ZGlmZiAtLWdpdCBhLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZCBiLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9idWdfcmVwb3J0Lm1kCkBAIC0wLDAgKzEsMzUgQEAKKy0tLQorbmFtZTogQnVnIHJlcG9ydAorYWJvdXQ6IENyZWF0ZSBhIHJlcG9ydCB0byBoZWxwIHVzIGltcHJvdmUKK3RpdGxlOiAnJworbGFiZWxzOiAnJworYXNzaWduZWVzOiAnJworCistLS0KKworKipDYXV0aW9uKioKK1RoZSBJc3N1ZXMgYXJlIHN0cmljdGx5IGxpbWl0ZWQgZm9yIHRoZSByZXBvcnRpbmcgb2YgcHJvYmxlbSBlbmNvdW50ZXJlZCB3aXRoIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHByb2plY3QuCitGb3IgYW55IG90aGVyIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgU1RNMzIgcHJvZHVjdCwgdGhlIHBlcmZvcm1hbmNlLCB0aGUgaGFyZHdhcmUgY2hhcmFjdGVyaXN0aWNzIGFuZCBib2FyZHMsIHRoZSB0b29scyB0aGUgZW52aXJvbm1lbnQgaW4gZ2VuZXJhbCwgcGxlYXNlIHBvc3QgYSB0b3BpYyBpbiB0aGUgW1NUIENvbW11bml0eS9TVE0zMiBNQ1VzIGZvcnVtXShodHRwczovL2NvbW11bml0eS5zdC5jb20vcy9ncm91cC8wRjkwWDAwMDAwMEFYc0FTQVcvc3RtMzItbWN1cykgCisKKyoqRGVzY3JpYmUgdGhlIHNldC11cCoqCisgKiBUaGUgYm9hcmQgKGVpdGhlciBTVCBSUE4gcmVmZXJlbmNlIG9yIHlvdXIgY3VzdG9tIGJvYXJkKQorICogSURFIG9yIGF0IGxlYXN0IHRoZSBjb21waWxlciBhbmQgaXRzIHZlcnNpb24KKworKipEZXNjcmliZSB0aGUgYnVnKioKK0EgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgYnVnIGlzLgorCisqKkhvdyBUbyBSZXByb2R1Y2UqKgorMS4gSW5kaWNhdGUgdGhlIGdsb2JhbCBiZWhhdmlvciBvZiB5b3VyIGFwcGxpY2F0aW9uIHByb2plY3QKKworMi4gVGhlIG1vZHVsZXMgdGhhdCB5b3Ugc3VzcGVjdCB0byBiZSB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0gKERyaXZlciwgQlNQLCBNVyAuLi4pCisKKzMuIFRoZSB1c2UgY2FzZSB0aGF0IGdlbmVyYXRlcyB0aGUgcHJvYmxlbQorCis0LiBIb3cgd2UgY2FuIHJlcHJvZHVjZSB0aGUgcHJvYmxlbQorCisKKyoqQWRkaXRpb25hbCBjb250ZXh0KioKK0lmIHlvdSBoYXZlIGEgZmlyc3QgYW5hbHlzaXMgb3IgcGF0Y2ggY29ycmVjdGlvbiwgdGhhbmsgeW91IHRvIHNoYXJlIHlvdXIgcHJvcG9zYWwuCisKKyoqU2NyZWVuc2hvdHMqKgorSWYgYXBwbGljYWJsZSwgYWRkIHNjcmVlbnNob3RzIHRvIGhlbHAgZXhwbGFpbiB5b3VyIHByb2JsZW0uCmRpZmYgLS1naXQgYS8uZ2l0aHViL0lTU1VFX1RFTVBMQVRFL290aGVyLWlzc3VlLm1kIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9vdGhlci1pc3N1ZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY0ODYxCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9vdGhlci1pc3N1ZS5tZApAQCAtMCwwICsxLDIyIEBACistLS0KK25hbWU6ICdPdGhlciBJc3N1ZSAnCithYm91dDogR2VuZXJpYyBpc3N1ZSBkZXNjcmlwdGlvbgordGl0bGU6ICcnCitsYWJlbHM6ICcnCithc3NpZ25lZXM6ICcnCisKKy0tLQorCisqKkNhdXRpb24qKgorVGhlIElzc3VlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCBmb3IgdGhlIHJlcG9ydGluZyBvZiBwcm9ibGVtIGVuY291bnRlcmVkIHdpdGggdGhlIHNvZnR3YXJlIHByb3ZpZGVkIGluIHRoaXMgcHJvamVjdC4KK0ZvciBhbnkgb3RoZXIgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBTVE0zMiBwcm9kdWN0LCB0aGUgcGVyZm9ybWFuY2UsIHRoZSBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGJvYXJkcywgdGhlIHRvb2xzIHRoZSBlbnZpcm9ubWVudCBpbiBnZW5lcmFsLCBwbGVhc2UgcG9zdCBhIHRvcGljIGluIHRoZSBbU1QgQ29tbXVuaXR5L1NUTTMyIE1DVXMgZm9ydW1dKGh0dHBzOi8vY29tbXVuaXR5LnN0LmNvbS9zL2dyb3VwLzBGOTBYMDAwMDAwQVhzQVNBVy9zdG0zMi1tY3VzKSAKKworKipEZXNjcmliZSB0aGUgc2V0LXVwKioKKyAqIFRoZSBib2FyZCAoZWl0aGVyIFNUIFJQTiByZWZlcmVuY2Ugb3IgeW91ciBjdXN0b20gYm9hcmQpCisgKiBJREUgb3IgYXQgbGVhc3QgdGhlIGNvbXBpbGVyIGFuZCBpdHMgdmVyc2lvbgorCisqKkFkZGl0aW9uYWwgY29udGV4dCoqCitJZiB5b3UgaGF2ZSBhIGZpcnN0IGFuYWx5c2lzIG9yIGEgcGF0Y2ggcHJvcG9zYWwsIHRoYW5rIHlvdSB0byBzaGFyZSB5b3VyIHByb3Bvc2FsLgorCisqKlNjcmVlbnNob3RzKioKK0lmIGFwcGxpY2FibGUsIGFkZCBzY3JlZW5zaG90cyB0byBoZWxwIGV4cGxhaW4geW91ciBwcm9ibGVtLgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQgYi8uZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFkYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQKQEAgLTAsMCArMSw4IEBACisjIyBJTVBPUlRBTlQgSU5GT1JNQVRJT04gCisKKyMjIyBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKQorKiBUaGUgUHVsbCBSZXF1ZXN0IGZlYXR1cmUgd2lsbCBiZSBjb25zaWRlcmVkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyBvbmx5IGFmdGVyIGEgKipDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKSoqIG1lY2hhbmlzbSBoYXMgYmVlbiBkZXBsb3llZC4KKyogV2UgYXJlIGN1cnJlbnRseSB3b3JraW5nIG9uIHRoZSBzZXQtdXAgb2YgdGhpcyBwcm9jZWR1cmUuIAorICAKKworCmRpZmYgLS1naXQgYS9DT0RFX09GX0NPTkRVQ1QubWQgYi9DT0RFX09GX0NPTkRVQ1QubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1MmIwNAotLS0gL2Rldi9udWxsCisrKyBiL0NPREVfT0ZfQ09ORFVDVC5tZApAQCAtMCwwICsxLDc2IEBACisjIENvbnRyaWJ1dG9yIENvdmVuYW50IENvZGUgb2YgQ29uZHVjdAorCisjIyBPdXIgUGxlZGdlCisKK0luIHRoZSBpbnRlcmVzdCBvZiBmb3N0ZXJpbmcgYW4gb3BlbiBhbmQgd2VsY29taW5nIGVudmlyb25tZW50LCB3ZSBhcworY29udHJpYnV0b3JzIGFuZCBtYWludGFpbmVycyBwbGVkZ2UgdG8gbWFraW5nIHBhcnRpY2lwYXRpb24gaW4gb3VyIHByb2plY3QgYW5kCitvdXIgY29tbXVuaXR5IGEgaGFyYXNzbWVudC1mcmVlIGV4cGVyaWVuY2UgZm9yIGV2ZXJ5b25lLCByZWdhcmRsZXNzIG9mIGFnZSwgYm9keQorc2l6ZSwgZGlzYWJpbGl0eSwgZXRobmljaXR5LCBzZXggY2hhcmFjdGVyaXN0aWNzLCBnZW5kZXIgaWRlbnRpdHkgYW5kIGV4cHJlc3Npb24sCitsZXZlbCBvZiBleHBlcmllbmNlLCBlZHVjYXRpb24sIHNvY2lvLWVjb25vbWljIHN0YXR1cywgbmF0aW9uYWxpdHksIHBlcnNvbmFsCithcHBlYXJhbmNlLCByYWNlLCByZWxpZ2lvbiwgb3Igc2V4dWFsIGlkZW50aXR5IGFuZCBvcmllbnRhdGlvbi4KKworIyMgT3VyIFN0YW5kYXJkcworCitFeGFtcGxlcyBvZiBiZWhhdmlvciB0aGF0IGNvbnRyaWJ1dGVzIHRvIGNyZWF0aW5nIGEgcG9zaXRpdmUgZW52aXJvbm1lbnQKK2luY2x1ZGU6CisKKyogVXNpbmcgd2VsY29taW5nIGFuZCBpbmNsdXNpdmUgbGFuZ3VhZ2UKKyogQmVpbmcgcmVzcGVjdGZ1bCBvZiBkaWZmZXJpbmcgdmlld3BvaW50cyBhbmQgZXhwZXJpZW5jZXMKKyogR3JhY2VmdWxseSBhY2NlcHRpbmcgY29uc3RydWN0aXZlIGNyaXRpY2lzbQorKiBGb2N1c2luZyBvbiB3aGF0IGlzIGJlc3QgZm9yIHRoZSBjb21tdW5pdHkKKyogU2hvd2luZyBlbXBhdGh5IHRvd2FyZHMgb3RoZXIgY29tbXVuaXR5IG1lbWJlcnMKKworRXhhbXBsZXMgb2YgdW5hY2NlcHRhYmxlIGJlaGF2aW9yIGJ5IHBhcnRpY2lwYW50cyBpbmNsdWRlOgorCisqIFRoZSB1c2Ugb2Ygc2V4dWFsaXplZCBsYW5ndWFnZSBvciBpbWFnZXJ5IGFuZCB1bndlbGNvbWUgc2V4dWFsIGF0dGVudGlvbiBvcgorIGFkdmFuY2VzCisqIFRyb2xsaW5nLCBpbnN1bHRpbmcvZGVyb2dhdG9yeSBjb21tZW50cywgYW5kIHBlcnNvbmFsIG9yIHBvbGl0aWNhbCBhdHRhY2tzCisqIFB1YmxpYyBvciBwcml2YXRlIGhhcmFzc21lbnQKKyogUHVibGlzaGluZyBvdGhlcnMnIHByaXZhdGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYSBwaHlzaWNhbCBvciBlbGVjdHJvbmljCisgYWRkcmVzcywgd2l0aG91dCBleHBsaWNpdCBwZXJtaXNzaW9uCisqIE90aGVyIGNvbmR1Y3Qgd2hpY2ggY291bGQgcmVhc29uYWJseSBiZSBjb25zaWRlcmVkIGluYXBwcm9wcmlhdGUgaW4gYQorIHByb2Zlc3Npb25hbCBzZXR0aW5nCisKKyMjIE91ciBSZXNwb25zaWJpbGl0aWVzCisKK1Byb2plY3QgbWFpbnRhaW5lcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjbGFyaWZ5aW5nIHRoZSBzdGFuZGFyZHMgb2YgYWNjZXB0YWJsZQorYmVoYXZpb3IgYW5kIGFyZSBleHBlY3RlZCB0byB0YWtlIGFwcHJvcHJpYXRlIGFuZCBmYWlyIGNvcnJlY3RpdmUgYWN0aW9uIGluCityZXNwb25zZSB0byBhbnkgaW5zdGFuY2VzIG9mIHVuYWNjZXB0YWJsZSBiZWhhdmlvci4KKworUHJvamVjdCBtYWludGFpbmVycyBoYXZlIHRoZSByaWdodCBhbmQgcmVzcG9uc2liaWxpdHkgdG8gcmVtb3ZlLCBlZGl0LCBvcgorcmVqZWN0IGNvbW1lbnRzLCBjb21taXRzLCBjb2RlLCB3aWtpIGVkaXRzLCBpc3N1ZXMsIGFuZCBvdGhlciBjb250cmlidXRpb25zCit0aGF0IGFyZSBub3QgYWxpZ25lZCB0byB0aGlzIENvZGUgb2YgQ29uZHVjdCwgb3IgdG8gYmFuIHRlbXBvcmFyaWx5IG9yCitwZXJtYW5lbnRseSBhbnkgY29udHJpYnV0b3IgZm9yIG90aGVyIGJlaGF2aW9ycyB0aGF0IHRoZXkgZGVlbSBpbmFwcHJvcHJpYXRlLAordGhyZWF0ZW5pbmcsIG9mZmVuc2l2ZSwgb3IgaGFybWZ1bC4KKworIyMgU2NvcGUKKworVGhpcyBDb2RlIG9mIENvbmR1Y3QgYXBwbGllcyBib3RoIHdpdGhpbiBwcm9qZWN0IHNwYWNlcyBhbmQgaW4gcHVibGljIHNwYWNlcword2hlbiBhbiBpbmRpdmlkdWFsIGlzIHJlcHJlc2VudGluZyB0aGUgcHJvamVjdCBvciBpdHMgY29tbXVuaXR5LiBFeGFtcGxlcyBvZgorcmVwcmVzZW50aW5nIGEgcHJvamVjdCBvciBjb21tdW5pdHkgaW5jbHVkZSB1c2luZyBhbiBvZmZpY2lhbCBwcm9qZWN0IGUtbWFpbAorYWRkcmVzcywgcG9zdGluZyB2aWEgYW4gb2ZmaWNpYWwgc29jaWFsIG1lZGlhIGFjY291bnQsIG9yIGFjdGluZyBhcyBhbiBhcHBvaW50ZWQKK3JlcHJlc2VudGF0aXZlIGF0IGFuIG9ubGluZSBvciBvZmZsaW5lIGV2ZW50LiBSZXByZXNlbnRhdGlvbiBvZiBhIHByb2plY3QgbWF5IGJlCitmdXJ0aGVyIGRlZmluZWQgYW5kIGNsYXJpZmllZCBieSBwcm9qZWN0IG1haW50YWluZXJzLgorCisjIyBFbmZvcmNlbWVudAorCitJbnN0YW5jZXMgb2YgYWJ1c2l2ZSwgaGFyYXNzaW5nLCBvciBvdGhlcndpc2UgdW5hY2NlcHRhYmxlIGJlaGF2aW9yIG1heSBiZQorcmVwb3J0ZWQgYnkgY29udGFjdGluZyB0aGUgcHJvamVjdCB0ZWFtIGF0IGh0dHBzOi8vd3d3LnN0LmNvbS9jb250ZW50L3N0X2NvbS9lbi9jb250YWN0LXVzLmh0bWwuIEFsbAorY29tcGxhaW50cyB3aWxsIGJlIHJldmlld2VkIGFuZCBpbnZlc3RpZ2F0ZWQgYW5kIHdpbGwgcmVzdWx0IGluIGEgcmVzcG9uc2UgdGhhdAoraXMgZGVlbWVkIG5lY2Vzc2FyeSBhbmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNpcmN1bXN0YW5jZXMuIFRoZSBwcm9qZWN0IHRlYW0gaXMKK29ibGlnYXRlZCB0byBtYWludGFpbiBjb25maWRlbnRpYWxpdHkgd2l0aCByZWdhcmQgdG8gdGhlIHJlcG9ydGVyIG9mIGFuIGluY2lkZW50LgorRnVydGhlciBkZXRhaWxzIG9mIHNwZWNpZmljIGVuZm9yY2VtZW50IHBvbGljaWVzIG1heSBiZSBwb3N0ZWQgc2VwYXJhdGVseS4KKworUHJvamVjdCBtYWludGFpbmVycyB3aG8gZG8gbm90IGZvbGxvdyBvciBlbmZvcmNlIHRoZSBDb2RlIG9mIENvbmR1Y3QgaW4gZ29vZAorZmFpdGggbWF5IGZhY2UgdGVtcG9yYXJ5IG9yIHBlcm1hbmVudCByZXBlcmN1c3Npb25zIGFzIGRldGVybWluZWQgYnkgb3RoZXIKK21lbWJlcnMgb2YgdGhlIHByb2plY3QncyBsZWFkZXJzaGlwLgorCisjIyBBdHRyaWJ1dGlvbgorCitUaGlzIENvZGUgb2YgQ29uZHVjdCBpcyBhZGFwdGVkIGZyb20gdGhlIFtDb250cmlidXRvciBDb3ZlbmFudF1baG9tZXBhZ2VdLCB2ZXJzaW9uIDEuNCwKK2F2YWlsYWJsZSBhdCBodHRwczovL3d3dy5jb250cmlidXRvci1jb3ZlbmFudC5vcmcvdmVyc2lvbi8xLzQvY29kZS1vZi1jb25kdWN0Lmh0bWwKKworW2hvbWVwYWdlXTogaHR0cHM6Ly93d3cuY29udHJpYnV0b3ItY292ZW5hbnQub3JnCisKK0ZvciBhbnN3ZXJzIHRvIGNvbW1vbiBxdWVzdGlvbnMgYWJvdXQgdGhpcyBjb2RlIG9mIGNvbmR1Y3QsIHNlZQoraHR0cHM6Ly93d3cuY29udHJpYnV0b3ItY292ZW5hbnQub3JnL2ZhcQpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMGYyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwyMSBAQAorIyMgQ29udHJpYnV0aW5nIGd1aWRlCitUaGlzIGRvY3VtZW50IHNlcnZlcyBhcyBhIGNoZWNrbGlzdCBiZWZvcmUgY29udHJpYnV0aW5nIHRvIHRoaXMgcmVwb3NpdG9yeS4KK0l0IGluY2x1ZGVzIGxpbmtzIHRvIHJlYWQgdXAgb24gaWYgdG9waWNzIGFyZSB1bmNsZWFyIHRvIHlvdS4KKworVGhpcyBndWlkZSBtYWlubHkgZm9jdXNlcyBvbiB0aGUgcHJvcGVyIHVzZSBvZiBHaXQuCisKKyMjIyAxLiBCZWZvcmUgb3BlbmluZyBhbiBpc3N1ZQorVG8gcmVwb3J0IGEgYnVnL3JlcXVlc3QgcGxlYXNlIGZpbGUgYW4gaXNzdWUgaW4gdGhlIHJpZ2h0IHJlcG9zaXRvcnkKKyhleGFtcGxlIGZvciBbc3RtMzJsMHh4X2hhbF9kcml2ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJsMHh4X2hhbF9kcml2ZXIvaXNzdWVzL25ldy9jaG9vc2UpKS4KK0J1dCBjaGVjayB0aGUgZm9sbG93aW5nIGJveGVzIGJlZm9yZSBwb3N0aW5nIGFuIGlzc3VlOgorCistIFsgXSBgTWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgdGhlIGxhdGVzdCBjb21taXQgKG1ham9yIHJlbGVhc2VzIGFyZSBUYWdnZWQsIGJ1dCBjb3JyZWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFzIG5ldyBjb21taXRzKS5gCistIFsgXSBgTWFrZSBzdXJlIHlvdXIgaXNzdWUgaXMgYSBxdWVzdGlvbi9mZWVkYmFjay9zdWdnZXN0aW9ucyBSRUxBVEVEIFRPIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHJlcG8uYCBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBkaXNjdXNzZWQgb24gdGhlIFtTVCBDb21tdW5pdHkvU1RNMzIgTUNVcyBmb3J1bV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvZ3JvdXAvMEY5MFgwMDAwMDBBWHNBU0FXL3N0bTMyLW1jdXMpLgorLSBbIF0gYE1ha2Ugc3VyZSB5b3VyIGlzc3VlIGlzIG5vdCBhbHJlYWR5IHJlcG9ydGVkL2ZpeGVkIG9uIEdpdEh1YiBvciBkaXNjdXNzZWQgb24gYSBwcmV2aW91cyBJc3N1ZS5gIFBsZWFzZSByZWZlciB0byB0aGlzIFtkYXNoYm9hcmRdKGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL1NUTWljcm9lbGVjdHJvbmljcy9wcm9qZWN0cy8yKSBmb3IgdGhlIGxpc3Qgb2YgaXNzdWVzIGFuZCBwdWxsLXJlcXVlc3RzLiBEbyBub3QgZm9yZ2V0IHRvIGJyb3dzZSBpbnRvIHRoZSAqKmNsb3NlZCoqIGlzc3Vlcy4KKworCisjIyMgMi4gUG9zdGluZyB0aGUgaXNzdWUKK1doZW4geW91IGhhdmUgY2hlY2tlZCB0aGUgcHJldmlvdXMgYm94ZXMuIFlvdSB3aWxsIGZpbmQgdHdvIHRlbXBsYXRlcyBJc3N1ZXMgKEJ1ZyBSZXBvcnQgb3IgT3RoZXIgSXNzdWUpIGF2YWlsYWJsZSBpbiB0aGUgKipJc3N1ZXMqKiB0YWIgb2YgdGhlIHJlcG8KKworIyMjIDMuIFB1bGwgUmVxdWVzdHMKK0ZvciB0aGUgbW9tZW50LCB0aGUgUHVsbCBSZXF1ZXN0IGZlYXR1cmUgaXMgbm90IGRlcGxveWVkLiBTVE1pY3JvbGVjdHJvbmljcyBpcyB3b3JraW5nIG9uIGEgQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQgcHJvY2VkdXJlCmRpZmYgLS1naXQgYS9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaCBiL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjJjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaApAQCAtMCwwICsxLDM0MjQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMl9oYWxfbGVnYWN5LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGlhc2VzIGRlZmluaXRpb24gZm9yIHRoZSBTVE0zMkN1YmUgSEFMIGNvbnN0YW50cworICAqICAgICAgICAgIG1hY3JvcyBhbmQgZnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyX0hBTF9MRUdBQ1kKKyNkZWZpbmUgU1RNMzJfSEFMX0xFR0FDWQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FFU19BbGlhc2VkX0RlZmluZXMgSEFMIENSWVAgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQUVTX0ZMQUdfUkRFUlIgICAgICAgICAgICAgICAgICBDUllQX0ZMQUdfUkRFUlIKKyNkZWZpbmUgQUVTX0ZMQUdfV1JFUlIgICAgICAgICAgICAgICAgICBDUllQX0ZMQUdfV1JFUlIKKyNkZWZpbmUgQUVTX0NMRUFSRkxBR19DQ0YgICAgICAgICAgICAgICBDUllQX0NMRUFSRkxBR19DQ0YKKyNkZWZpbmUgQUVTX0NMRUFSRkxBR19SREVSUiAgICAgICAgICAgICBDUllQX0NMRUFSRkxBR19SREVSUgorI2RlZmluZSBBRVNfQ0xFQVJGTEFHX1dSRVJSICAgICAgICAgICAgIENSWVBfQ0xFQVJGTEFHX1dSRVJSCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FEQ19BbGlhc2VkX0RlZmluZXMgSEFMIEFEQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTjEyYiAgICAgICAgICAgICAgIEFEQ19SRVNPTFVUSU9OXzEyQgorI2RlZmluZSBBRENfUkVTT0xVVElPTjEwYiAgICAgICAgICAgICAgIEFEQ19SRVNPTFVUSU9OXzEwQgorI2RlZmluZSBBRENfUkVTT0xVVElPTjhiICAgICAgICAgICAgICAgIEFEQ19SRVNPTFVUSU9OXzhCCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9ONmIgICAgICAgICAgICAgICAgQURDX1JFU09MVVRJT05fNkIKKyNkZWZpbmUgT1ZSX0RBVEFfT1ZFUldSSVRURU4gICAgICAgICAgICBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4KKyNkZWZpbmUgT1ZSX0RBVEFfUFJFU0VSVkVEICAgICAgICAgICAgICBBRENfT1ZSX0RBVEFfUFJFU0VSVkVECisjZGVmaW5lIEVPQ19TSU5HTEVfQ09OViAgICAgICAgICAgICAgICAgQURDX0VPQ19TSU5HTEVfQ09OVgorI2RlZmluZSBFT0NfU0VRX0NPTlYgICAgICAgICAgICAgICAgICAgIEFEQ19FT0NfU0VRX0NPTlYKKyNkZWZpbmUgRU9DX1NJTkdMRV9TRVFfQ09OViAgICAgICAgICAgICBBRENfRU9DX1NJTkdMRV9TRVFfQ09OVgorI2RlZmluZSBSRUdVTEFSX0dST1VQICAgICAgICAgICAgICAgICAgIEFEQ19SRUdVTEFSX0dST1VQCisjZGVmaW5lIElOSkVDVEVEX0dST1VQICAgICAgICAgICAgICAgICAgQURDX0lOSkVDVEVEX0dST1VQCisjZGVmaW5lIFJFR1VMQVJfSU5KRUNURURfR1JPVVAgICAgICAgICAgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVAKKyNkZWZpbmUgQVdEX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICBBRENfQVdEX0VWRU5UCisjZGVmaW5lIEFXRDFfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgQURDX0FXRDFfRVZFTlQKKyNkZWZpbmUgQVdEMl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICBBRENfQVdEMl9FVkVOVAorI2RlZmluZSBBV0QzX0VWRU5UICAgICAgICAgICAgICAgICAgICAgIEFEQ19BV0QzX0VWRU5UCisjZGVmaW5lIE9WUl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgQURDX09WUl9FVkVOVAorI2RlZmluZSBKUU9WRl9FVkVOVCAgICAgICAgICAgICAgICAgICAgIEFEQ19KUU9WRl9FVkVOVAorI2RlZmluZSBBTExfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgIEFEQ19BTExfQ0hBTk5FTFMKKyNkZWZpbmUgUkVHVUxBUl9DSEFOTkVMUyAgICAgICAgICAgICAgICBBRENfUkVHVUxBUl9DSEFOTkVMUworI2RlZmluZSBJTkpFQ1RFRF9DSEFOTkVMUyAgICAgICAgICAgICAgIEFEQ19JTkpFQ1RFRF9DSEFOTkVMUworI2RlZmluZSBTWVNDRkdfRkxBR19TRU5TT1JfQURDICAgICAgICAgIEFEQ19GTEFHX1NFTlNPUgorI2RlZmluZSBTWVNDRkdfRkxBR19WUkVGX0FEQyAgICAgICAgICAgIEFEQ19GTEFHX1ZSRUZJTlQKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWMSAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWMiAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWNCAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWNiAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjYKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWOCAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjgKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzBfVDZfVFJHTyAgICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UNl9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUcxX1QyMV9DQzIgICAgICAgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIxX0NDMgorI2RlZmluZSBBRENfRVhURVJOQUxUUklHMl9UMl9UUkdPICAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzNfVDJfQ0M0ICAgICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzQKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzRfVDIyX1RSR08gICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UMjJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHN19FWFRfSVQxMSAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQyAgICAgICAgICAgICAgICAgQURDX0NMT0NLX0FTWU5DX0RJVjEKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX05PTkUgICAgICBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfUklTSU5HICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkcKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX0ZBTExJTkcgICBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfRkFMTElORworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfUklTSU5HRkFMTElORyBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORworI2RlZmluZSBBRENfU0FNUExFVElNRV8yQ1lDTEVfNSAgICAgICAgIEFEQ19TQU1QTEVUSU1FXzJDWUNMRVNfNQorCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWV9SRUcgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWQorI2RlZmluZSBIQUxfQURDX1NUQVRFX0JVU1lfSU5KICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FT0NfUkVHICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19FT0MKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FT0NfSU5KICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9FT0MKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FUlJPUiAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWSAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9BV0QxCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZCQVRfRElWNCAgICAgICAgICAgQURDX0NIQU5ORUxfVkJBVAorI2VuZGlmIC8qIFNUTTMySDcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NFQ19BbGlhc2VkX0RlZmluZXMgSEFMIENFQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX0NFQ19HRVRfSVQgX19IQUxfQ0VDX0dFVF9GTEFHCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9EZWZpbmVzIEhBTCBDT01QIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9ESVNBQkxFRCAgICAgICBDT01QX1dJTkRPV01PREVfRElTQUJMRQorI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFRCAgICAgICAgQ09NUF9XSU5ET1dNT0RFX0VOQUJMRQorI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QMV9FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDEKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDJfRVZFTlQgICAgIENPTVBfRVhUSV9MSU5FX0NPTVAyCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVAzX0VWRU5UICAgICBDT01QX0VYVElfTElORV9DT01QMworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QNF9FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDQKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDVfRVZFTlQgICAgIENPTVBfRVhUSV9MSU5FX0NPTVA1CisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVA2X0VWRU5UICAgICBDT01QX0VYVElfTElORV9DT01QNgorI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QN19FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDcKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZGVmaW5lIENPTVBfTFBUSU1DT05ORUNUSU9OX0VOQUJMRUQgICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAgICAvKiE8IENPTVBYIG91dHB1dCBnZW5lcmljIG5hbWluZzogY29ubmVjdGVkIHRvIExQVElNIGlucHV0IDEgZm9yIENPTVAxLCBMUFRJTSBpbnB1dCAyIGZvciBDT01QMiAqLworI2VuZGlmCisjZGVmaW5lIENPTVBfT1VUUFVUX0NPTVA2VElNMk9DUkVGQ0xSICBDT01QX09VVFBVVF9DT01QNl9USU0yT0NSRUZDTFIKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBDT01QX09VVFBVVF9USU0zSUMxICAgICAgICAgICAgQ09NUF9PVVRQVVRfQ09NUDFfVElNM0lDMQorI2RlZmluZSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIgICAgICAgQ09NUF9PVVRQVVRfQ09NUDFfVElNM09DUkVGQ0xSCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFICAgICAgICAgQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OCisKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEgICAgICBDT01QX0lOUFVUX1BMVVNfSU8xCisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yICAgICAgQ09NUF9JTlBVVF9QTFVTX0lPMgorI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMyAgICAgIENPTVBfSU5QVVRfUExVU19JTzMKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzQgICAgICBDT01QX0lOUFVUX1BMVVNfSU80CisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU81ICAgICAgQ09NUF9JTlBVVF9QTFVTX0lPNQorI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPNiAgICAgIENPTVBfSU5QVVRfUExVU19JTzYKKworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfNFZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfMlZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzNfNFZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX1ZSRUZJTlQgICAgIENPTVBfSU5QVVRfTUlOVVNfVlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gxICAgIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMiAgICBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMSAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzIgICAgICAgIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzEgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPMQorI2lmIGRlZmluZWQoU1RNMzJMMCkKKy8qIElzc3VlIGZpeGVkIG9uIFNUTTMyTDAgQ09NUCBkcml2ZXI6IG9ubHkgMiBkZWRpY2F0ZWQgSU8gKElPMSBhbmQgSU8yKSwgICAgICovCisvKiBJTzIgd2FzIHdyb25nbHkgYXNzaWduZWQgdG8gSU8gc2hhcmVkIHdpdGggREFDIGFuZCBJTzMgd2FzIGNvcnJlc3BvbmRpbmcgICAqLworLyogdG8gdGhlIHNlY29uZCBkZWRpY2F0ZWQgSU8gKG9ubHkgZm9yIENPTVAyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8zICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzIKKyNlbHNlCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8yICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzIKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzMgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPMworI2VuZGlmCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU80ICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzQKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzUgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPNQorCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfTE9XICAgICAgICAgICAgQ09NUF9PVVRQVVRfTEVWRUxfTE9XCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfSElHSCAgICAgICAgICAgQ09NUF9PVVRQVVRfTEVWRUxfSElHSAorCisvKiBOb3RlOiBMaXRlcmFsICJDT01QX0ZMQUdfTE9DSyIga2VwdCBmb3IgbGVnYWN5IHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVG8gY2hlY2sgQ09NUCBsb2NrIHN0YXRlLCB1c2UgbWFjcm8gIl9fSEFMX0NPTVBfSVNfTE9DS0VEKCkiLiAgICAgICAgKi8KKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0xPQ0spCisjZGVmaW5lIENPTVBfRkxBR19MT0NLICAgICAgICAgICAgICAgICBDT01QX0NTUl9MT0NLCisjZWxpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVAxTE9DSykKKyNkZWZpbmUgQ09NUF9GTEFHX0xPQ0sgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAxTE9DSworI2VsaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeExPQ0spCisjZGVmaW5lIENPTVBfRkxBR19MT0NLICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeExPQ0sKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1ICAgICAgICBDT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1X0NPTVAxCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTJPQzMgICAgICAgIENPTVBfQkxBTktJTkdTUkNfVElNMl9PQzNfQ09NUDEKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DMyAgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DM19DT01QMQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0ICAgICAgICBDT01QX0JMQU5LSU5HU1JDX1RJTTNfT0M0X0NPTVAyCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTThPQzUgICAgICAgIENPTVBfQkxBTktJTkdTUkNfVElNOF9PQzVfQ09NUDIKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzFfQ09NUDIKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSAgICAgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19OT05FCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJMMCkKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQKKyNkZWZpbmUgQ09NUF9NT0RFX0xPV1NQRUVEICAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUgorI2Vsc2UKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfSElHSFNQRUVECisjZGVmaW5lIENPTVBfTU9ERV9NRURJVU1TUEVFRCAgICAgICAgICAgIENPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVECisjZGVmaW5lIENPTVBfTU9ERV9MT1dQT1dFUiAgICAgICAgICAgICAgIENPTVBfUE9XRVJNT0RFX0xPV1BPV0VSCisjZGVmaW5lIENPTVBfTU9ERV9VTFRSQUxPV1BPV0VSICAgICAgICAgIENPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVIKKyNlbmRpZgorCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPUlRFWF9BbGlhc2VkX0RlZmluZXMgSEFMIENPUlRFWCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DUkNfQWxpYXNlZF9EZWZpbmVzIEhBTCBDUkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRElTQUJMRUQgICAgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0RJU0FCTEUKKyNkZWZpbmUgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0VOQUJMRUQgICAgIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfREFDX0FsaWFzZWRfRGVmaW5lcyBIQUwgREFDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgREFDMV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NIQU5ORUxfMQorI2RlZmluZSBEQUMxX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ0hBTk5FTF8yCisjZGVmaW5lIERBQzJfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DSEFOTkVMXzEKKyNkZWZpbmUgREFDX1dBVkVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgREFDX1dBVkVfTk9JU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1dBVkUxXzAKKyNkZWZpbmUgREFDX1dBVkVfVFJJQU5HTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1dBVkUxXzEKKyNkZWZpbmUgREFDX1dBVkVHRU5FUkFUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgREFDX1dBVkVfTk9ORQorI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fTk9JU0UgICAgICAgICAgICAgICAgICAgICAgICBEQUNfV0FWRV9OT0lTRQorI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fVFJJQU5HTEUgICAgICAgICAgICAgICAgICAgICBEQUNfV0FWRV9UUklBTkdMRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9ETUFfQWxpYXNlZF9EZWZpbmVzIEhBTCBETUEgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1JFTUFQRE1BX0FEQ19ETUFfQ0gyICAgICAgICAgICAgICAgIERNQV9SRU1BUF9BRENfRE1BX0NIMgorI2RlZmluZSBIQUxfUkVNQVBETUFfVVNBUlQxX1RYX0RNQV9DSDQgICAgICAgICAgRE1BX1JFTUFQX1VTQVJUMV9UWF9ETUFfQ0g0CisjZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDFfUlhfRE1BX0NINSAgICAgICAgICBETUFfUkVNQVBfVVNBUlQxX1JYX0RNQV9DSDUKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE2X0RNQV9DSDQgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0xNl9ETUFfQ0g0CisjZGVmaW5lIEhBTF9SRU1BUERNQV9USU0xN19ETUFfQ0gyICAgICAgICAgICAgICBETUFfUkVNQVBfVElNMTdfRE1BX0NIMgorI2RlZmluZSBIQUxfUkVNQVBETUFfVVNBUlQzX0RNQV9DSDMyICAgICAgICAgICAgRE1BX1JFTUFQX1VTQVJUM19ETUFfQ0gzMgorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTZfRE1BX0NINiAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTE2X0RNQV9DSDYKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE3X0RNQV9DSDcgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0xN19ETUFfQ0g3CisjZGVmaW5lIEhBTF9SRU1BUERNQV9TUEkyX0RNQV9DSDY3ICAgICAgICAgICAgICBETUFfUkVNQVBfU1BJMl9ETUFfQ0g2NworI2RlZmluZSBIQUxfUkVNQVBETUFfVVNBUlQyX0RNQV9DSDY3ICAgICAgICAgICAgRE1BX1JFTUFQX1VTQVJUMl9ETUFfQ0g2NworI2RlZmluZSBIQUxfUkVNQVBETUFfSTJDMV9ETUFfQ0g3NiAgICAgICAgICAgICAgRE1BX1JFTUFQX0kyQzFfRE1BX0NINzYKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTFfRE1BX0NINiAgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0xX0RNQV9DSDYKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTJfRE1BX0NINyAgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0yX0RNQV9DSDcKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTNfRE1BX0NINiAgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0zX0RNQV9DSDYKKworI2RlZmluZSBJU19IQUxfUkVNQVBETUEgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0RNQV9SRU1BUAorI2RlZmluZSBfX0hBTF9SRU1BUERNQV9DSEFOTkVMX0VOQUJMRSAgICAgICAgICAgIF9fSEFMX0RNQV9SRU1BUF9DSEFOTkVMX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SRU1BUERNQV9DSEFOTkVMX0RJU0FCTEUgICAgICAgICAgIF9fSEFMX0RNQV9SRU1BUF9DSEFOTkVMX0RJU0FCTEUKKworI2lmIGRlZmluZWQoU1RNMzJMNCkKKworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMCAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTAKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTEgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkyICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMgorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMyAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTMKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTQgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk0CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk1ICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJNQorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJNiAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTYKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTcgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk3CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk4ICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJOAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJOSAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTkKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTEwICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTEgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTExCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxMiAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTIKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTEzICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTQgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTE0CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxNSAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTUKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDBfRVZUICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gwX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMV9FVlQgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDFfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gyX0VWVCAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMl9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDNfRVZUICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gzX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTFfT1VUICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0xX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTJfT1VUICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0yX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9EU0lfVEUgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRFNJX1RFCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RTSV9FT1QgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9EU0lfRU9UCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQTJEX0VPVCAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUEyRF9FT1QKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fTFREQ19JVCAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0xURENfSVQKKworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX05PX0VWRU5UICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVAorI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lORyAgICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkcKKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9GQUxMSU5HICAgICAgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lOR19GQUxMSU5HICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkdfRkFMTElORworCisjZW5kaWYgLyogU1RNMzJMNCAqLworCisjaWYgZGVmaW5lZChTVE0zMkg3KQorCisjZGVmaW5lIERNQV9SRVFVRVNUX0RBQzEgRE1BX1JFUVVFU1RfREFDMV9DSDEKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMiBETUFfUkVRVUVTVF9EQUMxX0NIMgorCisjZGVmaW5lIEJETUFfUkVRVUVTVF9MUF9VQVJUMV9SWCBCRE1BX1JFUVVFU1RfTFBVQVJUMV9SWAorI2RlZmluZSBCRE1BX1JFUVVFU1RfTFBfVUFSVDFfVFggQkRNQV9SRVFVRVNUX0xQVUFSVDFfVFgKKworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMF9FVlQgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMF9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDFfRVZUICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDFfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gyX0VWVCAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gyX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTFfT1VUICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTFfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMl9PVVQgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0xQVElNMl9PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fTFBUSU0zX09VVCAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0zX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMCAgICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9USU0xMl9UUkdPICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9USU0xMl9UUkdPCisKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDBfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDBfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0gxX0VWVCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0gxX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NIMl9FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIMl9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDNfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDNfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0g0X0VWVCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0g0X0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NINV9FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NINV9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDZfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDZfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVUFSVDFfUlhfV0tVUCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVUFSVDFfUlhfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFVBUlQxX1RYX1dLVVAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFVBUlQxX1RYX1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU0yX1dLVVAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU0yX1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU0yX09VVCAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU0yX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTNfV0tVUCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTNfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTNfT1VUICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTNfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNNF9XS1VQICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNNF9XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNNV9XS1VQICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNNV9XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0kyQzRfV0tVUCAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0kyQzRfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9TUEk2X1dLVVAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9TUEk2X1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQ09NUDFfT1VUICAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQ09NUDFfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0NPTVAyX09VVCAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0NPTVAyX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9SVENfV0tVUCAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9SVENfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9FWFRJMCAgICAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9FWFRJMAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9FWFRJMiAgICAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9FWFRJMgorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9JMkM0X0lUX0VWVCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9JMkM0X0lUX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9TUEk2X0lUICAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9TUEk2X0lUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVUFSVDFfVFhfSVQgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVUFSVDFfVFhfSVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBVQVJUMV9SWF9JVCAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBVQVJUMV9SWF9JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9BREMzX0lUICAgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9BREMzX0lUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0FEQzNfQVdEMV9PVVQgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0FEQzNfQVdEMV9PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQkRNQV9DSDBfSVQgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQkRNQV9DSDBfSVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQkRNQV9DSDFfSVQgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQkRNQV9DSDFfSVQKKworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX05PX0VWRU5UICAgICAgICAgICAgSEFMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HICAgICAgICAgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fRkFMTElORyAgICAgICAgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX1JJU0lOR19GQUxMSU5HICAgICAgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lOR19GQUxMSU5HCisKKyNkZWZpbmUgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMSAgICAgICAgICAgICAgIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTFfT1VUCisjZGVmaW5lIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTIgICAgICAgICAgICAgICBERlNETV9GSUxURVJfRVhUX1RSSUdfTFBUSU0yX09VVAorI2RlZmluZSBERlNETV9GSUxURVJfRVhUX1RSSUdfTFBUSU0zICAgICAgICAgICAgICAgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNM19PVVQKKworI2VuZGlmIC8qIFNUTTMySDcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRkxBU0hfQWxpYXNlZF9EZWZpbmVzIEhBTCBGTEFTSCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIFRZUEVQUk9HUkFNX0JZVEUgICAgICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX0JZVEUKKyNkZWZpbmUgVFlQRVBST0dSQU1fSEFMRldPUkQgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fSEFMRldPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1fV09SRCAgICAgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTV9ET1VCTEVXT1JEICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9ET1VCTEVXT1JECisjZGVmaW5lIFRZUEVFUkFTRV9TRUNUT1JTICAgICAgICAgICAgIEZMQVNIX1RZUEVFUkFTRV9TRUNUT1JTCisjZGVmaW5lIFRZUEVFUkFTRV9QQUdFUyAgICAgICAgICAgICAgIEZMQVNIX1RZUEVFUkFTRV9QQUdFUworI2RlZmluZSBUWVBFRVJBU0VfUEFHRUVSQVNFICAgICAgICAgICBGTEFTSF9UWVBFRVJBU0VfUEFHRVMKKyNkZWZpbmUgVFlQRUVSQVNFX01BU1NFUkFTRSAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFX01BU1NFUkFTRQorI2RlZmluZSBXUlBTVEFURV9ESVNBQkxFICAgICAgICAgICAgICBPQl9XUlBTVEFURV9ESVNBQkxFCisjZGVmaW5lIFdSUFNUQVRFX0VOQUJMRSAgICAgICAgICAgICAgIE9CX1dSUFNUQVRFX0VOQUJMRQorI2RlZmluZSBIQUxfRkxBU0hfVElNRU9VVF9WQUxVRSAgICAgICBGTEFTSF9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIE9CRVhfUENST1AgICAgICAgICAgICAgICAgICAgIE9QVElPTkJZVEVfUENST1AKKyNkZWZpbmUgT0JFWF9CT09UQ09ORklHICAgICAgICAgICAgICAgT1BUSU9OQllURV9CT09UQ09ORklHCisjZGVmaW5lIFBDUk9QU1RBVEVfRElTQUJMRSAgICAgICAgICAgIE9CX1BDUk9QX1NUQVRFX0RJU0FCTEUKKyNkZWZpbmUgUENST1BTVEFURV9FTkFCTEUgICAgICAgICAgICAgT0JfUENST1BfU1RBVEVfRU5BQkxFCisjZGVmaW5lIFRZUEVFUkFTRURBVEFfQllURSAgICAgICAgICAgIEZMQVNIX1RZUEVFUkFTRURBVEFfQllURQorI2RlZmluZSBUWVBFRVJBU0VEQVRBX0hBTEZXT1JEICAgICAgICBGTEFTSF9UWVBFRVJBU0VEQVRBX0hBTEZXT1JECisjZGVmaW5lIFRZUEVFUkFTRURBVEFfV09SRCAgICAgICAgICAgIEZMQVNIX1RZUEVFUkFTRURBVEFfV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfQllURSAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTURBVEFfQllURQorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfSEFMRldPUkQgICAgICBGTEFTSF9UWVBFUFJPR1JBTURBVEFfSEFMRldPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX1dPUkQgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1EQVRBX1dPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0ZBU1RCWVRFICAgICAgRkxBU0hfVFlQRVBST0dSQU1EQVRBX0ZBU1RCWVRFCisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9GQVNUSEFMRldPUkQgIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9GQVNUSEFMRldPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0ZBU1RXT1JEICAgICAgRkxBU0hfVFlQRVBST0dSQU1EQVRBX0ZBU1RXT1JECisjZGVmaW5lIFBBR0VTSVpFICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX1BBR0VfU0laRQorI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUQllURSAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9CWVRFCisjZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1RIQUxGV09SRCAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX0hBTEZXT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1RXT1JEICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX1dPUkQKKyNkZWZpbmUgVk9MVEFHRV9SQU5HRV8xICAgICAgICAgICAgICAgRkxBU0hfVk9MVEFHRV9SQU5HRV8xCisjZGVmaW5lIFZPTFRBR0VfUkFOR0VfMiAgICAgICAgICAgICAgIEZMQVNIX1ZPTFRBR0VfUkFOR0VfMgorI2RlZmluZSBWT0xUQUdFX1JBTkdFXzMgICAgICAgICAgICAgICBGTEFTSF9WT0xUQUdFX1JBTkdFXzMKKyNkZWZpbmUgVk9MVEFHRV9SQU5HRV80ICAgICAgICAgICAgICAgRkxBU0hfVk9MVEFHRV9SQU5HRV80CisjZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1QgICAgICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1QKKyNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVCAgICAgRkxBU0hfVFlQRVBST0dSQU1fRkFTVF9BTkRfTEFTVAorI2RlZmluZSBXUlBBUkVBX0JBTksxX0FSRUFBICAgICAgICAgICBPQl9XUlBBUkVBX0JBTksxX0FSRUFBCisjZGVmaW5lIFdSUEFSRUFfQkFOSzFfQVJFQUIgICAgICAgICAgIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUIKKyNkZWZpbmUgV1JQQVJFQV9CQU5LMl9BUkVBQSAgICAgICAgICAgT0JfV1JQQVJFQV9CQU5LMl9BUkVBQQorI2RlZmluZSBXUlBBUkVBX0JBTksyX0FSRUFCICAgICAgICAgICBPQl9XUlBBUkVBX0JBTksyX0FSRUFCCisjZGVmaW5lIElXREdfU1REQllfRlJFRVpFICAgICAgICAgICAgIE9CX0lXREdfU1REQllfRlJFRVpFCisjZGVmaW5lIElXREdfU1REQllfQUNUSVZFICAgICAgICAgICAgIE9CX0lXREdfU1REQllfUlVOCisjZGVmaW5lIElXREdfU1RPUF9GUkVFWkUgICAgICAgICAgICAgIE9CX0lXREdfU1RPUF9GUkVFWkUKKyNkZWZpbmUgSVdER19TVE9QX0FDVElWRSAgICAgICAgICAgICAgT0JfSVdER19TVE9QX1JVTgorI2RlZmluZSBGTEFTSF9FUlJPUl9OT05FICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfTk9ORQorI2RlZmluZSBGTEFTSF9FUlJPUl9SRCAgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfUkQKKyNkZWZpbmUgRkxBU0hfRVJST1JfUEcgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1BST0cKKyNkZWZpbmUgRkxBU0hfRVJST1JfUEdQICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1BHUworI2RlZmluZSBGTEFTSF9FUlJPUl9XUlAgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfV1JQCisjZGVmaW5lIEZMQVNIX0VSUk9SX09QVFYgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9PUFRWCisjZGVmaW5lIEZMQVNIX0VSUk9SX09QVFZVU1IgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9PUFRWVVNSCisjZGVmaW5lIEZMQVNIX0VSUk9SX1BST0cgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9QUk9HCisjZGVmaW5lIEZMQVNIX0VSUk9SX09QICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9PUEVSQVRJT04KKyNkZWZpbmUgRkxBU0hfRVJST1JfUEdBICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1BHQQorI2RlZmluZSBGTEFTSF9FUlJPUl9TSVpFICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfU0laRQorI2RlZmluZSBGTEFTSF9FUlJPUl9TSVogICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfU0laRQorI2RlZmluZSBGTEFTSF9FUlJPUl9QR1MgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfUEdTCisjZGVmaW5lIEZMQVNIX0VSUk9SX01JUyAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9NSVMKKyNkZWZpbmUgRkxBU0hfRVJST1JfRkFTVCAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX0ZBU1QKKyNkZWZpbmUgRkxBU0hfRVJST1JfRldXRVJSICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX0ZXV0VSUgorI2RlZmluZSBGTEFTSF9FUlJPUl9OT1RaRVJPICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfTk9UWkVSTworI2RlZmluZSBGTEFTSF9FUlJPUl9PUEVSQVRJT04gICAgICAgICBIQUxfRkxBU0hfRVJST1JfT1BFUkFUSU9OCisjZGVmaW5lIEZMQVNIX0VSUk9SX0VSUyAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9FUlMKKyNkZWZpbmUgT0JfV0RHX1NXICAgICAgICAgICAgICAgICAgICAgT0JfSVdER19TVworI2RlZmluZSBPQl9XREdfSFcgICAgICAgICAgICAgICAgICAgICBPQl9JV0RHX0hXCisjZGVmaW5lIE9CX1NEQURDMTJfVkREX01PTklUT1JfU0VUICAgIE9CX1NEQUNEX1ZERF9NT05JVE9SX1NFVAorI2RlZmluZSBPQl9TREFEQzEyX1ZERF9NT05JVE9SX1JFU0VUICBPQl9TREFDRF9WRERfTU9OSVRPUl9SRVNFVAorI2RlZmluZSBPQl9SQU1fUEFSSVRZX0NIRUNLX1NFVCAgICAgICBPQl9TUkFNX1BBUklUWV9TRVQKKyNkZWZpbmUgT0JfUkFNX1BBUklUWV9DSEVDS19SRVNFVCAgICAgT0JfU1JBTV9QQVJJVFlfUkVTRVQKKyNkZWZpbmUgSVNfT0JfU0RBREMxMl9WRERfTU9OSVRPUiAgICAgSVNfT0JfU0RBQ0RfVkREX01PTklUT1IKKyNkZWZpbmUgT0JfUkRQX0xFVkVMMCAgICAgICAgICAgICAgICAgT0JfUkRQX0xFVkVMXzAKKyNkZWZpbmUgT0JfUkRQX0xFVkVMMSAgICAgICAgICAgICAgICAgT0JfUkRQX0xFVkVMXzEKKyNkZWZpbmUgT0JfUkRQX0xFVkVMMiAgICAgICAgICAgICAgICAgT0JfUkRQX0xFVkVMXzIKKyNpZiBkZWZpbmVkKFNUTTMyRzApCisjZGVmaW5lIE9CX0JPT1RfTE9DS19ESVNBQkxFICAgICAgICAgIE9CX0JPT1RfRU5UUllfRk9SQ0VEX05PTkUKKyNkZWZpbmUgT0JfQk9PVF9MT0NLX0VOQUJMRSAgICAgICAgICAgT0JfQk9PVF9FTlRSWV9GT1JDRURfRkxBU0gKKyNlbHNlCisjZGVmaW5lIE9CX0JPT1RfRU5UUllfRk9SQ0VEX05PTkUgICAgIE9CX0JPT1RfTE9DS19ESVNBQkxFCisjZGVmaW5lIE9CX0JPT1RfRU5UUllfRk9SQ0VEX0ZMQVNIICAgIE9CX0JPT1RfTE9DS19FTkFCTEUKKyNlbmRpZgorI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgRkxBU0hfRkxBR19TTkVDQ0VfQkFOSzFSUiBGTEFTSF9GTEFHX1NORUNDRVJSX0JBTksxCisjZGVmaW5lIEZMQVNIX0ZMQUdfREJFQ0NFX0JBTksxUlIgRkxBU0hfRkxBR19EQkVDQ0VSUl9CQU5LMQorI2RlZmluZSBGTEFTSF9GTEFHX1NUUkJFUl9CQU5LMVIgIEZMQVNIX0ZMQUdfU1RSQkVSUl9CQU5LMQorI2RlZmluZSBGTEFTSF9GTEFHX1NORUNDRV9CQU5LMlJSIEZMQVNIX0ZMQUdfU05FQ0NFUlJfQkFOSzIKKyNkZWZpbmUgRkxBU0hfRkxBR19EQkVDQ0VfQkFOSzJSUiBGTEFTSF9GTEFHX0RCRUNDRVJSX0JBTksyCisjZGVmaW5lIEZMQVNIX0ZMQUdfU1RSQkVSX0JBTksyUiAgRkxBU0hfRkxBR19TVFJCRVJSX0JBTksyCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSlBFR19BbGlhc2VkX01hY3JvcyBIQUwgSlBFRyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX0NMS19FTkFCTEUgICAgICAgICAgICAgICBfX0hBTF9SQ0NfSlBHREVDRU5fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfRElTQUJMRSAgICAgICAgICAgICAgX19IQUxfUkNDX0pQR0RFQ0VOX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX0ZPUkNFX1JFU0VUICAgICAgICAgICAgICBfX0hBTF9SQ0NfSlBHREVDUlNUX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX1JFTEVBU0VfUkVTRVQgICAgICAgICAgICBfX0hBTF9SQ0NfSlBHREVDUlNUX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19KUEdERUNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfU0xFRVBfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX0pQR0RFQ19DTEtfU0xFRVBfRElTQUJMRQorI2VuZGlmIC8qIFNUTTMySDcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1lTQ0ZHX0FsaWFzZWRfRGVmaW5lcyBIQUwgU1lTQ0ZHIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDX1BBOSAgICBJMkNfRkFTVE1PREVQTFVTX1BBOQorI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEExMCAgIEkyQ19GQVNUTU9ERVBMVVNfUEExMAorI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI2ICAgIEkyQ19GQVNUTU9ERVBMVVNfUEI2CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQjcgICAgSTJDX0ZBU1RNT0RFUExVU19QQjcKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDX1BCOCAgICBJMkNfRkFTVE1PREVQTFVTX1BCOAorI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI5ICAgIEkyQ19GQVNUTU9ERVBMVVNfUEI5CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzEgICAgICAgSTJDX0ZBU1RNT0RFUExVU19JMkMxCisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzIgICAgICAgSTJDX0ZBU1RNT0RFUExVU19JMkMyCisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQzMgICAgICAgSTJDX0ZBU1RNT0RFUExVU19JMkMzCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgTExfRk1DX0FsaWFzZWRfRGVmaW5lcyBMTCBGTUMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9ESVNBQkxFICAgICAgIEZNQ19OQU5EX1dBSVRfRkVBVFVSRV9ESVNBQkxFCisjZGVmaW5lIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRU5BQkxFICAgICAgICBGTUNfTkFORF9XQUlUX0ZFQVRVUkVfRU5BQkxFCisjZGVmaW5lIEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzggICAgICAgICAgICBGTUNfTkFORF9NRU1fQlVTX1dJRFRIXzgKKyNkZWZpbmUgRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfMTYgICAgICAgICAgIEZNQ19OQU5EX01FTV9CVVNfV0lEVEhfMTYKKyNlbGlmIGRlZmluZWQoU1RNMzJGMSkgfHwgZGVmaW5lZChTVE0zMkYyKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IGRlZmluZWQoU1RNMzJGNCkKKyNkZWZpbmUgRk1DX05BTkRfV0FJVF9GRUFUVVJFX0RJU0FCTEUgICAgICAgICAgIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRElTQUJMRQorI2RlZmluZSBGTUNfTkFORF9XQUlUX0ZFQVRVUkVfRU5BQkxFICAgICAgICAgICAgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9FTkFCTEUKKyNkZWZpbmUgRk1DX05BTkRfTUVNX0JVU19XSURUSF84ICAgICAgICAgICAgICAgIEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzgKKyNkZWZpbmUgRk1DX05BTkRfTUVNX0JVU19XSURUSF8xNiAgICAgICAgICAgICAgIEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzE2CisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTExfRlNNQ19BbGlhc2VkX0RlZmluZXMgTEwgRlNNQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZTTUNfTk9SU1JBTV9UWVBFREVGICAgICAgICAgICAgICAgICAgICAgIEZTTUNfTk9SU1JBTV9UeXBlRGVmCisjZGVmaW5lIEZTTUNfTk9SU1JBTV9FWFRFTkRFRF9UWVBFREVGICAgICAgICAgICAgIEZTTUNfTk9SU1JBTV9FWFRFTkRFRF9UeXBlRGVmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9HUElPX0FsaWFzZWRfTWFjcm9zIEhBTCBHUElPIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgR0VUX0dQSU9fU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19HRVRfSU5ERVgKKyNkZWZpbmUgR0VUX0dQSU9fSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19HRVRfSU5ERVgKKworI2lmIGRlZmluZWQoU1RNMzJGNCkKKyNkZWZpbmUgR1BJT19BRjEyX1NETU1DICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEyX1NESU8KKyNkZWZpbmUgR1BJT19BRjEyX1NETU1DMSAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEyX1NESU8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBHUElPX0FGMTJfU0RJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTJfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUYxMl9TRE1NQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRE1NQzEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBHUElPX0FGMTJfU0RJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTJfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUYxMl9TRE1NQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRE1NQzEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBHUElPX0FGN19TRElPMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGN19TRE1NQzEKKyNkZWZpbmUgR1BJT19BRjhfU0RJTzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjhfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUYxMl9TRElPMSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRE1NQzEKKyNkZWZpbmUgR1BJT19BRjlfU0RJTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjlfU0RNTUMyCisjZGVmaW5lIEdQSU9fQUYxMF9TRElPMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMF9TRE1NQzIKKyNkZWZpbmUgR1BJT19BRjExX1NESU8yICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjExX1NETU1DMgorI2VuZGlmCisKKyNkZWZpbmUgR1BJT19BRjBfTFBUSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjBfTFBUSU0xCisjZGVmaW5lIEdQSU9fQUYxX0xQVElNICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxX0xQVElNMQorI2RlZmluZSBHUElPX0FGMl9MUFRJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMl9MUFRJTTEKKworI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGMikgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lICBHUElPX1NQRUVEX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fU1BFRURfRlJFUV9MT1cKKyNkZWZpbmUgIEdQSU9fU1BFRURfTUVESVVNICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19TUEVFRF9GUkVRX01FRElVTQorI2RlZmluZSAgR1BJT19TUEVFRF9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1NQRUVEX0ZSRVFfSElHSAorI2RlZmluZSAgR1BJT19TUEVFRF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisjZW5kaWYgLyogU1RNMzJMMCB8fCBTVE0zMkw0IHx8IFNUTTMyRjQgfHwgU1RNMzJGMiB8fCBTVE0zMkY3IHx8IFNUTTMySDcqLworCisjaWYgZGVmaW5lZChTVE0zMkwxKQorICNkZWZpbmUgIEdQSU9fU1BFRURfVkVSWV9MT1cgICAgR1BJT19TUEVFRF9GUkVRX0xPVworICNkZWZpbmUgIEdQSU9fU1BFRURfTE9XICAgICAgICAgR1BJT19TUEVFRF9GUkVRX01FRElVTQorICNkZWZpbmUgIEdQSU9fU1BFRURfTUVESVVNICAgICAgR1BJT19TUEVFRF9GUkVRX0hJR0gKKyAjZGVmaW5lICBHUElPX1NQRUVEX0hJR0ggICAgICAgIEdQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gKKyNlbmRpZiAvKiBTVE0zMkwxICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjApIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkYxKQorICNkZWZpbmUgIEdQSU9fU1BFRURfTE9XICAgIEdQSU9fU1BFRURfRlJFUV9MT1cKKyAjZGVmaW5lICBHUElPX1NQRUVEX01FRElVTSBHUElPX1NQRUVEX0ZSRVFfTUVESVVNCisgI2RlZmluZSAgR1BJT19TUEVFRF9ISUdIICAgR1BJT19TUEVFRF9GUkVRX0hJR0gKKyNlbmRpZiAvKiBTVE0zMkYwIHx8IFNUTTMyRjMgfHwgU1RNMzJGMSAqLworCisjZGVmaW5lIEdQSU9fQUY2X0RGU0RNICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUY2X0RGU0RNMQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSFJUSU1fQWxpYXNlZF9NYWNyb3MgSEFMIEhSVElNIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fRElTQUJMRUQgICAgICAgICAgIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RJU0FCTEVECisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQxX0VFVjY4ICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9FRVY2CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQyX0VFVjY4ICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9FRVY2CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjY4ICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVEQk9USF9FRVY2CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjY4ICAgICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9CQUxBTkNFRF9FRVY2CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQxX0RFRVY3OSBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9ERUVWNworI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9ERUVWNzkgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfREVFVjcKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNzkgIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjcKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fQkFMQU5DRURfRUVWNzkgICAgIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjcKKworI2RlZmluZSBfX0hBTF9IUlRJTV9TZXRDb3VudGVyICAgICAgICBfX0hBTF9IUlRJTV9TRVRDT1VOVEVSCisjZGVmaW5lIF9fSEFMX0hSVElNX0dldENvdW50ZXIgICAgICAgIF9fSEFMX0hSVElNX0dFVENPVU5URVIKKyNkZWZpbmUgX19IQUxfSFJUSU1fU2V0UGVyaW9kICAgICAgICAgX19IQUxfSFJUSU1fU0VUUEVSSU9ECisjZGVmaW5lIF9fSEFMX0hSVElNX0dldFBlcmlvZCAgICAgICAgIF9fSEFMX0hSVElNX0dFVFBFUklPRAorI2RlZmluZSBfX0hBTF9IUlRJTV9TZXRDbG9ja1ByZXNjYWxlciBfX0hBTF9IUlRJTV9TRVRDTE9DS1BSRVNDQUxFUgorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRDbG9ja1ByZXNjYWxlciBfX0hBTF9IUlRJTV9HRVRDTE9DS1BSRVNDQUxFUgorI2RlZmluZSBfX0hBTF9IUlRJTV9TZXRDb21wYXJlICAgICAgICBfX0hBTF9IUlRJTV9TRVRDT01QQVJFCisjZGVmaW5lIF9fSEFMX0hSVElNX0dldENvbXBhcmUgICAgICAgIF9fSEFMX0hSVElNX0dFVENPTVBBUkUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0kyQ19BbGlhc2VkX0RlZmluZXMgSEFMIEkyQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfRFVBTEFERFJFU1NfRElTQUJMRUQgICAgICAgICAgICAgICAgSTJDX0RVQUxBRERSRVNTX0RJU0FCTEUKKyNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0VOQUJMRUQgICAgICAgICAgICAgICAgIEkyQ19EVUFMQUREUkVTU19FTkFCTEUKKyNkZWZpbmUgSTJDX0dFTkVSQUxDQUxMX0RJU0FCTEVEICAgICAgICAgICAgICAgIEkyQ19HRU5FUkFMQ0FMTF9ESVNBQkxFCisjZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEVEICAgICAgICAgICAgICAgICBJMkNfR0VORVJBTENBTExfRU5BQkxFCisjZGVmaW5lIEkyQ19OT1NUUkVUQ0hfRElTQUJMRUQgICAgICAgICAgICAgICAgICBJMkNfTk9TVFJFVENIX0RJU0FCTEUKKyNkZWZpbmUgSTJDX05PU1RSRVRDSF9FTkFCTEVEICAgICAgICAgICAgICAgICAgIEkyQ19OT1NUUkVUQ0hfRU5BQkxFCisjZGVmaW5lIEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFRCAgICAgICAgICAgICAgICBJMkNfQU5BTE9HRklMVEVSX0VOQUJMRQorI2RlZmluZSBJMkNfQU5BTE9HRklMVEVSX0RJU0FCTEVEICAgICAgICAgICAgICAgSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFCisjaWYgZGVmaW5lZChTVE0zMkYwKSB8fCBkZWZpbmVkKFNUTTMyRjEpIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJMMSkgfHwgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01FTV9CVVNZX1RYICAgICAgICAgICAgICAgSEFMX0kyQ19TVEFURV9CVVNZX1RYCisjZGVmaW5lIEhBTF9JMkNfU1RBVEVfTUVNX0JVU1lfUlggICAgICAgICAgICAgICBIQUxfSTJDX1NUQVRFX0JVU1lfUlgKKyNkZWZpbmUgSEFMX0kyQ19TVEFURV9NQVNURVJfQlVTWV9UWCAgICAgICAgICAgIEhBTF9JMkNfU1RBVEVfQlVTWV9UWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYICAgICAgICAgICAgSEFMX0kyQ19TVEFURV9CVVNZX1JYCisjZGVmaW5lIEhBTF9JMkNfU1RBVEVfU0xBVkVfQlVTWV9UWCAgICAgICAgICAgICBIQUxfSTJDX1NUQVRFX0JVU1lfVFgKKyNkZWZpbmUgSEFMX0kyQ19TVEFURV9TTEFWRV9CVVNZX1JYICAgICAgICAgICAgIEhBTF9JMkNfU1RBVEVfQlVTWV9SWAorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JUkRBX0FsaWFzZWRfRGVmaW5lcyBIQUwgSVJEQSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX09ORV9CSVRfU0FNUExFX0RJU0FCTEVEICAgICAgICAgICAgSVJEQV9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisjZGVmaW5lIElSREFfT05FX0JJVF9TQU1QTEVfRU5BQkxFRCAgICAgICAgICAgICBJUkRBX09ORV9CSVRfU0FNUExFX0VOQUJMRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JV0RHX0FsaWFzZWRfRGVmaW5lcyBIQUwgSVdERyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBLUl9LRVlfUkVMT0FEICAgICAgICAgICAgICAgICAgIElXREdfS0VZX1JFTE9BRAorI2RlZmluZSBLUl9LRVlfRU5BQkxFICAgICAgICAgICAgICAgICAgIElXREdfS0VZX0VOQUJMRQorI2RlZmluZSBLUl9LRVlfRVdBICAgICAgICAgICAgICAgICAgICAgIElXREdfS0VZX1dSSVRFX0FDQ0VTU19FTkFCTEUKKyNkZWZpbmUgS1JfS0VZX0RXQSAgICAgICAgICAgICAgICAgICAgICBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRElTQUJMRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfTFBUSU1fQWxpYXNlZF9EZWZpbmVzIEhBTCBMUFRJTSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lTVElPTiBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTgorI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfMlRSQU5TSVNUSU9OUyAgICAgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfNFRSQU5TSVNUSU9OUyAgICAgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfOFRSQU5TSVNUSU9OUyAgICAgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUworCisjZGVmaW5lIExQVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HRURHRSAgICAgICAgICBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORworI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX0ZBTExJTkdFREdFICAgICAgICAgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HCisjZGVmaW5lIExQVElNX0NMT0NLUE9MQVJJVFlfQk9USEVER0VTICAgICAgICAgICBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HCisKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJU1RJT04gIExQVElNX1RSSUdTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04KKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVNUSU9OUyAgICAgIExQVElNX1RSSUdTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJU1RJT05TICAgICAgTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lTVElPTlMgICAgICBMUFRJTV9UUklHU0FNUExFVElNRV84VFJBTlNJVElPTlMKKworLyogVGhlIGZvbGxvd2luZyAzIGRlZmluaXRpb24gaGF2ZSBhbHNvIGJlZW4gcHJlc2VudCBpbiBhIHRlbXBvcmFyeSB2ZXJzaW9uIG9mIGxwdGltLmggKi8KKy8qIFRoZXkgbmVlZCB0byBiZSByZW5hbWVkIGFsc28gdG8gdGhlIHJpZ2h0IG5hbWUsIGp1c3QgaW4gY2FzZSAqLworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTiAgICAgICAgTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OICAgICAgICBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJVElPTlMKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT04gICAgICAgIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9OQU5EX0FsaWFzZWRfRGVmaW5lcyBIQUwgTkFORCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfTkFORF9SZWFkX1BhZ2UgICAgICAgICAgICAgIEhBTF9OQU5EX1JlYWRfUGFnZV84YgorI2RlZmluZSBIQUxfTkFORF9Xcml0ZV9QYWdlICAgICAgICAgICAgIEhBTF9OQU5EX1dyaXRlX1BhZ2VfOGIKKyNkZWZpbmUgSEFMX05BTkRfUmVhZF9TcGFyZUFyZWEgICAgICAgICBIQUxfTkFORF9SZWFkX1NwYXJlQXJlYV84YgorI2RlZmluZSBIQUxfTkFORF9Xcml0ZV9TcGFyZUFyZWEgICAgICAgIEhBTF9OQU5EX1dyaXRlX1NwYXJlQXJlYV84YgorCisjZGVmaW5lIE5BTkRfQWRkcmVzc1R5cGVkZWYgICAgICAgICAgICAgTkFORF9BZGRyZXNzVHlwZURlZgorCisjZGVmaW5lIF9fQVJSQVlfQUREUkVTUyAgICAgICAgICAgICAgICAgQVJSQVlfQUREUkVTUworI2RlZmluZSBfX0FERFJfMXN0X0NZQ0xFICAgICAgICAgICAgICAgIEFERFJfMVNUX0NZQ0xFCisjZGVmaW5lIF9fQUREUl8ybmRfQ1lDTEUgICAgICAgICAgICAgICAgQUREUl8yTkRfQ1lDTEUKKyNkZWZpbmUgX19BRERSXzNyZF9DWUNMRSAgICAgICAgICAgICAgICBBRERSXzNSRF9DWUNMRQorI2RlZmluZSBfX0FERFJfNHRoX0NZQ0xFICAgICAgICAgICAgICAgIEFERFJfNFRIX0NZQ0xFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9OT1JfQWxpYXNlZF9EZWZpbmVzIEhBTCBOT1IgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTk9SX1N0YXR1c1R5cGVkZWYgICAgICAgICAgICAgIEhBTF9OT1JfU3RhdHVzVHlwZURlZgorI2RlZmluZSBOT1JfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgSEFMX05PUl9TVEFUVVNfU1VDQ0VTUworI2RlZmluZSBOT1JfT05HT0lORyAgICAgICAgICAgICAgICAgICAgSEFMX05PUl9TVEFUVVNfT05HT0lORworI2RlZmluZSBOT1JfRVJST1IgICAgICAgICAgICAgICAgICAgICAgSEFMX05PUl9TVEFUVVNfRVJST1IKKyNkZWZpbmUgTk9SX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgIEhBTF9OT1JfU1RBVFVTX1RJTUVPVVQKKworI2RlZmluZSBfX05PUl9XUklURSAgICAgICAgICAgICAgICAgICAgTk9SX1dSSVRFCisjZGVmaW5lIF9fTk9SX0FERFJfU0hJRlQgICAgICAgICAgICAgICBOT1JfQUREUl9TSElGVAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfT1BBTVBfQWxpYXNlZF9EZWZpbmVzIEhBTCBPUEFNUCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX1ZQMCAgICAgICAgICAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX1ZQMSAgICAgICAgICAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8xCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX1ZQMiAgICAgICAgICAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX1ZQMyAgICAgICAgICAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8zCisKKyNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX1ZQMCAgICAgICBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9WUDEgICAgICAgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMQorI2RlZmluZSBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfVlAyICAgICAgIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzIKKyNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX1ZQMyAgICAgICBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8zCisKKyNkZWZpbmUgT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0wICAgICAgICAgICAgICBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzAKKyNkZWZpbmUgT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0xICAgICAgICAgICAgICBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzEKKworI2RlZmluZSBJT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0wICAgICAgICAgICAgIE9QQU1QX0lOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBJT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0xICAgICAgICAgICAgIE9QQU1QX0lOVkVSVElOR0lOUFVUX0lPMQorCisjZGVmaW5lIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9WTTAgICAgICAgICAgT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfVk0xICAgICAgICAgIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9JTzEKKworI2RlZmluZSBPUEFNUF9JTlZFUlRJTkdJTlBVVF9WSU5NICAgICAgICAgICAgIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9JTzEKKworI2RlZmluZSBPUEFNUF9QR0FDT05ORUNUX05PICAgICAgICAgICAgICAgICAgIE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX05PCisjZGVmaW5lIE9QQU1QX1BHQUNPTk5FQ1RfVk0wICAgICAgICAgICAgICAgICAgT1BBTVBfUEdBX0NPTk5FQ1RfSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX1BHQUNPTk5FQ1RfVk0xICAgICAgICAgICAgICAgICAgT1BBTVBfUEdBX0NPTk5FQ1RfSU5WRVJUSU5HSU5QVVRfSU8xCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0kyU19BbGlhc2VkX0RlZmluZXMgSEFMIEkyUyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBJMlNfU1RBTkRBUkRfUEhJTExJUFMgICAgICBJMlNfU1RBTkRBUkRfUEhJTElQUworCisjaWYgZGVmaW5lZChTVE0zMkg3KQorICAjZGVmaW5lIEkyU19JVF9UWEUgICAgICAgICAgICAgICBJMlNfSVRfVFhQCisgICNkZWZpbmUgSTJTX0lUX1JYTkUgICAgICAgICAgICAgIEkyU19JVF9SWFAKKworICAjZGVmaW5lIEkyU19GTEFHX1RYRSAgICAgICAgICAgICBJMlNfRkxBR19UWFAKKyAgI2RlZmluZSBJMlNfRkxBR19SWE5FICAgICAgICAgICAgSTJTX0ZMQUdfUlhQCisgICNkZWZpbmUgSTJTX0ZMQUdfRlJFICAgICAgICAgICAgIEkyU19GTEFHX1RJRlJFCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGNykKKyAgI2RlZmluZSBJMlNfQ0xPQ0tfU1lTQ0xLICAgICAgICAgICBJMlNfQ0xPQ0tfUExMCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BDQ0FSRF9BbGlhc2VkX0RlZmluZXMgSEFMIFBDQ0FSRCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisvKiBDb21wYWN0IEZsYXNoLUFUQSByZWdpc3RlcnMgZGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgQ0ZfREFUQSAgICAgICAgICAgICAgICAgICAgICAgQVRBX0RBVEEKKyNkZWZpbmUgQ0ZfU0VDVE9SX0NPVU5UICAgICAgICAgICAgICAgQVRBX1NFQ1RPUl9DT1VOVAorI2RlZmluZSBDRl9TRUNUT1JfTlVNQkVSICAgICAgICAgICAgICBBVEFfU0VDVE9SX05VTUJFUgorI2RlZmluZSBDRl9DWUxJTkRFUl9MT1cgICAgICAgICAgICAgICBBVEFfQ1lMSU5ERVJfTE9XCisjZGVmaW5lIENGX0NZTElOREVSX0hJR0ggICAgICAgICAgICAgIEFUQV9DWUxJTkRFUl9ISUdICisjZGVmaW5lIENGX0NBUkRfSEVBRCAgICAgICAgICAgICAgICAgIEFUQV9DQVJEX0hFQUQKKyNkZWZpbmUgQ0ZfU1RBVFVTX0NNRCAgICAgICAgICAgICAgICAgQVRBX1NUQVRVU19DTUQKKyNkZWZpbmUgQ0ZfU1RBVFVTX0NNRF9BTFRFUk5BVEUgICAgICAgQVRBX1NUQVRVU19DTURfQUxURVJOQVRFCisjZGVmaW5lIENGX0NPTU1PTl9EQVRBX0FSRUEgICAgICAgICAgIEFUQV9DT01NT05fREFUQV9BUkVBCisKKy8qIENvbXBhY3QgRmxhc2gtQVRBIGNvbW1hbmRzICovCisjZGVmaW5lIENGX1JFQURfU0VDVE9SX0NNRCAgICAgICAgICAgIEFUQV9SRUFEX1NFQ1RPUl9DTUQKKyNkZWZpbmUgQ0ZfV1JJVEVfU0VDVE9SX0NNRCAgICAgICAgICAgQVRBX1dSSVRFX1NFQ1RPUl9DTUQKKyNkZWZpbmUgQ0ZfRVJBU0VfU0VDVE9SX0NNRCAgICAgICAgICAgQVRBX0VSQVNFX1NFQ1RPUl9DTUQKKyNkZWZpbmUgQ0ZfSURFTlRJRllfQ01EICAgICAgICAgICAgICAgQVRBX0lERU5USUZZX0NNRAorCisjZGVmaW5lIFBDQ0FSRF9TdGF0dXNUeXBlZGVmICAgICAgICAgIEhBTF9QQ0NBUkRfU3RhdHVzVHlwZURlZgorI2RlZmluZSBQQ0NBUkRfU1VDQ0VTUyAgICAgICAgICAgICAgICBIQUxfUENDQVJEX1NUQVRVU19TVUNDRVNTCisjZGVmaW5lIFBDQ0FSRF9PTkdPSU5HICAgICAgICAgICAgICAgIEhBTF9QQ0NBUkRfU1RBVFVTX09OR09JTkcKKyNkZWZpbmUgUENDQVJEX0VSUk9SICAgICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9TVEFUVVNfRVJST1IKKyNkZWZpbmUgUENDQVJEX1RJTUVPVVQgICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9TVEFUVVNfVElNRU9VVAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUlRDX0FsaWFzZWRfRGVmaW5lcyBIQUwgUlRDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgRk9STUFUX0JJTiAgICAgICAgICAgICAgICAgIFJUQ19GT1JNQVRfQklOCisjZGVmaW5lIEZPUk1BVF9CQ0QgICAgICAgICAgICAgICAgICBSVENfRk9STUFUX0JDRAorCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfTm9uZSAgICAgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19OT05FCisjZGVmaW5lIFJUQ19UQU1QRVJFUkFTRUJBQ0tVUF9ESVNBQkxFRCAgUlRDX1RBTVBFUl9FUkFTRV9CQUNLVVBfRElTQUJMRQorI2RlZmluZSBSVENfVEFNUEVSTUFTS19GTEFHX0RJU0FCTEVEICAgIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRElTQUJMRQorI2RlZmluZSBSVENfVEFNUEVSTUFTS19GTEFHX0VOQUJMRUQgICAgIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRU5BQkxFCisKKyNkZWZpbmUgUlRDX01BU0tUQU1QRVJGTEFHX0RJU0FCTEVEICAgICBSVENfVEFNUEVSTUFTS19GTEFHX0RJU0FCTEUKKyNkZWZpbmUgUlRDX01BU0tUQU1QRVJGTEFHX0VOQUJMRUQgICAgICBSVENfVEFNUEVSTUFTS19GTEFHX0VOQUJMRQorI2RlZmluZSBSVENfVEFNUEVSRVJBU0VCQUNLVVBfRU5BQkxFRCAgIFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0VOQUJMRQorI2RlZmluZSBSVENfVEFNUEVSMV8yX0lOVEVSUlVQVCAgICAgICAgIFJUQ19BTExfVEFNUEVSX0lOVEVSUlVQVAorI2RlZmluZSBSVENfVEFNUEVSMV8yXzNfSU5URVJSVVBUICAgICAgIFJUQ19BTExfVEFNUEVSX0lOVEVSUlVQVAorCisjZGVmaW5lIFJUQ19USU1FU1RBTVBQSU5fUEMxMyAgUlRDX1RJTUVTVEFNUFBJTl9ERUZBVUxUCisjZGVmaW5lIFJUQ19USU1FU1RBTVBQSU5fUEEwIFJUQ19USU1FU1RBTVBQSU5fUE9TMQorI2RlZmluZSBSVENfVElNRVNUQU1QUElOX1BJOCBSVENfVElNRVNUQU1QUElOX1BPUzEKKyNkZWZpbmUgUlRDX1RJTUVTVEFNUFBJTl9QQzEgICBSVENfVElNRVNUQU1QUElOX1BPUzIKKworI2RlZmluZSBSVENfT1VUUFVUX1JFTUFQX1BDMTMgIFJUQ19PVVRQVVRfUkVNQVBfTk9ORQorI2RlZmluZSBSVENfT1VUUFVUX1JFTUFQX1BCMTQgIFJUQ19PVVRQVVRfUkVNQVBfUE9TMQorI2RlZmluZSBSVENfT1VUUFVUX1JFTUFQX1BCMiAgIFJUQ19PVVRQVVRfUkVNQVBfUE9TMQorCisjZGVmaW5lIFJUQ19UQU1QRVJQSU5fUEMxMyBSVENfVEFNUEVSUElOX0RFRkFVTFQKKyNkZWZpbmUgUlRDX1RBTVBFUlBJTl9QQTAgIFJUQ19UQU1QRVJQSU5fUE9TMQorI2RlZmluZSBSVENfVEFNUEVSUElOX1BJOCAgUlRDX1RBTVBFUlBJTl9QT1MxCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfU01BUlRDQVJEX0FsaWFzZWRfRGVmaW5lcyBIQUwgU01BUlRDQVJEIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9OQUNLX0VOQUJMRUQgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfTkFDS19FTkFCTEUKKyNkZWZpbmUgU01BUlRDQVJEX05BQ0tfRElTQUJMRUQgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9OQUNLX0RJU0FCTEUKKworI2RlZmluZSBTTUFSVENBUkRfT05FQklUX1NBTVBMSU5HX0RJU0FCTEVEICAgICAgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKyNkZWZpbmUgU01BUlRDQVJEX09ORUJJVF9TQU1QTElOR19FTkFCTEVEICAgICAgIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKyNkZWZpbmUgU01BUlRDQVJEX09ORUJJVF9TQU1QTElOR19ESVNBQkxFICAgICAgIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRU5BQkxFICAgICAgICBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRU5BQkxFCisKKyNkZWZpbmUgU01BUlRDQVJEX1RJTUVPVVRfRElTQUJMRUQgICAgICAgICAgICAgIFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEUKKyNkZWZpbmUgU01BUlRDQVJEX1RJTUVPVVRfRU5BQkxFRCAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9USU1FT1VUX0VOQUJMRQorCisjZGVmaW5lIFNNQVJUQ0FSRF9MQVNUQklUX0RJU0FCTEVEICAgICAgICAgICAgICBTTUFSVENBUkRfTEFTVEJJVF9ESVNBQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9MQVNUQklUX0VOQUJMRUQgICAgICAgICAgICAgICBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEUKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfU01CVVNfQWxpYXNlZF9EZWZpbmVzIEhBTCBTTUJVUyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFRCAgICAgIFNNQlVTX0RVQUxBRERSRVNTX0RJU0FCTEUKKyNkZWZpbmUgU01CVVNfRFVBTEFERFJFU1NfRU5BQkxFRCAgICAgICBTTUJVU19EVUFMQUREUkVTU19FTkFCTEUKKyNkZWZpbmUgU01CVVNfR0VORVJBTENBTExfRElTQUJMRUQgICAgICBTTUJVU19HRU5FUkFMQ0FMTF9ESVNBQkxFCisjZGVmaW5lIFNNQlVTX0dFTkVSQUxDQUxMX0VOQUJMRUQgICAgICAgU01CVVNfR0VORVJBTENBTExfRU5BQkxFCisjZGVmaW5lIFNNQlVTX05PU1RSRVRDSF9ESVNBQkxFRCAgICAgICAgU01CVVNfTk9TVFJFVENIX0RJU0FCTEUKKyNkZWZpbmUgU01CVVNfTk9TVFJFVENIX0VOQUJMRUQgICAgICAgICBTTUJVU19OT1NUUkVUQ0hfRU5BQkxFCisjZGVmaW5lIFNNQlVTX0FOQUxPR0ZJTFRFUl9FTkFCTEVEICAgICAgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRQorI2RlZmluZSBTTUJVU19BTkFMT0dGSUxURVJfRElTQUJMRUQgICAgIFNNQlVTX0FOQUxPR0ZJTFRFUl9ESVNBQkxFCisjZGVmaW5lIFNNQlVTX1BFQ19ESVNBQkxFRCAgICAgICAgICAgICAgU01CVVNfUEVDX0RJU0FCTEUKKyNkZWZpbmUgU01CVVNfUEVDX0VOQUJMRUQgICAgICAgICAgICAgICBTTUJVU19QRUNfRU5BQkxFCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9TTEFWRV9MSVNURU4gICAgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1BJX0FsaWFzZWRfRGVmaW5lcyBIQUwgU1BJIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9USU1PREVfRElTQUJMRUQgICAgICAgICAgICAgU1BJX1RJTU9ERV9ESVNBQkxFCisjZGVmaW5lIFNQSV9USU1PREVfRU5BQkxFRCAgICAgICAgICAgICAgU1BJX1RJTU9ERV9FTkFCTEUKKworI2RlZmluZSBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRUQgICAgIFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFCisjZGVmaW5lIFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEVEICAgICAgU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRQorCisjZGVmaW5lIFNQSV9OU1NfUFVMU0VfRElTQUJMRUQgICAgICAgICAgU1BJX05TU19QVUxTRV9ESVNBQkxFCisjZGVmaW5lIFNQSV9OU1NfUFVMU0VfRU5BQkxFRCAgICAgICAgICAgU1BJX05TU19QVUxTRV9FTkFCTEUKKworI2lmIGRlZmluZWQoU1RNMzJINykKKworICNkZWZpbmUgU1BJX0ZMQUdfVFhFICAgICAgICAgICAgICAgICAgICBTUElfRkxBR19UWFAKKyAjZGVmaW5lIFNQSV9GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgU1BJX0ZMQUdfUlhQCisKKyAjZGVmaW5lIFNQSV9JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgU1BJX0lUX1RYUAorICNkZWZpbmUgU1BJX0lUX1JYTkUgICAgICAgICAgICAgICAgICAgICBTUElfSVRfUlhQCisKKyAjZGVmaW5lIFNQSV9GUkxWTF9FTVBUWSAgICAgICAgICAgICAgICAgU1BJX1JYX0ZJRk9fMFBBQ0tFVAorICNkZWZpbmUgU1BJX0ZSTFZMX1FVQVJURVJfRlVMTCAgICAgICAgICBTUElfUlhfRklGT18xUEFDS0VUCisgI2RlZmluZSBTUElfRlJMVkxfSEFMRl9GVUxMICAgICAgICAgICAgIFNQSV9SWF9GSUZPXzJQQUNLRVQKKyAjZGVmaW5lIFNQSV9GUkxWTF9GVUxMICAgICAgICAgICAgICAgICAgU1BJX1JYX0ZJRk9fM1BBQ0tFVAorCisjZW5kaWYgLyogU1RNMzJINyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9USU1fQWxpYXNlZF9EZWZpbmVzIEhBTCBUSU0gQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0NFUl9DQ3hFX01BU0sgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0N4RV9NQVNLCisjZGVmaW5lIENDRVJfQ0N4TkVfTUFTSyAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDeE5FX01BU0sKKworI2RlZmluZSBUSU1fRE1BQmFzZV9DUjEgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DUjEKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ1IyICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ1IyCisjZGVmaW5lIFRJTV9ETUFCYXNlX1NNQ1IgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX1NNQ1IKKyNkZWZpbmUgVElNX0RNQUJhc2VfRElFUiAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfRElFUgorI2RlZmluZSBUSU1fRE1BQmFzZV9TUiAgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9TUgorI2RlZmluZSBUSU1fRE1BQmFzZV9FR1IgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9FR1IKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NNUjEgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NNUjEKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NNUjIgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NNUjIKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NFUiAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NFUgorI2RlZmluZSBUSU1fRE1BQmFzZV9DTlQgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DTlQKKyNkZWZpbmUgVElNX0RNQUJhc2VfUFNDICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfUFNDCisjZGVmaW5lIFRJTV9ETUFCYXNlX0FSUiAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0FSUgorI2RlZmluZSBUSU1fRE1BQmFzZV9SQ1IgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9SQ1IKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSMSAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NSMQorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1IyICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ1IyCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjMgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDUjMKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSNCAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NSNAorI2RlZmluZSBUSU1fRE1BQmFzZV9CRFRSICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9CRFRSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0RDUiAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0RDUgorI2RlZmluZSBUSU1fRE1BQmFzZV9ETUFSICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9ETUFSCisjZGVmaW5lIFRJTV9ETUFCYXNlX09SMSAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX09SMQorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ01SMyAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ01SMworI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1I1ICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ1I1CisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjYgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDUjYKKyNkZWZpbmUgVElNX0RNQUJhc2VfT1IyICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfT1IyCisjZGVmaW5lIFRJTV9ETUFCYXNlX09SMyAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX09SMworI2RlZmluZSBUSU1fRE1BQmFzZV9PUiAgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9PUgorCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9VcGRhdGUgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9VUERBVEUKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDMSAgICAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX0NDMQorI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ0MyICAgICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfQ0MyCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DQzMgICAgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9DQzMKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDNCAgICAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX0NDNAorI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ09NICAgICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfQ09NCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9UcmlnZ2VyICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9UUklHR0VSCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9CcmVhayAgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9CUkVBSworI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQnJlYWsyICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsyCisKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzFUcmFuc2ZlciAgICAgVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUgorI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMlRyYW5zZmVycyAgICBUSU1fRE1BQlVSU1RMRU5HVEhfMlRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfM1RyYW5zZmVycyAgICBUSU1fRE1BQlVSU1RMRU5HVEhfM1RSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfNFRyYW5zZmVycyAgICBUSU1fRE1BQlVSU1RMRU5HVEhfNFRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfNVRyYW5zZmVycyAgICBUSU1fRE1BQlVSU1RMRU5HVEhfNVRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfNlRyYW5zZmVycyAgICBUSU1fRE1BQlVSU1RMRU5HVEhfNlRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfN1RyYW5zZmVycyAgICBUSU1fRE1BQlVSU1RMRU5HVEhfN1RSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfOFRyYW5zZmVycyAgICBUSU1fRE1BQlVSU1RMRU5HVEhfOFRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfOVRyYW5zZmVycyAgICBUSU1fRE1BQlVSU1RMRU5HVEhfOVRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTBUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTBUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzExVHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzExVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xMlRyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xMlRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTNUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTNUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzE0VHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzE0VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xNVRyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xNVRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTZUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTZUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzE3VHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzE3VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xOFRyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xOFRSQU5TRkVSUworCisjaWYgZGVmaW5lZChTVE0zMkwwKQorI2RlZmluZSBUSU0yMl9USTFfR1BJTzEgICBUSU0yMl9USTFfR1BJTworI2RlZmluZSBUSU0yMl9USTFfR1BJTzIgICBUSU0yMl9USTFfR1BJTworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMpCisjZGVmaW5lIElTX1RJTV9IQUxMX0lOVEVSRkFDRV9JTlNUQU5DRSAgIElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVFNDX0FsaWFzZWRfRGVmaW5lcyBIQUwgVFNDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19TWU5DX1BPTF9GQUxMICAgICAgICBUU0NfU1lOQ19QT0xBUklUWV9GQUxMSU5HCisjZGVmaW5lIFRTQ19TWU5DX1BPTF9SSVNFX0hJR0ggICBUU0NfU1lOQ19QT0xBUklUWV9SSVNJTkcKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1VBUlRfQWxpYXNlZF9EZWZpbmVzIEhBTCBVQVJUIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfT05FQklUX1NBTVBMSU5HX0RJU0FCTEVEICAgVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisjZGVmaW5lIFVBUlRfT05FQklUX1NBTVBMSU5HX0VOQUJMRUQgICAgVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKyNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFRCAgICBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKyNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEVEICAgICBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRQorCisjZGVmaW5lIF9fSEFMX1VBUlRfT05FQklUX0VOQUJMRSAgICAgICAgX19IQUxfVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKyNkZWZpbmUgX19IQUxfVUFSVF9PTkVCSVRfRElTQUJMRSAgICAgICBfX0hBTF9VQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKworI2RlZmluZSBfX0RJVl9TQU1QTElORzE2ICAgICAgICAgICAgICAgIFVBUlRfRElWX1NBTVBMSU5HMTYKKyNkZWZpbmUgX19ESVZNQU5UX1NBTVBMSU5HMTYgICAgICAgICAgICBVQVJUX0RJVk1BTlRfU0FNUExJTkcxNgorI2RlZmluZSBfX0RJVkZSQVFfU0FNUExJTkcxNiAgICAgICAgICAgIFVBUlRfRElWRlJBUV9TQU1QTElORzE2CisjZGVmaW5lIF9fVUFSVF9CUlJfU0FNUExJTkcxNiAgICAgICAgICAgVUFSVF9CUlJfU0FNUExJTkcxNgorCisjZGVmaW5lIF9fRElWX1NBTVBMSU5HOCAgICAgICAgICAgICAgICAgVUFSVF9ESVZfU0FNUExJTkc4CisjZGVmaW5lIF9fRElWTUFOVF9TQU1QTElORzggICAgICAgICAgICAgVUFSVF9ESVZNQU5UX1NBTVBMSU5HOAorI2RlZmluZSBfX0RJVkZSQVFfU0FNUExJTkc4ICAgICAgICAgICAgIFVBUlRfRElWRlJBUV9TQU1QTElORzgKKyNkZWZpbmUgX19VQVJUX0JSUl9TQU1QTElORzggICAgICAgICAgICBVQVJUX0JSUl9TQU1QTElORzgKKworI2RlZmluZSBfX0RJVl9MUFVBUlQgICAgICAgICAgICAgICAgICAgIFVBUlRfRElWX0xQVUFSVAorCisjZGVmaW5lIFVBUlRfV0FLRVVQTUVUSE9ERV9JRExFTElORSAgICAgVUFSVF9XQUtFVVBNRVRIT0RfSURMRUxJTkUKKyNkZWZpbmUgVUFSVF9XQUtFVVBNRVRIT0RFX0FERFJFU1NNQVJLICBVQVJUX1dBS0VVUE1FVEhPRF9BRERSRVNTTUFSSworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1VTQVJUX0FsaWFzZWRfRGVmaW5lcyBIQUwgVVNBUlQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBVU0FSVF9DTE9DS19ESVNBQkxFRCAgICAgICAgICAgIFVTQVJUX0NMT0NLX0RJU0FCTEUKKyNkZWZpbmUgVVNBUlRfQ0xPQ0tfRU5BQkxFRCAgICAgICAgICAgICBVU0FSVF9DTE9DS19FTkFCTEUKKworI2RlZmluZSBVU0FSVE5BQ0tfRU5BQkxFRCAgICAgICAgICAgICAgIFVTQVJUX05BQ0tfRU5BQkxFCisjZGVmaW5lIFVTQVJUTkFDS19ESVNBQkxFRCAgICAgICAgICAgICAgVVNBUlRfTkFDS19ESVNBQkxFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9XV0RHX0FsaWFzZWRfRGVmaW5lcyBIQUwgV1dERyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBDRlJfQkFTRSAgICAgICAgICAgICAgICAgICAgV1dER19DRlJfQkFTRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DQU5fQWxpYXNlZF9EZWZpbmVzIEhBTCBDQU4gQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0FOX0ZpbHRlckZJRk8wICAgICAgICAgICAgIENBTl9GSUxURVJfRklGTzAKKyNkZWZpbmUgQ0FOX0ZpbHRlckZJRk8xICAgICAgICAgICAgIENBTl9GSUxURVJfRklGTzEKKyNkZWZpbmUgQ0FOX0lUX1JRQ1AwICAgICAgICAgICAgICAgIENBTl9JVF9UTUUKKyNkZWZpbmUgQ0FOX0lUX1JRQ1AxICAgICAgICAgICAgICAgIENBTl9JVF9UTUUKKyNkZWZpbmUgQ0FOX0lUX1JRQ1AyICAgICAgICAgICAgICAgIENBTl9JVF9UTUUKKyNkZWZpbmUgSU5BS19USU1FT1VUICAgICAgICAgICAgICAgIENBTl9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIFNMQUtfVElNRU9VVCAgICAgICAgICAgICAgICBDQU5fVElNRU9VVF9WQUxVRQorI2RlZmluZSBDQU5fVFhTVEFUVVNfRkFJTEVEICAgICAgICAgKCh1aW50OF90KTB4MDBVKQorI2RlZmluZSBDQU5fVFhTVEFUVVNfT0sgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSBDQU5fVFhTVEFUVVNfUEVORElORyAgICAgICAgKCh1aW50OF90KTB4MDJVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FVEhfQWxpYXNlZF9EZWZpbmVzIEhBTCBFVEggQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBWTEFOX1RBRyAgICAgICAgICAgICAgICBFVEhfVkxBTl9UQUcKKyNkZWZpbmUgTUlOX0VUSF9QQVlMT0FEICAgICAgICAgRVRIX01JTl9FVEhfUEFZTE9BRAorI2RlZmluZSBNQVhfRVRIX1BBWUxPQUQgICAgICAgICBFVEhfTUFYX0VUSF9QQVlMT0FECisjZGVmaW5lIEpVTUJPX0ZSQU1FX1BBWUxPQUQgICAgIEVUSF9KVU1CT19GUkFNRV9QQVlMT0FECisjZGVmaW5lIE1BQ01JSUFSX0NSX01BU0sgICAgICAgIEVUSF9NQUNNSUlBUl9DUl9NQVNLCisjZGVmaW5lIE1BQ0NSX0NMRUFSX01BU0sgICAgICAgIEVUSF9NQUNDUl9DTEVBUl9NQVNLCisjZGVmaW5lIE1BQ0ZDUl9DTEVBUl9NQVNLICAgICAgIEVUSF9NQUNGQ1JfQ0xFQVJfTUFTSworI2RlZmluZSBETUFPTVJfQ0xFQVJfTUFTSyAgICAgICBFVEhfRE1BT01SX0NMRUFSX01BU0sKKworI2RlZmluZSBFVEhfTU1DQ1IgICAgICAgICAgICAgIDB4MDAwMDAxMDBVCisjZGVmaW5lIEVUSF9NTUNSSVIgICAgICAgICAgICAgMHgwMDAwMDEwNFUKKyNkZWZpbmUgRVRIX01NQ1RJUiAgICAgICAgICAgICAweDAwMDAwMTA4VQorI2RlZmluZSBFVEhfTU1DUklNUiAgICAgICAgICAgIDB4MDAwMDAxMENVCisjZGVmaW5lIEVUSF9NTUNUSU1SICAgICAgICAgICAgMHgwMDAwMDExMFUKKyNkZWZpbmUgRVRIX01NQ1RHRlNDQ1IgICAgICAgICAweDAwMDAwMTRDVQorI2RlZmluZSBFVEhfTU1DVEdGTVNDQ1IgICAgICAgIDB4MDAwMDAxNTBVCisjZGVmaW5lIEVUSF9NTUNUR0ZDUiAgICAgICAgICAgMHgwMDAwMDE2OFUKKyNkZWZpbmUgRVRIX01NQ1JGQ0VDUiAgICAgICAgICAweDAwMDAwMTk0VQorI2RlZmluZSBFVEhfTU1DUkZBRUNSICAgICAgICAgIDB4MDAwMDAxOThVCisjZGVmaW5lIEVUSF9NTUNSR1VGQ1IgICAgICAgICAgMHgwMDAwMDFDNFUKKworI2RlZmluZSBFVEhfTUFDX1RYRklGT19GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwVSAgLyogVHggRklGTyBmdWxsICovCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPTk9UX0VNUFRZICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDBVICAvKiBUeCBGSUZPIG5vdCBlbXB0eSAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19XUklURV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwVSAgLyogVHggRklGTyB3cml0ZSBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9fSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IElkbGUgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFUgIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IFJlYWQgKHRyYW5zZmVycmluZyBkYXRhIHRvIHRoZSBNQUMgdHJhbnNtaXR0ZXIpICovCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1dBSVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBVICAvKiBUeCBGSUZPIHJlYWQgc3RhdHVzOiBXYWl0aW5nIGZvciBUeFN0YXR1cyBmcm9tIE1BQyB0cmFuc21pdHRlciAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19XUklUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzAwMDAwVSAgLyogVHggRklGTyByZWFkIHN0YXR1czogV3JpdGluZyB0aGUgcmVjZWl2ZWQgVHhTdGF0dXMgb3IgZmx1c2hpbmcgdGhlIFR4RklGTyAqLworI2RlZmluZSBFVEhfTUFDX1RSQU5TTUlTU0lPTl9QQVVTRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwVSAgLyogTUFDIHRyYW5zbWl0dGVyIGluIHBhdXNlICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfSURMRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogSWRsZSAqLworI2RlZmluZSBFVEhfTUFDX1RSQU5TTUlURlJBTUVDT05UUk9MTEVSX1dBSVRJTkcgICAgICAgICAweDAwMDIwMDAwVSAgLyogTUFDIHRyYW5zbWl0IGZyYW1lIGNvbnRyb2xsZXI6IFdhaXRpbmcgZm9yIFN0YXR1cyBvZiBwcmV2aW91cyBmcmFtZSBvciBJRkcvYmFja29mZiBwZXJpb2QgdG8gYmUgb3ZlciAqLworI2RlZmluZSBFVEhfTUFDX1RSQU5TTUlURlJBTUVDT05UUk9MTEVSX0dFTlJBVElOR19QQ0YgICAweDAwMDQwMDAwVSAgLyogTUFDIHRyYW5zbWl0IGZyYW1lIGNvbnRyb2xsZXI6IEdlbmVyYXRpbmcgYW5kIHRyYW5zbWl0dGluZyBhIFBhdXNlIGNvbnRyb2wgZnJhbWUgKGluIGZ1bGwgZHVwbGV4IG1vZGUpICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfVFJBTlNGRVJSSU5HICAgIDB4MDAwNjAwMDBVICAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogVHJhbnNmZXJyaW5nIGlucHV0IGZyYW1lIGZvciB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgRVRIX01BQ19NSUlfVFJBTlNNSVRfQUNUSVZFICAgICAgICAgICAweDAwMDEwMDAwVSAgLyogTUFDIE1JSSB0cmFuc21pdCBlbmdpbmUgYWN0aXZlICovCisjZGVmaW5lIEVUSF9NQUNfUlhGSUZPX0VNUFRZICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qIFJ4IEZJRk8gZmlsbCBsZXZlbDogZW1wdHkgKi8KKyNkZWZpbmUgRVRIX01BQ19SWEZJRk9fQkVMT1dfVEhSRVNIT0xEICAgICAgICAweDAwMDAwMTAwVSAgLyogUnggRklGTyBmaWxsIGxldmVsOiBmaWxsLWxldmVsIGJlbG93IGZsb3ctY29udHJvbCBkZS1hY3RpdmF0ZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRVRIX01BQ19SWEZJRk9fQUJPVkVfVEhSRVNIT0xEICAgICAgICAweDAwMDAwMjAwVSAgLyogUnggRklGTyBmaWxsIGxldmVsOiBmaWxsLWxldmVsIGFib3ZlIGZsb3ctY29udHJvbCBhY3RpdmF0ZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRVRIX01BQ19SWEZJRk9fRlVMTCAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwVSAgLyogUnggRklGTyBmaWxsIGxldmVsOiBmdWxsICovCisjaWYgZGVmaW5lZChTVE0zMkYxKQorI2Vsc2UKKyNkZWZpbmUgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9JRExFICAgICAgICAgICAweDAwMDAwMDAwVSAgLyogUnggRklGTyByZWFkIGNvbnRyb2xsZXIgSURMRSBzdGF0ZSAqLworI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX1JFQURJTkdfREFUQSAgIDB4MDAwMDAwMjBVICAvKiBSeCBGSUZPIHJlYWQgY29udHJvbGxlciBSZWFkaW5nIGZyYW1lIGRhdGEgKi8KKyNkZWZpbmUgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9SRUFESU5HX1NUQVRVUyAweDAwMDAwMDQwVSAgLyogUnggRklGTyByZWFkIGNvbnRyb2xsZXIgUmVhZGluZyBmcmFtZSBzdGF0dXMgKG9yIHRpbWUtc3RhbXApICovCisjZW5kaWYKKyNkZWZpbmUgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9GTFVTSElORyAgICAgICAweDAwMDAwMDYwVSAgLyogUnggRklGTyByZWFkIGNvbnRyb2xsZXIgRmx1c2hpbmcgdGhlIGZyYW1lIGRhdGEgYW5kIHN0YXR1cyAqLworI2RlZmluZSBFVEhfTUFDX1JYRklGT19XUklURV9BQ1RJVkUgICAgICAgICAgIDB4MDAwMDAwMTBVICAvKiBSeCBGSUZPIHdyaXRlIGNvbnRyb2xsZXIgYWN0aXZlICovCisjZGVmaW5lIEVUSF9NQUNfU01BTExfRklGT19OT1RBQ1RJVkUgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qIE1BQyBzbWFsbCBGSUZPIHJlYWQgLyB3cml0ZSBjb250cm9sbGVycyBub3QgYWN0aXZlICovCisjZGVmaW5lIEVUSF9NQUNfU01BTExfRklGT19SRUFEX0FDVElWRSAgICAgICAgMHgwMDAwMDAwMlUgIC8qIE1BQyBzbWFsbCBGSUZPIHJlYWQgY29udHJvbGxlciBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX1dSSVRFX0FDVElWRSAgICAgICAweDAwMDAwMDA0VSAgLyogTUFDIHNtYWxsIEZJRk8gd3JpdGUgY29udHJvbGxlciBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX1JXX0FDVElWRSAgICAgICAgICAweDAwMDAwMDA2VSAgLyogTUFDIHNtYWxsIEZJRk8gcmVhZCAvIHdyaXRlIGNvbnRyb2xsZXJzIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX01JSV9SRUNFSVZFX1BST1RPQ09MX0FDVElWRSAgIDB4MDAwMDAwMDFVICAvKiBNQUMgTUlJIHJlY2VpdmUgcHJvdG9jb2wgZW5naW5lIGFjdGl2ZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9EQ01JX0FsaWFzZWRfRGVmaW5lcyBIQUwgRENNSSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfRENNSV9FUlJPUl9PVkYgICAgICBIQUxfRENNSV9FUlJPUl9PVlIKKyNkZWZpbmUgRENNSV9JVF9PVkYgICAgICAgICAgICAgRENNSV9JVF9PVlIKKyNkZWZpbmUgRENNSV9GTEFHX09WRlJJICAgICAgICAgRENNSV9GTEFHX09WUlJJCisjZGVmaW5lIERDTUlfRkxBR19PVkZNSSAgICAgICAgIERDTUlfRkxBR19PVlJNSQorCisjZGVmaW5lIEhBTF9EQ01JX0NvbmZpZ0NST1AgICAgIEhBTF9EQ01JX0NvbmZpZ0Nyb3AKKyNkZWZpbmUgSEFMX0RDTUlfRW5hYmxlQ1JPUCAgICAgSEFMX0RDTUlfRW5hYmxlQ3JvcAorI2RlZmluZSBIQUxfRENNSV9EaXNhYmxlQ1JPUCAgICBIQUxfRENNSV9EaXNhYmxlQ3JvcAorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJGNDI3eHgpIHx8IGRlZmluZWQoU1RNMzJGNDM3eHgpIFwKKyAgfHwgZGVmaW5lZChTVE0zMkY0Mjl4eCkgfHwgZGVmaW5lZChTVE0zMkY0Mzl4eCkgfHwgZGVmaW5lZChTVE0zMkY0Njl4eCkgfHwgZGVmaW5lZChTVE0zMkY0Nzl4eCkgXAorICB8fCBkZWZpbmVkKFNUTTMySDcpCisvKiogQGRlZmdyb3VwIEhBTF9ETUEyRF9BbGlhc2VkX0RlZmluZXMgSEFMIERNQTJEIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIERNQTJEX0FSR0I4ODg4ICAgICAgICAgIERNQTJEX09VVFBVVF9BUkdCODg4OAorI2RlZmluZSBETUEyRF9SR0I4ODggICAgICAgICAgICBETUEyRF9PVVRQVVRfUkdCODg4CisjZGVmaW5lIERNQTJEX1JHQjU2NSAgICAgICAgICAgIERNQTJEX09VVFBVVF9SR0I1NjUKKyNkZWZpbmUgRE1BMkRfQVJHQjE1NTUgICAgICAgICAgRE1BMkRfT1VUUFVUX0FSR0IxNTU1CisjZGVmaW5lIERNQTJEX0FSR0I0NDQ0ICAgICAgICAgIERNQTJEX09VVFBVVF9BUkdCNDQ0NAorCisjZGVmaW5lIENNX0FSR0I4ODg4ICAgICAgICAgICAgIERNQTJEX0lOUFVUX0FSR0I4ODg4CisjZGVmaW5lIENNX1JHQjg4OCAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX1JHQjg4OAorI2RlZmluZSBDTV9SR0I1NjUgICAgICAgICAgICAgICBETUEyRF9JTlBVVF9SR0I1NjUKKyNkZWZpbmUgQ01fQVJHQjE1NTUgICAgICAgICAgICAgRE1BMkRfSU5QVVRfQVJHQjE1NTUKKyNkZWZpbmUgQ01fQVJHQjQ0NDQgICAgICAgICAgICAgRE1BMkRfSU5QVVRfQVJHQjQ0NDQKKyNkZWZpbmUgQ01fTDggICAgICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfTDgKKyNkZWZpbmUgQ01fQUw0NCAgICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfQUw0NAorI2RlZmluZSBDTV9BTDg4ICAgICAgICAgICAgICAgICBETUEyRF9JTlBVVF9BTDg4CisjZGVmaW5lIENNX0w0ICAgICAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX0w0CisjZGVmaW5lIENNX0E4ICAgICAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX0E4CisjZGVmaW5lIENNX0E0ICAgICAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX0E0CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmICAvKiBTVE0zMkw0IHx8ICBTVE0zMkY3IHx8ICBTVE0zMkY0IHx8ICBTVE0zMkg3ICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BQUF9BbGlhc2VkX0RlZmluZXMgSEFMIFBQUCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9DUllQX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBDUllQIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0NSWVBfQ29tcHV0YXRpb25DcGx0Q2FsbGJhY2sgICAgIEhBTF9DUllQRXhfQ29tcHV0YXRpb25DcGx0Q2FsbGJhY2sKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0hBU0hfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIEhBU0ggQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfSEFTSF9TVEFURVR5cGVEZWYgICAgICAgIEhBTF9IQVNIX1N0YXRlVHlwZURlZgorI2RlZmluZSBIQUxfSEFTSFBoYXNlVHlwZURlZiAgICAgICAgIEhBTF9IQVNIX1BoYXNlVHlwZURlZgorI2RlZmluZSBIQUxfSE1BQ19NRDVfRmluaXNoICAgICAgICAgIEhBTF9IQVNIX01ENV9GaW5pc2gKKyNkZWZpbmUgSEFMX0hNQUNfU0hBMV9GaW5pc2ggICAgICAgICBIQUxfSEFTSF9TSEExX0ZpbmlzaAorI2RlZmluZSBIQUxfSE1BQ19TSEEyMjRfRmluaXNoICAgICAgIEhBTF9IQVNIX1NIQTIyNF9GaW5pc2gKKyNkZWZpbmUgSEFMX0hNQUNfU0hBMjU2X0ZpbmlzaCAgICAgICBIQUxfSEFTSF9TSEEyNTZfRmluaXNoCisKKy8qSEFTSCBBbGdvcml0aG0gU2VsZWN0aW9uKi8KKworI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fU0hBMSAgICAgIEhBU0hfQUxHT1NFTEVDVElPTl9TSEExCisjZGVmaW5lIEhBU0hfQWxnb1NlbGVjdGlvbl9TSEEyMjQgICAgSEFTSF9BTEdPU0VMRUNUSU9OX1NIQTIyNAorI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fU0hBMjU2ICAgIEhBU0hfQUxHT1NFTEVDVElPTl9TSEEyNTYKKyNkZWZpbmUgSEFTSF9BbGdvU2VsZWN0aW9uX01ENSAgICAgICBIQVNIX0FMR09TRUxFQ1RJT05fTUQ1CisKKyNkZWZpbmUgSEFTSF9BbGdvTW9kZV9IQVNIICAgICAgICAgSEFTSF9BTEdPTU9ERV9IQVNICisjZGVmaW5lIEhBU0hfQWxnb01vZGVfSE1BQyAgICAgICAgIEhBU0hfQUxHT01PREVfSE1BQworCisjZGVmaW5lIEhBU0hfSE1BQ0tleVR5cGVfU2hvcnRLZXkgIEhBU0hfSE1BQ19LRVlUWVBFX1NIT1JUS0VZCisjZGVmaW5lIEhBU0hfSE1BQ0tleVR5cGVfTG9uZ0tleSAgIEhBU0hfSE1BQ19LRVlUWVBFX0xPTkdLRVkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBHZW5lcmljIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0VuYWJsZURCR1NsZWVwTW9kZSBIQUxfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZQorI2RlZmluZSBIQUxfRGlzYWJsZURCR1NsZWVwTW9kZSBIQUxfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUKKyNkZWZpbmUgSEFMX0VuYWJsZURCR1N0b3BNb2RlIEhBTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUKKyNkZWZpbmUgSEFMX0Rpc2FibGVEQkdTdG9wTW9kZSBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdG9wTW9kZQorI2RlZmluZSBIQUxfRW5hYmxlREJHU3RhbmRieU1vZGUgSEFMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZQorI2RlZmluZSBIQUxfRGlzYWJsZURCR1N0YW5kYnlNb2RlIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlCisjZGVmaW5lIEhBTF9EQkdfTG93UG93ZXJDb25maWcoUGVyaXBoLCBjbWQpICgoKGNtZCk9PUVOQUJMRSk/IEhBTF9EQkdNQ1VfREJHX0VuYWJsZUxvd1Bvd2VyQ29uZmlnKFBlcmlwaCkgOiBIQUxfREJHTUNVX0RCR19EaXNhYmxlTG93UG93ZXJDb25maWcoUGVyaXBoKSkKKyNkZWZpbmUgSEFMX1ZSRUZJTlRfT3V0cHV0U2VsZWN0ICBIQUxfU1lTQ0ZHX1ZSRUZJTlRfT3V0cHV0U2VsZWN0CisjZGVmaW5lIEhBTF9Mb2NrX0NtZChjbWQpICgoKGNtZCk9PUVOQUJMRSkgPyBIQUxfU1lTQ0ZHX0VuYWJsZV9Mb2NrX1ZSRUZJTlQoKSA6IEhBTF9TWVNDRkdfRGlzYWJsZV9Mb2NrX1ZSRUZJTlQoKSkKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZWxzZQorI2RlZmluZSBIQUxfVlJFRklOVF9DbWQoY21kKSAoKChjbWQpPT1FTkFCTEUpPyBIQUxfU1lTQ0ZHX0VuYWJsZVZSRUZJTlQoKSA6IEhBTF9TWVNDRkdfRGlzYWJsZVZSRUZJTlQoKSkKKyNlbmRpZgorI2RlZmluZSBIQUxfQURDX0VuYWJsZUJ1ZmZlcl9DbWQoY21kKSAgKCgoY21kKT09RU5BQkxFKSA/IEhBTF9BRENFeF9FbmFibGVWUkVGSU5UKCkgOiBIQUxfQURDRXhfRGlzYWJsZVZSRUZJTlQoKSkKKyNkZWZpbmUgSEFMX0FEQ19FbmFibGVCdWZmZXJTZW5zb3JfQ21kKGNtZCkgKCgoY21kKT09RU5BQkxFKSA/ICBIQUxfQURDRXhfRW5hYmxlVlJFRklOVFRlbXBTZW5zb3IoKSA6IEhBTF9BRENFeF9EaXNhYmxlVlJFRklOVFRlbXBTZW5zb3IoKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0ZMQVNIX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBGTEFTSCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX0hhbGZQYWdlUHJvZ3JhbSAgICAgIEhBTF9GTEFTSEV4X0hhbGZQYWdlUHJvZ3JhbQorI2RlZmluZSBGTEFTSF9FbmFibGVSdW5Qb3dlckRvd24gICBIQUxfRkxBU0hFeF9FbmFibGVSdW5Qb3dlckRvd24KKyNkZWZpbmUgRkxBU0hfRGlzYWJsZVJ1blBvd2VyRG93biAgSEFMX0ZMQVNIRXhfRGlzYWJsZVJ1blBvd2VyRG93bgorI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9VbmxvY2sgICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX1VubG9jaworI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9Mb2NrICAgICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX0xvY2sKKyNkZWZpbmUgSEFMX0RBVEFfRUVQUk9NRXhfRXJhc2UgICAgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9FcmFzZQorI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9Qcm9ncmFtICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX1Byb2dyYW0KKworIC8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0kyQ19BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgSTJDIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0kyQ0V4X0FuYWxvZ0ZpbHRlcl9Db25maWcgICAgICAgICBIQUxfSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyCisjZGVmaW5lIEhBTF9JMkNFeF9EaWdpdGFsRmlsdGVyX0NvbmZpZyAgICAgICAgSEFMX0kyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIKKyNkZWZpbmUgSEFMX0ZNUEkyQ0V4X0FuYWxvZ0ZpbHRlcl9Db25maWcgICAgICBIQUxfRk1QSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyCisjZGVmaW5lIEhBTF9GTVBJMkNFeF9EaWdpdGFsRmlsdGVyX0NvbmZpZyAgICAgSEFMX0ZNUEkyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIKKworI2RlZmluZSBIQUxfSTJDRmFzdE1vZGVQbHVzQ29uZmlnKFNZU0NGR19JMkNGYXN0TW9kZVBsdXMsIGNtZCkgKCgoY21kKT09RU5BQkxFKT8gSEFMX0kyQ0V4X0VuYWJsZUZhc3RNb2RlUGx1cyhTWVNDRkdfSTJDRmFzdE1vZGVQbHVzKTogSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXMoU1lTQ0ZHX0kyQ0Zhc3RNb2RlUGx1cykpCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkwwKQorI2RlZmluZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUICBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQKKyNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9SZWNlaXZlX0lUICAgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQKKyNkZWZpbmUgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUICAgSEFMX0kyQ19TbGF2ZV9TZXFfVHJhbnNtaXRfSVQKKyNkZWZpbmUgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1JlY2VpdmVfSVQgICAgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9JVAorI2RlZmluZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1RyYW5zbWl0X0RNQSBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfRE1BCisjZGVmaW5lIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEgIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQQorI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfVHJhbnNtaXRfRE1BICBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9ETUEKKyNkZWZpbmUgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1JlY2VpdmVfRE1BICAgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9ETUEKKyNlbmRpZiAvKiBTVE0zMkg3IHx8IFNUTTMyRzAgfHwgU1RNMzJMMCAqLworIC8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BXUl9BbGlhc2VkIEhBTCBQV1IgQWxpYXNlZCBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9QV1JfUFZEQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSX0NvbmZpZ1BWRAorI2RlZmluZSBIQUxfUFdSX0Rpc2FibGVCa1VwUmVnICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVCa1VwUmVnCisjZGVmaW5lIEhBTF9QV1JfRGlzYWJsZUZsYXNoUG93ZXJEb3duICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZUZsYXNoUG93ZXJEb3duCisjZGVmaW5lIEhBTF9QV1JfRGlzYWJsZVZkZGlvMk1vbml0b3IgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVZkZGlvMk1vbml0b3IKKyNkZWZpbmUgSEFMX1BXUl9FbmFibGVCa1VwUmVnICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVCa1VwUmVnCisjZGVmaW5lIEhBTF9QV1JfRW5hYmxlRmxhc2hQb3dlckRvd24gICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlRmxhc2hQb3dlckRvd24KKyNkZWZpbmUgSEFMX1BXUl9FbmFibGVWZGRpbzJNb25pdG9yICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVWZGRpbzJNb25pdG9yCisjZGVmaW5lIEhBTF9QV1JfUFZEX1BWTV9JUlFIYW5kbGVyICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfUFZEX1BWTV9JUlFIYW5kbGVyCisjZGVmaW5lIEhBTF9QV1JfUFZETGV2ZWxDb25maWcgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSX0NvbmZpZ1BWRAorI2RlZmluZSBIQUxfUFdSX1ZkZGlvMk1vbml0b3JfSVJRSGFuZGxlciAgICAgICAgICAgICAgSEFMX1BXUkV4X1ZkZGlvMk1vbml0b3JfSVJRSGFuZGxlcgorI2RlZmluZSBIQUxfUFdSX1ZkZGlvMk1vbml0b3JDYWxsYmFjayAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X1ZkZGlvMk1vbml0b3JDYWxsYmFjaworI2RlZmluZSBIQUxfUFdSRXhfQWN0aXZhdGVPdmVyRHJpdmUgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZU92ZXJEcml2ZQorI2RlZmluZSBIQUxfUFdSRXhfRGVhY3RpdmF0ZU92ZXJEcml2ZSAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVPdmVyRHJpdmUKKyNkZWZpbmUgSEFMX1BXUkV4X0Rpc2FibGVTREFEQ0FuYWxvZyAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlU0RBREMKKyNkZWZpbmUgSEFMX1BXUkV4X0VuYWJsZVNEQURDQW5hbG9nICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVTREFEQworI2RlZmluZSBIQUxfUFdSRXhfUFZNQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0NvbmZpZ1BWTQorCisjZGVmaW5lIFBXUl9NT0RFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfTk9STUFMCisjZGVmaW5lIFBXUl9NT0RFX0lUX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfSVRfUklTSU5HCisjZGVmaW5lIFBXUl9NT0RFX0lUX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfSVRfRkFMTElORworI2RlZmluZSBQV1JfTU9ERV9JVF9SSVNJTkdfRkFMTElORyAgICAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX0lUX1JJU0lOR19GQUxMSU5HCisjZGVmaW5lIFBXUl9NT0RFX0VWRU5UX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfRVZFTlRfUklTSU5HCisjZGVmaW5lIFBXUl9NT0RFX0VWRU5UX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfRVZFTlRfRkFMTElORworI2RlZmluZSBQV1JfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORyAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HCisKKyNkZWZpbmUgQ1JfT0ZGU0VUX0JCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9DUl9PRkZTRVRfQkIKKyNkZWZpbmUgQ1NSX09GRlNFVF9CQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9DU1JfT0ZGU0VUX0JCCisjZGVmaW5lIFBNT0RFX0JJVF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfQklUX05VTUJFUgorI2RlZmluZSBDUl9QTU9ERV9CQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JfVk9TX0JCCisKKyNkZWZpbmUgREJQX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCUF9CSVRfTlVNQkVSCisjZGVmaW5lIFBWREVfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVkRFX0JJVF9OVU1CRVIKKyNkZWZpbmUgUE1PREVfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNT0RFX0JJVF9OVU1CRVIKKyNkZWZpbmUgRVdVUF9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVXVVBfQklUX05VTUJFUgorI2RlZmluZSBGUERTX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBEU19CSVRfTlVNQkVSCisjZGVmaW5lIE9ERU5fQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPREVOX0JJVF9OVU1CRVIKKyNkZWZpbmUgT0RTV0VOX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9EU1dFTl9CSVRfTlVNQkVSCisjZGVmaW5lIE1STFZEU19CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUkxWRFNfQklUX05VTUJFUgorI2RlZmluZSBMUExWRFNfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBMVkRTX0JJVF9OVU1CRVIKKyNkZWZpbmUgQlJFX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSRV9CSVRfTlVNQkVSCisKKyNkZWZpbmUgUFdSX01PREVfRVZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9QVkRfTU9ERV9OT1JNQUwKKworIC8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQlVTX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBTTUJVUyBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9TTUJVU19TbGF2ZV9MaXN0ZW5fSVQgICAgICAgICAgSEFMX1NNQlVTX0VuYWJsZUxpc3Rlbl9JVAorI2RlZmluZSBIQUxfU01CVVNfU2xhdmVBZGRyQ2FsbGJhY2sgICAgICAgIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2sKKyNkZWZpbmUgSEFMX1NNQlVTX1NsYXZlTGlzdGVuQ3BsdENhbGxiYWNrICBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TUElfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFNQSSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9TUElfRmx1c2hSeEZpZm8gICAgICAgICAgICAgICAgSEFMX1NQSUV4X0ZsdXNoUnhGaWZvCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9USU1fQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFRJTSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9USU1fRE1BRGVsYXlQdWxzZUNwbHQgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlQ3BsdAorI2RlZmluZSBIQUxfVElNX0RNQUVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRE1BRXJyb3IKKyNkZWZpbmUgSEFMX1RJTV9ETUFDYXB0dXJlQ3BsdCAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RNQUNhcHR1cmVDcGx0CisjZGVmaW5lIEhBTF9USU1FeF9ETUFDb21tdXRhdGlvbkNwbHQgICAgICAgICAgICAgICAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdAorI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkwwKQorI2RlZmluZSBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb25pemF0aW9uICAgICAgICAgICAgICBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hybworI2RlZmluZSBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb25pemF0aW9uX0lUICAgICAgICAgICBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb19JVAorI2RlZmluZSBIQUxfVElNRXhfQ29tbXV0YXRpb25DYWxsYmFjayAgICAgICAgICAgICAgICAgICBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dGF0aW9uRXZlbnQgICAgICAgICAgICAgICAgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50CisjZGVmaW5lIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50X0lUICAgICAgICAgICAgIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9JVAorI2RlZmluZSBIQUxfVElNRXhfQ29uZmlnQ29tbXV0YXRpb25FdmVudF9ETUEgICAgICAgICAgICBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BCisjZW5kaWYgLyogU1RNMzJINyB8fCBTVE0zMkcwIHx8IFNUTTMyRjcgfHwgU1RNMzJGNCAgfHwgU1RNMzJMMCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVUFSVF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgVUFSVCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9VQVJUX1dha2V1cENhbGxiYWNrIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2sKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0xURENfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIExUREMgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfTFREQ19MaW5lRXZlbkNhbGxiYWNrIEhBTF9MVERDX0xpbmVFdmVudENhbGxiYWNrCisjZGVmaW5lIEhBTF9MVERDX1JlbGFvZCAgICAgICAgICAgSEFMX0xURENfUmVsb2FkCisjZGVmaW5lIEhBTF9MVERDX1N0cnVjdEluaXRGcm9tVmlkZW9Db25maWcgIEhBTF9MVERDRXhfU3RydWN0SW5pdEZyb21WaWRlb0NvbmZpZworI2RlZmluZSBIQUxfTFREQ19TdHJ1Y3RJbml0RnJvbUFkYXB0ZWRDb21tYW5kQ29uZmlnICBIQUxfTFREQ0V4X1N0cnVjdEluaXRGcm9tQWRhcHRlZENvbW1hbmRDb25maWcKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfUFBQX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBQUFAgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBIQUxfQUVTX0FsaWFzZWRfTWFjcm9zIEhBTCBDUllQIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQUVTX0lUX0NDICAgICAgICAgICAgICAgICAgICAgIENSWVBfSVRfQ0MKKyNkZWZpbmUgQUVTX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgIENSWVBfSVRfRVJSCisjZGVmaW5lIEFFU19GTEFHX0NDRiAgICAgICAgICAgICAgICAgICBDUllQX0ZMQUdfQ0NGCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9BbGlhc2VkX01hY3JvcyBIQUwgR2VuZXJpYyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX0dFVF9CT09UX01PREUgICAgICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX0dFVF9CT09UX01PREUKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRkxBU0ggICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfRkxBU0gKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfU1lTVEVNRkxBU0ggICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfU1lTVEVNRkxBU0gKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfU1JBTSAgICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfU1JBTQorI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9GTUMgICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GTUMKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRk1DX1NEUkFNICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfRk1DX1NEUkFNCisjZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX0ZTTUMgICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZTTUMKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfUVVBRFNQSSAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfUVVBRFNQSQorI2RlZmluZSBfX0hBTF9GTUNfQkFOSyAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19GTUNfQkFOSworI2RlZmluZSBfX0hBTF9HRVRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19HRVRfRkxBRworI2RlZmluZSBfX0hBTF9DTEVBUl9GTEFHICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1ZSRUZJTlRfT1VUX0VOQUJMRSAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1ZSRUZJTlRfT1VUX0VOQUJMRQorI2RlZmluZSBfX0hBTF9WUkVGSU5UX09VVF9ESVNBQkxFICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19WUkVGSU5UX09VVF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1NZU0NGR19TUkFNMl9XUlBfRU5BQkxFICAgICAgICAgX19IQUxfU1lTQ0ZHX1NSQU0yX1dSUF8wXzMxX0VOQUJMRQorCisjZGVmaW5lIFNZU0NGR19GTEFHX1ZSRUZfUkVBRFkgICAgICAgICAgICAgICAgU1lTQ0ZHX0ZMQUdfVlJFRklOVF9SRUFEWQorI2RlZmluZSBTWVNDRkdfRkxBR19SQzQ4ICAgICAgICAgICAgICAgICAgICAgIFJDQ19GTEFHX0hTSTQ4CisjZGVmaW5lIElTX1NZU0NGR19GQVNUTU9ERVBMVVNfQ09ORklHICAgICAgICAgSVNfSTJDX0ZBU1RNT0RFUExVUworI2RlZmluZSBVRkJfTU9ERV9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgIFVGQl9NT0RFX0JJVF9OVU1CRVIKKyNkZWZpbmUgQ01QX1BEX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICBDTVBfUERfQklUX05VTUJFUgorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FEQ19BbGlhc2VkX01hY3JvcyBIQUwgQURDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19BRENfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEUKKyNkZWZpbmUgX19BRENfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX0FEQ19FTkFCTElOR19DT05ESVRJT05TICAgICAgICAgICAgICAgICAgICBBRENfRU5BQkxJTkdfQ09ORElUSU9OUworI2RlZmluZSBfX0hBTF9BRENfRElTQUJMSU5HX0NPTkRJVElPTlMgICAgICAgICAgICAgICAgICAgQURDX0RJU0FCTElOR19DT05ESVRJT05TCisjZGVmaW5lIF9fSEFMX0FEQ19JU19FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSVNfRU5BQkxFCisjZGVmaW5lIF9fQURDX0lTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSVNfRU5BQkxFCisjZGVmaW5lIF9fSEFMX0FEQ19JU19TT0ZUV0FSRV9TVEFSVF9SRUdVTEFSICAgICAgICAgICAgICBBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUgorI2RlZmluZSBfX0hBTF9BRENfSVNfU09GVFdBUkVfU1RBUlRfSU5KRUNURUQgICAgICAgICAgICAgQURDX0lTX1NPRlRXQVJFX1NUQVJUX0lOSkVDVEVECisjZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUl9JTkpFQ1RFRCBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVJfSU5KRUNURUQKKyNkZWZpbmUgX19IQUxfQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSICAgICAgICAgIEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUgorI2RlZmluZSBfX0hBTF9BRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX0lOSkVDVEVEICAgICAgICAgQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19JTkpFQ1RFRAorI2RlZmluZSBfX0hBTF9BRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HICAgICAgICAgICAgICAgICAgQURDX0lTX0NPTlZFUlNJT05fT05HT0lORworI2RlZmluZSBfX0hBTF9BRENfQ0xFQVJfRVJST1JDT0RFICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERQorCisjZGVmaW5lIF9fSEFMX0FEQ19HRVRfUkVTT0xVVElPTiAgICAgICAgICAgICAgICAgICAgICAgICBBRENfR0VUX1JFU09MVVRJT04KKyNkZWZpbmUgX19IQUxfQURDX0pTUVJfUksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX1JLCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0FXRDFDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QxQ0hfU0hJRlQKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfQVdEMjNDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDIzQ1IKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfSU5KRUNUX0FVVE9fQ09OVkVSU0lPTiAgICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9BVVRPX0NPTlZFUlNJT04KKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfSU5KRUNUX0NPTlRFWFRfUVVFVUUgICAgICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9DT05URVhUX1FVRVVFCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0lOSkVDVF9ESVNDQ09OVElOVU9VUyAgICAgICAgICAgICBBRENfQ0ZHUl9JTkpFQ1RfRElTQ0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfUkVHX0RJU0NDT05USU5VT1VTICAgICAgICAgICAgICAgIEFEQ19DRkdSX1JFR19ESVNDQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9ESVNDT05USU5VT1VTX05VTSAgICAgICAgICAgICAgICAgQURDX0NGR1JfRElTQ09OVElOVU9VU19OVU0KKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfQVVUT1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FVVE9XQUlUCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0NPTlRJTlVPVVMgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9DT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX09WRVJSVU4gICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9PVkVSUlVOCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0RNQUNPTlRSRVEgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9ETUFDT05UUkVRCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0VYVFNFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9FWFRTRUxfU0VUCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSX0pFWFRTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9KRVhUU0VMX1NFVAorI2RlZmluZSBfX0hBTF9BRENfT0ZSX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX09GUl9DSEFOTkVMCisjZGVmaW5lIF9fSEFMX0FEQ19ESUZTRUxfQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgICAgICBBRENfRElGU0VMX0NIQU5ORUwKKyNkZWZpbmUgX19IQUxfQURDX0NBTEZBQ1RfRElGRl9TRVQgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DQUxGQUNUX0RJRkZfU0VUCisjZGVmaW5lIF9fSEFMX0FEQ19DQUxGQUNUX0RJRkZfR0VUICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0FMRkFDVF9ESUZGX0dFVAorI2RlZmluZSBfX0hBTF9BRENfVFJYX0hJR0hUSFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgQURDX1RSWF9ISUdIVEhSRVNIT0xECisKKyNkZWZpbmUgX19IQUxfQURDX09GRlNFVF9TSElGVF9SRVNPTFVUSU9OICAgICAgICAgICAgICAgIEFEQ19PRkZTRVRfU0hJRlRfUkVTT0xVVElPTgorI2RlZmluZSBfX0hBTF9BRENfQVdEMVRIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OICAgICAgICAgQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTgorI2RlZmluZSBfX0hBTF9BRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTiAgICAgICAgQURDX0FXRDIzVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04KKyNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DT01NT05fUkVHSVNURVIKKyNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9DQ1JfTVVMVEkgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DT01NT05fQ0NSX01VTFRJCisjZGVmaW5lIF9fSEFMX0FEQ19NVUxUSU1PREVfSVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICBBRENfTVVMVElNT0RFX0lTX0VOQUJMRQorI2RlZmluZSBfX0FEQ19NVUxUSU1PREVfSVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgQURDX01VTFRJTU9ERV9JU19FTkFCTEUKKyNkZWZpbmUgX19IQUxfQURDX05PTk1VTFRJTU9ERV9PUl9NVUxUSU1PREVNQVNURVIgICAgICAgIEFEQ19OT05NVUxUSU1PREVfT1JfTVVMVElNT0RFTUFTVEVSCisjZGVmaW5lIF9fSEFMX0FEQ19DT01NT05fQURDX09USEVSICAgICAgICAgICAgICAgICAgICAgICBBRENfQ09NTU9OX0FEQ19PVEhFUgorI2RlZmluZSBfX0hBTF9BRENfTVVMVElfU0xBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX01VTFRJX1NMQVZFCisKKyNkZWZpbmUgX19IQUxfQURDX1NRUjFfTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxX0xfU0hJRlQKKyNkZWZpbmUgX19IQUxfQURDX0pTUVJfSkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pMX1NISUZUCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSX1JLX0pMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9SS19KTAorI2RlZmluZSBfX0hBTF9BRENfQ1IxX0RJU0NPTlRJTlVPVVNfTlVNICAgICAgICAgICAgICAgICAgQURDX0NSMV9ESVNDT05USU5VT1VTX05VTQorI2RlZmluZSBfX0hBTF9BRENfQ1IxX1NDQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9TQ0FOX1NFVAorI2RlZmluZSBfX0hBTF9BRENfQ09OVkNZQ0xFU19NQVhfUkFOR0UgICAgICAgICAgICAgICAgICAgQURDX0NPTlZDWUNMRVNfTUFYX1JBTkdFCisjZGVmaW5lIF9fSEFMX0FEQ19DTE9DS19QUkVTQ0FMRVJfUkFOR0UgICAgICAgICAgICAgICAgICBBRENfQ0xPQ0tfUFJFU0NBTEVSX1JBTkdFCisjZGVmaW5lIF9fSEFMX0FEQ19HRVRfQ0xPQ0tfUFJFU0NBTEVSICAgICAgICAgICAgICAgICAgICBBRENfR0VUX0NMT0NLX1BSRVNDQUxFUgorCisjZGVmaW5lIF9fSEFMX0FEQ19TUVIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMQorI2RlZmluZSBfX0hBTF9BRENfU01QUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxCisjZGVmaW5lIF9fSEFMX0FEQ19TTVBSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjIKKyNkZWZpbmUgX19IQUxfQURDX1NRUjNfUksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIzX1JLCisjZGVmaW5lIF9fSEFMX0FEQ19TUVIyX1JLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMl9SSworI2RlZmluZSBfX0hBTF9BRENfU1FSMV9SSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfUksKKyNkZWZpbmUgX19IQUxfQURDX0NSMl9DT05USU5VT1VTICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjJfQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ1IxX0RJU0NPTlRJTlVPVVMgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9ESVNDT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DUjFfU0NBTkNPTlYgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX1NDQU5DT05WCisjZGVmaW5lIF9fSEFMX0FEQ19DUjJfRU9DU2VsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IyX0VPQ1NlbGVjdGlvbgorI2RlZmluZSBfX0hBTF9BRENfQ1IyX0RNQUNvbnRSZXEgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMl9ETUFDb250UmVxCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUgorCisjZGVmaW5lIF9fSEFMX0FEQ19DSFNFTFJfQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hTRUxSX0NIQU5ORUwKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX1JFR19ESVNDQ09OVElOVU9VUyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9SRUdfRElTQ0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0FVVE9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BVVRPT0ZGCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9BVVRPV0FJVCAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVVUT1dBSVQKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0NPTlRJTlVPVVMgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9DT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9PVkVSUlVOICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfT1ZFUlJVTgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfU0NBTkRJUiAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX1NDQU5ESVIKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0RNQUNPTlRSRVEgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9ETUFDT05UUkVRCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RBQ19BbGlhc2VkX01hY3JvcyBIQUwgREFDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfREhSMTJSMV9BTElHTkVNRU5UICAgICAgICAgICAgICAgICAgICAgICAgREFDX0RIUjEyUjFfQUxJR05NRU5UCisjZGVmaW5lIF9fSEFMX0RIUjEyUjJfQUxJR05FTUVOVCAgICAgICAgICAgICAgICAgICAgICAgIERBQ19ESFIxMlIyX0FMSUdOTUVOVAorI2RlZmluZSBfX0hBTF9ESFIxMlJEX0FMSUdORU1FTlQgICAgICAgICAgICAgICAgICAgICAgICBEQUNfREhSMTJSRF9BTElHTk1FTlQKKyNkZWZpbmUgSVNfREFDX0dFTkVSQVRFX1dBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfREFDX1dBVkUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfREJHTUNVX0FsaWFzZWRfTWFjcm9zIEhBTCBEQkdNQ1UgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTFfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0yX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTIKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTIKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTNfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0zX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNNF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU00CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU00CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU01X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTUKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNNV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTUKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTZfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNgorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU02X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNgorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNN19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU03CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTdfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU03CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU04X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTgKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNOF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTgKKworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNOV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU05CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTlfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU05CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xMF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xMF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEwCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xMV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xMV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTExCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xMl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMgorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEyCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xM19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xM19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEzCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xNF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xNF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE0CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9DQU4yX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0NBTjIKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfQ0FOMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0NBTjIKKworCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xNV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xNV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE1CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xNl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNgorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xNl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE2CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xN19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xN19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE3CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9SVENfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfUlRDCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1JUQ19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1JUQworI2lmIGRlZmluZWQoU1RNMzJINykKKyAgI2RlZmluZSBfX0hBTF9GUkVFWkVfV1dER19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9XV0RHMQorICAjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1dXREdfREJHTUNVIF9fSEFMX0RCR01DVV9VbkZyZWV6ZV9XV0RHMQorICAjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0lXREcxCisgICNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSVdER19EQkdNQ1UgX19IQUxfREJHTUNVX1VuRnJlZXplX0lXREcxCisjZWxzZQorICAjZGVmaW5lIF9fSEFMX0ZSRUVaRV9XV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1dXREcKKyAgI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9XV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfV1dERworICAjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0lXREcKKyAgI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9JV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSVdERworI2VuZGlmIC8qIFNUTTMySDcgKi8KKyNkZWZpbmUgX19IQUxfRlJFRVpFX0kyQzFfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMxX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSTJDMV9USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDMV9USU1FT1VUCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JMkMyX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfSTJDMl9USU1FT1VUCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0kyQzJfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzJfVElNRU9VVAorI2RlZmluZSBfX0hBTF9GUkVFWkVfSTJDM19USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzNfVElNRU9VVAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9JMkMzX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMzX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0NBTjFfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfQ0FOMQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9DQU4xX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfQ0FOMQorI2RlZmluZSBfX0hBTF9GUkVFWkVfTFBUSU0xX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0xQVElNMQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9MUFRJTTFfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9MUFRJTTEKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0xQVElNMl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9MUFRJTTIKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfTFBUSU0yX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0yCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9NYWNyb3MgSEFMIENPTVAgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMykKKyNkZWZpbmUgQ09NUF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfRU5BQkxFCisjZGVmaW5lIENPTVBfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0RJU0FCTEUKKyNkZWZpbmUgQ09NUF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfTE9DSworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/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/IEhBTF9SQ0NFeF9FbmFibGVIU0k0OF9WUkVGSU5UKCkgOiBIQUxfUkNDRXhfRGlzYWJsZUhTSTQ4X1ZSRUZJTlQoKSkKKworI2RlZmluZSBfX0FEQ19DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQURDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQURDX0NMS19FTkFCTEUgICAgICAgICAgIF9fSEFMX1JDQ19BRENfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FEQ19DTEtfU0xFRVBfRElTQUJMRSAgICBfX0hBTF9SQ0NfQURDX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQURDX0NMS19TTEVFUF9FTkFCTEUgICAgIF9fSEFMX1JDQ19BRENfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0FEQ19GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfQURDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQURDX1JFTEVBU0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19BRENfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FEQzFfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfQURDMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzFfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQURDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDMV9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19BREMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQURDMV9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19BREMxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BREMxX0NMS19TTEVFUF9FTkFCTEUgICAgX19IQUxfUkNDX0FEQzFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0FEQzFfQ0xLX1NMRUVQX0RJU0FCTEUgICBfX0hBTF9SQ0NfQURDMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FEQzJfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfQURDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzJfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQURDMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQURDM19DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUVTX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19BRVNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BRVNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FFU19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0FFU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUVTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUVTX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FFU19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ1JZUF9DTEtfU0xFRVBfRU5BQkxFICAgICAgX19IQUxfUkNDX0NSWVBfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NSWVBfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19DUllQX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQ1JZUF9DTEtfRU5BQkxFICBfX0hBTF9SQ0NfQ1JZUF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ1JZUF9DTEtfRElTQUJMRSAgX19IQUxfUkNDX0NSWVBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DUllQX0ZPUkNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19DUllQX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ1JZUF9SRUxFQVNFX1JFU0VUICBfX0hBTF9SQ0NfQ1JZUF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUZJT19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQUZJT19DTEtfRElTQUJMRQorI2RlZmluZSBfX0FGSU9fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQUZJT19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQUZJT19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUZJT19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FGSU9fUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUZJT19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUhCX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BSEJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUhCX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEIxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEIyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEIzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIzX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BUEIxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQVBCMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BUEIxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BUEIyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BUEIyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQVBCMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BUEIyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19CS1BfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0JLUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0JLUF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19CS1BfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0JLUF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQktQX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQktQX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0JLUF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0NBTjFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0FOMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NBTjFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQ0FOMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NBTjFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOX0NMS19ESVNBQkxFICAgICAgICAgX19IQUxfUkNDX0NBTjFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DQU5fQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQ0FOMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0FOX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX0NBTjFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19DQU5fUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfQ0FOMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0NBTjJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0FOMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0FOMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NBTjJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0VDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DRUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DRUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0VDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DT01QX0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfQ09NUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0NPTVBfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19DT01QX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DT01QX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfQ09NUF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NPTVBfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19DT01QX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DT01QX0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfQ09NUF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQ09NUF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0NPTVBfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DRUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NFQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NFQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DRUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0NSQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ1JDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ1JDX0NMS19FTkFCTEUgX19IQUxfUkNDX0NSQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ1JDX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DUkNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DUkNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ1JDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DUkNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NSQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NSQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DUkNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RBQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREFDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREFDX0NMS19FTkFCTEUgX19IQUxfUkNDX0RBQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fREFDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19EQUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19EQUNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfREFDX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19EQUMxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19EQUMxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREFDMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19EQUMxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19EQUMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19EQUMxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fREFDMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19EQUMxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19EQUMxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19EQUMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fREFDMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19EQUMxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19EQkdNQ1VfQ0xLX0VOQUJMRSAgICAgX19IQUxfUkNDX0RCR01DVV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fREJHTUNVX0NMS19ESVNBQkxFICAgICBfX0hBTF9SQ0NfREJHTUNVX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREJHTUNVX0ZPUkNFX1JFU0VUICAgIF9fSEFMX1JDQ19EQkdNQ1VfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19EQkdNQ1VfUkVMRUFTRV9SRVNFVCAgX19IQUxfUkNDX0RCR01DVV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fREZTRE1fQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0RGU0RNX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREZTRE1fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RGU0RNX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19ERlNETV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0RGU0RNX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0RGU0RNX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ERlNETV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfREZTRE1fRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19ERlNETV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19ERlNETV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RNQTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRE1BMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0RNQTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRE1BMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RNQTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RNQTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRE1BMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0RNQTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRE1BMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RNQTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRVRITUFDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRVRITUFDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0VUSE1BQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0VUSE1BQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19FVEhNQUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0VUSE1BQ1JYX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNSWF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1JYX0NMS19FTkFCTEUgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNUWF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRVRITUFDVFhfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNUWF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNUWF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRklSRVdBTExfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0ZJUkVXQUxMX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRklSRVdBTExfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRklSRVdBTExfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0ZMQVNIX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0ZMQVNIX0NMS19FTkFCTEUgX19IQUxfUkNDX0ZMQVNIX0NMS19FTkFCTEUKKyNkZWZpbmUgX19GTEFTSF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRkxBU0hfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19GTEFTSF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRkxBU0hfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0ZMQVNIX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRkxBU0hfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfRkxBU0hfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0ZMSVRGX0NMS19ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19GTElURl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0ZMSVRGX0NMS19FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19GTElURl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRkxJVEZfRk9SQ0VfUkVTRVQgICAgICAgX19IQUxfUkNDX0ZMSVRGX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRkxJVEZfUkVMRUFTRV9SRVNFVCAgICAgX19IQUxfUkNDX0ZMSVRGX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19GTElURl9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfRkxJVEZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0ZMSVRGX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19GTElURl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZNQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRk1DX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRk1DX0NMS19FTkFCTEUgX19IQUxfUkNDX0ZNQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fRk1DX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19GTUNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19GTUNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRk1DX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19GTUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0ZNQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0ZNQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19GTUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0ZTTUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0ZTTUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19GU01DX0NMS19FTkFCTEUgX19IQUxfUkNDX0ZTTUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9BX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPQV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9BX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPQV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPQV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPQV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0FfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9BX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0FfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0FfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9CX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPQl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9CX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPQl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPQl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPQl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0JfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9CX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0JfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0JfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9DX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9DX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0NfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9DX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0NfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0NfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9EX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPRF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9EX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPRF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPRF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPRF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0RfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9EX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0RfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0RfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9FX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPRV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9FX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPRV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPRV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPRV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0VfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9FX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0VfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0VfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9GX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPRl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9GX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPRl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0ZfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPRl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPRl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0ZfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9GX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0ZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0ZfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9HX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPR19DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9HX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPR19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPR19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPR19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0dfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9HX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0dfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0dfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9IX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPSF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9IX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPSF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0hfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPSF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0hfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9IX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0hfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0hfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0kyQzFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0kyQzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMxX0NMS19FTkFCTEUgX19IQUxfUkNDX0kyQzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0kyQzFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0kyQzFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0kyQzFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0kyQzFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0kyQzFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19JMkMxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0kyQzFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0kyQzJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0kyQzJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMyX0NMS19FTkFCTEUgX19IQUxfUkNDX0kyQzJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0kyQzJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0kyQzJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMyX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0kyQzJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0kyQzJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0kyQzJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19JMkMyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0kyQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0kyQzNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0kyQzNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMzX0NMS19FTkFCTEUgX19IQUxfUkNDX0kyQzNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0kyQzNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0kyQzNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMzX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0kyQzNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0kyQzNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0kyQzNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19JMkMzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0kyQzNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0xDRF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTENEX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTENEX0NMS19FTkFCTEUgX19IQUxfUkNDX0xDRF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fTENEX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19MQ0RfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MQ0RfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTENEX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19MQ0RfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xDRF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xDRF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19MQ0RfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0xQVElNMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTFBUSU0xX0NMS19FTkFCTEUgX19IQUxfUkNDX0xQVElNMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fTFBUSU0xX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MUFRJTTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19MUFRJTTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xQVElNMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19MUFRJTTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0xQVElNMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTFBUSU0yX0NMS19FTkFCTEUgX19IQUxfUkNDX0xQVElNMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fTFBUSU0yX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MUFRJTTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19MUFRJTTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xQVElNMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19MUFRJTTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0xQVUFSVDFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MUFVBUlQxX0NMS19FTkFCTEUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0xQVUFSVDFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MUFVBUlQxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0xQVUFSVDFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xQVUFSVDFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19MUFVBUlQxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0xQVUFSVDFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX09QQU1QX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19PUEFNUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX09QQU1QX0NMS19FTkFCTEUgX19IQUxfUkNDX09QQU1QX0NMS19FTkFCTEUKKyNkZWZpbmUgX19PUEFNUF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfT1BBTVBfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19PUEFNUF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19PUEFNUF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fT1BBTVBfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX09QQU1QX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fT1BBTVBfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfT1BBTVBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX09UR0ZTX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19PVEdGU19DTEtfRElTQUJMRQorI2RlZmluZSBfX09UR0ZTX0NMS19FTkFCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19PVEdGU19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfT1RHRlNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19PVEdGU19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19PVEdGU19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fT1RHRlNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX09UR0ZTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fT1RHRlNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfT1RHRlNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1BXUl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fUFdSX0NMS19FTkFCTEUgX19IQUxfUkNDX1BXUl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fUFdSX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19QV1JfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19QV1JfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfUFdSX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19QV1JfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1BXUl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1BXUl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19QV1JfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1FTUElfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1FTUElfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19RU1BJX0NMS19FTkFCTEUgX19IQUxfUkNDX1FTUElfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1FTUElfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1FTUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19RU1BJX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1FTUElfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1FTUElfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1FTUElfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19RU1BJX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1FTUElfUkVMRUFTRV9SRVNFVAorCisjZGVmaW5lIF9fUk5HX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19STkdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19STkdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfUk5HX0NMS19FTkFCTEUKKyNkZWZpbmUgX19STkdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1JOR19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1JOR19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19STkdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1JOR19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfUk5HX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fUk5HX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1JOR19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0FJMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NBSTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0FJMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NBSTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU0FJMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0FJMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NBSTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0FJMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0FJMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NBSTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0FJMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NBSTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0FJMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU0FJMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0FJMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NBSTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0FJMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RJT19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRQorI2RlZmluZSBfX1NESU9fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0RJT19DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RNTUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NETU1DX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU0RNTUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NETU1DX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TRE1NQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NETU1DX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NETU1DX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TRE1NQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU0RNTUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TRE1NQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TRE1NQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1BJMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1BJMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1BJMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1BJMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1BJMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1BJMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1BJMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1BJMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1BJM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1BJM19DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1BJM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJM19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1BJM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1BJM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1BJM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1BJM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1JBTV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1JBTV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NSQU1fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1JBTV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1JBTTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NSQU0xX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1JBTTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1JBTTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NSQU0yX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUkFNMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NSQU0yX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NSQU0yX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TV1BNSTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NXUE1JMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NXUE1JMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TV1BNSTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NXUE1JMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1dQTUkxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1dQTUkxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NXUE1JMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1dQTUkxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TV1BNSTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TV1BNSTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1dQTUkxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TWVNDRkdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NZU0NGR19DTEtfRElTQUJMRQorI2RlZmluZSBfX1NZU0NGR19DTEtfRU5BQkxFIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NZU0NGR19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1lTQ0ZHX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NZU0NGR19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1lTQ0ZHX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TWVNDRkdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TWVNDRkdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU1lTQ0ZHX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xMF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xMF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTBfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTEwX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTBfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTExX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTExX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTExX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTEyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTEyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTEyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTEyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTEzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE0X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE0X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTE0X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xNF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTVfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE1X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTVfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTVfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTE1X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTE1X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTE1X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xNV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE2X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTZfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTE2X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTE2X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTE2X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xNl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE3X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTE3X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTE3X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTE3X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xN19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xN19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xN19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNM19DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNM19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNNF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNNF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNNF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTRfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNNF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNNF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNNV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNNV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTVfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNNV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNNV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNNV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTVfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNNV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNNV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNNV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNNV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNNl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNNl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTZfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNNl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNNl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTZfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNNl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNNl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNNl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNN19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNN19DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNN19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNN19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNN19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNN19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNN19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNN19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNN19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNOF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNOF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTThfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNOF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNOF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTThfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNOF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNOF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNOF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTThfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNOF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNOV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNOV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTlfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNOV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNOV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNOV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTlfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNOV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVFNDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19UU0NfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19UU0NfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVFNDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19UU0NfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RTQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RTQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19UU0NfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RTQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVFNDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVFNDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RTQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDRfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ0X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ0X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ0X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VBUlQ0X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VQVJUNF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUNF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDVfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ1X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDVfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ1X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ1X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VBUlQ1X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VQVJUNV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUNV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUNV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQzX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUM19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ0X0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDRfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19VQVJUNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ0X0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VBUlQ0X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ0X0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfVUFSVDRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDRfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19VQVJUNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ1X0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDVfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19VQVJUNV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ1X0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfVUFSVDVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VBUlQ1X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ1X0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfVUFSVDVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDVfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19VQVJUNV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ3X0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDdfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19VQVJUN19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ3X0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfVUFSVDdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDdfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19VQVJUN19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ4X0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDhfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19VQVJUOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ4X0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDhfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19VQVJUOF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNCX0NMS19ESVNBQkxFICAgICAgICAgX19IQUxfUkNDX1VTQl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQl9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19VU0JfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQl9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19VU0JfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfQ0xLX1NMRUVQX0VOQUJMRSAgICBfX0hBTF9SQ0NfVVNCX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0JfQ0xLX1NMRUVQX0RJU0FCTEUgICBfX0hBTF9SQ0NfVVNCX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNCX09UR19GU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfRlNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNCX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fV1dER19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfRElTQUJMRQorI2RlZmluZSBfX1dXREdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFCisjZGVmaW5lIF9fV1dER19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1dXREdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fV1dER19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfV1dER19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1dXREdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfV1dER19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjFfQ0xLX0VOQUJMRSAgIF9fSEFMX1JDQ19USU0yMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMjFfQ0xLX0RJU0FCTEUgICBfX0hBTF9SQ0NfVElNMjFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMV9GT1JDRV9SRVNFVCAgIF9fSEFMX1JDQ19USU0yMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTIxX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19USU0yMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjFfQ0xLX1NMRUVQX0VOQUJMRSAgIF9fSEFMX1JDQ19USU0yMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMjFfQ0xLX1NMRUVQX0RJU0FCTEUgICBfX0hBTF9SQ0NfVElNMjFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfRU5BQkxFICAgX19IQUxfUkNDX1RJTTIyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfRElTQUJMRSAgIF9fSEFMX1JDQ19USU0yMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTIyX0ZPUkNFX1JFU0VUICAgX19IQUxfUkNDX1RJTTIyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjJfUkVMRUFTRV9SRVNFVCAgX19IQUxfUkNDX1RJTTIyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0yMl9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX1RJTTIyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfU0xFRVBfRElTQUJMRSAgIF9fSEFMX1JDQ19USU0yMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NSU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ1JTX0NMS19FTkFCTEUgX19IQUxfUkNDX0NSU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ1JTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DUlNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DUlNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DUlNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NSU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NSU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DUlNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1JDQ19CQUNLVVBSRVNFVF9GT1JDRSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UKKyNkZWZpbmUgX19SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRQorCisjZGVmaW5lIF9fVVNCX09UR19GU19GT1JDRV9SRVNFVCAgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfSFNfQ0xLX0RJU0FCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0hTX1VMUElfQ0xLX0VOQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNOV9DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU05X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU05X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVElNOV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTEwX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19USU0xMF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTBfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19USU0xMF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTExX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19USU0xMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTFfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19USU0xMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1BUUF9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfRVRITUFDUFRQX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19FVEhNQUNQVFBfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfRVRITUFDUFRQX0NMS19FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0VUSE1BQ1BUUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBU0hfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFTSF9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBU0hfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFTSF9DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19IQVNIX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQVNIX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfSEFTSF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBU0hfQ0xLX0RJU0FCTEUgICAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTVfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJNV9DTEtfRElTQUJMRSAgICAgICAgICAgICAgX19IQUxfUkNDX1NQSTVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEk1X0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19TUEk1X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1BJNV9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19TUEk1X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk1X0NMS19TTEVFUF9FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1NQSTVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTVfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19TUEk1X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1BJNl9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19TUEk2X0NMS19FTkFCTEUKKyNkZWZpbmUgX19TUEk2X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19TUEk2X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1BJNl9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfU1BJNl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTZfUkVMRUFTRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19TUEk2X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk2X0NMS19TTEVFUF9FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1NQSTZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTZfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19TUEk2X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fTFREQ19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MVERDX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTFREQ19GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfTFREQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xURENfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfTFREQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTFREQ19DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0VUSE1BQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRVRITUFDX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfRVRITUFDX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDVFhfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1RYX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNUWF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1RYX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDUlhfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNSWF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTJfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTEyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xMl9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTEyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTNfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTEzX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xM19DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTEzX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTRfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTE0X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xNF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTE0X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQktQU1JBTV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19CS1BTUkFNX0NMS19FTkFCTEUKKyNkZWZpbmUgX19CS1BTUkFNX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19CS1BTUkFNX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQktQU1JBTV9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfQktQU1JBTV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQktQU1JBTV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DQ01EQVRBUkFNRU5fQ0xLX0VOQUJMRSAgX19IQUxfUkNDX0NDTURBVEFSQU1FTl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0NNREFUQVJBTUVOX0NMS19ESVNBQkxFICBfX0hBTF9SQ0NfQ0NNREFUQVJBTUVOX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1VTQVJUNl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19VU0FSVDZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDZfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19VU0FSVDZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDZfUkVMRUFTRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX1VTQVJUNl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0FSVDZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNl9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VTQVJUNl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTRfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJNF9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTRfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1NQSTRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEk0X1JFTEVBU0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19TUEk0X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk0X0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfU1BJNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJNF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1NQSTRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19HUElPSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0lfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9JX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0lfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0dQSU9JX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0lfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0lfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9JX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19HUElPSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0lfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19HUElPSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9KX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9KX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPSl9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSl9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19HUElPSl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9KX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0dQSU9KX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPSl9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9KX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPS19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19HUElPS19DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0tfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9LX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0tfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0tfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9LX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19HUElPS19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0tfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19HUElPS19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19FVEhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0VUSF9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfRVRIX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRENNSV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19EQ01JX0NMS19FTkFCTEUKKyNkZWZpbmUgX19EQ01JX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19EQ01JX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRENNSV9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfRENNSV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RDTUlfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfRENNSV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRENNSV9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX0RDTUlfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RDTUlfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19EQ01JX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDdfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ3X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19VQVJUN19DTEtfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ3X1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX1VBUlQ3X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUN19GT1JDRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVUFSVDdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUN19DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ3X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUOF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19VQVJUOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDhfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDhfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDhfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ4X0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VQVJUOF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDhfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VQVJUOF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX09UR0hTX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PVEdIU19DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19PVEdIU19GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfVVNCX09UR19IU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX09UR0hTX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX09UR0hTVUxQSV9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PVEdIU1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQgX19IQUxfUkNDX1VTQl9PVEdfSFNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0lTX0NMS19TTEVFUF9ESVNBQkxFRCBfX0hBTF9SQ0NfVVNCX09UR19IU19JU19DTEtfU0xFRVBfRElTQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19PVEdIU19SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9DTEtfU0xFRVBfRU5BQkxFICAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19PVEdIU1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9JU19DTEtfU0xFRVBfRU5BQkxFRCAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9JU19DTEtfU0xFRVBfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNVTFBJX0lTX0NMS19TTEVFUF9ESVNBQkxFRCBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0lTX0NMS19TTEVFUF9ESVNBQkxFRAorI2RlZmluZSBfX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUgICAgICAgX19IQUxfUkNDX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DQU4yX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19DQU4yX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DQU4yX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19DQU4yX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fREFDX0NMS19TTEVFUF9FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfREFDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19EQUNfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICAgIF9fSEFMX1JDQ19EQUNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19BREMyX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19BREMyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19BREMyX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19BREMyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQURDM19DTEtfU0xFRVBfRU5BQkxFICAgICAgICBfX0hBTF9SQ0NfQURDM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQURDM19DTEtfU0xFRVBfRElTQUJMRSAgICAgICBfX0hBTF9SQ0NfQURDM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZTTUNfRk9SQ0VfUkVTRVQgICAgICAgICAgICAgX19IQUxfUkNDX0ZTTUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19GU01DX1JFTEVBU0VfUkVTRVQgICAgICAgICAgIF9fSEFMX1JDQ19GU01DX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19GU01DX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19GU01DX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19GU01DX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19GU01DX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU0RJT19GT1JDRV9SRVNFVCAgICAgICAgICAgICBfX0hBTF9SQ0NfU0RJT19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NESU9fUkVMRUFTRV9SRVNFVCAgICAgICAgICAgX19IQUxfUkNDX1NESU9fUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUgICAgICAgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TRElPX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ETUEyRF9DTEtfRU5BQkxFICAgICAgICAgICAgIF9fSEFMX1JDQ19ETUEyRF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRE1BMkRfQ0xLX0RJU0FCTEUgICAgICAgICAgICBfX0hBTF9SQ0NfRE1BMkRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19ETUEyRF9GT1JDRV9SRVNFVCAgICAgICAgICAgIF9fSEFMX1JDQ19ETUEyRF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RNQTJEX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0RNQTJEX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19ETUEyRF9DTEtfU0xFRVBfRU5BQkxFICAgICAgIF9fSEFMX1JDQ19ETUEyRF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRE1BMkRfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICBfX0hBTF9SQ0NfRE1BMkRfQ0xLX1NMRUVQX0RJU0FCTEUKKworLyogYWxpYXMgZGVmaW5lIG1haW50YWluZWQgZm9yIGxlZ2FjeSAqLworI2RlZmluZSBfX0hBTF9SQ0NfT1RHRlNfRk9SQ0VfUkVTRVQgICAgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0ZTX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQKKworI2RlZmluZSBfX0FEQzEyX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0FEQzEyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BREMxMl9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19BREMxMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzM0X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0FEQzM0X0NMS19FTkFCTEUKKyNkZWZpbmUgX19BREMzNF9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19BREMzNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RBQzJfQ0xLX0VOQUJMRSAgICAgICAgICAgX19IQUxfUkNDX0RBQzJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RBQzJfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0RBQzJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xOF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU0xOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMThfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVElNMThfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xOV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU0xOV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTlfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVElNMTlfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU0yMF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMjBfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVElNMjBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IUlRJTTFfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hSVElNMV9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX0hSVElNMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDMV9DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX1NEQURDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RBREMyX0NMS19FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfU0RBREMyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TREFEQzNfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19TREFEQzNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NEQURDMV9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1NEQURDMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDMl9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1NEQURDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDM19DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1NEQURDM19DTEtfRElTQUJMRQorCisjZGVmaW5lIF9fQURDMTJfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMxMl9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19BREMxMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDMzRfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfQURDMzRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMzNF9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19BREMzNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fREFDMl9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfREFDMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RBQzJfUkVMRUFTRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX0RBQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE4X0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1RJTTE4X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMThfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVElNMThfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE5X0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1RJTTE5X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTlfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVElNMTlfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTIwX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1RJTTIwX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjBfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVElNMjBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hSVElNMV9GT1JDRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX0hSVElNMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hSVElNMV9SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX0hSVElNMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMxX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfU0RBREMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMyX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfU0RBREMyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMzX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfU0RBREMzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMxX1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfU0RBREMxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TREFEQzJfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19TREFEQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NEQURDM19SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX1NEQURDM19SRUxFQVNFX1JFU0VUCisKKyNkZWZpbmUgX19BREMxX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19BREMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQURDMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfQURDMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19BREMxMl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19BREMxMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0FEQzEyX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0FEQzM0X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0FEQzM0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQURDMzRfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfQURDMzRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fQ0VDX0lTX0NMS19FTkFCTEVEICAgICAgICBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQ0VDX0lTX0NMS19ESVNBQkxFRCAgICAgICBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0NSQ19JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX0NSQ19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0NSQ19JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX0NSQ19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19EQUMxX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19EQUMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fREFDMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19EQUMyX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fREFDMl9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfREFDMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19ETUExX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19ETUExX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fRE1BMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19ETUEyX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fRE1BMl9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19GTElURl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19GTElURl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0ZMSVRGX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0ZMSVRGX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0ZNQ19JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX0ZNQ19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0ZNQ19JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX0ZNQ19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPQV9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9BX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9CX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0JfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0NfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPQ19JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPRF9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPRF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9EX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9FX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0VfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0ZfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPRl9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19HUElPRl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPR19JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPR19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9HX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9IX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9IX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0hfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0hfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fSFJUSU0xX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfSFJUSU0xX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSFJUSU0xX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfSFJUSU0xX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzFfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMxX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzJfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMyX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzNfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMzX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19JMkMzX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1BXUl9JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX1BXUl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1BXUl9JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TWVNDRkdfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TWVNDRkdfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJMV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTFfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJMl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTJfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJM19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTNfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJNF9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJNF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTRfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU0RBREMxX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfU0RBREMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU0RBREMxX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfU0RBREMxX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1NEQURDMl9JU19DTEtfRU5BQkxFRCAgICAgX19IQUxfUkNDX1NEQURDMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NEQURDMl9JU19DTEtfRElTQUJMRUQgICAgX19IQUxfUkNDX1NEQURDMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TREFEQzNfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19TREFEQzNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TREFEQzNfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19TREFEQzNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1JBTV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1JBTV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NSQU1fSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NSQU1fSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTFfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTJfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNM19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTNfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNF9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNNF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTRfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNNV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTVfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTVfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTZfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTZfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNN19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNN19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTdfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNOF9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNOF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTThfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTThfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTJfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMTJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xMl9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xM19JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTEzX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTEzX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE0X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTE0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTRfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTVfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMTVfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xNV9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xNl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xNl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE2X0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE3X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTdfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMThfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMThfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xOF9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xOF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xOV9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xOV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE5X0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTE5X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTIwX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTIwX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMjBfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMjBfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVFNDX0lTX0NMS19FTkFCTEVEICAgICAgICBfX0hBTF9SQ0NfVFNDX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVFNDX0lTX0NMS19ESVNBQkxFRCAgICAgICBfX0hBTF9SQ0NfVFNDX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VBUlQ0X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1VBUlQ0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVUFSVDRfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVUFSVDRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVUFSVDVfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVUFSVDVfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VQVJUNV9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVVNBUlQyX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVVNBUlQyX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VTQVJUM19JU19DTEtfRU5BQkxFRCAgICAgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1VTQVJUM19JU19DTEtfRElTQUJMRUQgICAgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19VU0JfSVNfQ0xLX0VOQUJMRUQgICAgICAgIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VU0JfSVNfQ0xLX0RJU0FCTEVEICAgICAgIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fV1dER19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfV1dER19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1dXREdfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0RJU0FCTEVECisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfRk9SQ0VfUkVTRVQgICAgICAgX19IQUxfUkNDX1NESU9fRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9SRUxFQVNFX1JFU0VUICAgICBfX0hBTF9SQ0NfU0RJT19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0VOQUJMRSAgICAgICAgX19IQUxfUkNDX1NESU9fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19TRElPX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfSVNfQ0xLX0VOQUJMRUQgICAgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRElTQUJMRUQgICBfX0hBTF9SQ0NfU0RJT19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgU2RtbWMxQ2xvY2tTZWxlY3Rpb24gICAgICAgICAgICAgICBTZGlvQ2xvY2tTZWxlY3Rpb24KKyNkZWZpbmUgUkNDX1BFUklQSENMS19TRE1NQzEgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1NESU8KKyNkZWZpbmUgUkNDX1NETU1DMUNMS1NPVVJDRV9DTEs0OCAgICAgICAgICBSQ0NfU0RJT0NMS1NPVVJDRV9DSzQ4CisjZGVmaW5lIFJDQ19TRE1NQzFDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgUkNDX1NESU9DTEtTT1VSQ0VfU1lTQ0xLCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ09ORklHICAgICAgICAgICAgX19IQUxfUkNDX1NESU9fQ09ORklHCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfU0RNTUMxX1NPVVJDRSAgICAgICAgX19IQUxfUkNDX0dFVF9TRElPX1NPVVJDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfU0RNTUMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX1NETU1DMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9FTkFCTEUgICAgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9ESVNBQkxFICAgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfU0RNTUMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgU2Rpb0Nsb2NrU2VsZWN0aW9uICAgICAgICAgICAgICAgICBTZG1tYzFDbG9ja1NlbGVjdGlvbgorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1NESU8gICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfU0RNTUMxCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NPTkZJRyAgICAgICAgICAgICAgX19IQUxfUkNDX1NETU1DMV9DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9TRElPX1NPVVJDRSAgICAgICAgICBfX0hBTF9SQ0NfR0VUX1NETU1DMV9TT1VSQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBSQ0NfU0RJT0NMS1NPVVJDRV9DTEs0OCAgICAgICAgICAgICBSQ0NfU0RNTUMxQ0xLU09VUkNFX0NMSzQ4CisjZGVmaW5lIFJDQ19TRElPQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICAgUkNDX1NETU1DMUNMS1NPVVJDRV9TWVNDTEsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFKCkgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfQ0xLX0RJU0FCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFKCkgICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19VTFBJX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfRk9SQ0VfUkVTRVQoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19SRUxFQVNFX1JFU0VUKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfVUxQSV9DTEtfRU5BQkxFKCkgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19VTFBJX0NMS19FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRSgpICAgICAgICAgICAgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfVUxQSV9DTEtfRElTQUJMRSgpICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19VTFBJX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19GT1JDRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfUkVMRUFTRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfU0xFRVBfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpCisjZW5kaWYKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJTQ0xLICAgICAgICAgICAgX19IQUxfUkNDX0kyU19DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0kyU0NMS19DT05GSUcgICAgIF9fSEFMX1JDQ19JMlNfQ09ORklHCisKKyNkZWZpbmUgX19SQ0NfUExMU1JDICAgICAgICAgICAgICAgIFJDQ19HRVRfUExMX09TQ1NPVVJDRQorCisjZGVmaW5lIElTX1JDQ19NU0lSQU5HRSAgICAgICAgICAgICBJU19SQ0NfTVNJX0NMT0NLX1JBTkdFCisjZGVmaW5lIElTX1JDQ19SVENDTEtfU09VUkNFICAgICAgICBJU19SQ0NfUlRDQ0xLU09VUkNFCisjZGVmaW5lIElTX1JDQ19TWVNDTEtfRElWICAgICAgICAgICBJU19SQ0NfSENMSworI2RlZmluZSBJU19SQ0NfSENMS19ESVYgICAgICAgICAgICAgSVNfUkNDX1BDTEsKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMSyAgICAgICAgICAgIElTX1JDQ19QRVJJUEhDTE9DSworCisjZGVmaW5lIFJDQ19JVF9IU0kxNCAgICAgICAgICAgICAgICBSQ0NfSVRfSFNJMTRSRFkKKworI2RlZmluZSBSQ0NfSVRfQ1NTTFNFICAgICAgICAgICAgICAgUkNDX0lUX0xTRUNTUworI2RlZmluZSBSQ0NfSVRfQ1NTSFNFICAgICAgICAgICAgICAgUkNDX0lUX0NTUworCisjZGVmaW5lIFJDQ19QTExNVUxfMyAgICAgICAgICAgICAgICBSQ0NfUExMX01VTDMKKyNkZWZpbmUgUkNDX1BMTE1VTF80ICAgICAgICAgICAgICAgIFJDQ19QTExfTVVMNAorI2RlZmluZSBSQ0NfUExMTVVMXzYgICAgICAgICAgICAgICAgUkNDX1BMTF9NVUw2CisjZGVmaW5lIFJDQ19QTExNVUxfOCAgICAgICAgICAgICAgICBSQ0NfUExMX01VTDgKKyNkZWZpbmUgUkNDX1BMTE1VTF8xMiAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMTIKKyNkZWZpbmUgUkNDX1BMTE1VTF8xNiAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMTYKKyNkZWZpbmUgUkNDX1BMTE1VTF8yNCAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMjQKKyNkZWZpbmUgUkNDX1BMTE1VTF8zMiAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMzIKKyNkZWZpbmUgUkNDX1BMTE1VTF80OCAgICAgICAgICAgICAgIFJDQ19QTExfTVVMNDgKKworI2RlZmluZSBSQ0NfUExMRElWXzIgICAgICAgICAgICAgICAgUkNDX1BMTF9ESVYyCisjZGVmaW5lIFJDQ19QTExESVZfMyAgICAgICAgICAgICAgICBSQ0NfUExMX0RJVjMKKyNkZWZpbmUgUkNDX1BMTERJVl80ICAgICAgICAgICAgICAgIFJDQ19QTExfRElWNAorCisjZGVmaW5lIElTX1JDQ19NQ09TT1VSQ0UgICAgICAgICAgICBJU19SQ0NfTUNPMVNPVVJDRQorI2RlZmluZSBfX0hBTF9SQ0NfTUNPX0NPTkZJRyAgICAgICAgX19IQUxfUkNDX01DTzFfQ09ORklHCisjZGVmaW5lIFJDQ19NQ09fTk9ESVYgICAgICAgICAgICAgICBSQ0NfTUNPRElWXzEKKyNkZWZpbmUgUkNDX01DT19ESVYxICAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfMQorI2RlZmluZSBSQ0NfTUNPX0RJVjIgICAgICAgICAgICAgICAgUkNDX01DT0RJVl8yCisjZGVmaW5lIFJDQ19NQ09fRElWNCAgICAgICAgICAgICAgICBSQ0NfTUNPRElWXzQKKyNkZWZpbmUgUkNDX01DT19ESVY4ICAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfOAorI2RlZmluZSBSQ0NfTUNPX0RJVjE2ICAgICAgICAgICAgICAgUkNDX01DT0RJVl8xNgorI2RlZmluZSBSQ0NfTUNPX0RJVjMyICAgICAgICAgICAgICAgUkNDX01DT0RJVl8zMgorI2RlZmluZSBSQ0NfTUNPX0RJVjY0ICAgICAgICAgICAgICAgUkNDX01DT0RJVl82NAorI2RlZmluZSBSQ0NfTUNPX0RJVjEyOCAgICAgICAgICAgICAgUkNDX01DT0RJVl8xMjgKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9OT05FICAgICAgICAgIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9MU0kgICAgICAgICAgIFJDQ19NQ08xU09VUkNFX0xTSQorI2RlZmluZSBSQ0NfTUNPU09VUkNFX0xTRSAgICAgICAgICAgUkNDX01DTzFTT1VSQ0VfTFNFCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfU1lTQ0xLICAgICAgICBSQ0NfTUNPMVNPVVJDRV9TWVNDTEsKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9IU0kgICAgICAgICAgIFJDQ19NQ08xU09VUkNFX0hTSQorI2RlZmluZSBSQ0NfTUNPU09VUkNFX0hTSTE0ICAgICAgICAgUkNDX01DTzFTT1VSQ0VfSFNJMTQKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9IU0k0OCAgICAgICAgIFJDQ19NQ08xU09VUkNFX0hTSTQ4CisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfSFNFICAgICAgICAgICBSQ0NfTUNPMVNPVVJDRV9IU0UKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9QTExDTEtfRElWMSAgIFJDQ19NQ08xU09VUkNFX1BMTENMSworI2RlZmluZSBSQ0NfTUNPU09VUkNFX1BMTENMS19OT0RJViAgUkNDX01DTzFTT1VSQ0VfUExMQ0xLCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfUExMQ0xLX0RJVjIgICBSQ0NfTUNPMVNPVVJDRV9QTExDTEtfRElWMgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSyAgICAgUkNDX1JUQ0NMS1NPVVJDRV9OT05FCisjZWxpZiBkZWZpbmVkKFNUTTMyRzApCisjZWxzZQorI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX05PTkUgICAgICAgUkNDX1JUQ0NMS1NPVVJDRV9OT19DTEsKKyNlbmRpZgorCisjZGVmaW5lIFJDQ19VU0JDTEtfUExMU0FJMSAgICAgICAgICBSQ0NfVVNCQ0xLU09VUkNFX1BMTFNBSTEKKyNkZWZpbmUgUkNDX1VTQkNMS19QTEwgICAgICAgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfUExMCisjZGVmaW5lIFJDQ19VU0JDTEtfTVNJICAgICAgICAgICAgICBSQ0NfVVNCQ0xLU09VUkNFX01TSQorI2RlZmluZSBSQ0NfVVNCQ0xLU09VUkNFX1BMTENMSyAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTEwKKyNkZWZpbmUgUkNDX1VTQlBMTENMS19ESVYxICAgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfUExMCisjZGVmaW5lIFJDQ19VU0JQTExDTEtfRElWMV81ICAgICAgICBSQ0NfVVNCQ0xLU09VUkNFX1BMTF9ESVYxXzUKKyNkZWZpbmUgUkNDX1VTQlBMTENMS19ESVYyICAgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfUExMX0RJVjIKKyNkZWZpbmUgUkNDX1VTQlBMTENMS19ESVYzICAgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfUExMX0RJVjMKKworI2RlZmluZSBIU0lPTl9CaXROdW1iZXIgICAgICAgIFJDQ19IU0lPTl9CSVRfTlVNQkVSCisjZGVmaW5lIEhTSU9OX0JJVE5VTUJFUiAgICAgICAgUkNDX0hTSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgSFNFT05fQml0TnVtYmVyICAgICAgICBSQ0NfSFNFT05fQklUX05VTUJFUgorI2RlZmluZSBIU0VPTl9CSVROVU1CRVIgICAgICAgIFJDQ19IU0VPTl9CSVRfTlVNQkVSCisjZGVmaW5lIE1TSU9OX0JJVE5VTUJFUiAgICAgICAgUkNDX01TSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgQ1NTT05fQml0TnVtYmVyICAgICAgICBSQ0NfQ1NTT05fQklUX05VTUJFUgorI2RlZmluZSBDU1NPTl9CSVROVU1CRVIgICAgICAgIFJDQ19DU1NPTl9CSVRfTlVNQkVSCisjZGVmaW5lIFBMTE9OX0JpdE51bWJlciAgICAgICAgUkNDX1BMTE9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgUExMT05fQklUTlVNQkVSICAgICAgICBSQ0NfUExMT05fQklUX05VTUJFUgorI2RlZmluZSBQTExJMlNPTl9CaXROdW1iZXIgICAgIFJDQ19QTExJMlNPTl9CSVRfTlVNQkVSCisjZGVmaW5lIEkyU1NSQ19CaXROdW1iZXIgICAgICAgUkNDX0kyU1NSQ19CSVRfTlVNQkVSCisjZGVmaW5lIFJUQ0VOX0JpdE51bWJlciAgICAgICAgUkNDX1JUQ0VOX0JJVF9OVU1CRVIKKyNkZWZpbmUgUlRDRU5fQklUTlVNQkVSICAgICAgICBSQ0NfUlRDRU5fQklUX05VTUJFUgorI2RlZmluZSBCRFJTVF9CaXROdW1iZXIgICAgICAgIFJDQ19CRFJTVF9CSVRfTlVNQkVSCisjZGVmaW5lIEJEUlNUX0JJVE5VTUJFUiAgICAgICAgUkNDX0JEUlNUX0JJVF9OVU1CRVIKKyNkZWZpbmUgUlRDUlNUX0JJVE5VTUJFUiAgICAgICBSQ0NfUlRDUlNUX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFNJT05fQml0TnVtYmVyICAgICAgICBSQ0NfTFNJT05fQklUX05VTUJFUgorI2RlZmluZSBMU0lPTl9CSVROVU1CRVIgICAgICAgIFJDQ19MU0lPTl9CSVRfTlVNQkVSCisjZGVmaW5lIExTRU9OX0JpdE51bWJlciAgICAgICAgUkNDX0xTRU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFNFT05fQklUTlVNQkVSICAgICAgICBSQ0NfTFNFT05fQklUX05VTUJFUgorI2RlZmluZSBMU0VCWVBfQklUTlVNQkVSICAgICAgIFJDQ19MU0VCWVBfQklUX05VTUJFUgorI2RlZmluZSBQTExTQUlPTl9CaXROdW1iZXIgICAgIFJDQ19QTExTQUlPTl9CSVRfTlVNQkVSCisjZGVmaW5lIFRJTVBSRV9CaXROdW1iZXIgICAgICAgUkNDX1RJTVBSRV9CSVRfTlVNQkVSCisjZGVmaW5lIFJNVkZfQml0TnVtYmVyICAgICAgICAgUkNDX1JNVkZfQklUX05VTUJFUgorI2RlZmluZSBSTVZGX0JJVE5VTUJFUiAgICAgICAgIFJDQ19STVZGX0JJVF9OVU1CRVIKKyNkZWZpbmUgUkNDX0NSMl9IU0kxNFRSSU1fQml0TnVtYmVyIFJDQ19IU0kxNFRSSU1fQklUX05VTUJFUgorI2RlZmluZSBDUl9CWVRFMl9BRERSRVNTICAgICAgIFJDQ19DUl9CWVRFMl9BRERSRVNTCisjZGVmaW5lIENJUl9CWVRFMV9BRERSRVNTICAgICAgUkNDX0NJUl9CWVRFMV9BRERSRVNTCisjZGVmaW5lIENJUl9CWVRFMl9BRERSRVNTICAgICAgUkNDX0NJUl9CWVRFMl9BRERSRVNTCisjZGVmaW5lIEJEQ1JfQllURTBfQUREUkVTUyAgICAgUkNDX0JEQ1JfQllURTBfQUREUkVTUworI2RlZmluZSBEQlBfVElNRU9VVF9WQUxVRSAgICAgIFJDQ19EQlBfVElNRU9VVF9WQUxVRQorI2RlZmluZSBMU0VfVElNRU9VVF9WQUxVRSAgICAgIFJDQ19MU0VfVElNRU9VVF9WQUxVRQorCisjZGVmaW5lIENSX0hTSU9OX0JCICAgICAgICAgICAgUkNDX0NSX0hTSU9OX0JCCisjZGVmaW5lIENSX0NTU09OX0JCICAgICAgICAgICAgUkNDX0NSX0NTU09OX0JCCisjZGVmaW5lIENSX1BMTE9OX0JCICAgICAgICAgICAgUkNDX0NSX1BMTE9OX0JCCisjZGVmaW5lIENSX1BMTEkyU09OX0JCICAgICAgICAgUkNDX0NSX1BMTEkyU09OX0JCCisjZGVmaW5lIENSX01TSU9OX0JCICAgICAgICAgICAgUkNDX0NSX01TSU9OX0JCCisjZGVmaW5lIENTUl9MU0lPTl9CQiAgICAgICAgICAgUkNDX0NTUl9MU0lPTl9CQgorI2RlZmluZSBDU1JfTFNFT05fQkIgICAgICAgICAgIFJDQ19DU1JfTFNFT05fQkIKKyNkZWZpbmUgQ1NSX0xTRUJZUF9CQiAgICAgICAgICBSQ0NfQ1NSX0xTRUJZUF9CQgorI2RlZmluZSBDU1JfUlRDRU5fQkIgICAgICAgICAgIFJDQ19DU1JfUlRDRU5fQkIKKyNkZWZpbmUgQ1NSX1JUQ1JTVF9CQiAgICAgICAgICBSQ0NfQ1NSX1JUQ1JTVF9CQgorI2RlZmluZSBDRkdSX0kyU1NSQ19CQiAgICAgICAgIFJDQ19DRkdSX0kyU1NSQ19CQgorI2RlZmluZSBCRENSX1JUQ0VOX0JCICAgICAgICAgIFJDQ19CRENSX1JUQ0VOX0JCCisjZGVmaW5lIEJEQ1JfQkRSU1RfQkIgICAgICAgICAgUkNDX0JEQ1JfQkRSU1RfQkIKKyNkZWZpbmUgQ1JfSFNFT05fQkIgICAgICAgICAgICBSQ0NfQ1JfSFNFT05fQkIKKyNkZWZpbmUgQ1NSX1JNVkZfQkIgICAgICAgICAgICBSQ0NfQ1NSX1JNVkZfQkIKKyNkZWZpbmUgQ1JfUExMU0FJT05fQkIgICAgICAgICBSQ0NfQ1JfUExMU0FJT05fQkIKKyNkZWZpbmUgRENLQ0ZHUl9USU1QUkVfQkIgICAgICBSQ0NfRENLQ0ZHUl9USU1QUkVfQkIKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0VOQUJMRV9GUkVRX0VSUk9SX0NPVU5URVIgICAgIF9fSEFMX1JDQ19DUlNfRlJFUV9FUlJPUl9DT1VOVEVSX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0RJU0FCTEVfRlJFUV9FUlJPUl9DT1VOVEVSICAgIF9fSEFMX1JDQ19DUlNfRlJFUV9FUlJPUl9DT1VOVEVSX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19FTkFCTEVfQVVUT01BVElDX0NBTElCICAgICAgICBfX0hBTF9SQ0NfQ1JTX0FVVE9NQVRJQ19DQUxJQl9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19ESVNBQkxFX0FVVE9NQVRJQ19DQUxJQiAgICAgICBfX0hBTF9SQ0NfQ1JTX0FVVE9NQVRJQ19DQUxJQl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0FMQ1VMQVRFX1JFTE9BRFZBTFVFICAgICAgICAgX19IQUxfUkNDX0NSU19SRUxPQURWQUxVRV9DQUxDVUxBVEUKKworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0lUX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JDQ19HRVRfSVQKKworI2RlZmluZSBSQ0NfQ1JTX1NZTkNXQVJNICAgICAgIFJDQ19DUlNfU1lOQ1dBUk4KKyNkZWZpbmUgUkNDX0NSU19UUklNT1YgICAgICAgICBSQ0NfQ1JTX1RSSU1PVkYKKworI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0NLNDggICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0NMSzQ4CisjZGVmaW5lIFJDQ19DSzQ4Q0xLU09VUkNFX1BMTFEgICAgICAgICAgIFJDQ19DTEs0OENMS1NPVVJDRV9QTExRCisjZGVmaW5lIFJDQ19DSzQ4Q0xLU09VUkNFX1BMTFNBSVAgICAgICAgIFJDQ19DTEs0OENMS1NPVVJDRV9QTExTQUlQCisjZGVmaW5lIFJDQ19DSzQ4Q0xLU09VUkNFX1BMTEkyU1EgICAgICAgIFJDQ19DTEs0OENMS1NPVVJDRV9QTExJMlNRCisjZGVmaW5lIElTX1JDQ19DSzQ4Q0xLU09VUkNFICAgICAgICAgICAgIElTX1JDQ19DTEs0OENMS1NPVVJDRQorI2RlZmluZSBSQ0NfU0RJT0NMS1NPVVJDRV9DSzQ4ICAgICAgICAgICBSQ0NfU0RJT0NMS1NPVVJDRV9DTEs0OAorCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DTEtfRU5BQkxFICAgICAgICAgICAgIF9fSEFMX1JDQ19ERlNETTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0RJU0FCTEUgICAgICAgICAgICBfX0hBTF9SQ0NfREZTRE0xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9JU19DTEtfRU5BQkxFRCAgICAgICAgIF9fSEFMX1JDQ19ERlNETTFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19ESVNBQkxFRCAgICAgICAgX19IQUxfUkNDX0RGU0RNMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0ZPUkNFX1JFU0VUICAgICAgICAgICAgX19IQUxfUkNDX0RGU0RNMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfREZTRE0xX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NMS19TTEVFUF9FTkFCTEUgICAgICAgX19IQUxfUkNDX0RGU0RNMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DTEtfU0xFRVBfRElTQUJMRSAgICAgIF9fSEFMX1JDQ19ERlNETTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19TTEVFUF9FTkFCTEVEICAgX19IQUxfUkNDX0RGU0RNMV9JU19DTEtfU0xFRVBfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fSVNfQ0xLX1NMRUVQX0RJU0FCTEVEICBfX0hBTF9SQ0NfREZTRE0xX0lTX0NMS19TTEVFUF9ESVNBQkxFRAorI2RlZmluZSBEZnNkbUNsb2NrU2VsZWN0aW9uICAgICAgICAgRGZzZG0xQ2xvY2tTZWxlY3Rpb24KKyNkZWZpbmUgUkNDX1BFUklQSENMS19ERlNETSAgICAgICAgIFJDQ19QRVJJUEhDTEtfREZTRE0xCisjZGVmaW5lIFJDQ19ERlNETUNMS1NPVVJDRV9QQ0xLICAgICBSQ0NfREZTRE0xQ0xLU09VUkNFX1BDTEsyCisjZGVmaW5lIFJDQ19ERlNETUNMS1NPVVJDRV9TWVNDTEsgICBSQ0NfREZTRE0xQ0xLU09VUkNFX1NZU0NMSworI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fQ09ORklHICAgICAgX19IQUxfUkNDX0RGU0RNMV9DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9ERlNETV9TT1VSQ0UgIF9fSEFMX1JDQ19HRVRfREZTRE0xX1NPVVJDRQorI2RlZmluZSBSQ0NfREZTRE0xQ0xLU09VUkNFX1BDTEsgICAgUkNDX0RGU0RNMUNMS1NPVVJDRV9QQ0xLMgorI2RlZmluZSBSQ0NfU1dQTUkxQ0xLU09VUkNFX1BDTEsgICAgUkNDX1NXUE1JMUNMS1NPVVJDRV9QQ0xLMQorI2RlZmluZSBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsgICAgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMQorI2RlZmluZSBSQ0NfTFBUSU0yQ0xLU09VUkNFX1BDTEsgICAgUkNDX0xQVElNMkNMS1NPVVJDRV9QQ0xLMQorCisjZGVmaW5lIFJDQ19ERlNETTFBVURJT0NMS1NPVVJDRV9JMlNBUEIxICAgIFJDQ19ERlNETTFBVURJT0NMS1NPVVJDRV9JMlMxCisjZGVmaW5lIFJDQ19ERlNETTFBVURJT0NMS1NPVVJDRV9JMlNBUEIyICAgIFJDQ19ERlNETTFBVURJT0NMS1NPVVJDRV9JMlMyCisjZGVmaW5lIFJDQ19ERlNETTJBVURJT0NMS1NPVVJDRV9JMlNBUEIxICAgIFJDQ19ERlNETTJBVURJT0NMS1NPVVJDRV9JMlMxCisjZGVmaW5lIFJDQ19ERlNETTJBVURJT0NMS1NPVVJDRV9JMlNBUEIyICAgIFJDQ19ERlNETTJBVURJT0NMS1NPVVJDRV9JMlMyCisjZGVmaW5lIFJDQ19ERlNETTFDTEtTT1VSQ0VfQVBCMiAgICAgICAgICAgIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSzIKKyNkZWZpbmUgUkNDX0RGU0RNMkNMS1NPVVJDRV9BUEIyICAgICAgICAgICAgUkNDX0RGU0RNMkNMS1NPVVJDRV9QQ0xLMgorI2RlZmluZSBSQ0NfRk1QSTJDMUNMS1NPVVJDRV9BUEIgICAgICAgICAgICBSQ0NfRk1QSTJDMUNMS1NPVVJDRV9QQ0xLMQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9STkdfQWxpYXNlZF9NYWNyb3MgSEFMIFJORyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lICBIQUxfUk5HX1JlYWR5Q2FsbGJhY2soX19IQU5ETEVfXykgIEhBTF9STkdfUmVhZHlEYXRhQ2FsbGJhY2soKF9fSEFORExFX18pLCB1aW50MzJfdCByYW5kb20zMmJpdCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUlRDX0FsaWFzZWRfTWFjcm9zIEhBTCBSVEMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQgKFNUTTMyRzApIHx8IGRlZmluZWQgKFNUTTMyTDQxMnh4KSB8fCBkZWZpbmVkIChTVE0zMkw0MjJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMNFA1eHgpIHx8IGRlZmluZWQgKFNUTTMyTDRRNXh4KQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfUlRDX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0VYVElfQ0xFQVJfRkxBRworI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JUQ19ESVNBQkxFX0lUICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfUlRDX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0VYVElfRU5BQkxFX0lUCisKKyNpZiBkZWZpbmVkIChTVE0zMkYxKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9DTEVBUl9GTEFHKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICBfX0hBTF9SVENfQUxBUk1fRVhUSV9DTEVBUl9GTEFHKCkKKworI2RlZmluZSBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0RJU0FCTEVfSVQoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfSVQoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFVF9GTEFHKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0dFVF9GTEFHKCkKKworI2RlZmluZSBfX0hBTF9SVENfRVhUSV9HRU5FUkFURV9TV0lUKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICAgX19IQUxfUlRDX0FMQVJNX0VYVElfR0VORVJBVEVfU1dJVCgpCisjZWxzZQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9DTEVBUl9GTEFHKF9fRVhUSV9MSU5FX18pICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSA/IF9fSEFMX1JUQ19BTEFSTV9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpID8gX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9DTEVBUl9GTEFHKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQoX19FWFRJX0xJTkVfXykgICAoKChfX0VYVElfTElORV9fKSAgPT0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgPyBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0lUKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSV9MSU5FX18pICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSA/IF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0RJU0FCTEVfSVQoKSkpCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFVF9GTEFHKF9fRVhUSV9MSU5FX18pICAgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpID8gX19IQUxfUlRDX0FMQVJNX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRVRfRkxBRygpKSkKKyNkZWZpbmUgX19IQUxfUlRDX0VYVElfR0VORVJBVEVfU1dJVChfX0VYVElfTElORV9fKSAgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpID8gX19IQUxfUlRDX0FMQVJNX0VYVElfR0VORVJBVEVfU1dJVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRU5FUkFURV9TV0lUKCkgOiAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfR0VORVJBVEVfU1dJVCgpKSkKKyNlbmRpZiAgIC8qIFNUTTMyRjEgKi8KKworI2RlZmluZSBJU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19SVENfQUxBUk0KKyNkZWZpbmUgSVNfQUxBUk1fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX0FMQVJNX01BU0sKKyNkZWZpbmUgSVNfVEFNUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUgorI2RlZmluZSBJU19UQU1QRVJfRVJBU0VfTU9ERSAgICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX0VSQVNFX01PREUKKyNkZWZpbmUgSVNfVEFNUEVSX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9GSUxURVIKKyNkZWZpbmUgSVNfVEFNUEVSX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9JTlRFUlJVUFQKKyNkZWZpbmUgSVNfVEFNUEVSX01BU0tGTEFHX1NUQVRFICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9NQVNLRkxBR19TVEFURQorI2RlZmluZSBJU19UQU1QRVJfUFJFQ0hBUkdFX0RVUkFUSU9OICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTgorI2RlZmluZSBJU19UQU1QRVJfUFVMTFVQX1NUQVRFICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1BVTExVUF9TVEFURQorI2RlZmluZSBJU19UQU1QRVJfU0FNUExJTkdfRlJFUSAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1NBTVBMSU5HX0ZSRVEKKyNkZWZpbmUgSVNfVEFNUEVSX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTiAgICAgSVNfUlRDX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04KKyNkZWZpbmUgSVNfVEFNUEVSX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9UUklHR0VSCisjZGVmaW5lIElTX1dBS0VVUF9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX1JUQ19XQUtFVVBfQ0xPQ0sKKyNkZWZpbmUgSVNfV0FLRVVQX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1dBS0VVUF9DT1VOVEVSCisKKyNkZWZpbmUgX19SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUKKyNkZWZpbmUgX19SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TRF9BbGlhc2VkX01hY3JvcyBIQUwgU0QgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIFNEX09DUl9DSURfQ1NEX09WRVJXUklFVEUgICBTRF9PQ1JfQ0lEX0NTRF9PVkVSV1JJVEUKKyNkZWZpbmUgU0RfQ01EX1NEX0FQUF9TVEFVUyAgICAgICAgIFNEX0NNRF9TRF9BUFBfU1RBVFVTCisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGMikKKyNkZWZpbmUgIFNEX1NETU1DX0RJU0FCTEVEICAgICAgICAgIFNEX1NESU9fRElTQUJMRUQKKyNkZWZpbmUgIFNEX1NETU1DX0ZVTkNUSU9OX0JVU1kgICAgIFNEX1NESU9fRlVOQ1RJT05fQlVTWQorI2RlZmluZSAgU0RfU0RNTUNfRlVOQ1RJT05fRkFJTEVEICAgU0RfU0RJT19GVU5DVElPTl9GQUlMRUQKKyNkZWZpbmUgIFNEX1NETU1DX1VOS05PV05fRlVOQ1RJT04gIFNEX1NESU9fVU5LTk9XTl9GVU5DVElPTgorI2RlZmluZSAgU0RfQ01EX1NETU1DX1NFTl9PUF9DT05EICAgU0RfQ01EX1NESU9fU0VOX09QX0NPTkQKKyNkZWZpbmUgIFNEX0NNRF9TRE1NQ19SV19ESVJFQ1QgICAgIFNEX0NNRF9TRElPX1JXX0RJUkVDVAorI2RlZmluZSAgU0RfQ01EX1NETU1DX1JXX0VYVEVOREVEICAgU0RfQ01EX1NESU9fUldfRVhURU5ERUQKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0VOQUJMRSAgICAgIF9fSEFMX1NEX1NESU9fRU5BQkxFCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19ESVNBQkxFICAgICBfX0hBTF9TRF9TRElPX0RJU0FCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0RNQV9FTkFCTEUgIF9fSEFMX1NEX1NESU9fRE1BX0VOQUJMRQorI2RlZmluZSAgX19IQUxfU0RfU0RNTUNfRE1BX0RJU0FCTEUgX19IQUxfU0RfU0RJT19ETUFfRElTQUJMCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19FTkFCTEVfSVQgICBfX0hBTF9TRF9TRElPX0VOQUJMRV9JVAorI2RlZmluZSAgX19IQUxfU0RfU0RNTUNfRElTQUJMRV9JVCAgX19IQUxfU0RfU0RJT19ESVNBQkxFX0lUCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19HRVRfRkxBRyAgICBfX0hBTF9TRF9TRElPX0dFVF9GTEFHCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19DTEVBUl9GTEFHICBfX0hBTF9TRF9TRElPX0NMRUFSX0ZMQUcKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0dFVF9JVCAgICAgIF9fSEFMX1NEX1NESU9fR0VUX0lUCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19DTEVBUl9JVCAgICBfX0hBTF9TRF9TRElPX0NMRUFSX0lUCisjZGVmaW5lICBTRE1NQ19TVEFUSUNfRkxBR1MgICAgICAgICBTRElPX1NUQVRJQ19GTEFHUworI2RlZmluZSAgU0RNTUNfQ01EMFRJTUVPVVQgICAgICAgICAgU0RJT19DTUQwVElNRU9VVAorI2RlZmluZSAgU0RfU0RNTUNfU0VORF9JRl9DT05EICAgICAgU0RfU0RJT19TRU5EX0lGX0NPTkQKKy8qIGFsaWFzIENNU0lTICovCisjZGVmaW5lICBTRE1NQzFfSVJRbiAgICAgICAgICAgICAgICBTRElPX0lSUW4KKyNkZWZpbmUgIFNETU1DMV9JUlFIYW5kbGVyICAgICAgICAgIFNESU9fSVJRSGFuZGxlcgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgIFNEX1NESU9fRElTQUJMRUQgICAgICAgICAgIFNEX1NETU1DX0RJU0FCTEVECisjZGVmaW5lICBTRF9TRElPX0ZVTkNUSU9OX0JVU1kgICAgICBTRF9TRE1NQ19GVU5DVElPTl9CVVNZCisjZGVmaW5lICBTRF9TRElPX0ZVTkNUSU9OX0ZBSUxFRCAgICBTRF9TRE1NQ19GVU5DVElPTl9GQUlMRUQKKyNkZWZpbmUgIFNEX1NESU9fVU5LTk9XTl9GVU5DVElPTiAgIFNEX1NETU1DX1VOS05PV05fRlVOQ1RJT04KKyNkZWZpbmUgIFNEX0NNRF9TRElPX1NFTl9PUF9DT05EICAgIFNEX0NNRF9TRE1NQ19TRU5fT1BfQ09ORAorI2RlZmluZSAgU0RfQ01EX1NESU9fUldfRElSRUNUICAgICAgU0RfQ01EX1NETU1DX1JXX0RJUkVDVAorI2RlZmluZSAgU0RfQ01EX1NESU9fUldfRVhURU5ERUQgICAgU0RfQ01EX1NETU1DX1JXX0VYVEVOREVECisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0VOQUJMRSAgICAgICBfX0hBTF9TRF9TRE1NQ19FTkFCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRElTQUJMRSAgICAgIF9fSEFMX1NEX1NETU1DX0RJU0FCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRE1BX0VOQUJMRSAgIF9fSEFMX1NEX1NETU1DX0RNQV9FTkFCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRE1BX0RJU0FCTCAgIF9fSEFMX1NEX1NETU1DX0RNQV9ESVNBQkxFCisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0VOQUJMRV9JVCAgICBfX0hBTF9TRF9TRE1NQ19FTkFCTEVfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRElTQUJMRV9JVCAgIF9fSEFMX1NEX1NETU1DX0RJU0FCTEVfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fR0VUX0ZMQUcgICAgIF9fSEFMX1NEX1NETU1DX0dFVF9GTEFHCisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0NMRUFSX0ZMQUcgICBfX0hBTF9TRF9TRE1NQ19DTEVBUl9GTEFHCisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0dFVF9JVCAgICAgICBfX0hBTF9TRF9TRE1NQ19HRVRfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fQ0xFQVJfSVQgICAgIF9fSEFMX1NEX1NETU1DX0NMRUFSX0lUCisjZGVmaW5lICBTRElPX1NUQVRJQ19GTEFHUwkgICAgICAgIFNETU1DX1NUQVRJQ19GTEFHUworI2RlZmluZSAgU0RJT19DTUQwVElNRU9VVAkgICAgICAgICAgU0RNTUNfQ01EMFRJTUVPVVQKKyNkZWZpbmUgIFNEX1NESU9fU0VORF9JRl9DT05ECSAgICAgIFNEX1NETU1DX1NFTkRfSUZfQ09ORAorLyogYWxpYXMgQ01TSVMgZm9yIGNvbXBhdGliaWxpdGllcyAqLworI2RlZmluZSAgU0RJT19JUlFuICAgICAgICAgICAgICAgICAgU0RNTUMxX0lSUW4KKyNkZWZpbmUgIFNESU9fSVJRSGFuZGxlciAgICAgICAgICAgIFNETU1DMV9JUlFIYW5kbGVyCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkY0KSB8fCBkZWZpbmVkKFNUTTMyRjIpCisjZGVmaW5lICBIQUxfU0RfQ2FyZENJRFR5cGVkZWYgICAgICAgSEFMX1NEX0NhcmRDSURUeXBlRGVmCisjZGVmaW5lICBIQUxfU0RfQ2FyZENTRFR5cGVkZWYgICAgICAgSEFMX1NEX0NhcmRDU0RUeXBlRGVmCisjZGVmaW5lICBIQUxfU0RfQ2FyZFN0YXR1c1R5cGVkZWYgICAgSEFMX1NEX0NhcmRTdGF0dXNUeXBlRGVmCisjZGVmaW5lICBIQUxfU0RfQ2FyZFN0YXRlVHlwZWRlZiAgICAgSEFMX1NEX0NhcmRTdGF0ZVR5cGVEZWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrICAgSEFMX01NQ0V4X1JlYWRfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWZmZXIxQ3BsdENhbGxiYWNrICAgSEFMX01NQ0V4X1JlYWRfRE1BRG91YmxlQnVmMUNwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfTU1DRXhfV3JpdGVfRE1BRG91YmxlQnVmZmVyMENwbHRDYWxsYmFjayAgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZjBDcGx0Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgIEhBTF9NTUNFeF9Xcml0ZV9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TREV4X1JlYWRfRE1BRG91YmxlQnVmZmVyMENwbHRDYWxsYmFjayAgICBIQUxfU0RFeF9SZWFkX0RNQURvdWJsZUJ1ZjBDcGx0Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWZmZXIxQ3BsdENhbGxiYWNrICAgIEhBTF9TREV4X1JlYWRfRE1BRG91YmxlQnVmMUNwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrICAgSEFMX1NERXhfV3JpdGVfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIxQ3BsdENhbGxiYWNrICAgSEFMX1NERXhfV3JpdGVfRE1BRG91YmxlQnVmMUNwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfU0RfRHJpdmVUcmFuc2NpdmVyXzFfOFZfQ2FsbGJhY2sgICAgICAgICAgSEFMX1NEX0RyaXZlVHJhbnNjZWl2ZXJfMV84Vl9DYWxsYmFjaworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TTUFSVENBUkRfQWxpYXNlZF9NYWNyb3MgSEFMIFNNQVJUQ0FSRCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19TTUFSVENBUkRfRU5BQkxFX0lUICAgICAgICAgICBfX0hBTF9TTUFSVENBUkRfRU5BQkxFX0lUCisjZGVmaW5lIF9fU01BUlRDQVJEX0RJU0FCTEVfSVQgICAgICAgICAgX19IQUxfU01BUlRDQVJEX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19TTUFSVENBUkRfRU5BQkxFICAgICAgICAgICAgICBfX0hBTF9TTUFSVENBUkRfRU5BQkxFCisjZGVmaW5lIF9fU01BUlRDQVJEX0RJU0FCTEUgICAgICAgICAgICAgX19IQUxfU01BUlRDQVJEX0RJU0FCTEUKKyNkZWZpbmUgX19TTUFSVENBUkRfRE1BX1JFUVVFU1RfRU5BQkxFICBfX0hBTF9TTUFSVENBUkRfRE1BX1JFUVVFU1RfRU5BQkxFCisjZGVmaW5lIF9fU01BUlRDQVJEX0RNQV9SRVFVRVNUX0RJU0FCTEUgX19IQUxfU01BUlRDQVJEX0RNQV9SRVFVRVNUX0RJU0FCTEUKKworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfR0VUQ0xPQ0tTT1VSQ0UgIFNNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRQorI2RlZmluZSBfX1NNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRSAgICAgIFNNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRQorCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkcgICAgSVNfU01BUlRDQVJEX09ORV9CSVRfU0FNUExFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQlVTX0FsaWFzZWRfTWFjcm9zIEhBTCBTTUJVUyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX1JFU0VUX0NSMSAgICAgICAgICAgU01CVVNfUkVTRVRfQ1IxCisjZGVmaW5lIF9fSEFMX1NNQlVTX1JFU0VUX0NSMiAgICAgICAgICAgU01CVVNfUkVTRVRfQ1IyCisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFTkVSQVRFX1NUQVJUICAgICAgU01CVVNfR0VORVJBVEVfU1RBUlQKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0FERFJfTUFUQ0ggICAgICBTTUJVU19HRVRfQUREUl9NQVRDSAorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfRElSICAgICAgICAgICAgIFNNQlVTX0dFVF9ESVIKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX1NUT1BfTU9ERSAgICAgICBTTUJVU19HRVRfU1RPUF9NT0RFCisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9QRUNfTU9ERSAgICAgICAgU01CVVNfR0VUX1BFQ19NT0RFCisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9BTEVSVF9FTkFCTEVEICAgU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NQSV9BbGlhc2VkX01hY3JvcyBIQUwgU1BJIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9TUElfMUxJTkVfVFggICAgICAgICAgICAgIFNQSV8xTElORV9UWAorI2RlZmluZSBfX0hBTF9TUElfMUxJTkVfUlggICAgICAgICAgICAgIFNQSV8xTElORV9SWAorI2RlZmluZSBfX0hBTF9TUElfUkVTRVRfQ1JDICAgICAgICAgICAgIFNQSV9SRVNFVF9DUkMKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVUFSVF9BbGlhc2VkX01hY3JvcyBIQUwgVUFSVCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfVUFSVF9HRVRDTE9DS1NPVVJDRSAgICAgICBVQVJUX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fSEFMX1VBUlRfTUFTS19DT01QVVRBVElPTiAgICAgVUFSVF9NQVNLX0NPTVBVVEFUSU9OCisjZGVmaW5lIF9fVUFSVF9HRVRDTE9DS1NPVVJDRSAgICAgICAgICAgVUFSVF9HRVRDTE9DS1NPVVJDRQorI2RlZmluZSBfX1VBUlRfTUFTS19DT01QVVRBVElPTiAgICAgICAgIFVBUlRfTUFTS19DT01QVVRBVElPTgorCisjZGVmaW5lIElTX1VBUlRfV0FLRVVQTUVUSE9ERSAgICAgICAgICAgSVNfVUFSVF9XQUtFVVBNRVRIT0QKKworI2RlZmluZSBJU19VQVJUX09ORUJJVF9TQU1QTEUgICAgICAgICAgIElTX1VBUlRfT05FX0JJVF9TQU1QTEUKKyNkZWZpbmUgSVNfVUFSVF9PTkVCSVRfU0FNUExJTkcgICAgICAgICBJU19VQVJUX09ORV9CSVRfU0FNUExFCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfVVNBUlRfQWxpYXNlZF9NYWNyb3MgSEFMIFVTQVJUIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX1VTQVJUX0VOQUJMRV9JVCAgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRV9JVAorI2RlZmluZSBfX1VTQVJUX0RJU0FCTEVfSVQgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19VU0FSVF9FTkFCTEUgICAgICAgICAgICAgICAgICBfX0hBTF9VU0FSVF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVF9ESVNBQkxFICAgICAgICAgICAgICAgICBfX0hBTF9VU0FSVF9ESVNBQkxFCisKKyNkZWZpbmUgX19IQUxfVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UgICAgICBVU0FSVF9HRVRDTE9DS1NPVVJDRQorI2RlZmluZSBfX1VTQVJUX0dFVENMT0NLU09VUkNFICAgICAgICAgIFVTQVJUX0dFVENMT0NLU09VUkNFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1VTQl9BbGlhc2VkX01hY3JvcyBIQUwgVVNCIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNCX0VYVElfTElORV9XQUtFVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX1dBS0VVUF9FWFRJX0xJTkUKKworI2RlZmluZSBVU0JfRlNfRVhUSV9UUklHR0VSX1JJU0lOR19FREdFICAgICAgICAgICAgICAgICAgICBVU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX1JJU0lOR19FREdFCisjZGVmaW5lIFVTQl9GU19FWFRJX1RSSUdHRVJfRkFMTElOR19FREdFICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfRkFMTElOR19FREdFCisjZGVmaW5lIFVTQl9GU19FWFRJX1RSSUdHRVJfQk9USF9FREdFICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfUklTSU5HX0ZBTExJTkdfRURHRQorI2RlZmluZSBVU0JfRlNfRVhUSV9MSU5FX1dBS0VVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0xJTkUKKworI2RlZmluZSBVU0JfSFNfRVhUSV9UUklHR0VSX1JJU0lOR19FREdFICAgICAgICAgICAgICAgICAgICBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX1JJU0lOR19FREdFCisjZGVmaW5lIFVTQl9IU19FWFRJX1RSSUdHRVJfRkFMTElOR19FREdFICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfRkFMTElOR19FREdFCisjZGVmaW5lIFVTQl9IU19FWFRJX1RSSUdHRVJfQk9USF9FREdFICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfUklTSU5HX0ZBTExJTkdfRURHRQorI2RlZmluZSBVU0JfSFNfRVhUSV9MSU5FX1dBS0VVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0xJTkUKKworI2RlZmluZSBfX0hBTF9VU0JfRVhUSV9FTkFCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfV0FLRVVQX0VYVElfRU5BQkxFX0lUCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0RJU0FCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9ESVNBQkxFX0lUCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0dFVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9HRVRfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfRVhUSV9DTEVBUl9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfRVhUSV9TRVRfUklTSU5HX0VER0VfVFJJR0dFUiAgICAgICAgICAgICBfX0hBTF9VU0JfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX1NFVF9GQUxMSU5HX0VER0VfVFJJR0dFUiAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX1NFVF9GQUxMSU5HUklTSU5HX1RSSUdHRVIgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRQorCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRU5BQkxFX0lUCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0RJU0FCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9HRVRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9TRVRfUklTSU5HX0VHREVfVFJJR0dFUiAgICAgICAgICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9TRVRfRkFMTElOR19FR0RFX1RSSUdHRVIgICAgICAgICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9HRU5FUkFURV9TV0lUICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0dFTkVSQVRFX1NXSVQKKworI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9FTkFCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0VOQUJMRV9JVAorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9ESVNBQkxFX0lUICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfR0VUX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9HRVRfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9DTEVBUl9GTEFHICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0NMRUFSX0ZMQUcKKyNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfU0VUX1JJU0lOR19FR0RFX1RSSUdHRVIgICAgICAgICAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSICAgICAgICAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX1NFVF9GQUxMSU5HUklTSU5HX1RSSUdHRVIgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfR0VORVJBVEVfU1dJVCAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9HRU5FUkFURV9TV0lUCisKKyNkZWZpbmUgSEFMX1BDRF9BY3RpdmVSZW1vdGVXYWtldXAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BDRF9BY3RpdmF0ZVJlbW90ZVdha2V1cAorI2RlZmluZSBIQUxfUENEX0RlQWN0aXZlUmVtb3RlV2FrZXVwICAgICAgICAgICAgICAgICAgICAgICBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAKKworI2RlZmluZSBIQUxfUENEX1NldFR4RmlGbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUENERXhfU2V0VHhGaUZvCisjZGVmaW5lIEhBTF9QQ0RfU2V0UnhGaUZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QQ0RFeF9TZXRSeEZpRm8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1RJTV9BbGlhc2VkX01hY3JvcyBIQUwgVElNIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NldElDUHJlc2NhbGVyVmFsdWUgICBUSU1fU0VUX0lDUFJFU0NBTEVSVkFMVUUKKyNkZWZpbmUgX19IQUxfVElNX1Jlc2V0SUNQcmVzY2FsZXJWYWx1ZSBUSU1fUkVTRVRfSUNQUkVTQ0FMRVJWQUxVRQorCisjZGVmaW5lIFRJTV9HRVRfSVRTVEFUVVMgICAgICAgICAgICAgICAgX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UKKyNkZWZpbmUgVElNX0dFVF9DTEVBUl9JVCAgICAgICAgICAgICAgICBfX0hBTF9USU1fQ0xFQVJfSVQKKworI2RlZmluZSBfX0hBTF9USU1fR0VUX0lUU1RBVFVTICAgICAgICAgIF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFCisKKyNkZWZpbmUgX19IQUxfVElNX0RJUkVDVElPTl9TVEFUVVMgICAgICBfX0hBTF9USU1fSVNfVElNX0NPVU5USU5HX0RPV04KKyNkZWZpbmUgX19IQUxfVElNX1BSRVNDQUxFUiAgICAgICAgICAgICBfX0hBTF9USU1fU0VUX1BSRVNDQUxFUgorI2RlZmluZSBfX0hBTF9USU1fU2V0Q291bnRlciAgICAgICAgICAgIF9fSEFMX1RJTV9TRVRfQ09VTlRFUgorI2RlZmluZSBfX0hBTF9USU1fR2V0Q291bnRlciAgICAgICAgICAgIF9fSEFMX1RJTV9HRVRfQ09VTlRFUgorI2RlZmluZSBfX0hBTF9USU1fU2V0QXV0b3JlbG9hZCAgICAgICAgIF9fSEFMX1RJTV9TRVRfQVVUT1JFTE9BRAorI2RlZmluZSBfX0hBTF9USU1fR2V0QXV0b3JlbG9hZCAgICAgICAgIF9fSEFMX1RJTV9HRVRfQVVUT1JFTE9BRAorI2RlZmluZSBfX0hBTF9USU1fU2V0Q2xvY2tEaXZpc2lvbiAgICAgIF9fSEFMX1RJTV9TRVRfQ0xPQ0tESVZJU0lPTgorI2RlZmluZSBfX0hBTF9USU1fR2V0Q2xvY2tEaXZpc2lvbiAgICAgIF9fSEFMX1RJTV9HRVRfQ0xPQ0tESVZJU0lPTgorI2RlZmluZSBfX0hBTF9USU1fU2V0SUNQcmVzY2FsZXIgICAgICAgIF9fSEFMX1RJTV9TRVRfSUNQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfVElNX0dldElDUHJlc2NhbGVyICAgICAgICBfX0hBTF9USU1fR0VUX0lDUFJFU0NBTEVSCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRDb21wYXJlICAgICAgICAgICAgX19IQUxfVElNX1NFVF9DT01QQVJFCisjZGVmaW5lIF9fSEFMX1RJTV9HZXRDb21wYXJlICAgICAgICAgICAgX19IQUxfVElNX0dFVF9DT01QQVJFCisKKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfREZTRE0gIFRJTV9CUkVBS0lOUFVUU09VUkNFX0RGU0RNMQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRVRIX0FsaWFzZWRfTWFjcm9zIEhBTCBFVEggQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX0lUCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX0RJU0FCTEVfSVQgICAgICAgICAgICAgICAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9FVEhfRVhUSV9HRVRfRkxBRyAgICAgICAgICAgICAgICAgICAgX19IQUxfRVRIX1dBS0VVUF9FWFRJX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9FVEhfRVhUSV9TRVRfUklTSU5HX0VHREVfVFJJR0dFUiAgICAgX19IQUxfRVRIX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRV9UUklHR0VSCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRV9UUklHR0VSCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX1NFVF9GQUxMSU5HUklTSU5HX1RSSUdHRVIgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdSSVNJTkdfVFJJR0dFUgorCisjZGVmaW5lIEVUSF9QUk9NSVNDSU9VU01PREVfRU5BQkxFICAgRVRIX1BST01JU0NVT1VTX01PREVfRU5BQkxFCisjZGVmaW5lIEVUSF9QUk9NSVNDSU9VU01PREVfRElTQUJMRSAgRVRIX1BST01JU0NVT1VTX01PREVfRElTQUJMRQorI2RlZmluZSBJU19FVEhfUFJPTUlTQ0lPVVNfTU9ERSAgICAgIElTX0VUSF9QUk9NSVNDVU9VU19NT0RFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9MVERDX0FsaWFzZWRfTWFjcm9zIEhBTCBMVERDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFREQ19MQVlFUiBMVERDX0xBWUVSCisjZGVmaW5lIF9fSEFMX0xURENfUkVMT0FEX0NPTkZJRyAgX19IQUxfTFREQ19SRUxPQURfSU1NRURJQVRFX0NPTkZJRworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU0FJX0FsaWFzZWRfTWFjcm9zIEhBTCBTQUkgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfT1VUUFVURFJJVkVfRElTQUJMRUQgICAgICAgICAgU0FJX09VVFBVVERSSVZFX0RJU0FCTEUKKyNkZWZpbmUgU0FJX09VVFBVVERSSVZFX0VOQUJMRUQgICAgICAgICAgIFNBSV9PVVRQVVREUklWRV9FTkFCTEUKKyNkZWZpbmUgU0FJX01BU1RFUkRJVklERVJfRU5BQkxFRCAgICAgICAgIFNBSV9NQVNURVJESVZJREVSX0VOQUJMRQorI2RlZmluZSBTQUlfTUFTVEVSRElWSURFUl9ESVNBQkxFRCAgICAgICAgU0FJX01BU1RFUkRJVklERVJfRElTQUJMRQorI2RlZmluZSBTQUlfU1RSRU9NT0RFICAgICAgICAgICAgICAgICAgICAgU0FJX1NURVJFT01PREUKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfRW1wdHkgICAgICAgICAgICAgIFNBSV9GSUZPU1RBVFVTX0VNUFRZCisjZGVmaW5lIFNBSV9GSUZPU3RhdHVzX0xlc3MxUXVhcnRlckZ1bGwgICBTQUlfRklGT1NUQVRVU19MRVNTMVFVQVJURVJGVUxMCisjZGVmaW5lIFNBSV9GSUZPU3RhdHVzXzFRdWFydGVyRnVsbCAgICAgICBTQUlfRklGT1NUQVRVU18xUVVBUlRFUkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfSGFsZkZ1bGwgICAgICAgICAgIFNBSV9GSUZPU1RBVFVTX0hBTEZGVUxMCisjZGVmaW5lIFNBSV9GSUZPU3RhdHVzXzNRdWFydGVyc0Z1bGwgICAgICBTQUlfRklGT1NUQVRVU18zUVVBUlRFUkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfRnVsbCAgICAgICAgICAgICAgIFNBSV9GSUZPU1RBVFVTX0ZVTEwKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX01PTk9fU1RSRU9fTU9ERSAgICAgIElTX1NBSV9CTE9DS19NT05PX1NURVJFT19NT0RFCisjZGVmaW5lIFNBSV9TWU5DSFJPTk9VU19FWFQgICAgICAgICAgICAgICBTQUlfU1lOQ0hST05PVVNfRVhUX1NBSTEKKyNkZWZpbmUgU0FJX1NZTkNFWFRfSU5fRU5BQkxFICAgICAgICAgICAgIFNBSV9TWU5DRVhUX09VVEJMT0NLQV9FTkFCTEUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NQRElGUlhfQWxpYXNlZF9NYWNyb3MgSEFMIFNQRElGUlggQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgSEFMX1NQRElGUlhfUmVjZWl2ZUNvbnRyb2xGbG93ICAgICAgSEFMX1NQRElGUlhfUmVjZWl2ZUN0cmxGbG93CisjZGVmaW5lIEhBTF9TUERJRlJYX1JlY2VpdmVDb250cm9sRmxvd19JVCAgIEhBTF9TUERJRlJYX1JlY2VpdmVDdHJsRmxvd19JVAorI2RlZmluZSBIQUxfU1BESUZSWF9SZWNlaXZlQ29udHJvbEZsb3dfRE1BICBIQUxfU1BESUZSWF9SZWNlaXZlQ3RybEZsb3dfRE1BCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0hSVElNX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBIUlRJTSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZCAoU1RNMzJINykgfHwgZGVmaW5lZCAoU1RNMzJGMykKKyNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0X0lUIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RhcnRfSVQKKyNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0X0RNQSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0YXJ0X0RNQQorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnQgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdGFydAorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcF9JVCBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0b3BfSVQKKyNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0b3BfRE1BIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcF9ETUEKKyNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0b3AgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdG9wCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BQUF9BbGlhc2VkX01hY3JvcyBIQUwgUFBQIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyX0hBTF9MRUdBQ1kgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMl9hc3NlcnRfdGVtcGxhdGUuaCBiL0luYy9zdG0zMl9hc3NlcnRfdGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTlmMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyX2Fzc2VydF90ZW1wbGF0ZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMl9hc3NlcnQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU1RNMzIgYXNzZXJ0IHRlbXBsYXRlIGZpbGUuCisgICogICAgICAgICAgVGhpcyBmaWxlIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGZvbGRlciBhbmQgcmVuYW1lZAorICAqICAgICAgICAgIHRvIHN0bTMyX2Fzc2VydC5oLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMl9BU1NFUlRfSAorI2RlZmluZSBfX1NUTTMyX0FTU0VSVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorLyoqCisgICogQGJyaWVmICBUaGUgYXNzZXJ0X3BhcmFtIG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycyBjaGVjay4KKyAgKiBAcGFyYW0gIGV4cHIgSWYgZXhwciBpcyBmYWxzZSwgaXQgY2FsbHMgYXNzZXJ0X2ZhaWxlZCBmdW5jdGlvbgorICAqICAgICAgICAgd2hpY2ggcmVwb3J0cyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBzb3VyY2UKKyAgKiAgICAgICAgIGxpbmUgbnVtYmVyIG9mIHRoZSBjYWxsIHRoYXQgZmFpbGVkLgorICAqICAgICAgICAgSWYgZXhwciBpcyB0cnVlLCBpdCByZXR1cm5zIG5vIHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKGV4cHIpID8gKHZvaWQpMFUgOiBhc3NlcnRfZmFpbGVkKCh1aW50OF90ICopX19GSUxFX18sIF9fTElORV9fKSkKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIHZvaWQgYXNzZXJ0X2ZhaWxlZCh1aW50OF90KiBmaWxlLCB1aW50MzJfdCBsaW5lKTsKKyNlbHNlCisgICNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZiAvKiBVU0VfRlVMTF9BU1NFUlQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJfQVNTRVJUX0ggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWwuaCBiL0luYy9zdG0zMmwweHhfaGFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkMzkyMwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsLmgKQEAgLTAsMCArMSw0NTYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgSEFMCisgICogICAgICAgICAgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfY29uZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhBTCBIQUwKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0NvbnN0YW50cyBIQUwgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfQm9vdE1vZGUgQm9vdCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1lTQ0ZHX0JPT1RfTUFJTkZMQVNIICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNZU0NGR19CT09UX1NZU1RFTUZMQVNIICAgICAgICAoKHVpbnQzMl90KVNZU0NGR19DRkdSMV9CT09UX01PREVfMCkKKyNkZWZpbmUgU1lTQ0ZHX0JPT1RfU1JBTSAgICAgICAgICAgICAgICgodWludDMyX3QpU1lTQ0ZHX0NGR1IxX0JPT1RfTU9ERSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQkdNQ1VfTG93X1Bvd2VyX0NvbmZpZyBEQkdNQ1UgTG93IFBvd2VyIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBEQkdNQ1VfU0xFRVAgICAgICAgICAgICAgICAgIERCR01DVV9DUl9EQkdfU0xFRVAKKyNkZWZpbmUgREJHTUNVX1NUT1AgICAgICAgICAgICAgICAgICBEQkdNQ1VfQ1JfREJHX1NUT1AKKyNkZWZpbmUgREJHTUNVX1NUQU5EQlkgICAgICAgICAgICAgICBEQkdNQ1VfQ1JfREJHX1NUQU5EQlkKKyNkZWZpbmUgSVNfREJHTUNVX1BFUklQSChfX1BFUklQSF9fKSAoKCgoX19QRVJJUEhfXykgJiAofihEQkdNQ1VfQ1JfREJHKSkpID09IDB4MDBVKSAmJiAoKF9fUEVSSVBIX18pICE9IDB4MDBVKSkKKworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZCAoTENEX0JBU0UpIC8qIFNUTTMyTDB4M3h4IG9ubHkgKi8KKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX0xDRF9FWFRfQ0FQQSBTWVNDRkcgTENEIEV4dGVybmFsIENhcGFjaXRvcnMKKyAgKiBAeworICAqLworI2RlZmluZSBTWVNDRkdfTENEX0VYVF9DQVBBICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9DQVBBIC8qITwgQ29ubmVjdGlvbiBvZiBpbnRlcm5hbCBWbGNkIHJhaWwgdG8gZXh0ZXJuYWwgY2FwYWNpdG9ycyAqLworI2RlZmluZSBTWVNDRkdfVkxDRF9QQjJfRVhUX0NBUEFfT04gICAgIFNZU0NGR19DRkdSMl9DQVBBXzAgIC8qITwgQ29ubmVjdGlvbiBvbiBQQjIgICAqLworI2RlZmluZSBTWVNDRkdfVkxDRF9QQjEyX0VYVF9DQVBBX09OICAgIFNZU0NGR19DRkdSMl9DQVBBXzEgIC8qITwgQ29ubmVjdGlvbiBvbiBQQjEyICAqLworI2RlZmluZSBTWVNDRkdfVkxDRF9QQjBfRVhUX0NBUEFfT04gICAgIFNZU0NGR19DRkdSMl9DQVBBXzIgIC8qITwgQ29ubmVjdGlvbiBvbiBQQjAgICAqLworI2lmIGRlZmluZWQgKFNZU0NGR19DRkdSMl9DQVBBXzMpCisjZGVmaW5lIFNZU0NGR19WTENEX1BFMTFfRVhUX0NBUEFfT04gICAgU1lTQ0ZHX0NGR1IyX0NBUEFfMyAgLyohPCBDb25uZWN0aW9uIG9uIFBFMTEgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNDRkdfQ0ZHUjJfQ0FQQV80KQorI2RlZmluZSBTWVNDRkdfVkxDRF9QRTEyX0VYVF9DQVBBX09OICAgIFNZU0NGR19DRkdSMl9DQVBBXzQgIC8qITwgQ29ubmVjdGlvbiBvbiBQRTEyICAqLworI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYKKworLyoqIEBkZWZncm91cCBTWVNDRkdfVlJFRklOVF9PVVRfU0VMRUNUIFNZU0NGRyBWUkVGSU5UIE91dCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTWVNDRkdfVlJFRklOVF9PVVRfTk9ORSAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiBubyBwYWQgY29ubmVjdGVkICovCisjZGVmaW5lIFNZU0NGR19WUkVGSU5UX09VVF9QQjAgICAgICAgICAgIFNZU0NGR19DRkdSM19WUkVGX09VVF8wIC8qIFNlbGVjdHMgUEJPIGFzIG91dHB1dCBmb3IgdGhlIFZyZWZpbnQgKi8KKyNkZWZpbmUgU1lTQ0ZHX1ZSRUZJTlRfT1VUX1BCMSAgICAgICAgICAgU1lTQ0ZHX0NGR1IzX1ZSRUZfT1VUXzEgLyogU2VsZWN0cyBQQjEgYXMgb3V0cHV0IGZvciB0aGUgVnJlZmludCAqLworI2RlZmluZSBTWVNDRkdfVlJFRklOVF9PVVRfUEIwX1BCMSAgICAgICBTWVNDRkdfQ0ZHUjNfVlJFRl9PVVQgICAvKiBTZWxlY3RzIFBCTyBhbmQgUEIxIGFzIG91dHB1dCBmb3IgdGhlIFZyZWZpbnQgKi8KKworI2RlZmluZSBJU19TWVNDRkdfVlJFRklOVF9PVVRfU0VMRUNUKE9VVFBVVCkgICAoKChPVVRQVVQpID09IFNZU0NGR19WUkVGSU5UX09VVF9OT05FKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IFNZU0NGR19WUkVGSU5UX09VVF9QQjApICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gU1lTQ0ZHX1ZSRUZJTlRfT1VUX1BCMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBTWVNDRkdfVlJFRklOVF9PVVRfUEIwX1BCMSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19mbGFnc19kZWZpbml0aW9uIFNZU0NGRyBGbGFncyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1lTQ0ZHX0ZMQUdfVlJFRklOVF9SRUFEWSAgICAgIFNZU0NGR19DRkdSM19WUkVGSU5UX1JEWUYKKworI2RlZmluZSBJU19TWVNDRkdfRkxBRyhGTEFHKSAgICAgICAgICAgKChGTEFHKSA9PSBTWVNDRkdfRkxBR19WUkVGSU5UX1JFQURZKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfRmFzdE1vZGVQbHVzX0dQSU8gRmFzdCBNb2RlIFBsdXMgb24gR1BJTworICAqIEB7CisgICovCisvKiogQGJyaWVmICBGYXN0IG1vZGUgUGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgb24gYSBzcGVjaWZpYyBHUElPCisgICovCisjaWYgZGVmaW5lZCAoU1lTQ0ZHX0NGR1IyX0kyQ19QQjZfRk1QKQorI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNiAgICAgICBTWVNDRkdfQ0ZHUjJfSTJDX1BCNl9GTVAgIC8qIEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQgKFNZU0NGR19DRkdSMl9JMkNfUEI3X0ZNUCkKKyNkZWZpbmUgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcgICAgICAgU1lTQ0ZHX0NGR1IyX0kyQ19QQjdfRk1QICAvKiBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI3ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNDRkdfQ0ZHUjJfSTJDX1BCOF9GTVApCisjZGVmaW5lIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4ICAgICAgIFNZU0NGR19DRkdSMl9JMkNfUEI4X0ZNUCAgLyogRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCOCAqLworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTQ0ZHX0NGR1IyX0kyQ19QQjlfRk1QKQorI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSAgICAgICBTWVNDRkdfQ0ZHUjJfSTJDX1BCOV9GTVAgIC8qIEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjkgKi8KKyNlbmRpZgorCisjZGVmaW5lIElTX1NZU0NGR19GQVNUTU9ERVBMVVMoUElOKSAoKCgoUElOKSAmIChTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFBJTikgJiAoU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpKSA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChQSU4pICYgKFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4KSkgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUElOKSAmIChTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSkpID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI5KSAgKQorLyoqCisgKiBAfQorICovCisgLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX01hY3JvcyBIQUwgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgRnJlZXplL1VuZnJlZXplIFBlcmlwaGVyYWxzIGluIERlYnVnIG1vZGUKKyAgKi8KKyNpZiBkZWZpbmVkIChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMl9TVE9QKQorLyoqCisgICogQGJyaWVmICBUSU0yIFBlcmlwaGVyYWxzIERlYnVnIG1vZGUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0yKCkgICAgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlosREJHTUNVX0FQQjFfRlpfREJHX1RJTTJfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTIoKSAgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWixEQkdNQ1VfQVBCMV9GWl9EQkdfVElNMl9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNM19TVE9QKQorLyoqCisgICogQGJyaWVmICBUSU0zIFBlcmlwaGVyYWxzIERlYnVnIG1vZGUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0zKCkgICAgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlosREJHTUNVX0FQQjFfRlpfREJHX1RJTTNfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTMoKSAgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWixEQkdNQ1VfQVBCMV9GWl9EQkdfVElNM19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChEQkdNQ1VfQVBCMV9GWl9EQkdfVElNNl9TVE9QKQorLyoqCisgICogQGJyaWVmICBUSU02IFBlcmlwaGVyYWxzIERlYnVnIG1vZGUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU02KCkgICAgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlosIERCR01DVV9BUEIxX0ZaX0RCR19USU02X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU02KCkgICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlosIERCR01DVV9BUEIxX0ZaX0RCR19USU02X1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQgKERCR01DVV9BUEIxX0ZaX0RCR19USU03X1NUT1ApCisvKioKKyAgKiBAYnJpZWYgIFRJTTcgUGVyaXBoZXJhbHMgRGVidWcgbW9kZQorICAqLworI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTcoKSAgICAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWiwgREJHTUNVX0FQQjFfRlpfREJHX1RJTTdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTcoKSAgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWiwgREJHTUNVX0FQQjFfRlpfREJHX1RJTTdfU1RPUCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoREJHTUNVX0FQQjFfRlpfREJHX1JUQ19TVE9QKQorLyoqCisgICogQGJyaWVmICBSVEMgUGVyaXBoZXJhbHMgRGVidWcgbW9kZQorICAqLworI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1JUQygpICAgICAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWiwgREJHTUNVX0FQQjFfRlpfREJHX1JUQ19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfUlRDKCkgICAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaLCBEQkdNQ1VfQVBCMV9GWl9EQkdfUlRDX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQgKERCR01DVV9BUEIxX0ZaX0RCR19XV0RHX1NUT1ApCisvKioKKyAgKiBAYnJpZWYgIFdXREcgUGVyaXBoZXJhbHMgRGVidWcgbW9kZQorICAqLworI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1dXREcoKSAgICAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWiwgREJHTUNVX0FQQjFfRlpfREJHX1dXREdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1dXREcoKSAgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWiwgREJHTUNVX0FQQjFfRlpfREJHX1dXREdfU1RPUCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoREJHTUNVX0FQQjFfRlpfREJHX0lXREdfU1RPUCkKKy8qKgorICAqIEBicmllZiAgSVdERyBQZXJpcGhlcmFscyBEZWJ1ZyBtb2RlCisgICovCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfSVdERygpICAgICBTRVRfQklUKERCR01DVS0+QVBCMUZaLCBEQkdNQ1VfQVBCMV9GWl9EQkdfSVdER19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSVdERygpICAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaLCBEQkdNQ1VfQVBCMV9GWl9EQkdfSVdER19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDMV9TVE9QKQorLyoqCisgICogQGJyaWVmICBJMkMxIFBlcmlwaGVyYWxzIERlYnVnIG1vZGUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMxX1RJTUVPVVQoKSAgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlosIERCR01DVV9BUEIxX0ZaX0RCR19JMkMxX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMxX1RJTUVPVVRfREJHTUNVKCkgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaLCBEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDMV9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDMl9TVE9QKQorLyoqCisgICogQGJyaWVmICBJMkMyIFBlcmlwaGVyYWxzIERlYnVnIG1vZGUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMyX1RJTUVPVVRfREJHTUNVKCkgICBTRVRfQklUKERCR01DVS0+QVBCMUZaLCBEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDMl9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDMl9USU1FT1VUX0RCR01DVSgpIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWiwgREJHTUNVX0FQQjFfRlpfREJHX0kyQzJfU1RPUCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoREJHTUNVX0FQQjFfRlpfREJHX0kyQzNfU1RPUCkKKy8qKgorICAqIEBicmllZiAgSTJDMyBQZXJpcGhlcmFscyBEZWJ1ZyBtb2RlCisgICovCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfSTJDM19USU1FT1VUKCkgICBTRVRfQklUKERCR01DVS0+QVBCMUZaLCBEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDM19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDM19USU1FT1VUKCkgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaLCBEQkdNQ1VfQVBCMV9GWl9EQkdfSTJDM19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChEQkdNQ1VfQVBCMV9GWl9EQkdfTFBUSU1FUl9TVE9QKQorLyoqCisgICogQGJyaWVmICBMUFRJTUVSIFBlcmlwaGVyYWxzIERlYnVnIG1vZGUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9MUFRJTUVSKCkgICAgICAgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlogLERCR01DVV9BUEIxX0ZaX0RCR19MUFRJTUVSX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9MUFRJTUVSKCkgICAgICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlogLERCR01DVV9BUEIxX0ZaX0RCR19MUFRJTUVSX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQgKERCR01DVV9BUEIyX0ZaX0RCR19USU0yMl9TVE9QKQorLyoqCisgICogQGJyaWVmICBUSU0yMiBQZXJpcGhlcmFscyBEZWJ1ZyBtb2RlCisgICovCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMjIoKSAgICAgICAgICBTRVRfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMjJfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTIyKCkgICAgICAgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJfRlpfREJHX1RJTTIyX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQgKERCR01DVV9BUEIyX0ZaX0RCR19USU0yMV9TVE9QKQorLyoqCisgICogQGJyaWVmICBUSU0yMSBQZXJpcGhlcmFscyBEZWJ1ZyBtb2RlCisgICovCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMjEoKSAgICAgICAgICBTRVRfQklUKERCR01DVS0+QVBCMkZaLCBEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMjFfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTIxKCkgICAgICAgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWiwgREJHTUNVX0FQQjJfRlpfREJHX1RJTTIxX1NUT1ApCisjZW5kaWYKKworLyoqIEBicmllZiAgTWFpbiBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZMQVNIKCkgICAgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfTUVNX01PREUpCisKKy8qKiBAYnJpZWYgIFN5c3RlbSBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NZU1RFTUZMQVNIKCkgICAgICBNT0RJRllfUkVHKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9NRU1fTU9ERSwgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzApCisKKworLyoqIEBicmllZiAgRW1iZWRkZWQgU1JBTSBtYXBwZWQgYXQgMHgwMDAwMDAwMAorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfU1JBTSgpICAgICAgICAgICAgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFLCBTWVNDRkdfQ0ZHUjFfTUVNX01PREVfMCB8IFNZU0NGR19DRkdSMV9NRU1fTU9ERV8xKQorCisvKiogQGJyaWVmICBDb25maWd1cmF0aW9uIG9mIHRoZSBEQkcgTG93IFBvd2VyIG1vZGUuCisgICogQHBhcmFtICBfX0RCR0xQTU9ERV9fIGJpdCBmaWVsZCB0byBpbmRpY2F0ZSBpbiB3aWNoIExvdyBQb3dlciBtb2RlIERCRyBpcyBzdGlsbCBhY3RpdmUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZgorICAqICAgICAgICAgLSBEQkdNQ1VfU0xFRVAKKyAgKiAgICAgICAgIC0gREJHTUNVX1NUT1AKKyAgKiAgICAgICAgIC0gREJHTUNVX1NUQU5EQlkKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0RCR19MUF9DT05GSUcoX19EQkdMUE1PREVfXykgICAgZG8ge2Fzc2VydF9wYXJhbShJU19EQkdNQ1VfUEVSSVBIKF9fREJHTFBNT0RFX18pKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCRywgKF9fREJHTFBNT0RFX18pKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQorCisjaWYgZGVmaW5lZCAoTENEX0JBU0UpIC8qIFNUTTMyTDB4M3h4IG9ubHkgKi8KKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBWTENEIERlY291cGxpbmcgY2FwYWNpdGFuY2UgY29ubmVjdGlvbi4KKyAgKgorICAqIEBwYXJhbSAgX19TWVNDRkdfVkxDRF9DQVBBX18gc3BlY2lmaWVzIHRoZSBkZWNvdXBsaW5nIG9mIExDRCBjYXBhY2l0YW5jZSBmb3IgcmFpbHMgY29ubmVjdGlvbiBvbiBHUElPLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIGZvbGxvd2luZyB2YWx1ZXMgKHdoZW4gYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgIEBhcmcgU1lTQ0ZHX1ZMQ0RfUEIyX0VYVF9DQVBBX09OOiAgQ29ubmVjdGlvbiBvbiBQQjIKKyAgKiAgICAgICAgICAgIEBhcmcgU1lTQ0ZHX1ZMQ0RfUEIxMl9FWFRfQ0FQQV9PTjogQ29ubmVjdGlvbiBvbiBQQjEyCisgICogICAgICAgICAgICBAYXJnIFNZU0NGR19WTENEX1BCMF9FWFRfQ0FQQV9PTjogIENvbm5lY3Rpb24gb24gUEIwCisgICogICAgICAgICAgICBAYXJnIFNZU0NGR19WTENEX1BFMTFfRVhUX0NBUEFfT046IENvbm5lY3Rpb24gb24gUEUxMQorICAqICAgICAgICAgICAgQGFyZyBTWVNDRkdfVkxDRF9QRTEyX0VYVF9DQVBBX09OOiBDb25uZWN0aW9uIG9uIFBFMTIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1ZMQ0RfQ0FQQV9DT05GSUcoX19TWVNDRkdfVkxDRF9DQVBBX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0xDRF9FWFRfQ0FQQSwgKHVpbnQzMl90KShfX1NZU0NGR19WTENEX0NBUEFfXykpCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgZGVjb3VwbGluZyBvZiBMQ0QgY2FwYWNpdGFuY2UgY29uZmlndXJlZCBieSB1c2VyLgorICAqIEByZXR2YWwgVGhlIExDRCBjYXBhY2l0YW5jZSBjb25uZWN0aW9uIGFzIGNvbmZpZ3VyZWQgYnkgdXNlci4gVGhlIHJldHVybmVkIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIDoKKyAgKiAgICAgICAgICAgIFNZU0NGR19WTENEX1BCMl9FWFRfQ0FQQV9PTjogIENvbm5lY3Rpb24gb24gUEIyCisgICogICAgICAgICAgICBTWVNDRkdfVkxDRF9QQjEyX0VYVF9DQVBBX09OOiBDb25uZWN0aW9uIG9uIFBCMTIKKyAgKiAgICAgICAgICAgIFNZU0NGR19WTENEX1BCMF9FWFRfQ0FQQV9PTjogIENvbm5lY3Rpb24gb24gUEIwCisgICogICAgICAgICAgICBTWVNDRkdfVkxDRF9QRTExX0VYVF9DQVBBX09OOiBDb25uZWN0aW9uIG9uIFBFMTEKKyAgKiAgICAgICAgICAgIFNZU0NGR19WTENEX1BFMTJfRVhUX0NBUEFfT046IENvbm5lY3Rpb24gb24gUEUxMgorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfR0VUX1ZMQ0RfQ0FQQV9DT05GSUcoKSAgICAgICAgICBSRUFEX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfTENEX0VYVF9DQVBBKQorCisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBib290IG1vZGUgYXMgY29uZmlndXJlZCBieSB1c2VyLgorICAqIEByZXR2YWwgVGhlIGJvb3QgbW9kZSBhcyBjb25maWd1cmVkIGJ5IHVzZXIuIFRoZSByZXR1cm5lZCBjYW4gYmUgYSB2YWx1ZSBvZiA6CisgICogICAgIC0gU1lTQ0ZHX0JPT1RfTUFJTkZMQVNICisgICogICAgIC0gU1lTQ0ZHX0JPT1RfU1lTVEVNRkxBU0gKKyAgKiAgICAgLSBTWVNDRkdfQk9PVF9TUkFNCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19HRVRfQk9PVF9NT0RFKCkgICAgICAgICAgUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0JPT1RfTU9ERSkKKworCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1lTQ0ZHIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoZSBvbmx5IHBhcmFtZXRlciBzdXBwb3J0ZWQgaXMgU1lTQ0ZHX0ZMQUdfVlJFRklOVF9SRUFEWQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19HRVRfRkxBRyhfX0ZMQUdfXykgKCgoU1lTQ0ZHLT5DRkdSMykgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBGYXN0IG1vZGUgUGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgZW5hYmxlIG1hY3JvCisgICogQHBhcmFtIF9fRkFTVE1PREVQTFVTX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgOgorICAqICAgICBAYXJnIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2CisgICogICAgIEBhcmcgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcKKyAgKiAgICAgQGFyZyBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOAorICAqICAgICBAYXJnIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI5CisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfRU5BQkxFKF9fRkFTVE1PREVQTFVTX18pICBkbyB7YXNzZXJ0X3BhcmFtKElTX1NZU0NGR19GQVNUTU9ERVBMVVMoKF9fRkFTVE1PREVQTFVTX18pKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIChfX0ZBU1RNT0RFUExVU19fKSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKKy8qKiBAYnJpZWYgIEZhc3QgbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBkaXNhYmxlIG1hY3JvCisgICogQHBhcmFtIF9fRkFTVE1PREVQTFVTX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgOgorICAqICAgICBAYXJnIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2CisgICogICAgIEBhcmcgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcKKyAgKiAgICAgQGFyZyBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOAorICAqICAgICBAYXJnIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI5CisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfRElTQUJMRShfX0ZBU1RNT0RFUExVU19fKSBkbyB7YXNzZXJ0X3BhcmFtKElTX1NZU0NGR19GQVNUTU9ERVBMVVMoKF9fRkFTVE1PREVQTFVTX18pKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMiwgKF9fRkFTVE1PREVQTFVTX18pKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfVmFyaWFibGVzIEhBTCBFeHBvcnRlZCBWYXJpYWJsZXMKKyAgKiBAeworICAqLworZXh0ZXJuIF9fSU8gdWludDMyX3QgdXdUaWNrOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9ucyBIQUwgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXQodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRGVJbml0KHZvaWQpOwordm9pZCBIQUxfTXNwSW5pdCh2b2lkKTsKK3ZvaWQgSEFMX01zcERlSW5pdCh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayh1aW50MzJfdCBUaWNrUHJpb3JpdHkpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCit2b2lkIEhBTF9JbmNUaWNrKHZvaWQpOwordm9pZCBIQUxfRGVsYXkodWludDMyX3QgRGVsYXkpOwordWludDMyX3QgSEFMX0dldFRpY2sodm9pZCk7Cit2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKTsKK3ZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCk7Cit1aW50MzJfdCBIQUxfR2V0SGFsVmVyc2lvbih2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRSRVZJRCh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRERVZJRCh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRVSUR3MCh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRVSUR3MSh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRVSUR3Mih2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgREJHTUNVIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgREJHTUNVIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZSh2b2lkKTsKK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU2xlZXBNb2RlKHZvaWQpOwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0b3BNb2RlKHZvaWQpOwordm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdG9wTW9kZSh2b2lkKTsKK3ZvaWQgSEFMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKTsKK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUodm9pZCk7Cit2b2lkIEhBTF9EQkdNQ1VfREJHX0VuYWJsZUxvd1Bvd2VyQ29uZmlnKHVpbnQzMl90IFBlcmlwaCk7Cit2b2lkIEhBTF9EQkdNQ1VfREJHX0Rpc2FibGVMb3dQb3dlckNvbmZpZyh1aW50MzJfdCBQZXJpcGgpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBTWVNDRkcgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBTWVNDRkcgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCit1aW50MzJfdCAgSEFMX1NZU0NGR19HZXRCb290TW9kZSh2b2lkKTsKK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVfTG9ja19WUkVGSU5UKHZvaWQpOwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVfTG9ja19WUkVGSU5UKHZvaWQpOwordm9pZCBIQUxfU1lTQ0ZHX1ZSRUZJTlRfT3V0cHV0U2VsZWN0KHVpbnQzMl90IFNZU0NGR19WcmVmaW50X09VVFBVVCk7CisvKioKKyAgKiBAfQorICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRGVmaW5lIHRoZSBwcml2YXRlIGdyb3VwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBIQUxfUHJpdmF0ZSBIQUwgUHJpdmF0ZQorICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9hZGMuaCBiL0luYy9zdG0zMmwweHhfaGFsX2FkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMGJkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9hZGMuaApAQCAtMCwwICsxLDExOTIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2FkYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBBREMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9BRENfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfQURDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQURDCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX1R5cGVzIEFEQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIEFEQyBncm91cCByZWd1bGFyIG92ZXJzYW1wbGluZyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUmF0aW87ICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgb3ZlcnNhbXBsaW5nIHJhdGlvLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19PdmVyc2FtcGxpbmdfUmF0aW8gKi8KKworICB1aW50MzJfdCBSaWdodEJpdFNoaWZ0OyAgICAgICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBkaXZpc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIE92ZXJzYW1wbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19SaWdodF9CaXRfU2hpZnQgKi8KKworICB1aW50MzJfdCBUcmlnZ2VyZWRNb2RlOyAgICAgICAgICAgICAgICAgLyohPCBTZWxlY3RzIHRoZSByZWd1bGFyIHRyaWdnZXJlZCBvdmVyc2FtcGxpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfVHJpZ2dlcmVkX092ZXJzYW1wbGluZ19Nb2RlICovCit9QURDX092ZXJzYW1wbGluZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGluc3RhbmNlIGFuZCBBREMgZ3JvdXAgcmVndWxhci4KKyAgKiBAbm90ZSAgIFBhcmFtZXRlcnMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIHNoYXJlZCB3aXRoaW4gMiBzY29wZXM6CisgICogICAgICAgICAgLSBTY29wZSBlbnRpcmUgQURDIChkaWZmZXJlbnRpYXRpb24gZG9uZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgb3RoZXIgU1RNMzIgc2VyaWVzIGZlYXR1cmluZyBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKTogQ2xvY2tQcmVzY2FsZXIsIFJlc29sdXRpb24sIERhdGFBbGlnbiwKKyAgKiAgICAgICAgICAgIFNjYW5Db252TW9kZSwgRU9DU2VsZWN0aW9uLCBMb3dQb3dlckF1dG9XYWl0LgorICAqICAgICAgICAgIC0gU2NvcGUgQURDIGdyb3VwIHJlZ3VsYXI6IENvbnRpbnVvdXNDb252TW9kZSwgTmJyT2ZDb252ZXJzaW9uLCBEaXNjb250aW51b3VzQ29udk1vZGUsCisgICogICAgICAgICAgICBFeHRlcm5hbFRyaWdDb252LCBFeHRlcm5hbFRyaWdDb252RWRnZSwgRE1BQ29udGludW91c1JlcXVlc3RzLCBPdmVycnVuLCBPdmVyc2FtcGxpbmdNb2RlLCBPdmVyc2FtcGxpbmcuCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEFEQyBzdGF0ZSBjYW4gYmUgZWl0aGVyOgorICAqICAgICAgICAgIC0gRm9yIGFsbCBwYXJhbWV0ZXJzOiBBREMgZGlzYWJsZWQKKyAgKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVycyBleGNlcHQgJ0Nsb2NrUHJlc2NhbGVyJyBhbmQgJ1Jlc29sdXRpb24nOiBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhci4KKyAgKiAgICAgICAgIElmIEFEQyBpcyBub3QgaW4gdGhlIGFwcHJvcHJpYXRlIHN0YXRlIHRvIG1vZGlmeSBzb21lIHBhcmFtZXRlcnMsIHRoZXNlIHBhcmFtZXRlcnMgc2V0dGluZyBpcyBieXBhc3NlZAorICAqICAgICAgICAgd2l0aG91dCBlcnJvciByZXBvcnRpbmcgKGFzIGl0IGNhbiBiZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gY2FzZSBvZiBpbnRlbmRlZCBhY3Rpb24gdG8gdXBkYXRlIGFub3RoZXIgcGFyYW1ldGVyIAorICAqICAgICAgICAgKHdoaWNoIGZ1bGZpbGxzIHRoZSBBREMgc3RhdGUgY29uZGl0aW9uKSBvbiB0aGUgZmx5KS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENsb2NrUHJlc2NhbGVyOyAgICAgICAgLyohPCBTZWxlY3QgQURDIGNsb2NrIHNvdXJjZSAoc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFQQiBjbG9jayBvciBhc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFEQyBkZWRpY2F0ZWQgSFNJIFJDIG9zY2lsbGF0b3IpIGFuZCBjbG9jayBwcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19DbG9ja1ByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2Ygc3luY2hyb25vdXMgY2xvY2sgbW9kZSBiYXNlZCBvbiBIQ0xLLzEsIHRoZSBjb25maWd1cmF0aW9uIG11c3QgYmUgZW5hYmxlZCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgc3lzdGVtIGNsb2NrIGhhcyBhIDUwJSBkdXR5IGNsb2NrIGN5Y2xlIChBUEIgcHJlc2NhbGVyIGNvbmZpZ3VyZWQgaW5zaWRlIFJDQyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYnlwYXNzZWQgYW5kIFBDTEsgY2xvY2sgbXVzdCBoYXZlIDUwJSBkdXR5IGN5Y2xlKS4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgdXNhZ2Ugb2YgdGhlIEFEQyBkZWRpY2F0ZWQgSFNJIFJDIG9zY2lsbGF0b3IsIGl0IG11c3QgYmUgcHJlbGltaW5hcmlseSBlbmFibGVkIGF0IFJDQyB0b3AgbGV2ZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgbW9kaWZpZWQgb25seSBpZiB0aGUgQURDIGlzIGRpc2FibGVkLiAqLworCisgIHVpbnQzMl90IFJlc29sdXRpb247ICAgICAgICAgICAgLyohPCBDb25maWd1cmUgdGhlIEFEQyByZXNvbHV0aW9uLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX1Jlc29sdXRpb24gKi8KKworICB1aW50MzJfdCBEYXRhQWxpZ247ICAgICAgICAgICAgIC8qITwgU3BlY2lmeSBBREMgZGF0YSBhbGlnbm1lbnQgaW4gY29udmVyc2lvbiBkYXRhIHJlZ2lzdGVyIChyaWdodCBvciBsZWZ0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGFsaWdubWVudHMgZm9ybWF0cyB2ZXJzdXMgcmVzb2x1dGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19EYXRhX2FsaWduICovCisKKyAgdWludDMyX3QgU2NhbkNvbnZNb2RlOyAgICAgICAgICAvKiE8IENvbmZpZ3VyZSB0aGUgc2VxdWVuY2VyIG9mIHJlZ3VsYXIgZ3JvdXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYXNzb2NpYXRlZCB0byBwYXJhbWV0ZXIgJ0Rpc2NvbnRpbnVvdXNDb252TW9kZScgdG8gaGF2ZSBtYWluIHNlcXVlbmNlIHN1YmRpdmlkZWQgaW4gc3VjY2Vzc2l2ZSBwYXJ0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlciBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgaWYgc2V2ZXJhbCBjaGFubmVscyBhcmUgc2V0IChzZXF1ZW5jZXIgY2Fubm90IGJlIGRpc2FibGVkLCBhcyBpdCBjYW4gYmUgdGhlIGNhc2Ugb24gb3RoZXIgU1RNMzIgZGV2aWNlcyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbmx5IDEgY2hhbm5lbCBpcyBzZXQ6IENvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGluIHNpbmdsZSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V2ZXJhbCBjaGFubmVscyBhcmUgc2V0OiAgQ29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBzZXF1ZW5jZSBtb2RlIChyYW5rcyBkZWZpbmVkIGJ5IGVhY2ggY2hhbm5lbCBudW1iZXI6IGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYW4gZGlyZWN0aW9uIGNhbiBiZSBzZXQgdG8gZm9yd2FyZCAoZnJvbSBjaGFubmVsIDAgdG8gY2hhbm5lbCAxOCkgb3IgYmFja3dhcmQgKGZyb20gY2hhbm5lbCAxOCB0byBjaGFubmVsIDApLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfU2Nhbl9tb2RlICovCisKKyAgdWludDMyX3QgRU9DU2VsZWN0aW9uOyAgICAgICAgICAvKiE8IFNwZWNpZnkgd2hpY2ggRU9DIChFbmQgT2YgQ29udmVyc2lvbikgZmxhZyBpcyB1c2VkIGZvciBjb252ZXJzaW9uIGJ5IHBvbGxpbmcgYW5kIGludGVycnVwdGlvbjogZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19FT0NTZWxlY3Rpb24uICovCisKKyAgdWludDMyX3QgTG93UG93ZXJBdXRvV2FpdDsgICAgICAvKiE8IFNlbGVjdCB0aGUgZHluYW1pYyBsb3cgcG93ZXIgQXV0byBEZWxheTogbmV3IGNvbnZlcnNpb24gc3RhcnQgb25seSB3aGVuIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiAoZm9yIEFEQyBncm91cCByZWd1bGFyKSBoYXMgYmVlbiByZXRyaWV2ZWQgYnkgdXNlciBzb2Z0d2FyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBhdXRvbWF0aWNhbGx5IGFkYXB0cyB0aGUgZnJlcXVlbmN5IG9mIEFEQyBjb252ZXJzaW9ucyB0cmlnZ2VycyB0byB0aGUgc3BlZWQgb2YgdGhlIHN5c3RlbSB0aGF0IHJlYWRzIHRoZSBkYXRhLiBNb3Jlb3ZlciwgdGhpcyBhdm9pZHMgcmlzayBvZiBvdmVycnVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbG93IGZyZXF1ZW5jeSBhcHBsaWNhdGlvbnMuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IERvIG5vdCB1c2Ugd2l0aCBpbnRlcnJ1cHRpb24gb3IgRE1BIChIQUxfQURDX1N0YXJ0X0lUKCksIEhBTF9BRENfU3RhcnRfRE1BKCkpIHNpbmNlIHRoZXkgY2xlYXIgaW1tZWRpYXRlbHkgdGhlIEVPQyBmbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBmcmVlIHRoZSBJUlEgdmVjdG9yIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvIHVzZSB3aXRoIHBvbGxpbmc6IDEuIFN0YXJ0IGNvbnZlcnNpb24gd2l0aCBIQUxfQURDX1N0YXJ0KCksIDIuIExhdGVyIG9uLCB3aGVuIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgbmVlZGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oKSB0byBlbnN1cmUgdGhhdCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlZCBhbmQgSEFMX0FEQ19HZXRWYWx1ZSgpIHRvIHJldHJpZXZlIGNvbnZlcnNpb24gcmVzdWx0IGFuZCB0cmlnIGFub3RoZXIgY29udmVyc2lvbiBzdGFydC4gKi8KKworICB1aW50MzJfdCBMb3dQb3dlckF1dG9Qb3dlck9mZjsgIC8qITwgU2VsZWN0IHRoZSBhdXRvLW9mZiBtb2RlOiB0aGUgQURDIGF1dG9tYXRpY2FsbHkgcG93ZXJzLW9mZiBhZnRlciBhIGNvbnZlcnNpb24gYW5kIGF1dG9tYXRpY2FsbHkgd2FrZXMtdXAgd2hlbiBhIG5ldyBjb252ZXJzaW9uIGlzIHRyaWdnZXJlZCAod2l0aCBzdGFydHVwIHRpbWUgYmV0d2VlbiB0cmlnZ2VyIGFuZCBzdGFydCBvZiBzYW1wbGluZykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIGNvbWJpbmVkIHdpdGggYXV0b21hdGljIHdhaXQgbW9kZSAocGFyYW1ldGVyICdMb3dQb3dlckF1dG9XYWl0JykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSWYgZW5hYmxlZCwgdGhpcyBmZWF0dXJlIGFsc28gdHVybnMgb2ZmIHRoZSBBREMgZGVkaWNhdGVkIDE0IE1IeiBSQyBvc2NpbGxhdG9yIChIU0kxNCkgKi8KKworICBGdW5jdGlvbmFsU3RhdGUgQ29udGludW91c0NvbnZNb2RlOyAvKiE8IFNwZWNpZnkgd2hldGhlciB0aGUgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgaW4gc2luZ2xlIG1vZGUgKG9uZSBjb252ZXJzaW9uKSBvciBjb250aW51b3VzIG1vZGUgZm9yIEFEQyBncm91cCByZWd1bGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGZpcnN0IEFEQyBjb252ZXJzaW9uIHN0YXJ0IHRyaWdnZXIgb2NjdXJyZWQgKHNvZnR3YXJlIHN0YXJ0IG9yIGV4dGVybmFsIHRyaWdnZXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUgRGlzY29udGludW91c0NvbnZNb2RlOyAvKiE8IFNwZWNpZnkgd2hldGhlciB0aGUgY29udmVyc2lvbnMgc2VxdWVuY2Ugb2YgQURDIGdyb3VwIHJlZ3VsYXIgaXMgcGVyZm9ybWVkIGluIENvbXBsZXRlLXNlcXVlbmNlL0Rpc2NvbnRpbnVvdXMtc2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWluIHNlcXVlbmNlIHN1YmRpdmlkZWQgaW4gc3VjY2Vzc2l2ZSBwYXJ0cykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb250aW51b3VzIG1vZGUgaXMgdXNlZCBvbmx5IGlmIHNlcXVlbmNlciBpcyBlbmFibGVkIChwYXJhbWV0ZXIgJ1NjYW5Db252TW9kZScpLiBJZiBzZXF1ZW5jZXIgaXMgZGlzYWJsZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvbnRpbnVvdXMgbW9kZSBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmIGNvbnRpbnVvdXMgbW9kZSBpcyBkaXNhYmxlZC4gSWYgY29udGludW91cyBtb2RlIGlzIGVuYWJsZWQsIHRoaXMgcGFyYW1ldGVyIHNldHRpbmcgaXMgZGlzY2FyZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBncm91cCByZWd1bGFyIG51bWJlciBvZiBkaXNjb250aW51b3VzIHJhbmtzIGluY3JlbWVudCBpcyBmaXhlZCB0byBvbmUtYnktb25lLiAqLworCisgIHVpbnQzMl90IEV4dGVybmFsVHJpZ0NvbnY7ICAgICAgLyohPCBTZWxlY3QgdGhlIGV4dGVybmFsIGV2ZW50IHNvdXJjZSB1c2VkIHRvIHRyaWdnZXIgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBzdGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBBRENfU09GVFdBUkVfU1RBUlQsIGV4dGVybmFsIHRyaWdnZXJzIGFyZSBkaXNhYmxlZCBhbmQgc29mdHdhcmUgdHJpZ2dlciBpcyB1c2VkIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19yZWd1bGFyX2V4dGVybmFsX3RyaWdnZXJfc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgY29tbW9uIHRvIGFsbCBBREMgaW5zdGFuY2VzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgRXh0ZXJuYWxUcmlnQ29udkVkZ2U7ICAvKiE8IFNlbGVjdCB0aGUgZXh0ZXJuYWwgZXZlbnQgZWRnZSB1c2VkIHRvIHRyaWdnZXIgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBzdGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRyaWdnZXIgc291cmNlIGlzIHNldCB0byBBRENfU09GVFdBUkVfU1RBUlQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX3JlZ3VsYXJfZXh0ZXJuYWxfdHJpZ2dlcl9lZGdlICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIERNQUNvbnRpbnVvdXNSZXF1ZXN0czsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIERNQSByZXF1ZXN0cyBhcmUgcGVyZm9ybWVkIGluIG9uZSBzaG90IG1vZGUgKERNQSB0cmFuc2ZlciBzdG9wcyB3aGVuIG51bWJlciBvZiBjb252ZXJzaW9ucyBpcyByZWFjaGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW4gY29udGludW91cyBtb2RlIChETUEgdHJhbnNmZXIgdW5saW1pdGVkLCB3aGF0ZXZlciBudW1iZXIgb2YgY29udmVyc2lvbnMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNvbnRpbnVvdXMgbW9kZSwgRE1BIG11c3QgYmUgY29uZmlndXJlZCBpbiBjaXJjdWxhciBtb2RlLiBPdGhlcndpc2UgYW4gb3ZlcnJ1biB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIERNQSBidWZmZXIgbWF4aW11bSBwb2ludGVyIGlzIHJlYWNoZWQuICovCisKKyAgdWludDMyX3QgT3ZlcnJ1bjsgICAgICAgICAgICAgICAvKiE8IFNlbGVjdCB0aGUgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOiBkYXRhIG92ZXJ3cml0dGVuIG9yIHByZXNlcnZlZCAoZGVmYXVsdCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19PdmVycnVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY2FzZSBvZiBvdmVycnVuIHNldCB0byBkYXRhIHByZXNlcnZlZCBhbmQgdXNhZ2Ugd2l0aCBwcm9ncmFtbWluZyBtb2RlbCB3aXRoIGludGVycnVwdGlvbiAoSEFMX1N0YXJ0X0lUKCkpOiBBREMgSVJRIGhhbmRsZXIgaGFzIHRvIGNsZWFyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIG9mIGNvbnZlcnNpb24gZmxhZ3MsIHRoaXMgaW5kdWNlcyB0aGUgcmVsZWFzZSBvZiB0aGUgcHJlc2VydmVkIGRhdGEuIElmIG5lZWRlZCwgdGhpcyBkYXRhIGNhbiBiZSBzYXZlZCBpbiBmdW5jdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpLCBwbGFjZWQgaW4gdXNlciBwcm9ncmFtIGNvZGUgKGNhbGxlZCBiZWZvcmUgZW5kIG9mIGNvbnZlcnNpb24gZmxhZ3MgY2xlYXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRXJyb3IgcmVwb3J0aW5nIHdpdGggcmVzcGVjdCB0byB0aGUgY29udmVyc2lvbiBtb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBVc2FnZSB3aXRoIEFEQyBjb252ZXJzaW9uIGJ5IHBvbGxpbmcgZm9yIGV2ZW50IG9yIGludGVycnVwdGlvbjogRXJyb3IgaXMgcmVwb3J0ZWQgb25seSBpZiBvdmVycnVuIGlzIHNldCB0byBkYXRhIHByZXNlcnZlZC4gSWYgb3ZlcnJ1biBpcyBzZXQgdG8gZGF0YSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXR0ZW4sIHVzZXIgY2FuIHdpbGxpbmdseSBub3QgcmVhZCBhbGwgdGhlIGNvbnZlcnRlZCBkYXRhLCB0aGlzIGlzIG5vdCBjb25zaWRlcmVkIGFzIGFuIGVycm9uZW91cyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBVc2FnZSB3aXRoIEFEQyBjb252ZXJzaW9uIGJ5IERNQTogRXJyb3IgaXMgcmVwb3J0ZWQgd2hhdGV2ZXIgb3ZlcnJ1biBzZXR0aW5nIChETUEgaXMgZXhwZWN0ZWQgdG8gcHJvY2VzcyBhbGwgZGF0YSBmcm9tIGRhdGEgcmVnaXN0ZXIpLiAqLworCisgIHVpbnQzMl90IExvd1Bvd2VyRnJlcXVlbmN5TW9kZTsgLyohPCBXaGVuIHNlbGVjdGluZyBhbiBhbmFsb2cgQURDIGNsb2NrIGZyZXF1ZW5jeSBsb3dlciB0aGFuIDIuOE1IeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIG1hbmRhdG9yeSB0byBmaXJzdCBlbmFibGUgdGhlIExvdyBGcmVxdWVuY3kgTW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgbW9kaWZpZWQgb25seSBpZiB0aGVyZSBpcyBubyBjb252ZXJzaW9uIGlzIG9uZ29pbmcuICovCisKKworICB1aW50MzJfdCBTYW1wbGluZ1RpbWU7ICAgICAgICAgICAgICAgICAvKiE8IFRoZSBzYW1wbGUgdGltZSBjb21tb24gdG8gYWxsIGNoYW5uZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19zYW1wbGluZ190aW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBtb2RpZmllZCBvbmx5IGlmIHRoZXJlIGlzIG5vIGNvbnZlcnNpb24gb25nb2luZy4gKi8KKworICB1aW50MzJfdCBPdmVyc2FtcGxpbmdNb2RlOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIG92ZXJzYW1wbGluZyBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBtb2RpZmllZCBvbmx5IGlmIHRoZXJlIGlzIG5vIGNvbnZlcnNpb24gaXMgb25nb2luZyBvbiBBREMgZ3JvdXAgcmVndWxhci4gKi8KKworCisgIEFEQ19PdmVyc2FtcGxpbmdUeXBlRGVmICBPdmVyc2FtcGxlOyAgIC8qITwgU3BlY2lmeSB0aGUgT3ZlcnNhbXBsaW5nIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgb3ZlcnNhbXBsaW5nIGNvbmZpZ3VyYXRpb24gaWYgb3ZlcnNhbXBsaW5nIGlzIGFscmVhZHkgZW5hYmxlZC4gKi8KK31BRENfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGNoYW5uZWwgZm9yIHJlZ3VsYXIgZ3JvdXAKKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gSEFMX0FEQ19Db25maWdDaGFubmVsKCkgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgQURDIHN0YXRlIGNhbiBiZSBlaXRoZXI6CisgICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnM6IEFEQyBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwLgorICAqICAgICAgICAgSWYgQURDIGlzIG5vdCBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUgdG8gbW9kaWZ5IHNvbWUgcGFyYW1ldGVycywgdGhlc2UgcGFyYW1ldGVycyBzZXR0aW5nIGlzIGJ5cGFzc2VkCisgICogICAgICAgICB3aXRob3V0IGVycm9yIHJlcG9ydGluZyAoYXMgaXQgY2FuIGJlIHRoZSBleHBlY3RlZCBiZWhhdmlvciBpbiBjYXNlIG9mIGludGVuZGVkIGFjdGlvbiB0byB1cGRhdGUgYW5vdGhlciBwYXJhbWV0ZXIgKHdoaWNoIGZ1bGZpbGxzIHRoZSBBREMgc3RhdGUgY29uZGl0aW9uKSBvbiB0aGUgZmx5KS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENoYW5uZWw7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmeSB0aGUgY2hhbm5lbCB0byBjb25maWd1cmUgaW50byBBREMgcmVndWxhciBncm91cC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19jaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IERlcGVuZGluZyBvbiBkZXZpY2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGRldmljZSBwYWNrYWdlIHBpbnMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4gKi8KKworICB1aW50MzJfdCBSYW5rOyAgICAgICAgICAgICAgICAgICAvKiE8IEFkZCBvciByZW1vdmUgdGhlIGNoYW5uZWwgZnJvbSBBREMgcmVndWxhciBncm91cCBzZXF1ZW5jZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIFNUTTMyTDAgZGV2aWNlcywgIG51bWJlciBvZiByYW5rcyBpbiB0aGUgc2VxdWVuY2UgaXMgZGVmaW5lZCBieSBudW1iZXIgb2YgY2hhbm5lbHMgZW5hYmxlZCwgcmFuayBvZiBlYWNoIGNoYW5uZWwgaXMgZGVmaW5lZCBieSBjaGFubmVsIG51bWJlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3BpdGUgdGhlIGNoYW5uZWwgcmFuayBpcyBmaXhlZCwgdGhpcyBwYXJhbWV0ZXIgYWxsb3cgYW4gYWRkaXRpb25hbCBwb3NzaWJpbGl0eTogdG8gcmVtb3ZlIHRoZSBzZWxlY3RlZCByYW5rIChzZWxlY3RlZCBjaGFubmVsKSBmcm9tIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19yYW5rICovCit9QURDX0NoYW5uZWxDb25mVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBBREMgYW5hbG9nIHdhdGNoZG9nCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKCkgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgQURDIHN0YXRlIGNhbiBiZSBlaXRoZXI6CisgICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnM6IEFEQyBkaXNhYmxlZCBvciBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIKKyAgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdIaWdoVGhyZXNob2xkJyBhbmQgJ0xvd1RocmVzaG9sZCc6IEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwIChBV0QgdGhyZXNob2xkcyBjYW4gYmUgbW9kaWZ5IG9uIHRoZSBmbHkgd2hpbGUgQURDIGNvbnZlcnNpb24gaXMgb24gZ29pbmcpCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBXYXRjaGRvZ01vZGU7ICAgICAgLyohPCBDb25maWd1cmUgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9kZTogc2luZ2xlL2FsbCBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfYW5hbG9nX3dhdGNoZG9nX21vZGUgKi8KKworICB1aW50MzJfdCBDaGFubmVsOyAgICAgICAgICAgLyohPCBTZWxlY3Qgd2hpY2ggQURDIGNoYW5uZWwgdG8gbW9uaXRvciBieSBhbmFsb2cgd2F0Y2hkb2cuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGhhcyBhbiBlZmZlY3Qgb25seSBpZiB3YXRjaGRvZyBtb2RlIGlzIGNvbmZpZ3VyZWQgb24gc2luZ2xlIGNoYW5uZWwgKHBhcmFtZXRlciBXYXRjaGRvZ01vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX2NoYW5uZWxzICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIElUTW9kZTsgICAgIC8qITwgU3BlY2lmeSB3aGV0aGVyIHRoZSBhbmFsb2cgd2F0Y2hkb2cgaXMgY29uZmlndXJlZCBpbiBpbnRlcnJ1cHQgb3IgcG9sbGluZyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFICovCisgIHVpbnQzMl90IEhpZ2hUaHJlc2hvbGQ7ICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgSGlnaCB0aHJlc2hvbGQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvZiBBREMgcmVzb2x1dGlvbiBzZWxlY3RlZCAoMTIsIDEwLCA4IG9yIDYgYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGLCAweDNGRiwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4gKi8KKworICB1aW50MzJfdCBMb3dUaHJlc2hvbGQ7ICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIEhpZ2ggdGhyZXNob2xkIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRpbmcgb2YgQURDIHJlc29sdXRpb24gc2VsZWN0ZWQgKDEyLCAxMCwgOCBvciA2IGJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRiwgMHgzRkYsIDB4RkYgb3IgMHgzRiByZXNwZWN0aXZlbHkuICovCit9QURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBBREMgc3RhdGUgbWFjaGluZTogQURDIHN0YXRlcyBkZWZpbml0aW9uIChiaXRmaWVsZHMpCisgICogQG5vdGUgICBBREMgc3RhdGUgbWFjaGluZSBpcyBtYW5hZ2VkIGJ5IGJpdGZpZWxkcywgc3RhdGUgbXVzdCBiZSBjb21wYXJlZAorICAqICAgICAgICAgd2l0aCBiaXQgYnkgYml0LgorICAqICAgICAgICAgRm9yIGV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgICIgaWYgKEhBTF9JU19CSVRfU0VUKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSkgIgorICAqICAgICAgICAgICAiIGlmIChIQUxfSVNfQklUX1NFVChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSwgSEFMX0FEQ19TVEFURV9BV0QxKSAgICApICIKKyAgKi8KKy8qIFN0YXRlcyBvZiBBREMgZ2xvYmFsIHNjb3BlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVTRVQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAgICAvKiE8IEFEQyBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVBRFkgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKSAgICAvKiE8IEFEQyBwZXJpcGhlcmFsIHJlYWR5IGZvciB1c2UgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpICAgIC8qITwgQURDIGlzIGJ1c3kgZHVlIHRvIGFuIGludGVybmFsIHByb2Nlc3MgKGluaXRpYWxpemF0aW9uLCBjYWxpYnJhdGlvbikgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9USU1FT1VUICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpICAgIC8qITwgVGltZU91dCBvY2N1cnJlbmNlICovCisKKy8qIFN0YXRlcyBvZiBBREMgZXJyb3JzICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKSAgICAvKiE8IEludGVybmFsIGVycm9yIG9jY3VycmVuY2UgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjApICAgIC8qITwgQ29uZmlndXJhdGlvbiBlcnJvciBvY2N1cnJlbmNlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwKSAgICAvKiE8IERNQSBlcnJvciBvY2N1cnJlbmNlICovCisKKy8qIFN0YXRlcyBvZiBBREMgZ3JvdXAgcmVndWxhciAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFR19CVVNZICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMCkgICAgLyohPCBBIGNvbnZlcnNpb24gb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgb25nb2luZyBvciBjYW4gb2NjdXIgKGVpdGhlciBieSBjb250aW51b3VzIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyaWdnZXIsIGxvdyBwb3dlciBhdXRvIHBvd2VyLW9uIChpZiBmZWF0dXJlIGF2YWlsYWJsZSksIG11bHRpbW9kZSBBREMgbWFzdGVyIGNvbnRyb2wgKGlmIGZlYXR1cmUgYXZhaWxhYmxlKSkgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfRU9DICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAyMDApICAgIC8qITwgQ29udmVyc2lvbiBkYXRhIGF2YWlsYWJsZSBvbiBncm91cCByZWd1bGFyICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVHX09WUiAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwKSAgICAvKiE8IE92ZXJydW4gb2NjdXJyZW5jZSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDgwMCkgICAgLyohPCBOb3QgYXZhaWxhYmxlIG9uIHRoaXMgU1RNMzIgc2VyaWU6IEVuZCBPZiBTYW1wbGluZyBmbGFnIHJhaXNlZCAgKi8KKworLyogU3RhdGVzIG9mIEFEQyBncm91cCBpbmplY3RlZCAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0lOSl9CVVNZICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMCkgICAgLyohPCBOb3QgYXZhaWxhYmxlIG9uIHRoaXMgU1RNMzIgc2VyaWU6IEEgY29udmVyc2lvbiBvbiBncm91cCBpbmplY3RlZCBpcyBvbmdvaW5nIG9yIGNhbiBvY2N1ciAoZWl0aGVyIGJ5IGF1dG8taW5qZWN0aW9uIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyaWdnZXIsIGxvdyBwb3dlciBhdXRvIHBvd2VyLW9uIChpZiBmZWF0dXJlIGF2YWlsYWJsZSksIG11bHRpbW9kZSBBREMgbWFzdGVyIGNvbnRyb2wgKGlmIGZlYXR1cmUgYXZhaWxhYmxlKSkgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9JTkpfRU9DICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDApICAgIC8qITwgTm90IGF2YWlsYWJsZSBvbiB0aGlzIFNUTTMyIHNlcmllOiBDb252ZXJzaW9uIGRhdGEgYXZhaWxhYmxlIG9uIGdyb3VwIGluamVjdGVkICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfSU5KX0pRT1ZGICAgICAgICAgKCh1aW50MzJfdCkweDAwMDA0MDAwKSAgICAvKiE8IE5vdCBhdmFpbGFibGUgb24gdGhpcyBTVE0zMiBzZXJpZTogSW5qZWN0ZWQgcXVldWUgb3ZlcmZsb3cgb2NjdXJyZW5jZSAqLworCisvKiBTdGF0ZXMgb2YgQURDIGFuYWxvZyB3YXRjaGRvZ3MgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9BV0QxICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDApICAgIC8qITwgT3V0LW9mLXdpbmRvdyBvY2N1cnJlbmNlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0FXRDIgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMCkgICAgLyohPCBOb3QgYXZhaWxhYmxlIG9uIHRoaXMgU1RNMzIgc2VyaWU6IE91dC1vZi13aW5kb3cgb2NjdXJyZW5jZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9BV0QzICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwNDAwMDApICAgIC8qITwgTm90IGF2YWlsYWJsZSBvbiB0aGlzIFNUTTMyIHNlcmllOiBPdXQtb2Ytd2luZG93IG9jY3VycmVuY2Ugb2YgQURDIGFuYWxvZyB3YXRjaGRvZyAzICovCisKKy8qIFN0YXRlcyBvZiBBREMgbXVsdGktbW9kZSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX01VTFRJTU9ERV9TTEFWRSAgICgodWludDMyX3QpMHgwMDEwMDAwMCkgICAgLyohPCBOb3QgYXZhaWxhYmxlIG9uIHRoaXMgU1RNMzIgc2VyaWU6IEFEQyBpbiBtdWx0aW1vZGUgc2xhdmUgc3RhdGUsIGNvbnRyb2xsZWQgYnkgYW5vdGhlciBBREMgbWFzdGVyICh3aGVuIGZlYXR1cmUgYXZhaWxhYmxlKSAqLworCisKKworLyoqIAorICAqIEBicmllZiAgQURDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZgoreworICBBRENfVHlwZURlZiAgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworCisgIEFEQ19Jbml0VHlwZURlZiAgICAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qITwgQURDIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAqRE1BX0hhbmRsZTsgICAgICAgICAgICAvKiE8IFBvaW50ZXIgRE1BIEhhbmRsZXIgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBsb2NraW5nIG9iamVjdCAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIFN0YXRlOyAgICAgICAgICAgICAgICAgIC8qITwgQURDIGNvbW11bmljYXRpb24gc3RhdGUgKGJpdG1hcCBvZiBBREMgc3RhdGVzKSAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAgICAgIC8qITwgQURDIEVycm9yIGNvZGUgKi8KKworCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIENvbnZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgICAgICAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBDb252SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgICAgICAvKiE8IEFEQyBjb252ZXJzaW9uIERNQSBoYWxmLXRyYW5zZmVyIGNhbGxiYWNrICovCisgIHZvaWQgKCogTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7ICAgICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7ICAgICAgICAgICAgICAgICAvKiE8IEFEQyBlcnJvciBjYWxsYmFjayAqLworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgICAgICAgICAgIC8qITwgQURDIE1zcCBJbml0IGNhbGxiYWNrICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgICAgICAgICAgICAgLyohPCBBREMgTXNwIERlSW5pdCBjYWxsYmFjayAqLworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfUFEQ19IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgQURDIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfQURDX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQgICAgID0gMHgwMFUsICAvKiE8IEFEQyBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElEICovCisgIEhBTF9BRENfQ09OVkVSU0lPTl9IQUxGX0NCX0lEICAgICAgICAgPSAweDAxVSwgIC8qITwgQURDIGNvbnZlcnNpb24gRE1BIGhhbGYtdHJhbnNmZXIgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQgICA9IDB4MDJVLCAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDNVLCAgLyohPCBBREMgZXJyb3IgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19JTkpfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCA9IDB4MDRVLCAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRCAqLworICBIQUxfQURDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwOVUsICAvKiE8IEFEQyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAqLworICBIQUxfQURDX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwQVUgICAvKiE8IEFEQyBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAqLworfSBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBBREMgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcEFEQ19DYWxsYmFja1R5cGVEZWYpKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBwb2ludGVyIHRvIGEgQURDIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9Db25zdGFudHMgQURDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0Vycm9yX0NvZGUgQURDIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQURDX0VSUk9SX05PTkUgICAgICAgICgodWludDMyX3QpMHgwMFUpICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9BRENfRVJST1JfSU5URVJOQUwgICAgKCh1aW50MzJfdCkweDAxVSkgICAvKiE8IEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yIChwcm9ibGVtIG9mIGNsb2NraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZS9kaXNhYmxlLCBlcnJvbmVvdXMgc3RhdGUsIC4uLikgICAgICAgICovCisjZGVmaW5lIEhBTF9BRENfRVJST1JfT1ZSICAgICAgICAgKCh1aW50MzJfdCkweDAyVSkgICAvKiE8IE92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0FEQ19FUlJPUl9ETUEgICAgICAgICAoKHVpbnQzMl90KTB4MDRVKSAgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgICgweDEwVSkgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX1RpbWVPdXRfVmFsdWVzIEFEQyBUaW1lT3V0IFZhbHVlcworICAqIEB7CisgICovCisKKyAgLyogRml4ZWQgdGltZW91dCB2YWx1ZXMgZm9yIEFEQyBjYWxpYnJhdGlvbiwgZW5hYmxlIHNldHRsaW5nIHRpbWUsIGRpc2FibGUgICovCisgIC8qIHNldHRsaW5nIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBWYWx1ZXMgZGVmaW5lZCB0byBiZSBoaWdoZXIgdGhhbiB3b3JzdCBjYXNlczogbG93IGNsb2NrcyBmcmVxLCAgICAgICAgICAgKi8KKyAgLyogbWF4aW11bSBwcmVzY2FsZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFVuaXQ6IG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIAorI2RlZmluZSBBRENfRU5BQkxFX1RJTUVPVVQgICAgICAgICAgICAxMFUKKyNkZWZpbmUgQURDX0RJU0FCTEVfVElNRU9VVCAgICAgICAgICAgMTBVCisjZGVmaW5lIEFEQ19TVE9QX0NPTlZFUlNJT05fVElNRU9VVCAgIDEwVQorCisgIC8qIERlbGF5IG9mIDEwdXMgZml4ZWQgdG8gd29yc3QgY2FzZTogbWF4aW11bSBDUFUgZnJlcXVlbmN5IDE4ME1IeiB0byBoYXZlICAqLworICAvKiB0aGUgbWluaW11bSBudW1iZXIgb2YgQ1BVIGN5Y2xlcyB0byBmdWxmaWxsIHRoaXMgZGVsYXkgICAgICAgICAgICAgICAgICAgKi8KKyAgI2RlZmluZSBBRENfREVMQVlfMTBVU19NSU5fQ1BVX0NZQ0xFUyAgICAgICAgIDE4MDBVIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfQ2xvY2tQcmVzY2FsZXIgQURDIENsb2NrIFByZXNjYWxlcgorICAqIEB7CisgICovICAgICAKKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjEgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIEFzeW5jaHJvbm91cyBjbG9jayBtb2RlIGRpdmlkZWQgYnkgMSAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMiAgICAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgQXN5bmNocm9ub3VzIGNsb2NrIG1vZGUgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVY0ICAgICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBBc3luY2hyb25vdXMgY2xvY2sgbW9kZSBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjYgICAgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzEgfCBBRENfQ0NSX1BSRVNDXzApICAgICAgICAgICAgICAgICAgIC8qITwgQURDIEFzeW5jaHJvbm91cyBjbG9jayBtb2RlIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWOCAgICAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgQXN5bmNocm9ub3VzIGNsb2NrIG1vZGUgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxMCAgICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18yIHwgQURDX0NDUl9QUkVTQ18wKSAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBBc3luY2hyb25vdXMgY2xvY2sgbW9kZSBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjEyICAgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzIgfCBBRENfQ0NSX1BSRVNDXzEpICAgICAgICAgICAgICAgICAgIC8qITwgQURDIEFzeW5jaHJvbm91cyBjbG9jayBtb2RlIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMTYgICAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMiB8IEFEQ19DQ1JfUFJFU0NfMSB8IEFEQ19DQ1JfUFJFU0NfMCkgLyohPCBBREMgQXN5bmNocm9ub3VzIGNsb2NrIG1vZGUgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYzMiAgICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBBc3luY2hyb25vdXMgY2xvY2sgbW9kZSBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjY0ICAgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzMgfCBBRENfQ0NSX1BSRVNDXzApICAgICAgICAgICAgICAgICAgIC8qITwgQURDIEFzeW5jaHJvbm91cyBjbG9jayBtb2RlIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMTI4ICAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMyB8IEFEQ19DQ1JfUFJFU0NfMSkgICAgICAgICAgICAgICAgICAgLyohPCBBREMgQXN5bmNocm9ub3VzIGNsb2NrIG1vZGUgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYyNTYgICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18zIHwgQURDX0NDUl9QUkVTQ18xIHwgQURDX0NDUl9QUkVTQ18wKSAvKiE8IEFEQyBBc3luY2hyb25vdXMgY2xvY2sgbW9kZSBkaXZpZGVkIGJ5IDIgKi8KKworI2RlZmluZSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSMl9DS01PREUpICAgIC8qITwgU3luY2hyb25vdXMgY2xvY2sgbW9kZSBkaXZpZGVkIGJ5IDEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb25maWd1cmF0aW9uIG11c3QgYmUgZW5hYmxlZCBvbmx5IGlmIFBDTEsgaGFzIGEgNTAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHV0eSBjbG9jayBjeWNsZSAoQVBCIHByZXNjYWxlciBjb25maWd1cmVkIGluc2lkZSB0aGUgUkNDIG11c3QgYmUgYnlwYXNzZWQgYW5kIHRoZSBzeXN0ZW0gY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJ5IDUwJSBkdXR5IGN5Y2xlKSovCisjZGVmaW5lIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMiAgICAgICAgICgodWludDMyX3QpQURDX0NGR1IyX0NLTU9ERV8wKSAgLyohPCBTeW5jaHJvbm91cyBjbG9jayBtb2RlIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSMl9DS01PREVfMSkgIC8qITwgU3luY2hyb25vdXMgY2xvY2sgbW9kZSBkaXZpZGVkIGJ5IDQgKi8KKworLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqIEB9CisgICovIAorCisvKiogQGRlZmdyb3VwIEFEQ19SZXNvbHV0aW9uIEFEQyBSZXNvbHV0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT05fMTJCICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgLyohPCBBREMgMTItYml0IHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT05fMTBCICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUjFfUkVTXzApICAgICAgLyohPCBBREMgMTAtYml0IHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT05fOEIgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUjFfUkVTXzEpICAgICAgLyohPCBBREMgOC1iaXQgcmVzb2x1dGlvbiAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTl82QiAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSMV9SRVMpICAgICAgICAvKiE8IEFEQyA2LWJpdCByZXNvbHV0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19EYXRhX2FsaWduIEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0RBVEFBTElHTl9SSUdIVCAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQ19EQVRBQUxJR05fTEVGVCAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSMV9BTElHTikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX3JlZ3VsYXJfZXh0ZXJuYWxfdHJpZ2dlcl9lZGdlIEFEQyBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZSBFZGdlIGZvciBSZWd1bGFyIEdyb3VwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX05PTkUgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkcgICAgICAgICAoKHVpbnQzMl90KUFEQ19DRkdSMV9FWFRFTl8wKSAgICAgICAgIAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfRkFMTElORyAgICAgICAgKCh1aW50MzJfdClBRENfQ0ZHUjFfRVhURU5fMSkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lOR0ZBTExJTkcgICgodWludDMyX3QpQURDX0NGR1IxX0VYVEVOKQorLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgQURDX0VPQ1NlbGVjdGlvbiBBREMgRU9DIFNlbGVjdGlvbgorICAqIEB7CisgICovIAorI2RlZmluZSBBRENfRU9DX1NJTkdMRV9DT05WICAgICAgICAgKCh1aW50MzJfdCkgQURDX0lTUl9FT0MpCisjZGVmaW5lIEFEQ19FT0NfU0VRX0NPTlYgICAgICAgICAgICAoKHVpbnQzMl90KSBBRENfSVNSX0VPUykKKy8qKgorICAqIEB9CisgICovIAorCisvKiogQGRlZmdyb3VwIEFEQ19PdmVycnVuIEFEQyBPdmVycnVuCisgICogQHsKKyAgKi8gCisjZGVmaW5lIEFEQ19PVlJfREFUQV9QUkVTRVJWRUQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIEFEQ19PVlJfREFUQV9PVkVSV1JJVFRFTiAgICAgICAgICAgICgodWludDMyX3QpQURDX0NGR1IxX09WUk1PRCkKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBBRENfcmFuayBBREMgcmFuaworICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19SQU5LX0NIQU5ORUxfTlVNQkVSICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDBVKSAgLyohPCBFbmFibGUgdGhlIHJhbmsgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWxzLiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNlcXVlbmNlIGlzIGRlZmluZWQgYnkgbnVtYmVyIG9mIGNoYW5uZWxzIGVuYWJsZWQsIHJhbmsgb2YgZWFjaCBjaGFubmVsIGlzIGRlZmluZWQgYnkgY2hhbm5lbCBudW1iZXIgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKSAqLworI2RlZmluZSBBRENfUkFOS19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxMDAxVSkgIC8qITwgRGlzYWJsZSB0aGUgc2VsZWN0ZWQgcmFuayAoc2VsZWN0ZWQgY2hhbm5lbCkgZnJvbSBzZXF1ZW5jZXIgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBBRENfY2hhbm5lbHMgQURDX0NoYW5uZWxzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMCAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NIU0VMUl9DSFNFTDApKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xICAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0hTRUxSX0NIU0VMMSkgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMiAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NIU0VMUl9DSFNFTDIpIHwgQURDX0NGR1IxX0FXRENIXzEpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzMgICAgICAgICAgICgodWludDMyX3QpKEFEQ19DSFNFTFJfQ0hTRUwzKXwgQURDX0NGR1IxX0FXRENIXzEgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNCAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NIU0VMUl9DSFNFTDQpfCBBRENfQ0ZHUjFfQVdEQ0hfMikKKyNkZWZpbmUgQURDX0NIQU5ORUxfNSAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NIU0VMUl9DSFNFTDUpfCBBRENfQ0ZHUjFfQVdEQ0hfMnwgQURDX0NGR1IxX0FXRENIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzYgICAgICAgICAgICgodWludDMyX3QpKEFEQ19DSFNFTFJfQ0hTRUw2KXwgQURDX0NGR1IxX0FXRENIXzJ8IEFEQ19DRkdSMV9BV0RDSF8xKQorI2RlZmluZSBBRENfQ0hBTk5FTF83ICAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0hTRUxSX0NIU0VMNyl8IEFEQ19DRkdSMV9BV0RDSF8yfCBBRENfQ0ZHUjFfQVdEQ0hfMSB8IEFEQ19DRkdSMV9BV0RDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF84ICAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0hTRUxSX0NIU0VMOCl8IEFEQ19DRkdSMV9BV0RDSF8zKQorI2RlZmluZSBBRENfQ0hBTk5FTF85ICAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0hTRUxSX0NIU0VMOSl8IEFEQ19DRkdSMV9BV0RDSF8zfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTAgICAgICAgICAgKCh1aW50MzJfdCkoQURDX0NIU0VMUl9DSFNFTDEwKXwgQURDX0NGR1IxX0FXRENIXzN8IEFEQ19DRkdSMV9BV0RDSF8xKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMSAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0hTRUxSX0NIU0VMMTEpfCBBRENfQ0ZHUjFfQVdEQ0hfM3wgQURDX0NGR1IxX0FXRENIXzF8IEFEQ19DRkdSMV9BV0RDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMiAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0hTRUxSX0NIU0VMMTIpfCBBRENfQ0ZHUjFfQVdEQ0hfM3wgQURDX0NGR1IxX0FXRENIXzIpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEzICAgICAgICAgICgodWludDMyX3QpKEFEQ19DSFNFTFJfQ0hTRUwxMyl8IEFEQ19DRkdSMV9BV0RDSF8zfCBBRENfQ0ZHUjFfQVdEQ0hfMnwgQURDX0NGR1IxX0FXRENIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE0ICAgICAgICAgICgodWludDMyX3QpKEFEQ19DSFNFTFJfQ0hTRUwxNCl8IEFEQ19DRkdSMV9BV0RDSF8zfCBBRENfQ0ZHUjFfQVdEQ0hfMnwgQURDX0NGR1IxX0FXRENIXzEpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE1ICAgICAgICAgICgodWludDMyX3QpKEFEQ19DSFNFTFJfQ0hTRUwxNSl8IEFEQ19DRkdSMV9BV0RDSF8zfCBBRENfQ0ZHUjFfQVdEQ0hfMnwgQURDX0NGR1IxX0FXRENIXzF8IEFEQ19DRkdSMV9BV0RDSF8wKQorI2lmIGRlZmluZWQgKFNUTTMyTDA1M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNiAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0hTRUxSX0NIU0VMMTYpfCBBRENfQ0ZHUjFfQVdEQ0hfNCkKKyNlbmRpZgorI2RlZmluZSBBRENfQ0hBTk5FTF8xNyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ0hTRUxSX0NIU0VMMTcpfCBBRENfQ0ZHUjFfQVdEQ0hfNHwgQURDX0NGR1IxX0FXRENIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4ICAgICAgICAgICgodWludDMyX3QpKEFEQ19DSFNFTFJfQ0hTRUwxOCl8IEFEQ19DRkdSMV9BV0RDSF80fCBBRENfQ0ZHUjFfQVdEQ0hfMSkKKworLyogSW50ZXJuYWwgY2hhbm5lbHMgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYzeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfVkxDRCAgICAgICAgIEFEQ19DSEFOTkVMXzE2ICAgIAorI2VuZGlmCisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICBBRENfQ0hBTk5FTF8xNworI2lmIGRlZmluZWQoQURDX0NDUl9UU0VOKQorI2RlZmluZSBBRENfQ0hBTk5FTF9URU1QU0VOU09SICAgQURDX0NIQU5ORUxfMTgKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfQ2hhbm5lbF9BV0RfTWFza3MgQURDIENoYW5uZWwgTWFza3MKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9NQVNLICAgICAgICAoKHVpbnQzMl90KTB4MDAwN0ZGRkZVKQorI2RlZmluZSBBRENfQ0hBTk5FTF9BV0RfTUFTSyAgICAoKHVpbnQzMl90KTB4N0MwMDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfc2FtcGxpbmdfdGltZXMgQURDIFNhbXBsaW5nIEN5Y2xlcworICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzFDWUNMRV81ICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgIEFEQyBzYW1wbGluZyB0aW1lIDEuNSBjeWNsZSAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV8zQ1lDTEVTXzUgICAgICAoKHVpbnQzMl90KUFEQ19TTVBSX1NNUFJfMCkgICAgICAgICAgICAgICAgICAgICAvKiE8ICBBREMgc2FtcGxpbmcgdGltZSAzLjUgQ1lDTEVTICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzdDWUNMRVNfNSAgICAgICgodWludDMyX3QpQURDX1NNUFJfU01QUl8xKSAgICAgICAgICAgICAgICAgICAgIC8qITwgIEFEQyBzYW1wbGluZyB0aW1lIDcuNSBDWUNMRVMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMTJDWUNMRVNfNSAgICAgKCh1aW50MzJfdCkoQURDX1NNUFJfU01QUl8xIHwgQURDX1NNUFJfU01QUl8wKSkgLyohPCAgQURDIHNhbXBsaW5nIHRpbWUgMTIuNSBDWUNMRVMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMTlDWUNMRVNfNSAgICAgKCh1aW50MzJfdClBRENfU01QUl9TTVBSXzIpICAgICAgICAgICAgICAgICAgICAgLyohPCAgQURDIHNhbXBsaW5nIHRpbWUgMTkuNSBDWUNMRVMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMzlDWUNMRVNfNSAgICAgKCh1aW50MzJfdCkoQURDX1NNUFJfU01QUl8yIHwgQURDX1NNUFJfU01QUl8wKSkgLyohPCAgQURDIHNhbXBsaW5nIHRpbWUgMzkuNSBDWUNMRVMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfNzlDWUNMRVNfNSAgICAgKCh1aW50MzJfdCkoQURDX1NNUFJfU01QUl8yIHwgQURDX1NNUFJfU01QUl8xKSkgLyohPCAgQURDIHNhbXBsaW5nIHRpbWUgNzkuNSBDWUNMRVMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMTYwQ1lDTEVTXzUgICAgKCh1aW50MzJfdClBRENfU01QUl9TTVBSKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCAgQURDIHNhbXBsaW5nIHRpbWUgMTYwLjUgQ1lDTEVTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19TY2FuX21vZGUgQURDIFNjYW4gbW9kZQorICAqIEB7CisgICovCisvKiBOb3RlOiBTY2FuIG1vZGUgdmFsdWVzIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIFNUTTMyIGRldmljZXMgaGF2aW5nICAqLworLyogICAgICAgYSBjb25maWd1cmFibGUgc2VxdWVuY2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFNjYW4gZGlyZWN0aW9uIHNldHRpbmcgdmFsdWVzIGFyZSBkZWZpbmVkIGJ5IHRha2luZyBpbiBhY2NvdW50ICAgICAgICovCisvKiAgICAgICBhbHJlYWR5IGRlZmluZWQgdmFsdWVzIGZvciBvdGhlciBTVE0zMiBkZXZpY2VzOiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBBRENfU0NBTl9ESVNBQkxFICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgQURDX1NDQU5fRU5BQkxFICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBTY2FuIGRpcmVjdGlvbiBmb3J3YXJkIGlzIGNvbnNpZGVyZWQgYXMgZGVmYXVsdCBzZXR0aW5nIGVxdWl2YWxlbnQgICAqLworLyogICAgICAgdG8gc2NhbiBlbmFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFNjYW4gZGlyZWN0aW9uIGJhY2t3YXJkIGlzIGNvbnNpZGVyZWQgYXMgYWRkaXRpb25hbCBzZXR0aW5nLiAgICAgICAgICovCisvKiAgICAgICBJbiBjYXNlIG9mIG1pZ3JhdGlvbiBmcm9tIGFub3RoZXIgU1RNMzIgZGV2aWNlLCB0aGUgdXNlciB3aWxsIGJlICAgICAqLworLyogICAgICAgd2FybmVkIG9mIGNoYW5nZSBvZiBzZXR0aW5nIGNob2ljZXMgd2l0aCBhc3NlcnQgY2hlY2suICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1NDQU5fRElSRUNUSU9OX0ZPUldBUkQgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAgICAgICAvKiE8IFNjYW4gZGlyZWN0aW9uIGZvcndhcmQ6IGZyb20gY2hhbm5lbCAwIHRvIGNoYW5uZWwgMTggKi8KKyNkZWZpbmUgQURDX1NDQU5fRElSRUNUSU9OX0JBQ0tXQVJEICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpICAgICAgICAvKiE8IFNjYW4gZGlyZWN0aW9uIGJhY2t3YXJkOiBmcm9tIGNoYW5uZWwgMTggdG8gY2hhbm5lbCAwICovCisKKyNkZWZpbmUgQURDX1NDQU5fRU5BQkxFICAgICAgICAgQURDX1NDQU5fRElSRUNUSU9OX0ZPUldBUkQgICAgICAgICAgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBTVE0zMiBkZXZpY2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19PdmVyc2FtcGxpbmdfUmF0aW8gQURDIE92ZXJzYW1wbGluZyBSYXRpbworICAqIEB7CisgICovCisKKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT18yICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCAgQURDIE92ZXJzYW1wbGluZyByYXRpbyAyeCAqLworI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzQgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpICAvKiE8ICBBREMgT3ZlcnNhbXBsaW5nIHJhdGlvIDR4ICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fOCAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgIC8qITwgIEFEQyBPdmVyc2FtcGxpbmcgcmF0aW8gOHggKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT18xNiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMENVKSAgLyohPCAgQURDIE92ZXJzYW1wbGluZyByYXRpbyAxNnggKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT18zMiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAgLyohPCAgQURDIE92ZXJzYW1wbGluZyByYXRpbyAzMnggKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT182NCAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTRVKSAgLyohPCAgQURDIE92ZXJzYW1wbGluZyByYXRpbyA2NHggKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT18xMjggICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMThVKSAgLyohPCAgQURDIE92ZXJzYW1wbGluZyByYXRpbyAxMjh4ICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMjU2ICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDFDVSkgIC8qITwgIEFEQyBPdmVyc2FtcGxpbmcgcmF0aW8gMjU2eCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfUmlnaHRfQml0X1NoaWZ0IEFEQyBSaWdodCBCaXQgU2hpZnQKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCAgQURDIE5vIGJpdCBzaGlmdCBmb3Igb3ZlcnNhbXBsaW5nICovCisjZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUXzEgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpICAvKiE8ICBBREMgMSBiaXQgc2hpZnQgZm9yIG92ZXJzYW1wbGluZyAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF8yICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAgLyohPCAgQURDIDIgYml0cyBzaGlmdCBmb3Igb3ZlcnNhbXBsaW5nICovCisjZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUXzMgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA2MFUpICAvKiE8ICBBREMgMyBiaXRzIHNoaWZ0IGZvciBvdmVyc2FtcGxpbmcgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNCAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwVSkgIC8qITwgIEFEQyA0IGJpdHMgc2hpZnQgZm9yIG92ZXJzYW1wbGluZyAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF81ICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwQTBVKSAgLyohPCAgQURDIDUgYml0cyBzaGlmdCBmb3Igb3ZlcnNhbXBsaW5nICovCisjZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUXzYgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDBDMFUpICAvKiE8ICBBREMgNiBiaXRzIHNoaWZ0IGZvciBvdmVyc2FtcGxpbmcgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMEUwVSkgIC8qITwgIEFEQyA3IGJpdHMgc2hpZnQgZm9yIG92ZXJzYW1wbGluZyAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF84ICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDBVKSAgLyohPCAgQURDIDggYml0cyBzaGlmdCBmb3Igb3ZlcnNhbXBsaW5nICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19UcmlnZ2VyZWRfT3ZlcnNhbXBsaW5nX01vZGUgQURDIFRyaWdnZXJlZCBPdmVyc2FtcGxpbmcgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19UUklHR0VSRURNT0RFX1NJTkdMRV9UUklHR0VSICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgIC8qITwgIEFEQyBObyBiaXQgc2hpZnQgZm9yIG92ZXJzYW1wbGluZyAqLworI2RlZmluZSBBRENfVFJJR0dFUkVETU9ERV9NVUxUSV9UUklHR0VSICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDIwMFUpICAvKiE8ICBBREMgTm8gYml0IHNoaWZ0IGZvciBvdmVyc2FtcGxpbmcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX2FuYWxvZ193YXRjaGRvZ19tb2RlIEFEQyBBbmFsb2cgV2F0Y2hkb2cgTW9kZQorICAqIEB7CisgICovIAorI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfTk9ORSAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpIDB4MDAwMDAwMDBVKQorI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRyAgICAgICAgICAgICAgICgodWludDMyX3QpKEFEQ19DRkdSMV9BV0RTR0wgfCBBRENfQ0ZHUjFfQVdERU4pKQorI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRyAgICAgICAgICAgICAgICAgICgodWludDMyX3QpIEFEQ19DRkdSMV9BV0RFTikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX2NvbnZlcnNpb25fdHlwZSBBREMgQ29udmVyc2lvbiBHcm91cAorICAqIEB7CisgICovIAorI2RlZmluZSBBRENfUkVHVUxBUl9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V2ZW50X3R5cGUgQURDIEV2ZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0FXRF9FVkVOVCAgICAgICAgICAgICAgKCh1aW50MzJfdClBRENfRkxBR19BV0QpCisjZGVmaW5lIEFEQ19PVlJfRVZFTlQgICAgICAgICAgICAgICgodWludDMyX3QpQURDX0ZMQUdfT1ZSKQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEFEQ19pbnRlcnJ1cHRzX2RlZmluaXRpb24gQURDIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19JVF9SRFkgICAgICAgICAgIEFEQ19JRVJfQURSRFlJRSAgICAgLyohPCBBREMgUmVhZHkgKEFEUkRZKSBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9FT1NNUCAgICAgICAgIEFEQ19JRVJfRU9TTVBJRSAgICAgLyohPCBBREMgRW5kIG9mIFNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX0VPQyAgICAgICAgICAgQURDX0lFUl9FT0NJRSAgICAgICAvKiE8IEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX0VPUyAgICAgICAgICAgQURDX0lFUl9FT1NFUUlFICAgICAvKiE8IEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucyBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9PVlIgICAgICAgICAgIEFEQ19JRVJfT1ZSSUUgICAgICAgLyohPCBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9BV0QgICAgICAgICAgIEFEQ19JRVJfQVdESUUgICAgICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfRU9DQUwgICAgICAgICBBRENfSUVSX0VPQ0FMSUUgICAgIC8qITwgQURDIEVuZCBvZiBDYWxpYnJhdGlvbiBpbnRlcnJ1cHQgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19mbGFnc19kZWZpbml0aW9uIEFEQyBmbGFncyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0ZMQUdfUkRZICAgICAgICAgICBBRENfSVNSX0FEUkRZICAgIC8qITwgQURDIFJlYWR5IGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfRU9TTVAgICAgICAgICBBRENfSVNSX0VPU01QICAgIC8qITwgQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0VPQyAgICAgICAgICAgQURDX0lTUl9FT0MgICAgICAvKiE8IEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfRU9TICAgICAgICAgICBBRENfSVNSX0VPU0VRICAgIC8qITwgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfT1ZSICAgICAgICAgICBBRENfSVNSX09WUiAgICAgIC8qITwgQURDIG92ZXJydW4gZmxhZyAqLworI2RlZmluZSBBRENfRkxBR19BV0QgICAgICAgICAgIEFEQ19JU1JfQVdEICAgICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfRU9DQUwgICAgICAgICBBRENfSVNSX0VPQ0FMICAgIC8qITwgQURDIEVuZiBPZiBDYWxpYnJhdGlvbiBmbGFnICovCisKKworI2RlZmluZSBBRENfRkxBR19BTEwgICAgKEFEQ19GTEFHX1JEWSB8IEFEQ19GTEFHX0VPU01QIHwgQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRENfRkxBR19PVlIgfCBBRENfRkxBR19BV0QgICB8IEFEQ19GTEFHX0VPQ0FMKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9NYWNyb3MgQURDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisvKiogQGJyaWVmIFJlc2V0IEFEQyBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfQURDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0FEQ19TVEFURV9SRVNFVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfQURDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9BRENfU1RBVEVfUkVTRVQpCisjZW5kaWYKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IEFEQ19DUl9BREVOKQorCisvKioKKyAgKiBAYnJpZWYgVmVyaWZpY2F0aW9uIG9mIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGJlZm9yZSBBREMgY2FuIGJlIGVuYWJsZWQKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBTRVQgKEFEQyBjYW4gYmUgZW5hYmxlZCkgb3IgUkVTRVQgKEFEQyBjYW5ub3QgYmUgZW5hYmxlZCkKKyAgKi8KKyNkZWZpbmUgQURDX0VOQUJMSU5HX0NPTkRJVElPTlMoX19IQU5ETEVfXykgICAgICAgICAgIFwKKyAgICAgICAoKCAoICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChBRENfQ1JfQURDQUwgfCBBRENfQ1JfQURTVFAgfCBBRENfQ1JfQURTVEFSVCB8IFwKKyAgICAgICAgICAgICBBRENfQ1JfQURESVMgfCBBRENfQ1JfQURFTiApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKSA9PSBSRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKSA/IFNFVCA6IFJFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IEFEQ19DUl9BRERJUzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCAoQURDX0ZMQUdfRU9TTVAgfCBBRENfRkxBR19SRFkpKTsgXAorICB9IHdoaWxlKDApCisgICAgCisvKioKKyAgKiBAYnJpZWYgVmVyaWZpY2F0aW9uIG9mIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGJlZm9yZSBBREMgY2FuIGJlIGRpc2FibGVkCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgU0VUIChBREMgY2FuIGJlIGRpc2FibGVkKSBvciBSRVNFVCAoQURDIGNhbm5vdCBiZSBkaXNhYmxlZCkKKyAgKi8KKyNkZWZpbmUgQURDX0RJU0FCTElOR19DT05ESVRJT05TKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKCggKCAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0FERU4pKSA9PSBBRENfQ1JfQURFTiAgIFwKKyAgICAgICAgKSA/IFNFVCA6IFJFU0VUKQorICAgICAgICAgCisvKioKKyAgKiBAYnJpZWYgVmVyaWZpY2F0aW9uIG9mIEFEQyBzdGF0ZTogZW5hYmxlZCBvciBkaXNhYmxlZAorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIFNFVCAoQURDIGVuYWJsZWQpIG9yIFJFU0VUIChBREMgZGlzYWJsZWQpCisgICovCisjZGVmaW5lIEFEQ19JU19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSKSAmIChBRENfQ1JfQURFTiB8IEFEQ19DUl9BRERJUykpID09IEFEQ19DUl9BREVOKSAmJiBcCisgICAgICAgICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIEFEQ19GTEFHX1JEWSkgPT0gQURDX0ZMQUdfUkRZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKSA/IFNFVCA6IFJFU0VUKQorICAgICAgICAgCisvKioKKyAgKiBAYnJpZWYgUmV0dXJucyByZXNvbHV0aW9uIGJpdHMgaW4gQ0ZHUiByZWdpc3RlcjogUkVTWzE6MF0uIFJldHVybiB2YWx1ZSBhbW9uZyBwYXJhbWV0ZXIgdG8gQHJlZiBBRENfUmVzb2x1dGlvbi4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19HRVRfUkVTT0xVVElPTihfX0hBTkRMRV9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGR1IxKSAmIEFEQ19DRkdSMV9SRVMpCisvKioKKyAgKiBAYnJpZWYgVGVzdCBpZiBjb252ZXJzaW9uIHRyaWdnZXIgb2YgcmVndWxhciBncm91cCBpcyBzb2Z0d2FyZSBzdGFydAorICAqICAgICAgICBvciBleHRlcm5hbCB0cmlnZ2VyLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIFNFVCAoc29mdHdhcmUgc3RhcnQpIG9yIFJFU0VUIChleHRlcm5hbCB0cmlnZ2VyKQorICAqLworI2RlZmluZSBBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSMSAmIEFEQ19DRkdSMV9FWFRFTikgPT0gUkVTRVQpCisKKworCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgaWYgbm8gY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgU0VUIChjb252ZXJzaW9uIGlzIG9uIGdvaW5nKSBvciBSRVNFVCAobm8gY29udmVyc2lvbiBpcyBvbiBnb2luZykKKyAgKi8KKyNkZWZpbmUgQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpICYgQURDX0NSX0FEU1RBUlQpID09IFJFU0VUICAgICAgICAgICAgICAgICAgXAorICApID8gUkVTRVQgOiBTRVQpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlLgorICAqIEBwYXJhbSBfQ09OVElOVU9VU19NT0RFXyBDb250aW51b3VzIG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19DT05USU5VT1VTKF9DT05USU5VT1VTX01PREVfKSAoKF9DT05USU5VT1VTX01PREVfKSA8PCAxM1UpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgQURDIHNjYW4gbW9kZSB0byBjb252ZXJ0IG11bHRpcGxlIHJhbmtzIHdpdGggc2VxdWVuY2VyLgorICAqIEBwYXJhbSBfU0NBTl9NT0RFXyBTY2FuIGNvbnZlcnNpb24gbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX1NDQU5ESVIoX1NDQU5fTU9ERV8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggKCAoX1NDQU5fTU9ERV8pID09IChBRENfU0NBTl9ESVJFQ1RJT05fQkFDS1dBUkQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk/IChBRENfQ0ZHUjFfU0NBTkRJUikgOiAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBkaXNjb250aW51b3VzIGNvbnZlcnNpb25zIGZvciB0aGUgcmVndWxhciBncm91cCBjaGFubmVscy4KKyAgKiBAcGFyYW0gX05CUl9ESVNDT05USU5VT1VTX0NPTlZfIE51bWJlciBvZiBkaXNjb250aW51b3VzIGNvbnZlcnNpb25zLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfRElTQ09OVElOVU9VU19OVU0oX05CUl9ESVNDT05USU5VT1VTX0NPTlZfKSAoKChfTkJSX0RJU0NPTlRJTlVPVVNfQ09OVl8pIC0gMVUpIDw8IDE3VSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgQURDIERNQSBjb250aW51b3VzIHJlcXVlc3QuCisgICogQHBhcmFtIF9ETUFDb250UmVxX01PREVfIERNQSBjb250aW51b3VzIHJlcXVlc3QgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0RNQUNPTlRSRVEoX0RNQUNvbnRSZXFfTU9ERV8pICgoX0RNQUNvbnRSZXFfTU9ERV8pIDw8IDFVKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBBREMgQXV0byBEZWxheS4KKyAgKiBAcGFyYW0gX0F1dG9EZWxheV8gQXV0byBkZWxheSBiaXQgZW5hYmxlIG9yIGRpc2FibGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9BdXRvRGVsYXkoX0F1dG9EZWxheV8pICgoX0F1dG9EZWxheV8pIDw8IDE0VSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgQURDIExvd1Bvd2VyQXV0b1Bvd2VyT2ZmLgorICAqIEBwYXJhbSBfQVVUT0ZGXyBBdXRvT2ZmIGJpdCBlbmFibGUgb3IgZGlzYWJsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0FVVE9GRihfQVVUT0ZGXykgKChfQVVUT0ZGXykgPDwgMTVVKQorCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBhbmFsb2cgd2F0Y2hkb2cgaGlnaCB0aHJlc2hvbGQgaW50byByZWdpc3RlcnMgVFIxLCBUUjIgb3IgVFIzLgorICAqIEBwYXJhbSBfVGhyZXNob2xkXyBUaHJlc2hvbGQgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX1RSWF9ISUdIVEhSRVNIT0xEKF9UaHJlc2hvbGRfKSAoKF9UaHJlc2hvbGRfKSA8PCAxNlUpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIEFEQyBMb3cgRnJlcXVlbmN5IG1vZGUuCisgICogQHBhcmFtIF9MT1dfRlJFUVVFTkNZX01PREVfIExvdyBGcmVxdWVuY3kgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NDUl9MT1dGUkVRVUVOQ1koX0xPV19GUkVRVUVOQ1lfTU9ERV8pICgoX0xPV19GUkVRVUVOQ1lfTU9ERV8pIDw8IDI1VSkKKworLyoqCisgICogQGJyaWVmIFNoaWZ0IHRoZSBvZmZzZXQgaW4gZnVuY3Rpb24gb2YgdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLiAKKyAgKiAgICAgICAgT2Zmc2V0IGhhcyB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDExLCB0aGUgTFNCIChyaWdodCBiaXRzKSBhcmUgc2V0IHRvIDAKKyAgKiAgICAgICAgSWYgcmVzb2x1dGlvbiAxMiBiaXRzLCBubyBzaGlmdC4KKyAgKiAgICAgICAgSWYgcmVzb2x1dGlvbiAxMCBiaXRzLCBzaGlmdCBvZiAyIHJhbmtzIG9uIHRoZSByaWdodC4KKyAgKiAgICAgICAgSWYgcmVzb2x1dGlvbiA4IGJpdHMsIHNoaWZ0IG9mIDQgcmFua3Mgb24gdGhlIHJpZ2h0LgorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDYgYml0cywgc2hpZnQgb2YgNiByYW5rcyBvbiB0aGUgcmlnaHQuCisgICogICAgICAgIHRoZXJlZm9yZSwgc2hpZnQgPSAoMTIgLSByZXNvbHV0aW9uKSA9IDEyIC0gKDEyLSAoKChSRVNbMTowXSkgPj4gMykqMikpCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX09mZnNldF8gVmFsdWUgdG8gYmUgc2hpZnRlZAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04oX19IQU5ETEVfXywgX09mZnNldF8pIFwKKyAgICAgICAgKChfT2Zmc2V0XykgPDwgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSMV9SRVMpID4+IDNVKSoyVSkpCisKKy8qKgorICAqIEBicmllZiBTaGlmdCB0aGUgQVdEMSB0aHJlc2hvbGQgaW4gZnVuY3Rpb24gb2YgdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLgorICAqICAgICAgICBUaHJlc2hvbGRzIGhhdmUgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykgYXJlIHNldCB0byAwCisgICogICAgICAgIElmIHJlc29sdXRpb24gMTIgYml0cywgbm8gc2hpZnQuCisgICogICAgICAgIElmIHJlc29sdXRpb24gMTAgYml0cywgc2hpZnQgb2YgMiByYW5rcyBvbiB0aGUgcmlnaHQuCisgICogICAgICAgIElmIHJlc29sdXRpb24gOCBiaXRzLCBzaGlmdCBvZiA0IHJhbmtzIG9uIHRoZSByaWdodC4KKyAgKiAgICAgICAgSWYgcmVzb2x1dGlvbiA2IGJpdHMsIHNoaWZ0IG9mIDYgcmFua3Mgb24gdGhlIHJpZ2h0LgorICAqICAgICAgICB0aGVyZWZvcmUsIHNoaWZ0ID0gKDEyIC0gcmVzb2x1dGlvbikgPSAxMiAtICgxMi0gKCgoUkVTWzE6MF0pID4+IDMpKjIpKQorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgICogQHBhcmFtIF9UaHJlc2hvbGRfIFZhbHVlIHRvIGJlIHNoaWZ0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihfX0hBTkRMRV9fLCBfVGhyZXNob2xkXykgXAorICAgICAgICAoKF9UaHJlc2hvbGRfKSA8PCAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSMSAmIEFEQ19DRkdSMV9SRVMpID4+IDNVKSoyVSkpCisKKy8qKgorICAqIEBicmllZiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIGxlZnQsIGxlc3Mgc2lnbmlmaWNhbnQgYXJlIHNldCB0byAwLiAKKyAgKiBAcGFyYW0gX1ZhbHVlXyBWYWx1ZSB0byBiZSBzaGlmdGVkCisgICogQHBhcmFtIF9TaGlmdF8gTnVtYmVyIG9mIHNoaWZ0IHRvIGJlIGRvbmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX1ZhbHVlX1NoaWZ0X2xlZnQoX1ZhbHVlXywgX1NoaWZ0XykgKChfVmFsdWVfKSA8PCAoX1NoaWZ0XykpCisKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEFEQyBJbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIpIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIEFEQyBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBBREMgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSKSAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBBREMgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBBREMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjaworICAqICAgICAgICAgICAgQGFyZyAuLi4KKyAgKiAgICAgICAgICAgIEBhcmcgLi4uCisgICogQHJldHZhbCBTdGF0ZSBvZiBpbnRlcnJ1cHRpb24gKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIEFEQydzIHBlbmRpbmcgZmxhZ3MKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0ZMQUdfXyBBREMgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKy8qIE5vdGU6IGJpdCBjbGVhcmVkIGJpdCBieSB3cml0aW5nIDEgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpID0gKF9fRkxBR19fKSkKKworLyoqCisgICogQGJyaWVmIEdldCB0aGUgc2VsZWN0ZWQgQURDJ3MgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19GTEFHX18gQURDIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXAorICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworCisvKioKKyAgKiBAYnJpZWYgU2ltdWx0YW5lb3VzbHkgY2xlYXJzIGFuZCBzZXRzIHNwZWNpZmljIGJpdHMgb2YgdGhlIGhhbmRsZSBTdGF0ZQorICAqIEBub3RlOiBBRENfU1RBVEVfQ0xSX1NFVCgpIG1hY3JvIGlzIG1lcmVseSBhbGlhc2VkIHRvIGdlbmVyaWMgbWFjcm8gTU9ESUZZX1JFRygpLAorICAqICAgICAgICB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBBREMgaGFuZGxlIFN0YXRlLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0aGUKKyAgKiAgICAgICAgYml0IGZpZWxkIHRvIGNsZWFyLCB0aGUgdGhpcmQgYW5kIGxhc3QgcGFyYW1ldGVyIGlzIHRoZSBiaXQgZmllbGQgdG8gc2V0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfU1RBVEVfQ0xSX1NFVCBNT0RJRllfUkVHCisKKy8qKgorICAqIEBicmllZiBDbGVhciBBREMgZXJyb3IgY29kZSAoc2V0IGl0IHRvIGVycm9yIGNvZGU6ICJubyBlcnJvciIpCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0xFQVJfRVJST1JDT0RFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX0hBTkRMRV9fKS0+RXJyb3JDb2RlID0gSEFMX0FEQ19FUlJPUl9OT05FKQorCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmF0aW9uIG9mIEFEQyBjbG9jayAmIHByZXNjYWxlcjogY2xvY2sgc291cmNlIFBDTEsgb3IgQXN5bmNocm9ub3VzIHdpdGggc2VsZWN0YWJsZSBwcmVzY2FsZXIKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisKKyNkZWZpbmUgX19IQUxfQURDX0NMT0NLX1BSRVNDQUxFUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoKChfX0hBTkRMRV9fKS0+SW5pdC5DbG9ja1ByZXNjYWxlcikgPT0gQURDX0NMT0NLX1NZTkNfUENMS19ESVYxKSB8fCAgXAorICAgICAgICAgICgoKF9fSEFORExFX18pLT5Jbml0LkNsb2NrUHJlc2NhbGVyKSA9PSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpIHx8ICBcCisgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluaXQuQ2xvY2tQcmVzY2FsZXIpID09IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWNCkpICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUjIgJj0gfihBRENfQ0ZHUjJfQ0tNT0RFKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUjIgfD0gIChfX0hBTkRMRV9fKS0+SW5pdC5DbG9ja1ByZXNjYWxlcjsgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogQ0tNT0QgYml0cyBtdXN0IGJlIHJlc2V0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUjIgJj0gfihBRENfQ0ZHUjJfQ0tNT0RFKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQURDLT5DQ1IgJj0gfihBRENfQ0NSX1BSRVNDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQURDLT5DQ1IgfD0gIChfX0hBTkRMRV9fKS0+SW5pdC5DbG9ja1ByZXNjYWxlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgSVNfQURDX0NMT0NLUFJFU0NBTEVSKEFEQ19DTE9DSykgKCgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX1NZTkNfUENMS19ESVYxKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfQ0xPQ0spID09IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWNCkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEgICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjIgICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjQgICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjYgICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjggICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEwICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEyICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjE2ICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjMyICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjY0ICkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEyOCApIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfQ0xPQ0spID09IEFEQ19DTE9DS19BU1lOQ19ESVYyNTYpKQorCisjZGVmaW5lIElTX0FEQ19SRVNPTFVUSU9OKFJFU09MVVRJT04pICgoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzEyQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVNPTFVUSU9OKSA9PSBBRENfUkVTT0xVVElPTl8xMEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTT0xVVElPTikgPT0gQURDX1JFU09MVVRJT05fOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTT0xVVElPTikgPT0gQURDX1JFU09MVVRJT05fNkIpKQorCisjZGVmaW5lIElTX0FEQ19SRVNPTFVUSU9OXzhfNl9CSVRTKFJFU09MVVRJT04pICgoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzhCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzZCKSkKKworI2RlZmluZSBJU19BRENfREFUQV9BTElHTihBTElHTikgKCgoQUxJR04pID09IEFEQ19EQVRBQUxJR05fUklHSFQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMSUdOKSA9PSBBRENfREFUQUFMSUdOX0xFRlQpKQorCisjZGVmaW5lIElTX0FEQ19FWFRUUklHX0VER0UoRURHRSkgKCgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX0ZBTExJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORykpCisKKyNkZWZpbmUgSVNfQURDX0VPQ19TRUxFQ1RJT04oRU9DX1NFTEVDVElPTikgKCgoRU9DX1NFTEVDVElPTikgPT0gQURDX0VPQ19TSU5HTEVfQ09OVikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVPQ19TRUxFQ1RJT04pID09IEFEQ19FT0NfU0VRX0NPTlYpKQorCisjZGVmaW5lIElTX0FEQ19PVkVSUlVOKE9WUikgKCgoT1ZSKSA9PSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1ZSKSA9PSBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4pKQorCisjZGVmaW5lIElTX0FEQ19SQU5LKFdBVENIRE9HKSAoKChXQVRDSERPRykgPT0gQURDX1JBTktfQ0hBTk5FTF9OVU1CRVIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfUkFOS19OT05FKSkKKworI2lmIGRlZmluZWQgKEFEQ19DSEFOTkVMX1ZMQ0QpCisjZGVmaW5lIElTX0FEQ19DSEFOTkVMKENIQU5ORUwpICgoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzApICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzIpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzMpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzQpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzUpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzYpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzcpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzgpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzkpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEwKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzExKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEyKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzEzKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzE0KSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMXzE1KSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1ZMQ0QpKQorI2VsaWYgZGVmaW5lZCAoQURDX0NIQU5ORUxfVEVNUFNFTlNPUikKKyNkZWZpbmUgSVNfQURDX0NIQU5ORUwoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMCkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMSkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMikgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMykgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfNCkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfNSkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfNikgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfNykgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfOCkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfOSkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMTApICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMTEpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMTIpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMTMpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMTQpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfMTUpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkpCisjZWxzZQorI2RlZmluZSBJU19BRENfQ0hBTk5FTChDSEFOTkVMKSAoKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8wKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8yKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8zKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF80KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF81KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF82KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF83KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF84KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF85KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xMCkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xMSkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xMikgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xMykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xNCkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xNSkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSkKKyNlbmRpZgorCisjZGVmaW5lIElTX0FEQ19TQU1QTEVfVElNRShUSU1FKSAoKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV8xQ1lDTEVfNSAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfM0NZQ0xFU181ICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzdDWUNMRVNfNSAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV8xMkNZQ0xFU181ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfMTlDWUNMRVNfNSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzM5Q1lDTEVTXzUgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV83OUNZQ0xFU181ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfMTYwQ1lDTEVTXzUpKQorCisjZGVmaW5lIElTX0FEQ19TQ0FOX01PREUoU0NBTl9NT0RFKSAoKChTQ0FOX01PREUpID09IEFEQ19TQ0FOX0RJUkVDVElPTl9GT1JXQVJEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTQ0FOX01PREUpID09IEFEQ19TQ0FOX0RJUkVDVElPTl9CQUNLV0FSRCkpCisKKyNkZWZpbmUgSVNfQURDX09WRVJTQU1QTElOR19SQVRJTyhSQVRJTykgICAgICAgICAgKCgoUkFUSU8pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMiAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSQVRJTykgPT0gQURDX09WRVJTQU1QTElOR19SQVRJT180ICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJBVElPKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzggICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkFUSU8pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTYgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSQVRJTykgPT0gQURDX09WRVJTQU1QTElOR19SQVRJT18zMiAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJBVElPKSA9PSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzY0ICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkFUSU8pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTI4ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSQVRJTykgPT0gQURDX09WRVJTQU1QTElOR19SQVRJT18yNTYgKSkKKworI2RlZmluZSBJU19BRENfUklHSFRfQklUX1NISUZUKFNISUZUKSAgICAgICAgICAgICAgICgoKFNISUZUKSA9PSBBRENfUklHSFRCSVRTSElGVF9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0hJRlQpID09IEFEQ19SSUdIVEJJVFNISUZUXzEgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSElGVCkgPT0gQURDX1JJR0hUQklUU0hJRlRfMiAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNISUZUKSA9PSBBRENfUklHSFRCSVRTSElGVF8zICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0hJRlQpID09IEFEQ19SSUdIVEJJVFNISUZUXzQgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSElGVCkgPT0gQURDX1JJR0hUQklUU0hJRlRfNSAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNISUZUKSA9PSBBRENfUklHSFRCSVRTSElGVF82ICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0hJRlQpID09IEFEQ19SSUdIVEJJVFNISUZUXzcgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSElGVCkgPT0gQURDX1JJR0hUQklUU0hJRlRfOCAgICkpCisKKyNkZWZpbmUgSVNfQURDX1RSSUdHRVJFRF9PVkVSU0FNUExJTkdfTU9ERShNT0RFKSAgICAgKCgoTU9ERSkgPT0gQURDX1RSSUdHRVJFRE1PREVfU0lOR0xFX1RSSUdHRVIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX1RSSUdHRVJFRE1PREVfTVVMVElfVFJJR0dFUikgKQorCisjZGVmaW5lIElTX0FEQ19BTkFMT0dfV0FUQ0hET0dfTU9ERShXQVRDSERPRykgICAgICgoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfTk9ORSAgICAgICkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRyAgICkpCisKKyNkZWZpbmUgSVNfQURDX0NPTlZFUlNJT05fR1JPVVAoQ09OVkVSU0lPTikgICAoKENPTlZFUlNJT04pID09IEFEQ19SRUdVTEFSX0dST1VQKQorCisjZGVmaW5lIElTX0FEQ19FVkVOVF9UWVBFKEVWRU5UKSAoKChFVkVOVCkgPT0gQURDX0FXRF9FVkVOVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVZFTlQpID09IEFEQ19PVlJfRVZFTlQpKQorCisKKy8qKiBAZGVmZ3JvdXAgQURDX3JhbmdlX3ZlcmlmaWNhdGlvbiBBREMgUmFuZ2UgVmVyaWZpY2F0aW9uCisgICogaW4gZnVuY3Rpb24gb2YgQURDIHJlc29sdXRpb24gc2VsZWN0ZWQgKDEyLCAxMCwgOCBvciA2IGJpdHMpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfQURDX1JBTkdFKFJFU09MVVRJT04sIEFEQ19WQUxVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzEyQikgJiYgKChBRENfVkFMVUUpIDw9ICgodWludDMyX3QpMHgwRkZGVSkpKSB8fCBcCisgICAgKCgoUkVTT0xVVElPTikgPT0gQURDX1JFU09MVVRJT05fMTBCKSAmJiAoKEFEQ19WQUxVRSkgPD0gKCh1aW50MzJfdCkweDAzRkZVKSkpIHx8IFwKKyAgICAoKChSRVNPTFVUSU9OKSA9PSBBRENfUkVTT0xVVElPTl84QikgICYmICgoQURDX1ZBTFVFKSA8PSAoKHVpbnQzMl90KTB4MDBGRlUpKSkgfHwgXAorICAgICgoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzZCKSAgJiYgKChBRENfVkFMVUUpIDw9ICgodWludDMyX3QpMHgwMDNGVSkpKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX3JlZ3VsYXJfbmJfY29udl92ZXJpZmljYXRpb24gQURDIFJlZ3VsYXIgTmIgQ29udmVyc2lvbiBWZXJpZmljYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBJU19BRENfUkVHVUxBUl9OQl9DT05WKExFTkdUSCkgKCgoTEVOR1RIKSA+PSAoKHVpbnQzMl90KTFVKSkgJiYgKChMRU5HVEgpIDw9ICgodWludDMyX3QpMTZVKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIEFEQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9hZGNfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgSEFMX0FEQ19Jbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgIEhBTF9BRENfRGVJbml0KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgIEhBTF9BRENfTXNwSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit2b2lkICAgICAgICAgICAgICAgICBIQUxfQURDX01zcERlSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19SZWdpc3RlckNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBBRENfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1VuUmVnaXN0ZXJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgIEhBTF9BRENfU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgSEFMX0FEQ19TdG9wKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgSEFMX0FEQ19Qb2xsRm9yRXZlbnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IEV2ZW50VHlwZSwgdWludDMyX3QgVGltZW91dCk7CisKKy8qIE5vbi1ibG9ja2luZyBtb2RlOiBJbnRlcnJ1cHRpb24gKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgIEhBTF9BRENfU3RhcnRfSVQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgSEFMX0FEQ19TdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyogTm9uLWJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgSEFMX0FEQ19TdGFydF9ETUEoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90KiBwRGF0YSwgdWludDMyX3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgIEhBTF9BRENfU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworCisvKiBBREMgcmV0cmlldmUgY29udmVyc2lvbiB2YWx1ZSBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggcG9sbGluZyBvciBpbnRlcnJ1cHRpb24gKi8KK3VpbnQzMl90ICAgICAgICAgICAgIEhBTF9BRENfR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworCisvKiBBREMgSVJRSGFuZGxlciBhbmQgQ2FsbGJhY2tzIHVzZWQgaW4gbm9uLWJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHRpb24gYW5kIERNQSkgKi8KK3ZvaWQgICAgICAgICAgICAgICAgIEhBTF9BRENfSVJRSGFuZGxlcihBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit2b2lkICAgICAgICAgICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit2b2lkICAgICAgICAgICAgICAgICBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit2b2lkICAgICAgICAgICAgICAgICBIQUxfQURDX0Vycm9yQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqIEB7CisgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgICBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIEFEQ19DaGFubmVsQ29uZlR5cGVEZWYqIHNDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgSEFMX0FEQ19BbmFsb2dXREdDb25maWcoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIEFEQ19BbmFsb2dXREdDb25mVHlwZURlZiogQW5hbG9nV0RHQ29uZmlnKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAeworICAqLwordWludDMyX3QgICAgICAgICAgICAgSEFMX0FEQ19HZXRTdGF0ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfQURDX0dldEVycm9yKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLypfX1NUTTMyTDB4eF9IQUxfQURDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2FkY19leC5oIGIvSW5jL3N0bTMybDB4eF9oYWxfYWRjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3YTU2YQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX2FkY19leC5oCkBAIC0wLDAgKzEsMjE2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9hZGNfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQURDIEhBTCBleHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfQURDX0VYX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfSEFMX0FEQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ0V4CisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0NvbnN0YW50cyBBREMgRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9DaGFubmVsX01vZGUgQURDIFNpbmdsZSBFbmRlZAorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19TSU5HTEVfRU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpMHgwMDAwMDAwMFUgICAvKiBkdW1teSB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfcmVndWxhcl9leHRlcm5hbF90cmlnZ2VyX3NvdXJjZSBBREMgRXh0ZXJuYWwgVHJpZ2dlciBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UNl9UUkdPICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIxX0NDMiAgICAgICAgICAgIChBRENfQ0ZHUjFfRVhUU0VMXzApCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08gICAgICAgICAgICAoQURDX0NGR1IxX0VYVFNFTF8xKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzQgICAgICAgICAgICAgKEFEQ19DRkdSMV9FWFRTRUxfMSB8IEFEQ19DRkdSMV9FWFRTRUxfMCkKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIyX1RSR08gICAgICAgICAgIChBRENfQ0ZHUjFfRVhUU0VMXzIpCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QzX1RSR08gICAgICAgICAgICAoQURDX0NGR1IxX0VYVFNFTF8yIHwgQURDX0NGR1IxX0VYVFNFTF8xKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9FWFRfSVQxMSAgICAgICAgICAgKEFEQ19DRkdSMV9FWFRTRUxfMiB8IEFEQ19DRkdSMV9FWFRTRUxfMSB8IEFEQ19DRkdSMV9FWFRTRUxfMCkKKyNkZWZpbmUgQURDX1NPRlRXQVJFX1NUQVJUICAgICAgICAgICAgICAgICAgICAgIChBRENfQ0ZHUjFfRVhUU0VMICsgKHVpbnQzMl90KTEpCisKKy8qIEFEQyBncm91cCByZWd1bGFyIGV4dGVybmFsIHRyaWdnZXIgVElNMjFfVFJHTyBhdmFpbGFibGUgb25seSBvbiAgICAgICAgICAgICovCisvKiBTVE0zMkwwIGRldmljZXMgY2F0ZWdvcmllczogQ2F0LjIsIENhdC4zLCBDYXQuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQgKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDA1MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNTJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDUzeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwNjF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2M3h4KSB8fCBcCisgICAgZGVmaW5lZCAoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwMTB4NikgfHwgZGVmaW5lZCAoU1RNMzJMMDEweDgpIHx8IGRlZmluZWQgKFNUTTMyTDAxMHhCKQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVl9UMjFfVFJHTyAgICAgICAgICAgKEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMl9UUkdPKQorI2VuZGlmCisKKy8qIEFEQyBncm91cCByZWd1bGFyIGV4dGVybmFsIHRyaWdnZXIgVElNMl9DQzMgYXZhaWxhYmxlIG9ubHkgb24gICAgICAgICAgICAgICovCisvKiBTVE0zMkwwIGRldmljZXMgY2F0ZWdvcmllczogQ2F0LjEsIENhdC4yLCBDYXQuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQgKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMjF4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwODF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KSB8fCBcCisgICAgZGVmaW5lZCAoU1RNMzJMMDEweDQpIHx8IGRlZmluZWQgKFNUTTMyTDAxMHg2KSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4OCkgfHwgZGVmaW5lZCAoU1RNMzJMMDEweEIpCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX0NDMyAgICAgICAgICAgICAoQURDX0NGR1IxX0VYVFNFTF8yIHwgQURDX0NGR1IxX0VYVFNFTF8wKQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX1NZU0NGR19pbnRlcm5hbF9wYXRoc19mbGFnc19kZWZpbml0aW9uIEFEQyBTWVNDRkcgaW50ZXJuYWwgcGF0aHMgRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19GTEFHX1NFTlNPUiAgICAgICAgIFNZU0NGR19DRkdSM19WUkVGSU5UX1JEWUYKKyNkZWZpbmUgQURDX0ZMQUdfVlJFRklOVCAgICAgICAgU1lTQ0ZHX1ZSRUZJTlRfQURDX1JEWUYKKy8qKgorICAqIEB9CisgICovCisgICAKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfUHJpdmF0ZV9NYWNyb3MgQURDRXggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKFNJTkdfRElGRikgICAoKFNJTkdfRElGRikgPT0gQURDX1NJTkdMRV9FTkRFRCkKKworLyoqIEBkZWZncm91cCBBRENFeF9jYWxpYnJhdGlvbl9mYWN0b3JfbGVuZ3RoX3ZlcmlmaWNhdGlvbiBBREMgQ2FsaWJyYXRpb24gRmFjdG9yIExlbmd0aCBWZXJpZmljYXRpb24KKyAgKiBAeworICAqLyAKKy8qKgorICAqIEBicmllZiBDYWxpYnJhdGlvbiBmYWN0b3IgbGVuZ3RoIHZlcmlmaWNhdGlvbiAoNyBiaXRzIG1heGltdW0pCisgICogQHBhcmFtIF9DYWxpYnJhdGlvbl9GYWN0b3JfOiBDYWxpYnJhdGlvbiBmYWN0b3IgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfQURDX0NBTEZBQ1QoX0NhbGlicmF0aW9uX0ZhY3Rvcl8pICgoX0NhbGlicmF0aW9uX0ZhY3Rvcl8pIDw9ICgodWludDMyX3QpMHg3RlUpKQorLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4dGVybmFsX3RyaWdnZXJfU291cmNlIEFEQyBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZCAoU1RNMzJMMDMxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA0MXh4KSB8fCBcCisgICAgZGVmaW5lZCAoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwMTB4NikgfHwgZGVmaW5lZCAoU1RNMzJMMDEweDgpIHx8IGRlZmluZWQgKFNUTTMyTDAxMHhCKQorI2RlZmluZSBJU19BRENfRVhUVFJJRyhDT05WKSAoKChDT05WKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UNl9UUkdPICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVikgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIxX0NDMiAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlYpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08gICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzQgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVikgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIyX1RSR08gKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlYpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMV9UUkdPICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzMgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVikgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfVFJHTyAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlYpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpKQorI2VsaWYgZGVmaW5lZCAoU1RNMzJMMDEweDQpIHx8IGRlZmluZWQgKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMjF4eCkKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUcoQ09OVikgKCgoQ09OVikgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDZfVFJHTyAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlYpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMV9DQzIgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9UUkdPICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVikgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfQ0M0ICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlYpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMl9UUkdPICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzMgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVikgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfVFJHTyAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlYpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpKQorI2VsaWYgZGVmaW5lZCAoU1RNMzJMMDUxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA1Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNTN4eCkgfHwgXAorICAgICAgZGVmaW5lZCAoU1RNMzJMMDYxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjN4eCkKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUcoQ09OVikgKCgoQ09OVikgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDZfVFJHTyAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlYpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMV9DQzIgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9UUkdPICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVikgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDJfQ0M0ICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlYpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyMl9UUkdPICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVl9UMjFfVFJHTyApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVikgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZfVDNfVFJHTyAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlYpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05WKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpKQorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFEQyBjYWxpYnJhdGlvbiAqLworSEFMX1N0YXR1c1R5cGVEZWYgICBIQUxfQURDRXhfQ2FsaWJyYXRpb25fU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFNpbmdsZURpZmYpOwordWludDMyX3QgICAgICAgICAgICBIQUxfQURDRXhfQ2FsaWJyYXRpb25fR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFNpbmdsZURpZmYpOworSEFMX1N0YXR1c1R5cGVEZWYgICBIQUxfQURDRXhfQ2FsaWJyYXRpb25fU2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFNpbmdsZURpZmYsIHVpbnQzMl90IENhbGlicmF0aW9uRmFjdG9yKTsKKworLyogQURDIFZyZWZJbnQgYW5kIFRlbXBlcmF0dXJlIHNlbnNvciBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBTVE0zMiBzZXJpZSAqLworSEFMX1N0YXR1c1R5cGVEZWYgICBIQUxfQURDRXhfRW5hYmxlVlJFRklOVCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0Rpc2FibGVWUkVGSU5UKHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgICBIQUxfQURDRXhfRW5hYmxlVlJFRklOVFRlbXBTZW5zb3Iodm9pZCk7Cit2b2lkICAgICAgICAgICAgICAgIEhBTF9BRENFeF9EaXNhYmxlVlJFRklOVFRlbXBTZW5zb3Iodm9pZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKl9fU1RNMzJMMHh4X0hBTF9BRENfRVhfSCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9jb21wLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9jb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkMzdjYQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX2NvbXAuaApAQCAtMCwwICsxLDcyNyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfY29tcC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDT01QIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9DT01QX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfSEFMX0NPTVBfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KQorLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ09NUAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX1R5cGVzIENPTVAgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogCisgICogQGJyaWVmICBDT01QIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICB1aW50MzJfdCBXaW5kb3dNb2RlOyAgICAgICAgIC8qITwgU2V0IHdpbmRvdyBtb2RlIG9mIGEgcGFpciBvZiBjb21wYXJhdG9ycyBpbnN0YW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyIGNvbnNlY3V0aXZlIGluc3RhbmNlcyBvZGQgYW5kIGV2ZW4gQ09NUDx4PiBhbmQgQ09NUDx4KzE+KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEhBTCBDT01QIGRyaXZlciBhbGxvd3MgdG8gc2V0IHdpbmRvdyBtb2RlIGZyb20gYW55IENPTVAgaW5zdGFuY2Ugb2YgdGhlIHBhaXIgb2YgQ09NUCBpbnN0YW5jZXMgY29tcG9zaW5nIHdpbmRvdyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX1dpbmRvd01vZGUgKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3Igb3BlcmF0aW5nIG1vZGUgdG8gYWRqdXN0IHBvd2VyIGFuZCBzcGVlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEZvciB0aGUgY2hhcmFjdGVyaXRpY3Mgb2YgY29tcGFyYXRvciBwb3dlciBtb2RlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BhZ2F0aW9uIGRlbGF5IGFuZCBwb3dlciBjb25zdW1wdGlvbiksIHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfUG93ZXJNb2RlICovCisKKyAgdWludDMyX3QgTm9uSW52ZXJ0aW5nSW5wdXQ7ICAvKiE8IFNldCBjb21wYXJhdG9yIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcgaW5wdXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0lucHV0UGx1cyAqLworCisgIHVpbnQzMl90IEludmVydGluZ0lucHV0OyAgICAgLyohPCBTZXQgY29tcGFyYXRvciBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nIGlucHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9JbnB1dE1pbnVzICovCisKKyAgdWludDMyX3QgT3V0cHV0UG9sOyAgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9PdXRwdXRQb2xhcml0eSAqLworCisgIHVpbnQzMl90IExQVElNQ29ubmVjdGlvbjsgICAgLyohPCBTZXQgY29tcGFyYXRvciBvdXRwdXQgY29ubmVjdGlvbiB0byBMUFRJTSBwZXJpcGhlcmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xQVElNQ29ubmVjdGlvbiAqLworCisgIHVpbnQzMl90IFRyaWdnZXJNb2RlOyAgICAgICAgLyohPCBTZXQgdGhlIGNvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgKEVYVEkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0VYVElfVHJpZ2dlck1vZGUgKi8KKworfUNPTVBfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIENPTVAgc3RhdGUgbWFjaGluZTogSEFMIENPTVAgc3RhdGVzIGRlZmluaXRpb24KKyAgKi8KKyNkZWZpbmUgQ09NUF9TVEFURV9CSVRGSUVMRF9MT0NLICAoKHVpbnQzMl90KTB4MTApCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0NPTVBfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgbm90IHlldCBpbml0aWFsaXplZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NPTVBfU1RBVEVfUkVTRVRfTE9DS0VEICAgICAgPSAoSEFMX0NPTVBfU1RBVEVfUkVTRVQgfCBDT01QX1NUQVRFX0JJVEZJRUxEX0xPQ0spLCAvKiE8IENPTVAgbm90IHlldCBpbml0aWFsaXplZCBhbmQgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgKi8KKyAgSEFMX0NPTVBfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NPTVBfU1RBVEVfUkVBRFlfTE9DS0VEICAgICAgPSAoSEFMX0NPTVBfU1RBVEVfUkVBRFkgfCBDT01QX1NUQVRFX0JJVEZJRUxEX0xPQ0spLCAvKiE8IENPTVAgaW5pdGlhbGl6ZWQgYnV0IGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkICAgICAgICAgKi8KKyAgSEFMX0NPTVBfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgaXMgcnVubmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NPTVBfU1RBVEVfQlVTWV9MT0NLRUQgICAgICAgPSAoSEFMX0NPTVBfU1RBVEVfQlVTWSB8IENPTVBfU1RBVEVfQklURklFTERfTE9DSykgICAvKiE8IENPTVAgaXMgcnVubmluZyBhbmQgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgICAgICAgICAgKi8KK31IQUxfQ09NUF9TdGF0ZVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIENPTVAgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCBfX0NPTVBfSGFuZGxlVHlwZURlZgoreworICBDT01QX1R5cGVEZWYgICAgICAgKkluc3RhbmNlOyAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAqLworICBDT01QX0luaXRUeXBlRGVmICAgSW5pdDsgICAgICAgICAgICAvKiE8IENPTVAgcmVxdWlyZWQgcGFyYW1ldGVycyAqLworICBIQUxfTG9ja1R5cGVEZWYgICAgTG9jazsgICAgICAgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAqLworICBfX0lPIEhBTF9DT01QX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAvKiE8IENPTVAgY29tbXVuaWNhdGlvbiBzdGF0ZSAqLworICBfX0lPIHVpbnQzMl90ICAgICAgRXJyb3JDb2RlOyAgICAgICAvKiE8IENPTVAgRXJyb3IgY29kZSAqLworI2lmIChVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogVHJpZ2dlckNhbGxiYWNrKShzdHJ1Y3QgX19DT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsgICAvKiE8IENPTVAgdHJpZ2dlciBjYWxsYmFjayAqLworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7ICAgLyohPCBDT01QIE1zcCBJbml0IGNhbGxiYWNrICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0NPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOyAvKiE8IENPTVAgTXNwIERlSW5pdCBjYWxsYmFjayAqLworI2VuZGlmIC8qIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gQ09NUF9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIENPTVAgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9DT01QX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgQ09NUCB0cmlnZ2VyIGNhbGxiYWNrIElEICovCisgIEhBTF9DT01QX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgPSAweDAxVSwgIC8qITwgQ09NUCBNc3AgSW5pdCBjYWxsYmFjayBJRCAqLworICBIQUxfQ09NUF9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgID0gMHgwMlUgICAvKiE8IENPTVAgTXNwIERlSW5pdCBjYWxsYmFjayBJRCAqLworfSBIQUxfQ09NUF9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgQ09NUCBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwQ09NUF9DYWxsYmFja1R5cGVEZWYpKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOyAvKiE8IHBvaW50ZXIgdG8gYSBDT01QIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfRXhwb3J0ZWRfQ29uc3RhbnRzIENPTVAgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0Vycm9yX0NvZGUgQ09NUCBFcnJvciBDb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0NPTVBfRVJST1JfTk9ORSAgICAgICAgICAgICAoMHgwMFUpICAgLyohPCBObyBlcnJvciAqLworI2lmIChVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgKDB4MDFVKSAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAqLworI2VuZGlmIC8qIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9XaW5kb3dNb2RlIENPTVAgV2luZG93IE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX1dJTkRPV01PREVfRElTQUJMRSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBXaW5kb3cgbW9kZSBkaXNhYmxlOiBDb21wYXJhdG9ycyBpbnN0YW5jZXMgcGFpciBDT01QMSBhbmQgQ09NUDIgYXJlIGluZGVwZW5kZW50ICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9DT01QMV9JTlBVVF9QTFVTX0NPTU1PTiAoQ09NUF9DU1JfQ09NUDFXTSkgICAgIC8qITwgV2luZG93IG1vZGUgZW5hYmxlOiBDb21wYXJhdG9ycyBpbnN0YW5jZXMgcGFpciBDT01QMSBhbmQgQ09NUDIgaGF2ZSB0aGVpciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0b2dldGhlci4gVGhlIGNvbW1vbiBpbnB1dCBpcyBDT01QMSBpbnB1dCBwbHVzIChDT01QMiBpbnB1dCBwbHVzIGlzIG5vIG1vcmUgYWNjZXNzaWJsZSkuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfUG93ZXJNb2RlIENPTVAgcG93ZXIgbW9kZQorICAqIEB7CisgICovCisvKiBOb3RlOiBGb3IgdGhlIGNoYXJhY3Rlcml0aWNzIG9mIGNvbXBhcmF0b3IgcG93ZXIgbW9kZXMgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgKHByb3BhZ2F0aW9uIGRlbGF5IGFuZCBwb3dlciBjb25zdW1wdGlvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVEICAgICAoQ09NUF9DU1JfQ09NUDJTUEVFRCkgICAgICAgLyohPCBDT01QIHBvd2VyIG1vZGUgdG8gbG93IHBvd2VyIChpbmRpY2F0ZWQgYXMgImhpZ2ggc3BlZWQiIGluIHJlZmVyZW5jZSBtYW51YWwpIChvbmx5IGZvciBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUiAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAvKiE8IENPTVAgcG93ZXIgbW9kZSB0byB1bHRyYSBsb3cgcG93ZXIgKGluZGljYXRlZCBhcyAibG93IHNwZWVkIiBpbiByZWZlcmVuY2UgbWFudWFsKSAob25seSBmb3IgQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfSW5wdXRQbHVzIENPTVAgaW5wdXQgcGx1cyAobm9uLWludmVydGluZyBpbnB1dCkKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX0lOUFVUX1BMVVNfSU8xICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMSAocGluIFBBMSBmb3IgQ09NUDEsIHBpbiBQQTMgZm9yIENPTVAyKSAqLworI2RlZmluZSBDT01QX0lOUFVUX1BMVVNfSU8yICAgICAgICAgICAgKENPTVBfQ1NSX0NPTVAySU5QU0VMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMiAocGluIFBCNCBmb3IgQ09NUDIpIChvbmx5IGZvciBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9QTFVTX0lPMyAgICAgICAgICAgIChDT01QX0NTUl9DT01QMklOUFNFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBJTzMgKHBpbiBQQTUgZm9yIENPTVAyKSAob25seSBmb3IgQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIENPTVBfSU5QVVRfUExVU19JTzQgICAgICAgICAgICAoQ09NUF9DU1JfQ09NUDJJTlBTRUxfMCB8IENPTVBfQ1NSX0NPTVAySU5QU0VMXzEpICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gSU80IChwaW4gUEI2IGZvciBDT01QMikgKG9ubHkgZm9yIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworI2RlZmluZSBDT01QX0lOUFVUX1BMVVNfSU81ICAgICAgICAgICAgKENPTVBfQ1NSX0NPTVAySU5QU0VMXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPNSAocGluIFBCNyBmb3IgQ09NUDIpIChvbmx5IGZvciBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwMTF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDIxeHgpCisjZGVmaW5lIENPTVBfSU5QVVRfUExVU19JTzYgICAgICAgICAgICAoQ09NUF9DU1JfQ09NUDJJTlBTRUxfMiB8IENPTVBfQ1NSX0NPTVAySU5QU0VMXzApICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gSU82IChwaW4gUEE3IGZvciBDT01QMikgKG9ubHkgZm9yIENPTVAgaW5zdGFuY2U6IENPTVAyKSAoQXZhaWxhYmxlIG9ubHkgb24gZGV2aWNlcyBTVE0zMkwwIGNhdGVnb3J5IDEpICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9JbnB1dE1pbnVzIENPTVAgaW5wdXQgbWludXMgKGludmVydGluZyBpbnB1dCkKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQgICAgKENPTVBfQ1NSX0NPTVAySU5OU0VMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byAxLzQgVlJFRklOVCAob25seSBmb3IgQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIENPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVCAgICAoQ09NUF9DU1JfQ09NUDJJTk5TRUxfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMklOTlNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIDEvMiBWUkVGSU5UIChvbmx5IGZvciBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UICAgIChDT01QX0NTUl9DT01QMklOTlNFTF8yIHwgQ09NUF9DU1JfQ09NUDJJTk5TRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gMy80IFZSRUZJTlQgKG9ubHkgZm9yIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBWcmVmSW50ICovCisjZGVmaW5lIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAySU5OU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAxIChEQUNfT1VUMSkgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMiAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDJJTk5TRUxfMSB8IENPTVBfQ1NSX0NPTVAySU5OU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gREFDMSBjaGFubmVsIDIgKERBQ19PVVQyKSAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTX0lPMSAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDJJTk5TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzEgKHBpbiBQQTAgZm9yIENPTVAxLCBwaW4gUEEyIGZvciBDT01QMikgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9NSU5VU19JTzIgICAgICAgICAgIChDT01QX0NTUl9DT01QMklOTlNFTF8yIHwgQ09NUF9DU1JfQ09NUDJJTk5TRUxfMSB8IENPTVBfQ1NSX0NPTVAySU5OU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8yIChwaW4gUEIzIGZvciBDT01QMikgKG9ubHkgZm9yIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIENPTVBfTFBUSU1Db25uZWN0aW9uIENPTVAgTG93IHBvd2VyIHRpbWVyIGNvbm5lY3Rpb24gZGVmaW5pdGlvbgorICAqIEB7CisgICovCisKKyNkZWZpbmUgQ09NUF9MUFRJTUNPTk5FQ1RJT05fRElTQUJMRUQgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAvKiE8IENPTVB4IHNpZ25hbCBpcyBnYXRlZCAqLworI2RlZmluZSBDT01QX0xQVElNQ09OTkVDVElPTl9JTjFfRU5BQkxFRCAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAgIC8qITwgQ09NUHggc2lnbmFsIGlzIGNvbm5lY3RlZCB0byBMUFRJTSBpbnB1dCAxICovCisjZGVmaW5lIENPTVBfTFBUSU1DT05ORUNUSU9OX0lOMl9FTkFCTEVEICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgICAgLyohPCBDT01QeCBzaWduYWwgaXMgY29ubmVjdGVkIHRvIExQVElNIGlucHV0IDIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9PdXRwdXRQb2xhcml0eSBDT01QIG91dHB1dCBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IENPTVAgb3V0cHV0IG9uIEdQSU8gaXNuJ3QgaW52ZXJ0ZWQgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRQT0xfSU5WRVJURUQgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUHhQT0xBUklUWSAgICAgICAvKiE8IENPTVAgb3V0cHV0IG9uIEdQSU8gaXMgaW52ZXJ0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9PdXRwdXRMZXZlbCBDT01QIE91dHB1dCBMZXZlbAorICAqIEB7CisgICovCisvKiBOb3RlOiBDb21wYXJhdG9yIG91dHB1dCBsZXZlbCB2YWx1ZXMgYXJlIGZpeGVkIHRvICIwIiBhbmQgIjEiLCAgICAgICAgICAgICAqLworLyogY29ycmVzcG9uZGluZyBDT01QIHJlZ2lzdGVyIGJpdCBpcyBtYW5hZ2VkIGJ5IEhBTCBmdW5jdGlvbiB0byBtYXRjaCAgICAgICAgKi8KKy8qIHdpdGggdGhlc2UgdmFsdWVzIChpbmRlcGVuZGVudGx5IG9mIGJpdCBwb3NpdGlvbiBpbiByZWdpc3RlcikuICAgICAgICAgICAgICovCisKKy8qIFdoZW4gb3V0cHV0IHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZCwgY29tcGFyYXRvciBvdXRwdXQgaXMgbG93IHdoZW4KKyAgIHRoZSBpbnB1dCBwbHVzIGlzIGF0IGEgbG93ZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cyAqLworI2RlZmluZSBDT01QX09VVFBVVF9MRVZFTF9MT1cgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisvKiBXaGVuIG91dHB1dCBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQsIGNvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbgorICAgdGhlIGlucHV0IHBsdXMgaXMgYXQgYSBoaWdoZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cyAqLworI2RlZmluZSBDT01QX09VVFBVVF9MRVZFTF9ISUdIICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfRVhUSV9UcmlnZ2VyTW9kZSBDT01QIG91dHB1dCB0byBFWFRJCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9UUklHR0VSTU9ERV9OT05FICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgdHJpZ2dlcmluZyBubyBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0lUX1JJU0lORyAgICAgICAgICAgIChDT01QX0VYVElfSVQgfCBDT01QX0VYVElfUklTSU5HKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgZXZlbnQgd2l0aCBpbnRlcnJ1cHRpb24sIG9uIHJpc2luZyBlZGdlICovCisjZGVmaW5lIENPTVBfVFJJR0dFUk1PREVfSVRfRkFMTElORyAgICAgICAgICAgKENPTVBfRVhUSV9JVCB8IENPTVBfRVhUSV9GQUxMSU5HKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgdHJpZ2dlcmluZyBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSBldmVudCB3aXRoIGludGVycnVwdGlvbiwgb24gZmFsbGluZyBlZGdlICovCisjZGVmaW5lIENPTVBfVFJJR0dFUk1PREVfSVRfUklTSU5HX0ZBTExJTkcgICAgKENPTVBfRVhUSV9JVCB8IENPTVBfRVhUSV9SSVNJTkcgfCBDT01QX0VYVElfRkFMTElORykgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgdHJpZ2dlcmluZyBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSBldmVudCB3aXRoIGludGVycnVwdGlvbiwgb24gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgKi8KKyNkZWZpbmUgQ09NUF9UUklHR0VSTU9ERV9FVkVOVF9SSVNJTkcgICAgICAgICAoQ09NUF9FWFRJX0VWRU5UIHwgQ09NUF9FWFRJX1JJU0lORykgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCB0cmlnZ2VyaW5nIEV4dGVybmFsIEludGVycnVwdCBMaW5lIGV2ZW50IG9ubHkgKHdpdGhvdXQgaW50ZXJydXB0aW9uKSwgb24gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgQ09NUF9UUklHR0VSTU9ERV9FVkVOVF9GQUxMSU5HICAgICAgICAoQ09NUF9FWFRJX0VWRU5UIHwgQ09NUF9FWFRJX0ZBTExJTkcpICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCB0cmlnZ2VyaW5nIEV4dGVybmFsIEludGVycnVwdCBMaW5lIGV2ZW50IG9ubHkgKHdpdGhvdXQgaW50ZXJydXB0aW9uKSwgb24gZmFsbGluZyBlZGdlICovCisjZGVmaW5lIENPTVBfVFJJR0dFUk1PREVfRVZFTlRfUklTSU5HX0ZBTExJTkcgKENPTVBfRVhUSV9FVkVOVCB8IENPTVBfRVhUSV9SSVNJTkcgfCBDT01QX0VYVElfRkFMTElORykgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgdHJpZ2dlcmluZyBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSBldmVudCBvbmx5ICh3aXRob3V0IGludGVycnVwdGlvbiksIG9uIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX01hY3JvcyBDT01QIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9IYW5kbGVfTWFuYWdlbWVudCAgQ09NUCBIYW5kbGUgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IENPTVAgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9DT01QX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRVNFVDsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfQ09NUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRVNFVCkKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgQ09NUCBlcnJvciBjb2RlIChzZXQgaXQgdG8gbm8gZXJyb3IgY29kZSAiSEFMX0NPTVBfRVJST1JfTk9ORSIpLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIENPTVBfQ0xFQVJfRVJST1JDT0RFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkVycm9yQ29kZSA9IEhBTF9DT01QX0VSUk9SX05PTkUpIAorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DU1IsIENPTVBfQ1NSX0NPTVB4RU4pCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUiwgQ09NUF9DU1JfQ09NUHhFTikKKworLyoqCisgICogQGJyaWVmICBMb2NrIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvciBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICAgVXNpbmcgdGhpcyBtYWNybyBpbmR1Y2UgSEFMIENPTVAgaGFuZGxlIHN0YXRlIG1hY2hpbmUgYmVpbmcgbm8KKyAgKiAgICAgICAgIG1vcmUgaW4gbGluZSB3aXRoIENPTVAgaW5zdGFuY2Ugc3RhdGUuCisgICogICAgICAgICBUbyBrZWVwIEhBTCBDT01QIGhhbmRsZSBzdGF0ZSBtYWNoaW5lIHVwZGF0ZWQsIGl0IGlzIHJlY29tbWVuZGVkCisgICogICAgICAgICB0byB1c2UgZnVuY3Rpb24gIkhBTF9DT01QX0xvY2snKSIuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0xPQ0soX19IQU5ETEVfXykgICAgICAgICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DU1IsIENPTVBfQ1NSX0NPTVB4TE9DSykKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvciBpcyBsb2NrZWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgVmFsdWUgMCBpZiBDT01QIGluc3RhbmNlIGlzIG5vdCBsb2NrZWQsIHZhbHVlIDEgaWYgQ09NUCBpbnN0YW5jZSBpcyBsb2NrZWQKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9JU19MT0NLRUQoX19IQU5ETEVfXykgICAgICAgICAgIChSRUFEX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DU1IsIENPTVBfQ1NSX0NPTVB4TE9DSykgPT0gQ09NUF9DU1JfQ09NUHhMT0NLKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfRXh0aV9NYW5hZ2VtZW50ICBDT01QIGV4dGVybmFsIGludGVycnVwdCBsaW5lIG1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBTRVRfQklUKEVYVEktPlJUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAxIEVYVEkgbGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgQ0xFQVJfQklUKEVYVEktPlJUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgU0VUX0JJVChFWFRJLT5GVFNSLCBDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICBDTEVBUl9CSVQoRVhUSS0+RlRTUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAxIEVYVEkgbGluZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAgICAgIFNFVF9CSVQoRVhUSS0+SU1SLCBDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0lUKCkgICAgICAgICAgICBDTEVBUl9CSVQoRVhUSS0+SU1SLCBDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIGludGVycnVwdCBvbiB0aGUgQ09NUDEgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VORVJBVEVfU1dJVCgpICAgICAgICAgU0VUX0JJVChFWFRJLT5TV0lFUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgaW4gZXZlbnQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9FVkVOVCgpICAgICAgICAgICBTRVRfQklUKEVYVEktPkVNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0VWRU5UKCkgICAgICAgICAgQ0xFQVJfQklUKEVYVEktPkVNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQ09NUDEgRVhUSSBsaW5lIGZsYWcgaXMgc2V0LgorICAqIEByZXR2YWwgUkVTRVQgb3IgU0VUCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9HRVRfRkxBRygpICAgICAgICAgICAgICBSRUFEX0JJVChFWFRJLT5QUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENPTVAxIEVYVEkgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgIFdSSVRFX1JFRyhFWFRJLT5QUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgU0VUX0JJVChFWFRJLT5SVFNSLCBDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgQ0xFQVJfQklUKEVYVEktPlJUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICBTRVRfQklUKEVYVEktPkZUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAyIEVYVEkgbGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgQ0xFQVJfQklUKEVYVEktPkZUU1IsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgICAgICBTRVRfQklUKEVYVEktPklNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGludGVycnVwdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpICAgICAgICAgICAgQ0xFQVJfQklUKEVYVEktPklNUiwgQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIENPTVAyIEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMl9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgICAgICAgIFNFVF9CSVQoRVhUSS0+U1dJRVIsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgICAgICAgU0VUX0JJVChFWFRJLT5FTVIsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAyIEVYVEkgbGluZSBpbiBldmVudCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9FVkVOVCgpICAgICAgICAgIENMRUFSX0JJVChFWFRJLT5FTVIsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIENPTVAyIEVYVEkgbGluZSBmbGFnIGlzIHNldC4KKyAgKiBAcmV0dmFsIFJFU0VUIG9yIFNFVAorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSAgICAgICAgICAgICAgUkVBRF9CSVQoRVhUSS0+UFIsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDT01QMiBFWFRJIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICBXUklURV9SRUcoRVhUSS0+UFIsIENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX1ByaXZhdGVfQ29uc3RhbnRzIENPTVAgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBDT01QX0V4dGlMaW5lIENPTVAgRVhUSSBMaW5lcworICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVAxICAgICAgICAgICAoRVhUSV9JTVJfSU0yMSkgIC8qITwgRVhUSSBsaW5lIDIxIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDIgICAgICAgICAgIChFWFRJX0lNUl9JTTIyKSAgLyohPCBFWFRJIGxpbmUgMjIgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4dGlMaW5lIENPTVAgRVhUSSBMaW5lcworICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfRVhUSV9JVCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpIDB4MDFVKSAgLyohPCBFWFRJIGxpbmUgZXZlbnQgd2l0aCBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0VWRU5UICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkgMHgwMlUpICAvKiE8IEVYVEkgbGluZSBldmVudCBvbmx5ICh3aXRob3V0IGludGVycnVwdGlvbikgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX1JJU0lORyAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkgMHgxMFUpICAvKiE8IEVYVEkgbGluZSBldmVudCBvbiByaXNpbmcgZWRnZSAqLworI2RlZmluZSBDT01QX0VYVElfRkFMTElORyAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KSAweDIwVSkgIC8qITwgRVhUSSBsaW5lIGV2ZW50IG9uIGZhbGxpbmcgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9Qcml2YXRlX01hY3JvcyBDT01QIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0dFVF9FWFRJX0xJTkUgQ09NUCBwcml2YXRlIG1hY3JvcyB0byBnZXQgRVhUSSBsaW5lIGFzc29jaWF0ZWQgd2l0aCBjb21wYXJhdG9ycyAKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNwZWNpZmllZCBFWFRJIGxpbmUgZm9yIGEgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyAgc3BlY2lmaWVzIHRoZSBDT01QIGluc3RhbmNlLgorICAqIEByZXR2YWwgdmFsdWUgb2YgQHJlZiBDT01QX0V4dGlMaW5lCisgICovCisjZGVmaW5lIENPTVBfR0VUX0VYVElfTElORShfX0lOU1RBTkNFX18pICAgICgoKF9fSU5TVEFOQ0VfXykgPT0gQ09NUDEpID8gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfRVhUSV9MSU5FX0NPTVAxIDogQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfSVNfQ09NUF9EZWZpbml0aW9ucyBDT01QIHByaXZhdGUgbWFjcm9zIHRvIGNoZWNrIGlucHV0IHBhcmFtZXRlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBJU19DT01QX1dJTkRPV01PREUoX19XSU5ET1dNT0RFX18pICAoKChfX1dJTkRPV01PREVfXykgPT0gQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUpICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XSU5ET1dNT0RFX18pID09IENPTVBfV0lORE9XTU9ERV9DT01QMV9JTlBVVF9QTFVTX0NPTU1PTikgICkKKworI2RlZmluZSBJU19DT01QX1BPV0VSTU9ERShfX1BPV0VSTU9ERV9fKSAgICAoKChfX1BPV0VSTU9ERV9fKSA9PSBDT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1dFUk1PREVfXykgPT0gQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUikgICkKKworI2RlZmluZSBJU19DT01QX1dJTkRPV01PREVfSU5TVEFOQ0UoSU5TVEFOQ0UpICgoSU5TVEFOQ0UpID09IENPTVAxKQorCisjaWYgZGVmaW5lZCAoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2RlZmluZSBJU19DT01QX0lOUFVUX1BMVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfUExVU19fKSAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChfX0lOUFVUX1BMVVNfXykgPT0gQ09NUF9JTlBVVF9QTFVTX0lPMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKF9fSU5QVVRfUExVU19fKSA9PSBDT01QX0lOUFVUX1BMVVNfSU8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX1BMVVNfXykgPT0gQ09NUF9JTlBVVF9QTFVTX0lPMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9QTFVTX18pID09IENPTVBfSU5QVVRfUExVU19JTzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBDT01QX0lOUFVUX1BMVVNfSU80KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX1BMVVNfXykgPT0gQ09NUF9JTlBVVF9QTFVTX0lPNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9QTFVTX18pID09IENPTVBfSU5QVVRfUExVU19JTzYpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbHNlCisjZGVmaW5lIElTX0NPTVBfSU5QVVRfUExVUyhfX0NPTVBfSU5TVEFOQ0VfXywgX19JTlBVVF9QTFVTX18pICAgICAgICAgICAgICAgICAgXAorICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKF9fSU5QVVRfUExVU19fKSA9PSBDT01QX0lOUFVUX1BMVVNfSU8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoX19JTlBVVF9QTFVTX18pID09IENPTVBfSU5QVVRfUExVU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBDT01QX0lOUFVUX1BMVVNfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX1BMVVNfXykgPT0gQ09NUF9JTlBVVF9QTFVTX0lPMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9QTFVTX18pID09IENPTVBfSU5QVVRfUExVU19JTzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBDT01QX0lOUFVUX1BMVVNfSU81KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYKKworI2RlZmluZSBJU19DT01QX0lOUFVUX01JTlVTKF9fQ09NUF9JTlNUQU5DRV9fLCBfX0lOUFVUX01JTlVTX18pICAgICAgICAgICAgICAgIFwKKyAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTX0lPMSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IENPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTXzNfNFZSRUZJTlQpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IENPTVBfSU5QVVRfTUlOVVNfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0NPTVAxX0xQVElNQ09OTkVDVElPTihMUFRJTUNPTk5FQ1RJT04pICAgKCgoTFBUSU1DT05ORUNUSU9OKSA9PSBDT01QX0xQVElNQ09OTkVDVElPTl9ESVNBQkxFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExQVElNQ09OTkVDVElPTikgPT0gQ09NUF9MUFRJTUNPTk5FQ1RJT05fSU4xX0VOQUJMRUQpKQorCisjZGVmaW5lIElTX0NPTVAyX0xQVElNQ09OTkVDVElPTihMUFRJTUNPTk5FQ1RJT04pICAgKCgoTFBUSU1DT05ORUNUSU9OKSA9PSBDT01QX0xQVElNQ09OTkVDVElPTl9ESVNBQkxFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExQVElNQ09OTkVDVElPTikgPT0gQ09NUF9MUFRJTUNPTk5FQ1RJT05fSU4xX0VOQUJMRUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMUFRJTUNPTk5FQ1RJT04pID09IENPTVBfTFBUSU1DT05ORUNUSU9OX0lOMl9FTkFCTEVEKSkKKworI2RlZmluZSBJU19DT01QMl9MUFRJTUNPTk5FQ1RJT05fUkVTVFJJQ1RFRChMUFRJTUNPTk5FQ1RJT04pICAgKCgoTFBUSU1DT05ORUNUSU9OKSA9PSBDT01QX0xQVElNQ09OTkVDVElPTl9ESVNBQkxFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFBUSU1DT05ORUNUSU9OKSA9PSBDT01QX0xQVElNQ09OTkVDVElPTl9JTjFfRU5BQkxFRCkpCisKKyNkZWZpbmUgSVNfQ09NUF9PVVRQVVRQT0woUE9MKSAgKCgoUE9MKSA9PSBDT01QX09VVFBVVFBPTF9OT05JTlZFUlRFRCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MKSA9PSBDT01QX09VVFBVVFBPTF9JTlZFUlRFRCkpCisKKyNkZWZpbmUgSVNfQ09NUF9UUklHR0VSTU9ERShfX1RSSUdHRVJNT0RFX18pICgoKF9fVFJJR0dFUk1PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9OT05FKSAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHR0VSTU9ERV9fKSA9PSBDT01QX1RSSUdHRVJNT0RFX0lUX1JJU0lORykgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdHRVJNT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfSVRfRkFMTElORykgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR0dFUk1PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9JVF9SSVNJTkdfRkFMTElORykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHR0VSTU9ERV9fKSA9PSBDT01QX1RSSUdHRVJNT0RFX0VWRU5UX1JJU0lORykgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdHRVJNT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfRVZFTlRfRkFMTElORykgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR0dFUk1PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORykgICApCisKKworI2RlZmluZSBJU19DT01QX09VVFBVVF9MRVZFTChfX09VVFBVVF9MRVZFTF9fKSAoKChfX09VVFBVVF9MRVZFTF9fKSA9PSBDT01QX09VVFBVVF9MRVZFTF9MT1cpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fT1VUUFVUX0xFVkVMX18pID09IENPTVBfT1VUUFVUX0xFVkVMX0hJR0gpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIENPTVAgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfY29tcF9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9Jbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfRGVJbml0IChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9DT01QX01zcEluaXQoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfQ09NUF9Nc3BEZUluaXQoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7CisKKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX1JlZ2lzdGVyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCwgSEFMX0NPTVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcENPTVBfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCwgSEFMX0NPTVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfU3RhcnQoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9TdG9wKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOwordm9pZCAgICAgICAgICAgICAgSEFMX0NPTVBfSVJRSGFuZGxlcihDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfTG9jayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9DT01QX0dldE91dHB1dExldmVsKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworLyogQ2FsbGJhY2sgaW4gaW50ZXJydXB0IG1vZGUgKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAeworICAqLworSEFMX0NPTVBfU3RhdGVUeXBlRGVmIEhBTF9DT01QX0dldFN0YXRlKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOwordWludDMyX3QgICAgICAgICAgICAgIEhBTF9DT01QX0dldEVycm9yKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiAhZGVmaW5lZCAoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfQ09NUF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9jb21wX2V4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF9jb21wX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5NjU2YgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX2NvbXBfZXguaApAQCAtMCwwICsxLDc2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9jb21wX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENPTVAgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfQ09NUF9FWF9ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9DT01QX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KQorLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBFeCBDT01QRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIENPTVBFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIENPTVAgVlJFRklOVCBzZXR1cCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIENPTVAgc3BlY2lmaWMgZnVuY3Rpb25zIHRvIG1hbmFnZSBWUkVGSU5UICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9DT01QRXhfRW5hYmxlVlJFRklOVCh2b2lkKTsKK3ZvaWQgSEFMX0NPTVBFeF9EaXNhYmxlVlJFRklOVCh2b2lkKTsKKyAgIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfQ09NUF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2NvbmZfdGVtcGxhdGUuaCBiL0luYy9zdG0zMmwweHhfaGFsX2NvbmZfdGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjZmMTMxCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfY29uZl90ZW1wbGF0ZS5oCkBAIC0wLDAgKzEsMzM4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9jb25mLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhBTCBjb25maWd1cmF0aW9uIHRlbXBsYXRlIGZpbGUuIAorICAqICAgICAgICAgIFRoaXMgZmlsZSBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBhcHBsaWNhdGlvbiBmb2xkZXIgYW5kIHJlbmFtZWQKKyAgKiAgICAgICAgICB0byBzdG0zMmwweHhfaGFsX2NvbmYuaC4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfQ09ORl9ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9DT05GX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1vZHVsZSBTZWxlY3Rpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisvKioKKyAgKiBAYnJpZWYgVGhpcyBpcyB0aGUgbGlzdCBvZiBtb2R1bGVzIHRvIGJlIHVzZWQgaW4gdGhlIEhBTCBkcml2ZXIgCisgICovCisjZGVmaW5lIEhBTF9NT0RVTEVfRU5BQkxFRCAgCisjZGVmaW5lIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQgICAKKyNkZWZpbmUgSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQgCisjZGVmaW5lIEhBTF9DUkNfTU9EVUxFX0VOQUJMRUQgIAorI2RlZmluZSBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRCAgCisjZGVmaW5lIEhBTF9EQUNfTU9EVUxFX0VOQUJMRUQgICAKKyNkZWZpbmUgSEFMX0RNQV9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfRklSRVdBTExfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9HUElPX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0kyU19NT0RVTEVfRU5BQkxFRCAgIAorI2RlZmluZSBIQUxfSVdER19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfTENEX01PRFVMRV9FTkFCTEVEIAorI2RlZmluZSBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAgCisjZGVmaW5lIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQgCisjZGVmaW5lIEhBTF9STkdfTU9EVUxFX0VOQUJMRUQgICAKKyNkZWZpbmUgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfU1BJX01PRFVMRV9FTkFCTEVEICAgCisjZGVmaW5lIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1RTQ19NT0RVTEVfRU5BQkxFRCAgIAorI2RlZmluZSBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAKKyNkZWZpbmUgSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVEIAorI2RlZmluZSBIQUxfSVJEQV9NT0RVTEVfRU5BQkxFRCAKKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRCAKKyNkZWZpbmUgSEFMX1NNQlVTX01PRFVMRV9FTkFCTEVEIAorI2RlZmluZSBIQUxfV1dER19NT0RVTEVfRU5BQkxFRCAgCisjZGVmaW5lIEhBTF9DT1JURVhfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCAKKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgT3NjaWxsYXRvciBWYWx1ZXMgYWRhcHRhdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKioKKyAgKiBAYnJpZWYgQWRqdXN0IHRoZSB2YWx1ZSBvZiBFeHRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTRSkgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLgorICAqICAgICAgICBUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGhlIFJDQyBIQUwgbW9kdWxlIHRvIGNvbXB1dGUgdGhlIHN5c3RlbSBmcmVxdWVuY3kKKyAgKiAgICAgICAgKHdoZW4gSFNFIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSwgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgUExMKS4gIAorICAqLworI2lmICFkZWZpbmVkICAoSFNFX1ZBTFVFKSAKKyAgI2RlZmluZSBIU0VfVkFMVUUgICAgKCh1aW50MzJfdCk4MDAwMDAwVSkgLyohPCBWYWx1ZSBvZiB0aGUgRXh0ZXJuYWwgb3NjaWxsYXRvciBpbiBIeiAqLworI2VuZGlmIC8qIEhTRV9WQUxVRSAqLworCisjaWYgIWRlZmluZWQgIChIU0VfU1RBUlRVUF9USU1FT1VUKQorICAjZGVmaW5lIEhTRV9TVEFSVFVQX1RJTUVPVVQgICAgKCh1aW50MzJfdCkxMDBVKSAgIC8qITwgVGltZSBvdXQgZm9yIEhTRSBzdGFydCB1cCwgaW4gbXMgKi8KKyNlbmRpZiAvKiBIU0VfU1RBUlRVUF9USU1FT1VUICovCisKKy8qKgorICAqIEBicmllZiBJbnRlcm5hbCBNdWx0aXBsZSBTcGVlZCBvc2NpbGxhdG9yIChNU0kpIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgIFRoaXMgdmFsdWUgaXMgdGhlIGRlZmF1bHQgTVNJIHJhbmdlIHZhbHVlIGFmdGVyIFJlc2V0LgorICAqLworI2lmICFkZWZpbmVkICAoTVNJX1ZBTFVFKQorICAjZGVmaW5lIE1TSV9WQUxVRSAgICAoKHVpbnQzMl90KTIwOTcxNTJVKSAvKiE8IFZhbHVlIG9mIHRoZSBJbnRlcm5hbCBvc2NpbGxhdG9yIGluIEh6Ki8KKyNlbmRpZiAvKiBNU0lfVkFMVUUgKi8KKworLyoqCisgICogQGJyaWVmIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKSB2YWx1ZS4KKyAgKiAgICAgICAgVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBSQ0MgSEFMIG1vZHVsZSB0byBjb21wdXRlIHRoZSBzeXN0ZW0gZnJlcXVlbmN5CisgICogICAgICAgICh3aGVuIEhTSSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UsIGRpcmVjdGx5IG9yIHRocm91Z2ggdGhlIFBMTCkuIAorICAqLworI2lmICFkZWZpbmVkICAoSFNJX1ZBTFVFKQorICAjZGVmaW5lIEhTSV9WQUxVRSAgICAoKHVpbnQzMl90KTE2MDAwMDAwVSkgLyohPCBWYWx1ZSBvZiB0aGUgSW50ZXJuYWwgb3NjaWxsYXRvciBpbiBIeiovCisjZW5kaWYgLyogSFNJX1ZBTFVFICovCisKKy8qKgorICAqIEBicmllZiBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgZm9yIFVTQiAoSFNJNDgpIHZhbHVlLgorICAqLworI2lmICFkZWZpbmVkICAoSFNJNDhfVkFMVUUpIAorI2RlZmluZSBIU0k0OF9WQUxVRSAoKHVpbnQzMl90KTQ4MDAwMDAwVSkgLyohPCBWYWx1ZSBvZiB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIGZvciBVU0IgaW4gSHouCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVhbCB2YWx1ZSBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHZhcmlhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlLiAgKi8KKyNlbmRpZiAvKiBIU0k0OF9WQUxVRSAqLworCisvKioKKyAgKiBAYnJpZWYgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSSkgdmFsdWUuCisgICovCisjaWYgIWRlZmluZWQgIChMU0lfVkFMVUUpIAorICNkZWZpbmUgTFNJX1ZBTFVFICAoKHVpbnQzMl90KTM3MDAwVSkgICAgICAgLyohPCBMU0kgVHlwaWNhbCBWYWx1ZSBpbiBIeiovCisjZW5kaWYgLyogTFNJX1ZBTFVFICovICAgICAgICAgICAgICAgICAgICAgIC8qITwgVmFsdWUgb2YgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIGluIEh6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVhbCB2YWx1ZSBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHZhcmlhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlLiovCisvKioKKyAgKiBAYnJpZWYgRXh0ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTRSkgdmFsdWUuCisgICogICAgICAgIFRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgVUFSVCwgUlRDIEhBTCBtb2R1bGUgdG8gY29tcHV0ZSB0aGUgc3lzdGVtIGZyZXF1ZW5jeQorICAqLworI2lmICFkZWZpbmVkICAoTFNFX1ZBTFVFKQorICAjZGVmaW5lIExTRV9WQUxVRSAgICAoKHVpbnQzMl90KTMyNzY4VSkgLyohPCBWYWx1ZSBvZiB0aGUgRXh0ZXJuYWwgb3NjaWxsYXRvciBpbiBIeiovCisjZW5kaWYgLyogTFNFX1ZBTFVFICovCisKKy8qKgorICAqIEBicmllZiBUaW1lIG91dCBmb3IgTFNFIHN0YXJ0IHVwIHZhbHVlIGluIG1zLgorICAqLworI2lmICFkZWZpbmVkICAoTFNFX1NUQVJUVVBfVElNRU9VVCkKKyAgI2RlZmluZSBMU0VfU1RBUlRVUF9USU1FT1VUICAgICgodWludDMyX3QpNTAwMFUpICAgLyohPCBUaW1lIG91dCBmb3IgTFNFIHN0YXJ0IHVwLCBpbiBtcyAqLworI2VuZGlmIC8qIExTRV9TVEFSVFVQX1RJTUVPVVQgKi8KKworICAgCisvKiBUaXA6IFRvIGF2b2lkIG1vZGlmeWluZyB0aGlzIGZpbGUgZWFjaCB0aW1lIHlvdSBuZWVkIHRvIHVzZSBkaWZmZXJlbnQgSFNFLAorICAgPT09ICB5b3UgY2FuIGRlZmluZSB0aGUgSFNFIHZhbHVlIGluIHlvdXIgdG9vbGNoYWluIGNvbXBpbGVyIHByZXByb2Nlc3Nvci4gKi8KKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFN5c3RlbSBDb25maWd1cmF0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKy8qKgorICAqIEBicmllZiBUaGlzIGlzIHRoZSBIQUwgc3lzdGVtIGNvbmZpZ3VyYXRpb24gc2VjdGlvbgorICAqLyAgICAgCisjZGVmaW5lICBWRERfVkFMVUUgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMzMwMFUpIC8qITwgVmFsdWUgb2YgVkREIGluIG12ICovCisjZGVmaW5lICBUSUNLX0lOVF9QUklPUklUWSAgICAgICAgICAgICgoKHVpbnQzMl90KTFVPDxfX05WSUNfUFJJT19CSVRTKSAtIDFVKSAgICAvKiE8IHRpY2sgaW50ZXJydXB0IHByaW9yaXR5ICovICAgICAgICAgICAgCisjZGVmaW5lICBVU0VfUlRPUyAgICAgICAgICAgICAgICAgICAgIDBVICAgICAKKyNkZWZpbmUgIFBSRUZFVENIX0VOQUJMRSAgICAgICAgICAgICAgMVUgICAgICAgICAgICAgIAorI2RlZmluZSAgUFJFUkVBRF9FTkFCTEUgICAgICAgICAgICAgICAwVQorI2RlZmluZSAgQlVGRkVSX0NBQ0hFX0RJU0FCTEUgICAgICAgICAwVQorCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBc3NlcnQgU2VsZWN0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworLyoqCisgICogQGJyaWVmIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBleHBhbnNlIHRoZSAiYXNzZXJ0X3BhcmFtIiBtYWNybyBpbiB0aGUgCisgICogICAgICAgIEhBTCBkcml2ZXJzIGNvZGUKKyAgKi8KKy8qICNkZWZpbmUgVVNFX0ZVTExfQVNTRVJUICAgIDFVICovCisKKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIFJlZ2lzdGVyIGNhbGxiYWNrIGZlYXR1cmUgY29uZmlndXJhdGlvbiAjIyMjIyMjIyMjIyMjIyMgKi8KKy8qKgorICAqIEBicmllZiBTZXQgYmVsb3cgdGhlIHBlcmlwaGVyYWwgY29uZmlndXJhdGlvbiAgdG8gIjFVIiB0byBhZGQgdGhlIHN1cHBvcnQKKyAgKiAgICAgICAgb2YgSEFMIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbi9kZXJlZ2lzdHJhdGlvbiBmZWF0dXJlIGZvciB0aGUgSEFMCisgICogICAgICAgIGRyaXZlcihzKS4gVGhpcyBhbGxvd3MgdXNlciBhcHBsaWNhdGlvbiB0byBwcm92aWRlIHNwZWNpZmljIGNhbGxiYWNrCisgICogICAgICAgIGZ1bmN0aW9ucyB0aGFua3MgdG8gSEFMX1BQUF9SZWdpc3RlckNhbGxiYWNrKCkgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcKKyAgKiAgICAgICAgdGhlIGRlZmF1bHQgd2VhayBjYWxsYmFjayBmdW5jdGlvbnMgKHNlZSBlYWNoIHN0bTMybDB4eF9oYWxfcHBwLmggZmlsZQorICAqICAgICAgICBmb3IgcG9zc2libGUgY2FsbGJhY2sgaWRlbnRpZmllcnMgZGVmaW5lZCBpbiBIQUxfUFBQX0NhbGxiYWNrSURUeXBlRGVmCisgICogICAgICAgIGZvciBlYWNoIFBQUCBwZXJpcGhlcmFsKS4KKyAgKi8KKyNkZWZpbmUgVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAgICAwVQorI2RlZmluZSBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAgIDBVCisjZGVmaW5lIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgICAgMFUKKyNkZWZpbmUgVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAgICAwVQorI2RlZmluZSBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgIDBVCisjZGVmaW5lIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgMFUKKyNkZWZpbmUgVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAwVQorI2RlZmluZSBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgIDBVCisjZGVmaW5lIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgICAgMFUKKyNkZWZpbmUgVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAgICAwVQorI2RlZmluZSBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgIDBVCisjZGVmaW5lIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAgMFUKKyNkZWZpbmUgVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAgICAwVQorI2RlZmluZSBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgIDBVCisjZGVmaW5lIFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgICAgMFUKKyNkZWZpbmUgVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgICAwVQorI2RlZmluZSBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgIDBVCisjZGVmaW5lIFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgMFUKKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIFNQSSBwZXJpcGhlcmFsIGNvbmZpZ3VyYXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKworLyogQ1JDIEZFQVRVUkU6IFVzZSB0byBhY3RpdmF0ZSBDUkMgZmVhdHVyZSBpbnNpZGUgSEFMIFNQSSBEcml2ZXIKKyAqIEFjdGl2YXRlZDogQ1JDIGNvZGUgaXMgcHJlc2VudCBpbnNpZGUgZHJpdmVyCisgKiBEZWFjdGl2YXRlZDogQ1JDIGNvZGUgY2xlYW5lZCBmcm9tIGRyaXZlcgorICovCisKKyNkZWZpbmUgVVNFX1NQSV9DUkMgICAgICAgICAgICAgICAgICAgMVUKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKgorICAqIEBicmllZiBJbmNsdWRlIG1vZHVsZSdzIGhlYWRlciBmaWxlIAorICAqLworCisjaWZkZWYgSEFMX1JDQ19NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9yY2MuaCIKKyNlbmRpZiAvKiBIQUxfUkNDX01PRFVMRV9FTkFCTEVEICovCisgIAorI2lmZGVmIEhBTF9HUElPX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2dwaW8uaCIKKyNlbmRpZiAvKiBIQUxfR1BJT19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0RNQV9NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kbWEuaCIKKyNlbmRpZiAvKiBIQUxfRE1BX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfQ09SVEVYX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2NvcnRleC5oIgorI2VuZGlmIC8qIEhBTF9DT1JURVhfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfYWRjLmgiCisjZW5kaWYgLyogSEFMX0FEQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfY29tcC5oIgorI2VuZGlmIC8qIEhBTF9DT01QX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2NyYy5oIgorI2VuZGlmIC8qIEhBTF9DUkNfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2NyeXAuaCIKKyNlbmRpZiAvKiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0RBQ19NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kYWMuaCIKKyNlbmRpZiAvKiBIQUxfREFDX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfRklSRVdBTExfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZmlyZXdhbGwuaCIKKyNlbmRpZiAvKiBIQUxfRklSRVdBTExfTU9EVUxFX0VOQUJMRUQgKi8KKyAKKyNpZmRlZiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZmxhc2guaCIKKyNlbmRpZiAvKiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQgKi8KKyAKKyNpZmRlZiBIQUxfSTJDX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfaTJjLmgiCisjZW5kaWYgLyogSEFMX0kyQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0kyU19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2kycy5oIgorI2VuZGlmIC8qIEhBTF9JMlNfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9JV0RHX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfaXdkZy5oIgorI2VuZGlmIC8qIEhBTF9JV0RHX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfTENEX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfbGNkLmgiCisjZW5kaWYgLyogSEFMX0xDRF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0xQVElNX01PRFVMRV9FTkFCTEVECisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9scHRpbS5oIgorI2VuZGlmIC8qIEhBTF9MUFRJTV9NT0RVTEVfRU5BQkxFRCAqLworICAgCisjaWZkZWYgSEFMX1BXUl9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3B3ci5oIgorI2VuZGlmIC8qIEhBTF9QV1JfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9STkdfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9ybmcuaCIKKyNlbmRpZiAvKiBIQUxfUk5HX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfUlRDX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfcnRjLmgiCisjZW5kaWYgLyogSEFMX1JUQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1NQSV9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3NwaS5oIgorI2VuZGlmIC8qIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF90aW0uaCIKKyNlbmRpZiAvKiBIQUxfVElNX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfVFNDX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfdHNjLmgiCisjZW5kaWYgLyogSEFMX1RTQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF91YXJ0LmgiCisjZW5kaWYgLyogSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9VU0FSVF9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3VzYXJ0LmgiCisjZW5kaWYgLyogSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfSVJEQV9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2lyZGEuaCIKKyNlbmRpZiAvKiBIQUxfSVJEQV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3NtYXJ0Y2FyZC5oIgorI2VuZGlmIC8qIEhBTF9TTUFSVENBUkRfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9TTUJVU19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3NtYnVzLmgiCisjZW5kaWYgLyogSEFMX1NNQlVTX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3d3ZGcuaCIKKyNlbmRpZiAvKiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1BDRF9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3BjZC5oIgorI2VuZGlmIC8qIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisvKioKKyAgKiBAYnJpZWYgIFRoZSBhc3NlcnRfcGFyYW0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb24ncyBwYXJhbWV0ZXJzIGNoZWNrLgorICAqIEBwYXJhbSAgZXhwciBJZiBleHByIGlzIGZhbHNlLCBpdCBjYWxscyBhc3NlcnRfZmFpbGVkIGZ1bmN0aW9uCisgICogICAgICAgICB3aGljaCByZXBvcnRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIHNvdXJjZQorICAqICAgICAgICAgbGluZSBudW1iZXIgb2YgdGhlIGNhbGwgdGhhdCBmYWlsZWQuIAorICAqICAgICAgICAgSWYgZXhwciBpcyB0cnVlLCBpdCByZXR1cm5zIG5vIHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKGV4cHIpID8gKHZvaWQpMFUgOiBhc3NlcnRfZmFpbGVkKCh1aW50OF90ICopX19GSUxFX18sIF9fTElORV9fKSkKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIHZvaWQgYXNzZXJ0X2ZhaWxlZCh1aW50OF90KiBmaWxlLCB1aW50MzJfdCBsaW5lKTsKKyNlbHNlCisgICNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZiAvKiBVU0VfRlVMTF9BU1NFUlQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0hBTF9DT05GX0ggKi8KKyAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfY29ydGV4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF9jb3J0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjE2NzBkCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfY29ydGV4LmgKQEAgLTAsMCArMSwzNjUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2NvcnRleC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDT1JURVggSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfQ09SVEVYX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfSEFMX0NPUlRFWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVggQ09SVEVYCisgICogQHsKKyAgKi8gCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9FeHBvcnRlZF9UeXBlcyBDT1JURVggRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisjaWYgKF9fTVBVX1BSRVNFTlQgPT0gMSkKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9SZWdpb25fSW5pdGlhbGl6YXRpb25fU3RydWN0dXJlX2RlZmluaXRpb24gTVBVIFJlZ2lvbiBJbml0aWFsaXphdGlvbiBTdHJ1Y3R1cmUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uIHRvIHByb3RlY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgIEVuYWJsZTsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgcmVnaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX0VuYWJsZSAgICAgICAgICAgICAgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICBOdW1iZXI7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIHJlZ2lvbiB0byBwcm90ZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX051bWJlciAgICAgICAgICAgICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHJlZ2lvbiB0byBwcm90ZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX1NpemUgICAgICAgICAgICAgICAgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICBTdWJSZWdpb25EaXNhYmxlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIHN1YnJlZ2lvbiBwcm90ZWN0aW9uIHRvIGRpc2FibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRiAgICAqLworICB1aW50OF90ICAgICAgICAgICAgICAgIFR5cGVFeHRGaWVsZDsgICAgICAgICAgLyohPCBUaGlzIHBhcmFtZXRlciBpcyBOT1QgdXNlZCBidXQgaXMga2VwdCB0byBrZWVwIEFQSSB1bmlmaWVkIHRocm91Z2ggYWxsIGZhbWlsaWVzKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgIEFjY2Vzc1Blcm1pc3Npb247ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJlZ2lvbiBhY2Nlc3MgcGVybWlzc2lvbiB0eXBlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX1Blcm1pc3Npb25fQXR0cmlidXRlcyAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICBEaXNhYmxlRXhlYzsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnN0cnVjdGlvbiBhY2Nlc3Mgc3RhdHVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfSW5zdHJ1Y3Rpb25fQWNjZXNzICAgICAgICAgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICBJc1NoYXJlYWJsZTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzaGFyZWFiaWxpdHkgc3RhdHVzIG9mIHRoZSBwcm90ZWN0ZWQgcmVnaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfQWNjZXNzX1NoYXJlYWJsZSAgICAgICAgICAgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICBJc0NhY2hlYWJsZTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjYWNoZWFibGUgc3RhdHVzIG9mIHRoZSByZWdpb24gcHJvdGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfQWNjZXNzX0NhY2hlYWJsZSAgICAgICAgICAgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICBJc0J1ZmZlcmFibGU7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBidWZmZXJhYmxlIHN0YXR1cyBvZiB0aGUgcHJvdGVjdGVkIHJlZ2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT1JURVhfTVBVX0FjY2Vzc19CdWZmZXJhYmxlICAgICAgICAgICAgICovCit9TVBVX1JlZ2lvbl9Jbml0VHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0NvbnN0YW50cyBDT1JURXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworCisjZGVmaW5lIElTX05WSUNfUFJFRU1QVElPTl9QUklPUklUWShfX1BSSU9SSVRZX18pICAoKF9fUFJJT1JJVFlfXykgPCAweDRVKQorCisjZGVmaW5lIElTX05WSUNfREVWSUNFX0lSUShJUlEpICAgICAgICAgICAgICAgICgoSVJRKSA+PSAweDApCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX1N5c1RpY2tfY2xvY2tfc291cmNlIENPUlRFWCBTeXNUaWNrIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOCAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkKKyNkZWZpbmUgSVNfU1lTVElDS19DTEtfU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4KSkKKy8qKgorICAqIEB9CisgICovCisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxKQorLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0hGTk1JX1BSSVZERUZfQ29udHJvbCBDT1JURVggTVBVIEhGTk1JIGFuZCBQUklWSUxFR0VEIEFjY2VzcyBjb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9IRk5NSV9QUklWREVGX05PTkUgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSAgTVBVX0hBUkRGQVVMVF9OTUkgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpCisjZGVmaW5lICBNUFVfUFJJVklMRUdFRF9ERUZBVUxUICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkKKyNkZWZpbmUgIE1QVV9IRk5NSV9QUklWREVGICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9FbmFibGUgQ09SVEVYIE1QVSBSZWdpb24gRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9SRUdJT05fRU5BQkxFICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lICBNUFVfUkVHSU9OX0RJU0FCTEUgICAgICAgICAgKCh1aW50OF90KTB4MDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0luc3RydWN0aW9uX0FjY2VzcyBDT1JURVggTVBVIEluc3RydWN0aW9uIEFjY2VzcworICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSAgICAgICgodWludDhfdCkweDAwVSkKKyNkZWZpbmUgIE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRElTQUJMRSAgICAgKCh1aW50OF90KTB4MDFVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0FjY2Vzc19TaGFyZWFibGUgQ09SVEVYIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MgU2hhcmVhYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9BQ0NFU1NfU0hBUkVBQkxFICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lICBNUFVfQUNDRVNTX05PVF9TSEFSRUFCTEUgICAgKCh1aW50OF90KTB4MDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0FjY2Vzc19DYWNoZWFibGUgQ09SVEVYIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MgQ2FjaGVhYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9BQ0NFU1NfQ0FDSEVBQkxFICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lICBNUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUgICAgKCh1aW50OF90KTB4MDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0FjY2Vzc19CdWZmZXJhYmxlIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzIEJ1ZmZlcmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX0FDQ0VTU19CVUZGRVJBQkxFICAgICAgICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgIE1QVV9BQ0NFU1NfTk9UX0JVRkZFUkFCTEUgICAoKHVpbnQ4X3QpMHgwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX1NpemUgQ09SVEVYIE1QVSBSZWdpb24gU2l6ZQorICAqIEB7CisgICovCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzMyQiAgICAgICAgKCh1aW50OF90KTB4MDRVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV82NEIgICAgICAgICgodWludDhfdCkweDA1VSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTI4QiAgICAgICAoKHVpbnQ4X3QpMHgwNlUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzI1NkIgICAgICAgKCh1aW50OF90KTB4MDdVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV81MTJCICAgICAgICgodWludDhfdCkweDA4VSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMUtCICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzJLQiAgICAgICAgKCh1aW50OF90KTB4MEFVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV80S0IgICAgICAgICgodWludDhfdCkweDBCVSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfOEtCICAgICAgICAoKHVpbnQ4X3QpMHgwQ1UpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzE2S0IgICAgICAgKCh1aW50OF90KTB4MERVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8zMktCICAgICAgICgodWludDhfdCkweDBFVSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNjRLQiAgICAgICAoKHVpbnQ4X3QpMHgwRlUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzEyOEtCICAgICAgKCh1aW50OF90KTB4MTBVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8yNTZLQiAgICAgICgodWludDhfdCkweDExVSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNTEyS0IgICAgICAoKHVpbnQ4X3QpMHgxMlUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzFNQiAgICAgICAgKCh1aW50OF90KTB4MTNVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8yTUIgICAgICAgICgodWludDhfdCkweDE0VSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNE1CICAgICAgICAoKHVpbnQ4X3QpMHgxNVUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzhNQiAgICAgICAgKCh1aW50OF90KTB4MTZVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8xNk1CICAgICAgICgodWludDhfdCkweDE3VSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMzJNQiAgICAgICAoKHVpbnQ4X3QpMHgxOFUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzY0TUIgICAgICAgKCh1aW50OF90KTB4MTlVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8xMjhNQiAgICAgICgodWludDhfdCkweDFBVSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMjU2TUIgICAgICAoKHVpbnQ4X3QpMHgxQlUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzUxMk1CICAgICAgKCh1aW50OF90KTB4MUNVKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8xR0IgICAgICAgICgodWludDhfdCkweDFEVSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMkdCICAgICAgICAoKHVpbnQ4X3QpMHgxRVUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzRHQiAgICAgICAgKCh1aW50OF90KTB4MUZVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9QZXJtaXNzaW9uX0F0dHJpYnV0ZXMgQ09SVEVYIE1QVSBSZWdpb24gUGVybWlzc2lvbiBBdHRyaWJ1dGVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9SRUdJT05fTk9fQUNDRVNTICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpCisjZGVmaW5lICBNUFVfUkVHSU9OX1BSSVZfUlcgICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSAgTVBVX1JFR0lPTl9QUklWX1JXX1VSTyAgICAgICgodWludDhfdCkweDAyVSkKKyNkZWZpbmUgIE1QVV9SRUdJT05fRlVMTF9BQ0NFU1MgICAgICAoKHVpbnQ4X3QpMHgwM1UpCisjZGVmaW5lICBNUFVfUkVHSU9OX1BSSVZfUk8gICAgICAgICAgKCh1aW50OF90KTB4MDVVKQorI2RlZmluZSAgTVBVX1JFR0lPTl9QUklWX1JPX1VSTyAgICAgICgodWludDhfdCkweDA2VSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9SZWdpb25fTnVtYmVyIENPUlRFWCBNUFUgUmVnaW9uIE51bWJlcgorICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfUkVHSU9OX05VTUJFUjAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKQorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVIxICAgICAgICAgICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpCisjZGVmaW5lICBNUFVfUkVHSU9OX05VTUJFUjMgICAgICAgICAgKCh1aW50OF90KTB4MDNVKQorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVI0ICAgICAgICAgICgodWludDhfdCkweDA0VSkKKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSNSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpCisjZGVmaW5lICBNUFVfUkVHSU9OX05VTUJFUjYgICAgICAgICAgKCh1aW50OF90KTB4MDZVKQorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVI3ICAgICAgICAgICgodWludDhfdCkweDA3VSkKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworCisKKy8qKgorICAqIEB9CisgICovICAKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0Z1bmN0aW9ucyBDT1JURVggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKiBAeworICAqLwordm9pZCBIQUxfTlZJQ19TZXRQcmlvcml0eShJUlFuX1R5cGUgSVJRbiwgdWludDMyX3QgUHJlZW1wdFByaW9yaXR5LCB1aW50MzJfdCBTdWJQcmlvcml0eSk7Cit2b2lkIEhBTF9OVklDX0VuYWJsZUlSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9OVklDX0Rpc2FibGVJUlEoSVJRbl9UeXBlIElSUW4pOwordm9pZCBIQUxfTlZJQ19TeXN0ZW1SZXNldCh2b2lkKTsKK3VpbnQzMl90IEhBTF9TWVNUSUNLX0NvbmZpZyh1aW50MzJfdCBUaWNrc051bWIpOworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBDb3J0ZXggY29udHJvbCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKyAKK3VpbnQzMl90IEhBTF9OVklDX0dldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuKTsKK3VpbnQzMl90IEhBTF9OVklDX0dldFBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pOwordm9pZCBIQUxfTlZJQ19TZXRQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKTsKK3ZvaWQgSEFMX05WSUNfQ2xlYXJQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKTsKK3ZvaWQgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnKHVpbnQzMl90IENMS1NvdXJjZSk7Cit2b2lkIEhBTF9TWVNUSUNLX0lSUUhhbmRsZXIodm9pZCk7Cit2b2lkIEhBTF9TWVNUSUNLX0NhbGxiYWNrKHZvaWQpOworI2lmIChfX01QVV9QUkVTRU5UID09IDFVKQordm9pZCBIQUxfTVBVX0VuYWJsZSh1aW50MzJfdCBNUFVfQ29udHJvbCk7Cit2b2lkIEhBTF9NUFVfRGlzYWJsZSh2b2lkKTsKK3ZvaWQgSEFMX01QVV9Db25maWdSZWdpb24oTVBVX1JlZ2lvbl9Jbml0VHlwZURlZiAqTVBVX0luaXQpOworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKy8qKgorICAqIEB9CisgICovCisgIAorICAvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfUHJpdmF0ZV9NYWNyb3MgQ09SVEVYIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2lmIChfX01QVV9QUkVTRU5UID09IDEpCisjZGVmaW5lIElTX01QVV9SRUdJT05fRU5BQkxFKFNUQVRFKSAoKChTVEFURSkgPT0gTVBVX1JFR0lPTl9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBNUFVfUkVHSU9OX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX01QVV9JTlNUUlVDVElPTl9BQ0NFU1MoU1RBVEUpICgoKFNUQVRFKSA9PSBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gTVBVX0lOU1RSVUNUSU9OX0FDQ0VTU19ESVNBQkxFKSkKKworI2RlZmluZSBJU19NUFVfQUNDRVNTX1NIQVJFQUJMRShTVEFURSkgICAoKChTVEFURSkgPT0gTVBVX0FDQ0VTU19TSEFSRUFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IE1QVV9BQ0NFU1NfTk9UX1NIQVJFQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX0FDQ0VTU19DQUNIRUFCTEUoU1RBVEUpICAgKCgoU1RBVEUpID09IE1QVV9BQ0NFU1NfQ0FDSEVBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUpKQorCisjZGVmaW5lIElTX01QVV9BQ0NFU1NfQlVGRkVSQUJMRShTVEFURSkgICAoKChTVEFURSkgPT0gTVBVX0FDQ0VTU19CVUZGRVJBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFKSkKKworI2RlZmluZSBJU19NUFVfUkVHSU9OX1BFUk1JU1NJT05fQVRUUklCVVRFKFRZUEUpICgoKFRZUEUpID09IE1QVV9SRUdJT05fTk9fQUNDRVNTKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUlcpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9QUklWX1JXX1VSTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IE1QVV9SRUdJT05fRlVMTF9BQ0NFU1MpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUk8pICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9QUklWX1JPX1VSTykpCisKKyNkZWZpbmUgSVNfTVBVX1JFR0lPTl9OVU1CRVIoTlVNQkVSKSAgICAoKChOVU1CRVIpID09IE1QVV9SRUdJT05fTlVNQkVSMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChOVU1CRVIpID09IE1QVV9SRUdJT05fTlVNQkVSMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTlVNQkVSKSA9PSBNUFVfUkVHSU9OX05VTUJFUjUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChOVU1CRVIpID09IE1QVV9SRUdJT05fTlVNQkVSNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI3KSkKKworI2RlZmluZSBJU19NUFVfUkVHSU9OX1NJWkUoU0laRSkgICAgKCgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzI1NkIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNTEyQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xS0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzJLQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNEtCKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV84S0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzE2S0IpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMzJLQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV82NEtCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzEyOEtCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMjU2S0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV81MTJLQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzFNQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMk1CKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV80TUIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzhNQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTZNQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8zMk1CKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzY0TUIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTI4TUIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yNTZNQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzUxMk1CKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMUdCKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yR0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzRHQikpCisKKyNkZWZpbmUgSVNfTVBVX1NVQl9SRUdJT05fRElTQUJMRShTVUJSRUdJT04pICAoKFNVQlJFR0lPTikgPCAodWludDE2X3QpMHgwMEZGVSkKKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovCisgIAorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0hBTF9DT1JURVhfSCAqLworIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9jcmMuaCBiL0luYy9zdG0zMmwweHhfaGFsX2NyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYWYzMjQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9jcmMuaApAQCAtMCwwICsxLDM0NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfY3JjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSQyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9IQUxfQ1JDX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9DUkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSQworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9UeXBlcyBDUkMgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENSQyBIQUwgU3RhdGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfQ1JDX1NUQVRFX1JFU0VUICAgICA9IDB4MDBVLCAgLyohPCBDUkMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAqLworICBIQUxfQ1JDX1NUQVRFX1JFQURZICAgICA9IDB4MDFVLCAgLyohPCBDUkMgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAqLworICBIQUxfQ1JDX1NUQVRFX0JVU1kgICAgICA9IDB4MDJVLCAgLyohPCBDUkMgaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAqLworICBIQUxfQ1JDX1NUQVRFX1RJTUVPVVQgICA9IDB4MDNVLCAgLyohPCBDUkMgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworICBIQUxfQ1JDX1NUQVRFX0VSUk9SICAgICA9IDB4MDRVICAgLyohPCBDUkMgZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLworfSBIQUxfQ1JDX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIENSQyBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OF90IERlZmF1bHRQb2x5bm9taWFsVXNlOyAgICAgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNfRGVmYXVsdF9Qb2x5bm9taWFsIGFuZCBpbmRpY2F0ZXMgaWYgZGVmYXVsdCBwb2x5bm9taWFsIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBERUZBVUxUX1BPTFlOT01JQUxfRU5BQkxFLCByZXNvcnQgdG8gZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYXjMyICsgWF4yNiArIFheMjMgKyBYXjIyICsgWF4xNiArIFheMTIgKyBYXjExICsgWF4xMCArWF44ICsgWF43ICsgWF41ICsgWF40ICsgWF4yKyBYICsxLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGF0IGNhc2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IEdlbmVyYXRpbmdQb2x5bm9taWFsIGZpZWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvdGhlcndpc2Ugc2V0IHRvIERFRkFVTFRfUE9MWU5PTUlBTF9ESVNBQkxFLCBHZW5lcmF0aW5nUG9seW5vbWlhbCBhbmQgQ1JDTGVuZ3RoIGZpZWxkcyBtdXN0IGJlIHNldC4gKi8KKworICB1aW50OF90IERlZmF1bHRJbml0VmFsdWVVc2U7ICAgICAgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNfRGVmYXVsdF9Jbml0VmFsdWVfVXNlIGFuZCBpbmRpY2F0ZXMgaWYgZGVmYXVsdCBpbml0IHZhbHVlIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIERFRkFVTFRfSU5JVF9WQUxVRV9FTkFCTEUsIHJlc29ydCB0byBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRiB2YWx1ZS4gSW4gdGhhdCBjYXNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBJbml0VmFsdWUgZmllbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb3RoZXJ3aXNlIHNldCB0byBERUZBVUxUX0lOSVRfVkFMVUVfRElTQUJMRSwgIEluaXRWYWx1ZSBmaWVsZCBtdXN0IGJlIHNldC4gKi8KKworICB1aW50MzJfdCBHZW5lcmF0aW5nUG9seW5vbWlhbDsgICAgICAvKiE8IFNldCBDUkMgZ2VuZXJhdGluZyBwb2x5bm9taWFsIGFzIGEgNywgOCwgMTYgb3IgMzItYml0IGxvbmcgdmFsdWUgZm9yIGEgcG9seW5vbWlhbCBkZWdyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkgZXF1YWwgdG8gNywgOCwgMTYgb3IgMzIuIFRoaXMgZmllbGQgaXMgd3JpdHRlbiBpbiBub3JtYWwgcmVwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiwgZm9yIGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgNywgWF43ICsgWF42ICsgWF41ICsgWF4yICsgMSBpcyB3cml0dGVuIDB4NjUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbmVlZCB0byBzcGVjaWZ5IGl0IGlmIERlZmF1bHRQb2x5bm9taWFsVXNlIGlzIHNldCB0byBERUZBVUxUX1BPTFlOT01JQUxfRU5BQkxFLiAgICovCisKKyAgdWludDMyX3QgQ1JDTGVuZ3RoOyAgICAgICAgICAgICAgICAgLyohPCBUaGlzIHBhcmFtZXRlciBpcyBhIHZhbHVlIG9mIEByZWYgQ1JDX1BvbHlub21pYWxfU2l6ZXMgYW5kIGluZGljYXRlcyBDUkMgbGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGNhbiBiZSBlaXRoZXIgb25lIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19QT0xZTEVOR1RIXzMyQiAgICAgICAgICAgICAgICAgICgzMi1iaXQgQ1JDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX1BPTFlMRU5HVEhfMTZCICAgICAgICAgICAgICAgICAgKDE2LWJpdCBDUkMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfUE9MWUxFTkdUSF84QiAgICAgICAgICAgICAgICAgICAoOC1iaXQgQ1JDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX1BPTFlMRU5HVEhfN0IgICAgICAgICAgICAgICAgICAgKDctYml0IENSQykuICovCisKKyAgdWludDMyX3QgSW5pdFZhbHVlOyAgICAgICAgICAgICAgICAgLyohPCBJbml0IHZhbHVlIHRvIGluaXRpYXRlIENSQyBjb21wdXRhdGlvbi4gTm8gbmVlZCB0byBzcGVjaWZ5IGl0IGlmIERlZmF1bHRJbml0VmFsdWVVc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzZXQgdG8gREVGQVVMVF9JTklUX1ZBTFVFX0VOQUJMRS4gICAqLworCisgIHVpbnQzMl90IElucHV0RGF0YUludmVyc2lvbk1vZGU7ICAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ0V4X0lucHV0X0RhdGFfSW52ZXJzaW9uIGFuZCBzcGVjaWZpZXMgaW5wdXQgZGF0YSBpbnZlcnNpb24gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgZWl0aGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9OT05FICAgICAgIG5vIGlucHV0IGRhdGEgaW52ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0JZVEUgICAgICAgYnl0ZS13aXNlIGludmVyc2lvbiwgMHgxQTJCM0M0RCBiZWNvbWVzIDB4NThENDNDQjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fSEFMRldPUkQgICBoYWxmd29yZC13aXNlIGludmVyc2lvbiwgMHgxQTJCM0M0RCBiZWNvbWVzIDB4RDQ1OEIyM0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fV09SRCAgICAgICB3b3JkLXdpc2UgaW52ZXJzaW9uLCAweDFBMkIzQzREIGJlY29tZXMgMHhCMjNDRDQ1OCAqLworCisgIHVpbnQzMl90IE91dHB1dERhdGFJbnZlcnNpb25Nb2RlOyAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ0V4X091dHB1dF9EYXRhX0ludmVyc2lvbiBhbmQgc3BlY2lmaWVzIG91dHB1dCBkYXRhIChpLmUuIENSQykgaW52ZXJzaW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFICAgbm8gQ1JDIGludmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUgICAgQ1JDIDB4MTEyMjMzNDQgaXMgY29udmVydGVkIGludG8gMHgyMkNDNDQ4OCAqLworfSBDUkNfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgQ1JDIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQ1JDX1R5cGVEZWYgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgKi8KKworICBDUkNfSW5pdFR5cGVEZWYgICAgICAgICAgICAgSW5pdDsgICAgICAgIC8qITwgQ1JDIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICBMb2NrOyAgICAgICAgLyohPCBDUkMgTG9ja2luZyBvYmplY3QgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfQ1JDX1N0YXRlVHlwZURlZiAgIFN0YXRlOyAgICAgICAvKiE8IENSQyBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgKi8KKworICB1aW50MzJfdCBJbnB1dERhdGFGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ19JbnB1dF9CdWZmZXJfRm9ybWF0IGFuZCBzcGVjaWZpZXMgaW5wdXQgZGF0YSBmb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfRk9STUFUX0JZVEVTICAgICAgIGlucHV0IGRhdGEgaXMgYSBzdHJlYW0gb2YgYnl0ZXMgKDgtYml0IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfSU5QVVREQVRBX0ZPUk1BVF9IQUxGV09SRFMgICBpbnB1dCBkYXRhIGlzIGEgc3RyZWFtIG9mIGhhbGYtd29yZHMgKDE2LWJpdCBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9GT1JNQVRfV09SRFMgICAgICAgaW5wdXQgZGF0YSBpcyBhIHN0cmVhbSBvZiB3b3JkcyAoMzItYml0IGRhdGEpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgY29uc3RhbnQgQ1JDX0lOUFVUX0ZPUk1BVF9VTkRFRklORUQgaXMgZGVmaW5lZCBidXQgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IG9jY3VyIGlmIElucHV0QnVmZmVyRm9ybWF0IGlzIG5vdCBvbmUgb2YgdGhlIHRocmVlIHZhbHVlcyBsaXN0ZWQgYWJvdmUgICovCit9IENSQ19IYW5kbGVUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0NvbnN0YW50cyBDUkMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfRGVmYXVsdF9Qb2x5bm9taWFsX1ZhbHVlICAgIERlZmF1bHQgQ1JDIGdlbmVyYXRpbmcgcG9seW5vbWlhbAorICAqIEB7CisgICovCisjZGVmaW5lIERFRkFVTFRfQ1JDMzJfUE9MWSAgICAgIDB4MDRDMTFEQjdVICAvKiE8ICBYXjMyICsgWF4yNiArIFheMjMgKyBYXjIyICsgWF4xNiArIFheMTIgKyBYXjExICsgWF4xMCArWF44ICsgWF43ICsgWF41ICsgWF40ICsgWF4yKyBYICsxICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19EZWZhdWx0X0luaXRWYWx1ZSAgICBEZWZhdWx0IENSQyBjb21wdXRhdGlvbiBpbml0aWFsaXphdGlvbiB2YWx1ZQorICAqIEB7CisgICovCisjZGVmaW5lIERFRkFVTFRfQ1JDX0lOSVRWQUxVRSAgIDB4RkZGRkZGRkZVICAvKiE8IEluaXRpYWwgQ1JDIGRlZmF1bHQgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0RlZmF1bHRfUG9seW5vbWlhbCAgICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZGVmYXVsdCBwb2x5bm9taWFsIGlzIHVzZWQKKyAgKiBAeworICAqLworI2RlZmluZSBERUZBVUxUX1BPTFlOT01JQUxfRU5BQkxFICAgICAgICgodWludDhfdCkweDAwVSkgIC8qITwgRW5hYmxlIGRlZmF1bHQgZ2VuZXJhdGluZyBwb2x5bm9taWFsIDB4MDRDMTFEQjcgICovCisjZGVmaW5lIERFRkFVTFRfUE9MWU5PTUlBTF9ESVNBQkxFICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyohPCBEaXNhYmxlIGRlZmF1bHQgZ2VuZXJhdGluZyBwb2x5bm9taWFsIDB4MDRDMTFEQjcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0RlZmF1bHRfSW5pdFZhbHVlX1VzZSAgICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZGVmYXVsdCBpbml0IHZhbHVlIGlzIHVzZWQKKyAgKiBAeworICAqLworI2RlZmluZSBERUZBVUxUX0lOSVRfVkFMVUVfRU5BQkxFICAgICAgKCh1aW50OF90KTB4MDBVKSAvKiE8IEVuYWJsZSBpbml0aWFsIENSQyBkZWZhdWx0IHZhbHVlICAqLworI2RlZmluZSBERUZBVUxUX0lOSVRfVkFMVUVfRElTQUJMRSAgICAgKCh1aW50OF90KTB4MDFVKSAvKiE8IERpc2FibGUgaW5pdGlhbCBDUkMgZGVmYXVsdCB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfUG9seW5vbWlhbF9TaXplcyBQb2x5bm9taWFsIHNpemVzIHRvIGNvbmZpZ3VyZSB0aGUgcGVyaXBoZXJhbAorICAqIEB7CisgICovCisjZGVmaW5lIENSQ19QT0xZTEVOR1RIXzMyQiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IFJlc29ydCB0byBhIDMyLWJpdCBsb25nIGdlbmVyYXRpbmcgcG9seW5vbWlhbCAqLworI2RlZmluZSBDUkNfUE9MWUxFTkdUSF8xNkIgICAgICAgICAgICAgICAgICBDUkNfQ1JfUE9MWVNJWkVfMCAgLyohPCBSZXNvcnQgdG8gYSAxNi1iaXQgbG9uZyBnZW5lcmF0aW5nIHBvbHlub21pYWwgKi8KKyNkZWZpbmUgQ1JDX1BPTFlMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAgQ1JDX0NSX1BPTFlTSVpFXzEgIC8qITwgUmVzb3J0IHRvIGEgOC1iaXQgbG9uZyBnZW5lcmF0aW5nIHBvbHlub21pYWwgICovCisjZGVmaW5lIENSQ19QT0xZTEVOR1RIXzdCICAgICAgICAgICAgICAgICAgIENSQ19DUl9QT0xZU0laRSAgICAvKiE8IFJlc29ydCB0byBhIDctYml0IGxvbmcgZ2VuZXJhdGluZyBwb2x5bm9taWFsICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfUG9seW5vbWlhbF9TaXplX0RlZmluaXRpb25zIENSQyBwb2x5bm9taWFsIHBvc3NpYmxlIHNpemVzIGFjdHVhbCBkZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9DUkNfTEVOR1RIXzMyQiAgICAgMzJVICAgICAgICAgIC8qITwgMzItYml0IGxvbmcgQ1JDICovCisjZGVmaW5lIEhBTF9DUkNfTEVOR1RIXzE2QiAgICAgMTZVICAgICAgICAgIC8qITwgMTYtYml0IGxvbmcgQ1JDICovCisjZGVmaW5lIEhBTF9DUkNfTEVOR1RIXzhCICAgICAgIDhVICAgICAgICAgIC8qITwgOC1iaXQgbG9uZyBDUkMgICovCisjZGVmaW5lIEhBTF9DUkNfTEVOR1RIXzdCICAgICAgIDdVICAgICAgICAgIC8qITwgNy1iaXQgbG9uZyBDUkMgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19JbnB1dF9CdWZmZXJfRm9ybWF0IElucHV0IEJ1ZmZlciBGb3JtYXQKKyAgKiBAeworICAqLworLyogV0FSTklORzogQ1JDX0lOUFVUX0ZPUk1BVF9VTkRFRklORUQgaXMgY3JlYXRlZCBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzIGJ1dAorICogYW4gZXJyb3IgaXMgdHJpZ2dlcmVkIGluIEhBTF9DUkNfSW5pdCgpIGlmIElucHV0RGF0YUZvcm1hdCBmaWVsZCBpcyBzZXQKKyAqIHRvIENSQ19JTlBVVF9GT1JNQVRfVU5ERUZJTkVEOiB0aGUgZm9ybWF0IE1VU1QgYmUgZGVmaW5lZCBieSB0aGUgdXNlciBmb3IKKyAqIHRoZSBDUkMgQVBJcyB0byBwcm92aWRlIGEgY29ycmVjdCByZXN1bHQgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9GT1JNQVRfVU5ERUZJTkVEICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiE8IFVuZGVmaW5lZCBpbnB1dCBkYXRhIGZvcm1hdCAgICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgIC8qITwgSW5wdXQgZGF0YSBpbiBieXRlIGZvcm1hdCAgICAgICovCisjZGVmaW5lIENSQ19JTlBVVERBVEFfRk9STUFUX0hBTEZXT1JEUyAgICAgICAgICAgICAweDAwMDAwMDAyVSAgLyohPCBJbnB1dCBkYXRhIGluIGhhbGYtd29yZCBmb3JtYXQgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9GT1JNQVRfV09SRFMgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDNVICAvKiE8IElucHV0IGRhdGEgaW4gd29yZCBmb3JtYXQgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfQWxpYXNlcyBDUkMgQVBJIGFsaWFzZXMKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ1JDX0lucHV0X0RhdGFfUmV2ZXJzZSAgIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UgICAgLyohPCBBbGlhc2VkIHRvIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UgZm9yIGludGVyIFNUTTMyIHNlcmllcyBjb21wYXRpYmlsaXR5ICAqLworI2RlZmluZSBIQUxfQ1JDX091dHB1dF9EYXRhX1JldmVyc2UgIEhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlICAgLyohPCBBbGlhc2VkIHRvIEhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlIGZvciBpbnRlciBTVE0zMiBzZXJpZXMgY29tcGF0aWJpbGl0eSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX01hY3JvcyBDUkMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBDUkMgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDUkMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUkNfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0NSQ19TVEFURV9SRVNFVCkKKworLyoqCisgICogQGJyaWVmICBSZXNldCBDUkMgRGF0YSBSZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUkNfRFJfUkVTRVQoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IENSQ19DUl9SRVNFVCkKKworLyoqCisgICogQGJyaWVmICBTZXQgQ1JDIElOSVQgbm9uLWRlZmF1bHQgdmFsdWUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTklUX18gMzItYml0IGluaXRpYWwgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JDX0lOSVRJQUxDUkNWQUxVRV9DT05GSUcoX19IQU5ETEVfXywgX19JTklUX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JTklUID0gKF9fSU5JVF9fKSkKKworLyoqCisgICogQGJyaWVmIFN0b3JlIGRhdGEgaW4gdGhlIEluZGVwZW5kZW50IERhdGEgKElEKSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBDUkMgaGFuZGxlCisgICogQHBhcmFtIF9fVkFMVUVfXyAgVmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZSBJRCByZWdpc3RlcgorICAqIEBub3RlICBSZWZlciB0byB0aGUgUmVmZXJlbmNlIE1hbnVhbCB0byBnZXQgdGhlIGF1dGhvcml6ZWQgX19WQUxVRV9fIGxlbmd0aCBpbiBiaXRzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSQ19TRVRfSURSKF9fSEFORExFX18sIF9fVkFMVUVfXykgKFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRFIsIChfX1ZBTFVFX18pKSkKKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIEluZGVwZW5kZW50IERhdGEgKElEKSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBDUkMgaGFuZGxlCisgICogQG5vdGUgIFJlZmVyIHRvIHRoZSBSZWZlcmVuY2UgTWFudWFsIHRvIGdldCB0aGUgYXV0aG9yaXplZCBfX1ZBTFVFX18gbGVuZ3RoIGluIGJpdHMKKyAgKiBAcmV0dmFsIFZhbHVlIG9mIHRoZSBJRCByZWdpc3RlcgorICAqLworI2RlZmluZSBfX0hBTF9DUkNfR0VUX0lEUihfX0hBTkRMRV9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklEUikgJiBDUkNfSURSX0lEUikKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCAgQ1JDX1ByaXZhdGVfTWFjcm9zIENSQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfREVGQVVMVF9QT0xZTk9NSUFMKERFRkFVTFQpICgoKERFRkFVTFQpID09IERFRkFVTFRfUE9MWU5PTUlBTF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERFRkFVTFQpID09IERFRkFVTFRfUE9MWU5PTUlBTF9ESVNBQkxFKSkKKworCisjZGVmaW5lIElTX0RFRkFVTFRfSU5JVF9WQUxVRShWQUxVRSkgICgoKFZBTFVFKSA9PSBERUZBVUxUX0lOSVRfVkFMVUVfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBERUZBVUxUX0lOSVRfVkFMVUVfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfQ1JDX1BPTF9MRU5HVEgoTEVOR1RIKSAgICAgKCgoTEVOR1RIKSA9PSBDUkNfUE9MWUxFTkdUSF8zMkIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBDUkNfUE9MWUxFTkdUSF8xNkIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBDUkNfUE9MWUxFTkdUSF84QikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBDUkNfUE9MWUxFTkdUSF83QikpCisKKyNkZWZpbmUgSVNfQ1JDX0lOUFVUREFUQV9GT1JNQVQoRk9STUFUKSAgICAgICAgICAgKCgoRk9STUFUKSA9PSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9IQUxGV09SRFMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9XT1JEUykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgQ1JDIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2NyY19leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zIENSQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNfSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDX0RlSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7Cit2b2lkIEhBTF9DUkNfTXNwSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7Cit2b2lkIEhBTF9DUkNfTXNwRGVJbml0KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLwordWludDMyX3QgSEFMX0NSQ19BY2N1bXVsYXRlKENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBwQnVmZmVyW10sIHVpbnQzMl90IEJ1ZmZlckxlbmd0aCk7Cit1aW50MzJfdCBIQUxfQ1JDX0NhbGN1bGF0ZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpOworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX0NSQ19TdGF0ZVR5cGVEZWYgSEFMX0NSQ19HZXRTdGF0ZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9DUkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfY3JjX2V4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF9jcmNfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTgyODg4Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfY3JjX2V4LmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2NyY19leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUkMgSEFMIGV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkwweHhfSEFMX0NSQ19FWF9ICisjZGVmaW5lIFNUTTMyTDB4eF9IQUxfQ1JDX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUkNFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNFeF9FeHBvcnRlZF9Db25zdGFudHMgQ1JDIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfSW5wdXRfRGF0YV9JbnZlcnNpb24gSW5wdXQgRGF0YSBJbnZlcnNpb24gTW9kZXMKKyAgKiBAeworICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9OT05FICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgTm8gaW5wdXQgZGF0YSBpbnZlcnNpb24gICAgICAgICAgICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9CWVRFICAgICAgICAgICAgICAgQ1JDX0NSX1JFVl9JTl8wIC8qITwgQnl0ZS13aXNlIGlucHV0IGRhdGEgaW52ZXJzaW9uICAgICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9IQUxGV09SRCAgICAgICAgICAgQ1JDX0NSX1JFVl9JTl8xIC8qITwgSGFsZldvcmQtd2lzZSBpbnB1dCBkYXRhIGludmVyc2lvbiAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9XT1JEICAgICAgICAgICAgICAgQ1JDX0NSX1JFVl9JTiAgIC8qITwgV29yZC13aXNlIGlucHV0IGRhdGEgaW52ZXJzaW9uICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNFeF9PdXRwdXRfRGF0YV9JbnZlcnNpb24gT3V0cHV0IERhdGEgSW52ZXJzaW9uIE1vZGVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0RJU0FCTEUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IE5vIG91dHB1dCBkYXRhIGludmVyc2lvbiAgICAgICAqLworI2RlZmluZSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFICAgICAgICAgIENSQ19DUl9SRVZfT1VUICAgIC8qITwgQml0LXdpc2Ugb3V0cHV0IGRhdGEgaW52ZXJzaW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNFeF9FeHBvcnRlZF9NYWNyb3MgQ1JDIEV4dGVuZGVkIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IENSQyBvdXRwdXQgcmV2ZXJzYWwKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSAgX19IQUxfQ1JDX09VVFBVVFJFVkVSU0FMX0VOQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gQ1JDX0NSX1JFVl9PVVQpCisKKy8qKgorICAqIEBicmllZiAgVW5zZXQgQ1JDIG91dHB1dCByZXZlcnNhbAorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSQ19PVVRQVVRSRVZFUlNBTF9ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KENSQ19DUl9SRVZfT1VUKSkKKworLyoqCisgICogQGJyaWVmICBTZXQgQ1JDIG5vbi1kZWZhdWx0IHBvbHlub21pYWwKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgX19QT0xZTk9NSUFMX18gNywgOCwgMTYgb3IgMzItYml0IHBvbHlub21pYWwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JDX1BPTFlOT01JQUxfQ09ORklHKF9fSEFORExFX18sIF9fUE9MWU5PTUlBTF9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UE9MID0gKF9fUE9MWU5PTUlBTF9fKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNFeF9Qcml2YXRlX01hY3JvcyBDUkMgRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0NSQ19JTlBVVERBVEFfSU5WRVJTSU9OX01PREUoTU9ERSkgICAgICgoKE1PREUpID09IENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX05PTkUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0JZVEUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0hBTEZXT1JEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX1dPUkQpKQorCisjZGVmaW5lIElTX0NSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9NT0RFKE1PREUpICAgICgoKE1PREUpID09IENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQ1JDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9Qb2x5bm9taWFsX1NldChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgUG9sLCB1aW50MzJfdCBQb2x5TGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IElucHV0UmV2ZXJzZU1vZGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ0V4X091dHB1dF9EYXRhX1JldmVyc2UoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IE91dHB1dFJldmVyc2VNb2RlKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfQ1JDX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2NyeXAuaCBiL0luYy9zdG0zMmwweHhfaGFsX2NyeXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTU1YmE2Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfY3J5cC5oCkBAIC0wLDAgKzEsNDExIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9jcnlwLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSWVAgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfQ1JZUF9ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9DUllQX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKyAgIAorI2lmIGRlZmluZWQgKFNUTTMyTDAyMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSWVAgQ1JZUAorICAqIEB7CisgICovIAorCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX1R5cGVzIENSWVAgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogCisgICogQGJyaWVmICBDUllQIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sgIAorICB1aW50MzJfdCBEYXRhVHlwZTsgICAgLyohPCAzMi1iaXQgZGF0YSwgMTYtYml0IGRhdGEsIDgtYml0IGRhdGEgb3IgMS1iaXQgc3RyaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENSWVBfRGF0YV9UeXBlICovCisgIAorICB1aW50OF90KiBwS2V5OyAgICAgICAgLyohPCBUaGUga2V5IHVzZWQgZm9yIGVuY3J5cHRpb24vZGVjcnlwdGlvbiAqLworICAKKyAgdWludDhfdCogcEluaXRWZWN0OyAgIC8qITwgVGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciB1c2VkIGFsc28gYXMgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlciBpbiBDVFIgbW9kZSAqLworICAKK31DUllQX0luaXRUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmIEhBTCBDUllQIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbiAgCisgICovIAordHlwZWRlZiBlbnVtCit7CisgIEhBTF9DUllQX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAvKiE8IENSWVAgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8KKyAgSEFMX0NSWVBfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgIC8qITwgQ1JZUCBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAqLworICBIQUxfQ1JZUF9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MDJVLCAgLyohPCBDUllQIGludGVybmFsIHByb2Nlc3NpbmcgaXMgb25nb2luZyAgICovCisgIEhBTF9DUllQX1NUQVRFX1RJTUVPVVQgICAgICAgICAgID0gMHgwM1UsICAvKiE8IENSWVAgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NSWVBfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweDA0VSAgIC8qITwgQ1JZUCBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAqLyAKKyAgICAKK31IQUxfQ1JZUF9TVEFURVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgSEFMIENSWVAgcGhhc2Ugc3RydWN0dXJlcyBkZWZpbml0aW9uICAKKyAgKi8gCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0NSWVBfUEhBU0VfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgcmVhZHkgZm9yIGluaXRpYWxpemF0aW9uLiAqLworICBIQUxfQ1JZUF9QSEFTRV9QUk9DRVNTICAgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBwcm9jZXNzaW5nIHBoYXNlICovCit9SEFMX1BoYXNlVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgQ1JZUCBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLyAKK3R5cGVkZWYgc3RydWN0Cit7CisgIEFFU19UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgKi8KKworICBDUllQX0luaXRUeXBlRGVmICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgLyohPCBDUllQIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgKnBDcnlwSW5CdWZmUHRyOyAgLyohPCBQb2ludGVyIHRvIENSWVAgcHJvY2Vzc2luZyAoZW5jcnlwdGlvbiwgZGVjcnlwdGlvbiwuLi4pIGJ1ZmZlciAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAqcENyeXBPdXRCdWZmUHRyOyAvKiE8IFBvaW50ZXIgdG8gQ1JZUCBwcm9jZXNzaW5nIChlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLC4uLikgYnVmZmVyICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgIENyeXBJbkNvdW50OyAgICAgIC8qITwgQ291bnRlciBvZiBpbnB1dGVkIGRhdGEgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgQ3J5cE91dENvdW50OyAgICAgLyohPCBDb3VudGVyIG9mIG91dHB1dGVkIGRhdGEgKi8KKworICBIQUxfU3RhdHVzVHlwZURlZiAgICAgICAgICAgU3RhdHVzOyAgICAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgc3RhdHVzICovCisKKyAgSEFMX1BoYXNlVHlwZURlZiAgICAgICAgICAgIFBoYXNlOyAgICAgICAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIHBoYXNlICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICpoZG1haW47ICAgICAgICAgIC8qITwgQ1JZUCBJbiBETUEgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgKmhkbWFvdXQ7ICAgICAgICAgLyohPCBDUllQIE91dCBETUEgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgTG9jazsgICAgICAgICAgICAgLyohPCBDUllQIGxvY2tpbmcgb2JqZWN0ICovCisKKyAgX19JTyAgSEFMX0NSWVBfU1RBVEVUeXBlRGVmIFN0YXRlOyAgICAgICAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisKK31DUllQX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9Db25zdGFudHMgQ1JZUCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSWVBfRGF0YV9UeXBlIENSWVAgRGF0YSBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ1JZUF9EQVRBVFlQRV8zMkIgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBDUllQX0RBVEFUWVBFXzE2QiAgICAgICAgIEFFU19DUl9EQVRBVFlQRV8wCisjZGVmaW5lIENSWVBfREFUQVRZUEVfOEIgICAgICAgICAgQUVTX0NSX0RBVEFUWVBFXzEKKyNkZWZpbmUgQ1JZUF9EQVRBVFlQRV8xQiAgICAgICAgICBBRVNfQ1JfREFUQVRZUEUKKworI2RlZmluZSBJU19DUllQX0RBVEFUWVBFKERBVEFUWVBFKSAoKChEQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfMTZCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzhCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV8xQikpICAKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9BbGdvTW9kZURpcmVjdGlvbiBDUllQIEFsZ28gTW9kZSBEaXJlY3Rpb24KKyAgKiBAeworICAqLyAKKyNkZWZpbmUgQ1JZUF9DUl9BTEdPTU9ERV9ESVJFQ1RJT04gICAgICAgICAgICAgICh1aW50MzJfdCkoQUVTX0NSX01PREV8QUVTX0NSX0NITU9EKQorCisjZGVmaW5lIENSWVBfQ1JfQUxHT01PREVfQUVTX0VDQl9FTkNSWVBUICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBDUllQX0NSX0FMR09NT0RFX0FFU19FQ0JfS0VZREVSREVDUllQVCAgKEFFU19DUl9NT0RFKQorI2RlZmluZSBDUllQX0NSX0FMR09NT0RFX0FFU19DQkNfRU5DUllQVCAgICAgICAgKEFFU19DUl9DSE1PRF8wKQorI2RlZmluZSBDUllQX0NSX0FMR09NT0RFX0FFU19DQkNfS0VZREVSREVDUllQVCAgKCh1aW50MzJfdCkoQUVTX0NSX0NITU9EXzB8QUVTX0NSX01PREUpKQorI2RlZmluZSBDUllQX0NSX0FMR09NT0RFX0FFU19DVFJfRU5DUllQVCAgICAgICAgKEFFU19DUl9DSE1PRF8xKQorI2RlZmluZSBDUllQX0NSX0FMR09NT0RFX0FFU19DVFJfREVDUllQVCAgICAgICAgKCh1aW50MzJfdCkoQUVTX0NSX0NITU9EXzEgfCBBRVNfQ1JfTU9ERV8xKSkKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBDUllQX0FFU19JbnRlcnJ1cHRzIEFFUyBJbnRlcnJ1cHRzCisgICogQHsKKyAgKi8gCisjZGVmaW5lIENSWVBfSVRfQ0MgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9DQ0lFICAvKiE8IENvbXB1dGF0aW9uIENvbXBsZXRlIGludGVycnVwdCAqLworI2RlZmluZSBDUllQX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfRVJSSUUgLyohPCBFcnJvciBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIENSWVBfQUVTX0ZsYWdzIEFFUyBGbGFncworICAqIEB7CisgICovIAorI2RlZmluZSBDUllQX0ZMQUdfQ0NGICAgICAgICAgICAgICAgICAgICAgICBBRVNfU1JfQ0NGICAgIC8qITwgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyAqLworI2RlZmluZSBDUllQX0ZMQUdfUkRFUlIgICAgICAgICAgICAgICAgICAgICBBRVNfU1JfUkRFUlIgIC8qITwgUmVhZCBFcnJvciBGbGFnICAgICAgICAgICAqLworI2RlZmluZSBDUllQX0ZMQUdfV1JFUlIgICAgICAgICAgICAgICAgICAgICBBRVNfU1JfV1JFUlIgIC8qITwgV3JpdGUgRXJyb3IgRmxhZyAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBDUllQX0FFU19DbGVhcl9GbGFncyBBRVMgQ2xlYXIgRmxhZ3MKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgQ1JZUF9DTEVBUkZMQUdfQ0NGICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfQ0NGQyAgIC8qITwgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyBDbGVhciAqLworI2RlZmluZSBDUllQX0NMRUFSRkxBR19SREVSUiAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9FUlJDICAgLyohPCBSZWFkIEVycm9yIENsZWFyICAgICAgICAgICAqLworI2RlZmluZSBDUllQX0NMRUFSRkxBR19XUkVSUiAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9FUlJDICAgLyohPCBXcml0ZSBFcnJvciBDbGVhciAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX01hY3JvcyBDUllQIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgUmVzZXQgQ1JZUCBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JZUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUvRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUllQX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfRU4pCisjZGVmaW5lIF9fSEFMX0NSWVBfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgQUVTX0NSX0VOKQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgYWxnb3JpdGhtIG1vZGU6IEFFUy1FQ0IsIEFFUy1DQkMsIEFFUy1DVFIsIERFUy1FQ0IsIERFUy1DQkMsLi4uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ1JZUCBoYW5kbGUuCisgICogQHBhcmFtICBfX01PREVfXyBUaGUgYWxnb3JpdGhtIG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSWVBfU0VUX01PREUoX19IQU5ETEVfXyxfX01PREVfXykgICAgICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgKF9fTU9ERV9fKSkKKworCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ1JZUCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ1JZUCBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfQ0NGICAgOiBDb21wdXRhdGlvbiBDb21wbGV0ZSBGbGFnCisgICogICAgICAgICAgICBAYXJnIENSWVBfRkxBR19SREVSUiA6IFJlYWQgRXJyb3IgRmxhZworICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfV1JFUlIgOiBXcml0ZSBFcnJvciBGbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JZUF9HRVRfRkxBRyhfX0hBTkRMRV9fLF9fRkxBR19fKSAgICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgQ1JZUCBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ1JZUCBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBDUllQX0NMRUFSRkxBR19DQ0YgICA6IENvbXB1dGF0aW9uIENvbXBsZXRlIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9DTEVBUkZMQUdfUkRFUlIgOiBSZWFkIEVycm9yIENsZWFyCisgICogICAgICAgICAgICBAYXJnIENSWVBfQ0xFQVJGTEFHX1dSRVJSIDogV3JpdGUgRXJyb3IgQ2xlYXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDUllQIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gQ1JZUCBJbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSWVBfRU5BQkxFX0lUKF9fSEFORExFX18sX19JTlRFUlJVUFRfXykgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ1JZUCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ1JZUCBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIENSWVAgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUllQX0RJU0FCTEVfSVQoX19IQU5ETEVfXyxfX0lOVEVSUlVQVF9fKSAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIENSWVAgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIENSWVAgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjaworICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9JVF9DQyAgIDogQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIENSWVBfSVRfRVJSIDogRXJyb3IgaW50ZXJydXB0ICh1c2VkIGZvciBSREVSUiBhbmQgV1JFUlIpCisgICogQHJldHZhbCBTdGF0ZSBvZiBpbnRlcnJ1cHRpb24gKFNFVCBvciBSRVNFVCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JZUF9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKKyAgICAoKCAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSAgICAgICBcCisgICAgICk/IFNFVCA6IFJFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKQorICAgICAgICAgCisvKiogQGJyaWVmICBDbGVhciB0aGUgQ1JZUCBwZW5kaW5nIElULgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JVF9fIHNwZWNpZmllcyB0aGUgSVQgdG8gY2xlYXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBDUllQX0NMRUFSRkxBR19DQ0YgICA6IENvbXB1dGF0aW9uIENvbXBsZXRlIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9DTEVBUkZMQUdfUkRFUlIgOiBSZWFkIEVycm9yIENsZWFyCisgICogICAgICAgICAgICBAYXJnIENSWVBfQ0xFQVJGTEFHX1dSRVJSIDogV3JpdGUgRXJyb3IgQ2xlYXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JZUF9DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lUX18pIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIChfX0lUX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIENSWVAgSEFMIEV4dGVuc2lvbiBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2NyeXBfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUllQIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9DUllQX0luaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0NSWVBfRGVJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworCisvKiBNU1AgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9DUllQX01zcEluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX0NSWVBfTXNwRGVJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEFFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gdXNpbmcgcG9sbGluZyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0NSWVBfQUVTRUNCX0VuY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9DUllQX0FFU0VDQl9EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfQ1JZUF9BRVNDQkNfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0NSWVBfQUVTQ0JDX0RlY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9DUllQX0FFU0NUUl9FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBQbGFpbkRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfQ1JZUF9BRVNDVFJfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDMyX3QgVGltZW91dCk7CisKKy8qIEFFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gdXNpbmcgaW50ZXJydXB0ICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0NSWVBfQUVTRUNCX0VuY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcEN5cGhlckRhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9DUllQX0FFU0NCQ19FbmNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBQbGFpbkRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfQ1JZUF9BRVNDVFJfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0NSWVBfQUVTRUNCX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9DUllQX0FFU0NUUl9EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwUGxhaW5EYXRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfQ1JZUF9BRVNDQkNfRGVjcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcFBsYWluRGF0YSk7CisKKy8qIEFFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gdXNpbmcgRE1BICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0NSWVBfQUVTRUNCX0VuY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBQbGFpbkRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfQ1JZUF9BRVNFQ0JfRGVjcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9DUllQX0FFU0NCQ19FbmNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0NSWVBfQUVTQ0JDX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwUGxhaW5EYXRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfQ1JZUF9BRVNDVFJfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcEN5cGhlckRhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9DUllQX0FFU0NUUl9EZWNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcFBsYWluRGF0YSk7CisKKy8qKgorICAqIEB9CisgICovIAorCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIERNQSBjYWxsYmFjayBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBDYWxsQmFjayBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3ZvaWQgICAgICAgICAgICAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgQ1JZUCBJUlEgaGFuZGxlcgorICAqIEB7CisgICovCisKKy8qIFByb2Nlc3NpbmcgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgICAgICBIQUxfQ1JZUF9JUlFIYW5kbGVyKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfQ1JZUF9TVEFURVR5cGVEZWYgSEFMX0NSWVBfR2V0U3RhdGUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLyAKKworLyogRGVmaW5lIHRoZSBwcml2YXRlIGdyb3VwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBDUllQX1ByaXZhdGUgQ1JZUCBQcml2YXRlCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorICAKKyNlbmRpZiAvKiBTVE0zMkwwMjF4eCB8fCBTVE0zMkwwNDF4eCB8fCBTVE0zMkwwNjF4eCB8fCBTVE0zMkwwNjJ4eCB8fCBTVE0zMkwwNjN4eCB8fCBTVE0zMkwwODF4eCB8fCBTVE0zMkwwODJ4eCB8fCBTVE0zMkwwODN4eCAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0hBTF9DUllQX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfY3J5cF9leC5oIGIvSW5jL3N0bTMybDB4eF9oYWxfY3J5cF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZGMyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9jcnlwX2V4LmgKQEAgLTAsMCArMSw4MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfY3J5cF9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUllQRXggSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfQ1JZUF9FWF9ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9DUllQX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKyAgIAorI2lmIGRlZmluZWQgKFNUTTMyTDAyMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjN4eCkgfHwgKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQRXggQ1JZUEV4CisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBDUllQRXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBDYWxsQmFjayBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfQ1JZUEV4X0NvbXB1dGF0aW9uQ3BsdENhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorICAKKyNlbmRpZiAvKiBTVE0zMkwwMjF4eCB8fCBTVE0zMkwwNDF4eCB8fCBTVE0zMkwwNjF4eCB8fCBTVE0zMkwwNjJ4eCB8fCBTVE0zMkwwNjN4eCB8fCBTVE0zMkwwODF4eCB8fCBTVE0zMkwwODJ4eCB8fCBTVE0zMkwwODN4eCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfSEFMX0NSWVBfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9kYWMuaCBiL0luYy9zdG0zMmwweHhfaGFsX2RhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTUwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9kYWMuaApAQCAtMCwwICsxLDQ4NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfZGFjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIERBQyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9EQUNfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfREFDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKyAgIAorI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4QikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDIxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwMzF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDA0MXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDUxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwNjF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDA3MXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDgxeHgpCisgICAKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUMgREFDCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfVHlwZXMgREFDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIAorICAqIEBicmllZiAgSEFMIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbiAgCisgICovIAordHlwZWRlZiBlbnVtCit7CisgIEhBTF9EQUNfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgREFDIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCisgIEhBTF9EQUNfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgIC8qITwgREFDIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9EQUNfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgIC8qITwgREFDIGludGVybmFsIHByb2Nlc3NpbmcgaXMgb25nb2luZyAgICovCisgIEhBTF9EQUNfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgIC8qITwgREFDIHRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9EQUNfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweDA0VSAgIC8qITwgREFDIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICovCisgCit9SEFMX0RBQ19TdGF0ZVR5cGVEZWY7CisgCisvKiogCisgICogQGJyaWVmICBEQUMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8gCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19EQUNfSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0IERBQ19IYW5kbGVUeXBlRGVmCisjZW5kaWYKK3sKKyAgREFDX1R5cGVEZWYgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfREFDX1N0YXRlVHlwZURlZiAgIFN0YXRlOyAgICAgICAgIC8qITwgREFDIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgIExvY2s7ICAgICAgICAgIC8qITwgREFDIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICpETUFfSGFuZGxlMTsgIC8qITwgUG9pbnRlciBETUEgaGFuZGxlciBmb3IgY2hhbm5lbCAxICovCisKKyNpZiBkZWZpbmVkIChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICpETUFfSGFuZGxlMjsgIC8qITwgUG9pbnRlciBETUEgaGFuZGxlciBmb3IgY2hhbm5lbCAyICovIAorI2VuZGlmCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgIC8qITwgREFDIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIChVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBDb252Q3BsdENhbGxiYWNrQ2gxKSAgICAgICAgICAgIChzdHJ1Y3QgX19EQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisgIHZvaWQgKCogQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDEpICAgICAgICAoc3RydWN0IF9fREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOworICB2b2lkICgqIEVycm9yQ2FsbGJhY2tDaDEpICAgICAgICAgICAgICAgKHN0cnVjdCBfX0RBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKKyAgdm9pZCAoKiBETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKSAgICAgICAgIChzdHJ1Y3QgX19EQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisgIHZvaWQgKCogQ29udkNwbHRDYWxsYmFja0NoMikgICAgICAgICAgICAoc3RydWN0IF9fREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpOworICB2b2lkICgqIENvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKSAgICAgICAgKHN0cnVjdCBfX0RBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKTsKKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrQ2gyKSAgICAgICAgICAgICAgIChzdHJ1Y3QgX19EQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7CisgIHZvaWQgKCogRE1BVW5kZXJydW5DYWxsYmFja0NoMikgICAgICAgICAoc3RydWN0IF9fREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpOyAKKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykgICAgICAgICAgICAgICAgKHN0cnVjdCBfX0RBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjayApICAgICAgICAgICAgIChzdHJ1Y3QgX19EQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7IAorI2VuZGlmIC8qIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKKworfURBQ19IYW5kbGVUeXBlRGVmOworCisvKiogCisgICogQGJyaWVmICAgREFDIENvbmZpZ3VyYXRpb24gcmVndWxhciBDaGFubmVsIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBEQUNfVHJpZ2dlcjsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVybmFsIHRyaWdnZXIgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfdHJpZ2dlcl9zZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBEQUNfT3V0cHV0QnVmZmVyOyAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgREFDIGNoYW5uZWwgb3V0cHV0IGJ1ZmZlciBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19vdXRwdXRfYnVmZmVyICovCisKK31EQUNfQ2hhbm5lbENvbmZUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgREFDIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfREFDX0NIMV9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgREFDIENIMSBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICovCisgIEhBTF9EQUNfQ0gxX0hBTEZfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICA9IDB4MDFVLCAgLyohPCBEQUMgQ0gxIGhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgKi8KKyAgSEFMX0RBQ19DSDFfRVJST1JfSUQgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMlUsICAvKiE8IERBQyBDSDEgZXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAqLworICBIQUxfREFDX0NIMV9VTkRFUlJVTl9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDAzVSwgIC8qITwgREFDIENIMSB1bmRlcnJ1biBDYWxsYmFjayBJRCAgICAgICovCisgIEhBTF9EQUNfQ0gyX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDRVLCAgLyohPCBEQUMgQ0gyIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX0RBQ19DSDJfSEFMRl9DT01QTEVURV9DQl9JRCAgICAgICAgICAgID0gMHgwNVUsICAvKiE8IERBQyBDSDIgaGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRCAqLworICBIQUxfREFDX0NIMl9FUlJPUl9JRCAgICAgICAgICAgICAgICAgICAgICAgPSAweDA2VSwgIC8qITwgREFDIENIMiBlcnJvciBDYWxsYmFjayBJRCAgICAgICAgICovCisgIEhBTF9EQUNfQ0gyX1VOREVSUlVOX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDdVLCAgLyohPCBEQUMgQ0gyIHVuZGVycnVuIENhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX0RBQ19NU1BfSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgICAgID0gMHgwOFUsICAvKiE8IERBQyBNc3BJbml0IENhbGxiYWNrIElEICAgICAgICAgICAqLworICBIQUxfREFDX01TUF9ERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA5VSwgIC8qITwgREFDIE1zcERlSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICovCisgIEhBTF9EQUNfQUxMX0NCX0lEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEFVICAgLyohPCBEQUMgQWxsIElEICAgICAgICAgICAgICAgICAgICAgICAgKi8KK31IQUxfREFDX0NhbGxiYWNrSURUeXBlRGVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKgorICAqIEBicmllZiAgSEFMIERBQyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgdm9pZCAoKnBEQUNfQ2FsbGJhY2tUeXBlRGVmKShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX0NvbnN0YW50cyBEQUMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8gIAorCisvKiogQGRlZmdyb3VwIERBQ19FcnJvcl9Db2RlIERBQyBFcnJvciBDb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIEhBTF9EQUNfRVJST1JfTk9ORSAgICAgICAgICAgICAgMHgwMFUgICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEhBTF9EQUNfRVJST1JfRE1BVU5ERVJSVU5DSDEgICAgMHgwMVUgICAgLyohPCBEQUMgY2hhbm5lbDEgRE1BIHVuZGVycnVuIGVycm9yICAgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKyNkZWZpbmUgIEhBTF9EQUNfRVJST1JfRE1BVU5ERVJSVU5DSDIgICAgMHgwMlUgICAgLyohPCBEQUMgY2hhbm5lbDIgRE1BIHVuZGVycnVuIGVycm9yICAgKi8KKyNlbmRpZgorI2RlZmluZSAgSEFMX0RBQ19FUlJPUl9ETUEgICAgICAgICAgICAgICAweDA0VSAgICAvKiE8IERNQSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIChVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX0RBQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAgMHgxMFUgICAgLyohPCBJbnZhbGlkIGNhbGxiYWNrIGVycm9yICAgICAgICAgICAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfdHJpZ2dlcl9zZWxlY3Rpb24gREFDIHRyaWdnZXIgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfTk9ORSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IENvbnZlcnNpb24gaXMgYXV0b21hdGljIG9uY2UgdGhlIERBQzFfREhSeHh4eCByZWdpc3RlciBoYXMgYmVlbiBsb2FkZWQsIGFuZCBub3QgYnkgZXh0ZXJuYWwgdHJpZ2dlciAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UNl9UUkdPICAgICgodWludDMyX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9URU4xKSAgLyohPCBUSU02IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UMjFfVFJHTyAgICgodWludDMyX3QpKCAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVFNFTDFfMCB8IERBQ19DUl9URU4xKSkgLyohPCBUSU0yMSBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDJfVFJHTyAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfVEVOMSkpIC8qITwgVElNMiBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfRVhUX0lUOSAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMiB8IERBQ19DUl9UU0VMMV8xIHwgICAgICAgICAgICAgICAgICBEQUNfQ1JfVEVOMSkpIC8qITwgRVhUSSBMaW5lOSBldmVudCBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX1NPRlRXQVJFICAgKCh1aW50MzJfdCkoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IENvbnZlcnNpb24gc3RhcnRlZCBieSBzb2Z0d2FyZSB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpCisjZGVmaW5lIERBQ19UUklHR0VSX1QzX1RSR08gICAgKCh1aW50MzJfdCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpKSAvKiE8IFRJTTMgIFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9UM19DSDMgICAgICgodWludDMyX3QpKCAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzEgfCAgICAgICAgICAgICAgICAgIERBQ19DUl9URU4xKSkgLyohPCBUSU0zICBDSDMgIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDdfVFJHTyAgICAoKHVpbnQzMl90KShEQUNfQ1JfVFNFTDFfMiB8ICAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzAgfCBEQUNfQ1JfVEVOMSkpIC8qITwgVElNNyAgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZW5kaWYKKworI2lmIGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KQorI2RlZmluZSBJU19EQUNfVFJJR0dFUihUUklHR0VSKSAoKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9OT05FKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1Q2X1RSR08pICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDNfVFJHTykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UM19DSDMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1Q3X1RSR08pICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDIxX1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UMl9UUkdPKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX0VYVF9JVDkpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfU09GVFdBUkUpKQorI2Vsc2UgLyogU1RNMzJMMDcyeHggfHwgU1RNMzJMMDczeHggfHwgU1RNMzJMMDgyeHggfHwgU1RNMzJMMDgzeHggKi8KKyNkZWZpbmUgSVNfREFDX1RSSUdHRVIoVFJJR0dFUikgKCgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfTk9ORSkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UNl9UUkdPKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1QyMV9UUkdPKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDJfVFJHTykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9FWFRfSVQ5KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1NPRlRXQVJFKSkKKyNlbmRpZiAvKiBTVE0zMkwwNzJ4eCB8fCBTVE0zMkwwNzN4eCB8fCBTVE0zMkwwODJ4eCB8fCBTVE0zMkwwODN4eCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfb3V0cHV0X2J1ZmZlciBEQUMgb3V0cHV0IGJ1ZmZlcgorICAqIEB7CisgICovCisjZGVmaW5lIERBQ19PVVRQVVRCVUZGRVJfRU5BQkxFICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgREFDX09VVFBVVEJVRkZFUl9ESVNBQkxFICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9CT0ZGMSkKKworI2RlZmluZSBJU19EQUNfT1VUUFVUX0JVRkZFUl9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IERBQ19PVVRQVVRCVUZGRVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gREFDX09VVFBVVEJVRkZFUl9ESVNBQkxFKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0NoYW5uZWxfc2VsZWN0aW9uIERBQyBDaGFubmVsIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIERBQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNpZiBkZWZpbmVkIChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKyNkZWZpbmUgREFDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKyNkZWZpbmUgSVNfREFDX0NIQU5ORUwoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gREFDX0NIQU5ORUxfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBEQUNfQ0hBTk5FTF8yKSkKKyNlbHNlCisjZGVmaW5lIElTX0RBQ19DSEFOTkVMKENIQU5ORUwpICgoQ0hBTk5FTCkgPT0gREFDX0NIQU5ORUxfMSkKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfZGF0YV9hbGlnbmVtZW50IERBQyBkYXRhIGFsaWduZW1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBEQUNfQUxJR05fMTJCX1IgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIERBQ19BTElHTl8xMkJfTCAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkKKyNkZWZpbmUgREFDX0FMSUdOXzhCX1IgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKQorCisjZGVmaW5lIElTX0RBQ19BTElHTihBTElHTikgKCgoQUxJR04pID09IERBQ19BTElHTl8xMkJfUikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMSUdOKSA9PSBEQUNfQUxJR05fMTJCX0wpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTElHTikgPT0gREFDX0FMSUdOXzhCX1IpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfZGF0YSBEQUMgZGF0YQorICAqIEB7CisgICovCisjZGVmaW5lIElTX0RBQ19EQVRBKERBVEEpICgoREFUQSkgPD0gMHhGRkYwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX2ZsYWdzX2RlZmluaXRpb24gREFDIGZsYWdzIGRlZmluaXRpb24KKyAgKiBAeworICAqLyAKKyNkZWZpbmUgREFDX0ZMQUdfRE1BVURSMSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19TUl9ETUFVRFIxKQorI2lmIGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KQorI2RlZmluZSBEQUNfRkxBR19ETUFVRFIyICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpREFDX1NSX0RNQVVEUjIpICAgCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfSVRfZGVmaW5pdGlvbiBEQUMgSVQgZGVmaW5pdGlvbgorICAqIEB7CisgICovIAorI2RlZmluZSBEQUNfSVRfRE1BVURSMSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19TUl9ETUFVRFIxKQorI2lmIGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KQorI2RlZmluZSBEQUNfSVRfRE1BVURSMiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19TUl9ETUFVRFIyKSAgIAorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX01hY3JvcyBEQUMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBEQUMgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX0RBQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRVNFVDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9EQUNfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqIEBicmllZiBFbmFibGUgdGhlIERBQyBjaGFubmVsCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fREFDX0NIQU5ORUxfXyBzcGVjaWZpZXMgdGhlIERBQyBjaGFubmVsCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RBQ19FTkFCTEUoX19IQU5ETEVfXywgX19EQUNfQ0hBTk5FTF9fKSBcCitTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCAoREFDX0NSX0VOMSA8PCAoX19EQUNfQ0hBTk5FTF9fKSkpCisKKy8qKiBAYnJpZWYgRGlzYWJsZSB0aGUgREFDIGNoYW5uZWwKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBEQUMgaGFuZGxlCisgICogQHBhcmFtICBfX0RBQ19DSEFOTkVMX18gc3BlY2lmaWVzIHRoZSBEQUMgY2hhbm5lbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfREFDX0RJU0FCTEUoX19IQU5ETEVfXywgX19EQUNfQ0hBTk5FTF9fKSBcCitDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIChEQUNfQ1JfRU4xIDw8IChfX0RBQ19DSEFOTkVMX18pKSkKKworICAKKyNkZWZpbmUgX19IQUxfREFDX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSBcCitTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCAoX19JTlRFUlJVUFRfXykpCisKKworLyoqIEBicmllZiBEaXNhYmxlIHRoZSBEQUMgaW50ZXJydXB0CisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERBQyBpbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RBQ19ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKK0NMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgREFDIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtIF9fSEFORExFX18gREFDIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIERBQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0lUX0RNQVVEUjE6IERBQyBjaGFubmVsIDEgRE1BIHVuZGVycnVuIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBEQUNfSVRfRE1BVURSMjogREFDIGNoYW5uZWwgMiBETUEgdW5kZXJydW4gaW50ZXJydXB0IChTVE0zMkwwNzJ4eCBTVE0zMkwwNzN4eCBTVE0zMkwwODJ4eCBTVE0zMkwwODN4eCBvbmx5KQorICAqIEByZXR2YWwgU3RhdGUgb2YgaW50ZXJydXB0aW9uIChTRVQgb3IgUkVTRVQpCisgICovCisjZGVmaW5lIF9fSEFMX0RBQ19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIFwKKygoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBEQUMncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBEQUMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBGTEFHLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9EQUNfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICBcCisoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgREFDJ3MgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBEQUMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBGTEFHLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9EQUNfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgXAorKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgPSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAfQorICAqLyAKKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIERBQ19Qcml2YXRlX01hY3JvcyBEQUMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFNldCBESFIxMlIxIGFsaWdubWVudAorICAqIEBwYXJhbSAgX19BTElHTk1FTlRfXyBzcGVjaWZpZXMgdGhlIERBQyBhbGlnbmVtZW50CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIERBQ19ESFIxMlIxX0FMSUdOTUVOVChfX0FMSUdOTUVOVF9fKSAoKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgKyAoX19BTElHTk1FTlRfXykpCisKKy8qKiBAYnJpZWYgIFNldCBESFIxMlIyIGFsaWdubWVudAorICAqIEBwYXJhbSAgX19BTElHTk1FTlRfXyBzcGVjaWZpZXMgdGhlIERBQyBhbGlnbmVtZW50CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIERBQ19ESFIxMlIyX0FMSUdOTUVOVChfX0FMSUdOTUVOVF9fKSAoKCh1aW50MzJfdCkweDAwMDAwMDE0VSkgKyAoX19BTElHTk1FTlRfXykpCisKKy8qKiBAYnJpZWYgIFNldCBESFIxMlJEIGFsaWdubWVudAorICAqIEBwYXJhbSAgX19BTElHTk1FTlRfXyBzcGVjaWZpZXMgdGhlIERBQyBhbGlnbmVtZW50CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIERBQ19ESFIxMlJEX0FMSUdOTUVOVChfX0FMSUdOTUVOVF9fKSAoKCh1aW50MzJfdCkweDAwMDAwMDIwVSkgKyAoX19BTElHTk1FTlRfXykpCisKKy8qKiBAYnJpZWYgRW5hYmxlIHRoZSBEQUMgaW50ZXJydXB0CisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERBQyBpbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lCisgICovCisgIAorLyoqCisgICogQH0KKyAgKi8gCisKKworLyogSW5jbHVkZSBEQUMgSEFMIEV4dGVuc2lvbiBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RhY19leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIERBQ19FeHBvcnRlZF9GdW5jdGlvbnMgREFDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovIAorLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfSW5pdChEQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX0RlSW5pdChEQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7Cit2b2lkIEhBTF9EQUNfTXNwSW5pdChEQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7Cit2b2lkIEhBTF9EQUNfTXNwRGVJbml0KERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0YXJ0KERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RvcChEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0YXJ0X0RNQShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QqIHBEYXRhLCB1aW50MzJfdCBMZW5ndGgsIHVpbnQzMl90IEFsaWdubWVudCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0b3BfRE1BKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IEFsaWdubWVudCwgdWludDMyX3QgRGF0YSk7Cit1aW50MzJfdCBIQUxfREFDX0dldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKTsKK3ZvaWQgSEFMX0RBQ19JUlFIYW5kbGVyKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKTsKK3ZvaWQgSEFMX0RBQ19Db252Q3BsdENhbGxiYWNrQ2gxKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKTsKK3ZvaWQgSEFMX0RBQ19Db252SGFsZkNwbHRDYWxsYmFja0NoMShEQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7Cit2b2lkIEhBTF9EQUNfRXJyb3JDYWxsYmFja0NoMShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7Cit2b2lkIEhBTF9EQUNfRE1BVW5kZXJydW5DYWxsYmFja0NoMShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisKKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKiBEQUMgY2FsbGJhY2sgcmVnaXN0ZXJpbmcvdW5yZWdpc3RlcmluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9EQUNfUmVnaXN0ZXJDYWxsYmFjayAoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIEhBTF9EQUNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJZCwgcERBQ19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfREFDX1VuUmVnaXN0ZXJDYWxsYmFjayAoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIEhBTF9EQUNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJZCk7CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19Db25maWdDaGFubmVsKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCBEQUNfQ2hhbm5lbENvbmZUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9EQUNfU3RhdGVUeXBlRGVmIEhBTF9EQUNfR2V0U3RhdGUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpOwordWludDMyX3QgSEFMX0RBQ19HZXRFcnJvcihEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiAhU1RNMzJMMDEweEIgJiYgIVNUTTMyTDAxMHg4ICYmICFTVE0zMkwwMTB4NiAmJiAhU1RNMzJMMDEweDQgJiYgIVNUTTMyTDAxMXh4ICYmICFTVE0zMkwwMjF4eCAmJiAhU1RNMzJMMDMxeHggJiYgIVNUTTMyTDA0MXh4ICYmICFTVE0zMkwwNjF4eCAmJiAhU1RNMzJMMDcxeHggJiYgIVNUTTMyTDA4MXh4Ki8KKyAgCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLypfX1NUTTMyTDB4eF9IQUxfREFDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2RhY19leC5oIGIvSW5jL3N0bTMybDB4eF9oYWxfZGFjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0Y2QwYgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX2RhY19leC5oCkBAIC0wLDAgKzEsMTY3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9kYWNfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgREFDIEhBTCBFeHRlbnNpb24gbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkwweHhfSEFMX0RBQ19FWF9ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9EQUNfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkIChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAyMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDMxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwNDF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDA1MXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDYxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwNzF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDA4MXh4KQorICAgCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDRXggREFDRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAKKy8qKiBAZGVmZ3JvdXAgREFDRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIERBQ0V4IEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovIAorICAgCisvKiogQGRlZmdyb3VwIERBQ0V4X2xmc3J1bm1hc2tfdHJpYW5nbGVhbXBsaXR1ZGUgREFDRXggbGZzcnVubWFzayB0cmlhbmdsZWFtcGxpdHVkZQorICAqIEB7CisgICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVDAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXQwIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzFfMCAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8wKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzJfMCAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8xKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsyOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzNfMCAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8xIHwgREFDX0NSX01BTVAxXzApLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMzowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFM0XzAgICAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMikgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbNDowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFM1XzAgICAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMiB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs1OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzZfMCAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzEpIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzY6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTN18wICAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs3OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzhfMCAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8zKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs4OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzlfMCAgICAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8zIHwgREFDX0NSX01BTVAxXzApIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0Wzk6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTMTBfMCAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzMgfCBEQUNfQ1JfTUFNUDFfMSkgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMTA6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTMTFfMCAgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzMgfCBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxMTowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8xICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAxICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8zICAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAzICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV83ICAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMSkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA3ICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8xNSAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDE1ICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8zMSAgICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMikgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAzMSAqLworI2RlZmluZSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNjMgICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA2MyAqLworI2RlZmluZSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTI3ICAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAxMjcgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzI1NSAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAyNTUgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzUxMSAgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8zKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDUxMSAqLworI2RlZmluZSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTAyMyAgICAgICAgICgodWludDMyX3QpREFDX0NSX01BTVAxXzMgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAxMDIzICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8yMDQ3ICAgICAgICAgKCh1aW50MzJfdClEQUNfQ1JfTUFNUDFfMyB8IERBQ19DUl9NQU1QMV8xKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDIwNDcgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzQwOTUgICAgICAgICAoKHVpbnQzMl90KURBQ19DUl9NQU1QMV8zIHwgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA0MDk1ICovCisKKyNkZWZpbmUgSVNfREFDX0xGU1JfVU5NQVNLX1RSSUFOR0xFX0FNUExJVFVERShWQUxVRSkgKCgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVDApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFMxXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFMyXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFMzXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFM0XzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFM1XzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFM2XzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFM3XzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFM4XzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFM5XzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVU5NQVNLX0JJVFMxMF8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTMTFfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzE1KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV82MykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzEyNykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzI1NSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzUxMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzEwMjMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8yMDQ3KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNDA5NSkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorCisvKiogQGRlZmdyb3VwIERBQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBEQUNFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERBQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBFeHRlbnNpb24gZmVhdHVyZXMgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ0V4X1RyaWFuZ2xlV2F2ZUdlbmVyYXRlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBBbXBsaXR1ZGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ0V4X05vaXNlV2F2ZUdlbmVyYXRlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBBbXBsaXR1ZGUpOworCisjaWYgZGVmaW5lZCAoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpCit1aW50MzJfdCBIQUxfREFDRXhfRHVhbEdldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9EdWFsU2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IEFsaWdubWVudCwgdWludDMyX3QgRGF0YTEsIHVpbnQzMl90IERhdGEyKTsKK3ZvaWQgSEFMX0RBQ0V4X0NvbnZDcGx0Q2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpOwordm9pZCBIQUxfREFDRXhfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpOwordm9pZCBIQUxfREFDRXhfRXJyb3JDYWxsYmFja0NoMihEQUNfSGFuZGxlVHlwZURlZiogaGRhYyk7Cit2b2lkIEhBTF9EQUNFeF9ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gyKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKTsKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRGVmaW5lIHRoZSBwcml2YXRlIGdyb3VwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBEQUNFeF9Qcml2YXRlIERBQ0V4IFByaXZhdGUKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiAhU1RNMzJMMDEweEIgJiYgIVNUTTMyTDAxMHg4ICYmICFTVE0zMkwwMTB4NiAmJiAhU1RNMzJMMDEweDQgJiYgIVNUTTMyTDAxMXh4ICYmICFTVE0zMkwwMjF4eCAmJiAhU1RNMzJMMDMxeHggJiYgIVNUTTMyTDA0MXh4ICYmICFTVE0zMkwwNTF4eCAmJiAhU1RNMzJMMDYxeHggJiYgIVNUTTMyTDA3MXh4ICYmICFTVE0zMkwwODF4eCovCisgIAorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qX19TVE0zMkwweHhfSEFMX0RBQ19FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2RlZi5oIGIvSW5jL3N0bTMybDB4eF9oYWxfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5NTY4OQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX2RlZi5oCkBAIC0wLDAgKzEsMTkwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9kZWYuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIEhBTCBjb21tb24gZGVmaW5lcywgZW51bWVyYXRpb24sIG1hY3JvcyBhbmQKKyAgKiAgICAgICAgICBzdHJ1Y3R1cmVzIGRlZmluaXRpb25zLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9ERUYKKyNkZWZpbmUgX19TVE0zMkwweHhfSEFMX0RFRgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eC5oIgorI2luY2x1ZGUgIkxlZ2FjeS9zdG0zMl9oYWxfbGVnYWN5LmgiCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEBicmllZiAgSEFMIFN0YXR1cyBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfT0sgICAgICAgPSAweDAwVSwKKyAgSEFMX0VSUk9SICAgID0gMHgwMVUsCisgIEhBTF9CVVNZICAgICA9IDB4MDJVLAorICBIQUxfVElNRU9VVCAgPSAweDAzVQorfSBIQUxfU3RhdHVzVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgTG9jayBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVU5MT0NLRUQgPSAweDAwVSwKKyAgSEFMX0xPQ0tFRCAgID0gMHgwMVUKK30gSEFMX0xvY2tUeXBlRGVmOworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFVOVVNFRChYKSAodm9pZClYICAgICAgLyogVG8gYXZvaWQgZ2NjL2crKyB3YXJuaW5ncyAqLworCisjZGVmaW5lIEhBTF9NQVhfREVMQVkgICAgICAweEZGRkZGRkZGVQorCisjZGVmaW5lIEhBTF9JU19CSVRfU0VUKFJFRywgQklUKSAgICAgICAgICgoKFJFRykgJiAoQklUKSkgPT0gKEJJVCkpCisjZGVmaW5lIEhBTF9JU19CSVRfQ0xSKFJFRywgQklUKSAgICAgICAgICgoKFJFRykgJiAoQklUKSkgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfTElOS0RNQShfX0hBTkRMRV9fLCBfX1BQUF9ETUFfRklFTERfXywgX19ETUFfSEFORExFX18pICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5fX1BQUF9ETUFfRklFTERfXyA9ICYoX19ETUFfSEFORExFX18pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fRE1BX0hBTkRMRV9fKS5QYXJlbnQgPSAoX19IQU5ETEVfXyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKiogQGJyaWVmIFJlc2V0IHRoZSBIYW5kbGUncyBTdGF0ZSBmaWVsZC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXzogc3BlY2lmaWVzIHRoZSBQZXJpcGhlcmFsIEhhbmRsZS4KKyAgKiBAbm90ZSAgVGhpcyBtYWNybyBjYW4gYmUgdXNlZCBmb3IgdGhlIGZvbGxvd2luZyBwdXJwb3NlOgorICAqICAgICAgICAgIC0gV2hlbiB0aGUgSGFuZGxlIGlzIGRlY2xhcmVkIGFzIGxvY2FsIHZhcmlhYmxlOyBiZWZvcmUgcGFzc2luZyBpdCBhcyBwYXJhbWV0ZXIKKyAgKiAgICAgICAgICAgIHRvIEhBTF9QUFBfSW5pdCgpIGZvciB0aGUgZmlyc3QgdGltZSwgaXQgaXMgbWFuZGF0b3J5IHRvIHVzZSB0aGlzIG1hY3JvCisgICogICAgICAgICAgICB0byBzZXQgdG8gMCB0aGUgSGFuZGxlJ3MgIlN0YXRlIiBmaWVsZC4KKyAgKiAgICAgICAgICAgIE90aGVyd2lzZSwgIlN0YXRlIiBmaWVsZCBtYXkgaGF2ZSBhbnkgcmFuZG9tIHZhbHVlIGFuZCB0aGUgZmlyc3QgdGltZSB0aGUgZnVuY3Rpb24KKyAgKiAgICAgICAgICAgIEhBTF9QUFBfSW5pdCgpIGlzIGNhbGxlZCwgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiB3aWxsIGJlIG1pc3NlZAorICAqICAgICAgICAgICAgKGkuZS4gSEFMX1BQUF9Nc3BJbml0KCkgd2lsbCBub3QgYmUgZXhlY3V0ZWQpLgorICAqICAgICAgICAgIC0gV2hlbiB0aGVyZSBpcyBhIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogaW5zdGVhZCBvZiBjYWxsaW5nCisgICogICAgICAgICAgICBIQUxfUFBQX0RlSW5pdCgpIHRoZW4gSEFMX1BQUF9Jbml0KCksIHVzZXIgY2FuIG1ha2UgYSBjYWxsIHRvIHRoaXMgbWFjcm8gdGhlbiBIQUxfUFBQX0luaXQoKS4KKyAgKiAgICAgICAgICAgIEluIHRoaXMgbGF0ZXIgZnVuY3Rpb24sIHdoZW4gdGhlIEhhbmRsZSdzICJTdGF0ZSIgZmllbGQgaXMgc2V0IHRvIDAsIGl0IHdpbGwgZXhlY3V0ZSB0aGUgZnVuY3Rpb24KKyAgKiAgICAgICAgICAgIEhBTF9QUFBfTXNwSW5pdCgpIHdoaWNoIHdpbGwgcmVjb25maWd1cmUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gMFUpCisKKyNpZiAoVVNFX1JUT1MgPT0gMSkKKworICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworICAjZXJyb3IgIlVTRV9SVE9TIHNob3VsZCBiZSAwIGluIHRoZSBjdXJyZW50IEhBTCByZWxlYXNlIgorCisjZWxzZQorICAjZGVmaW5lIF9fSEFMX0xPQ0soX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoX19IQU5ETEVfXyktPkxvY2sgPT0gSEFMX0xPQ0tFRCkgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIQUxfQlVTWTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkxvY2sgPSBIQUxfTE9DS0VEOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUgKDApCisKKyAgI2RlZmluZSBfX0hBTF9VTkxPQ0soX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSAoMCkKKyNlbmRpZiAvKiBVU0VfUlRPUyAqLworCisjaWYgIGRlZmluZWQgKCBfX0dOVUNfXyApICYmICFkZWZpbmVkIChfX0NDX0FSTSkgLyogR05VIENvbXBpbGVyICovCisgICNpZm5kZWYgX193ZWFrCisgICAgI2RlZmluZSBfX3dlYWsgICBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKKyAgI2VuZGlmIC8qIF9fd2VhayAqLworICAjaWZuZGVmIF9fcGFja2VkCisgICAgI2RlZmluZSBfX3BhY2tlZCBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkKKyAgI2VuZGlmIC8qIF9fcGFja2VkICovCisKKyAgI2RlZmluZSBfX05PSU5MSU5FIF9fYXR0cmlidXRlX18gKCAobm9pbmxpbmUpICkKKworI2VuZGlmIC8qIF9fR05VQ19fICovCisKKworLyogTWFjcm8gdG8gZ2V0IHZhcmlhYmxlIGFsaWduZWQgb24gNC1ieXRlcywgZm9yIF9fSUNDQVJNX18gdGhlIGRpcmVjdGl2ZSAiI3ByYWdtYSBkYXRhX2FsaWdubWVudD00IiBtdXN0IGJlIHVzZWQgaW5zdGVhZCAqLworI2lmIGRlZmluZWQgICAoX19HTlVDX18pICYmICFkZWZpbmVkIChfX0NDX0FSTSkgLyogR05VIENvbXBpbGVyICovCisgICNpZm5kZWYgX19BTElHTl9FTkQKKyAgICAjZGVmaW5lIF9fQUxJR05fRU5EICAgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpCisgICNlbmRpZiAvKiBfX0FMSUdOX0VORCAqLworICAjaWZuZGVmIF9fQUxJR05fQkVHSU4KKyAgICAjZGVmaW5lIF9fQUxJR05fQkVHSU4KKyAgI2VuZGlmIC8qIF9fQUxJR05fQkVHSU4gKi8KKyNlbHNlCisgICNpZm5kZWYgX19BTElHTl9FTkQKKyAgICAjZGVmaW5lIF9fQUxJR05fRU5ECisgICNlbmRpZiAvKiBfX0FMSUdOX0VORCAqLworICAjaWZuZGVmIF9fQUxJR05fQkVHSU4KKyAgICAjaWYgZGVmaW5lZCAgIChfX0NDX0FSTSkgICAgICAvKiBBUk0gQ29tcGlsZXIgKi8KKyAgICAgICNkZWZpbmUgX19BTElHTl9CRUdJTiAgICBfX2FsaWduKDQpCisgICAgI2VsaWYgZGVmaW5lZCAoX19JQ0NBUk1fXykgICAgLyogSUFSIENvbXBpbGVyICovCisgICAgICAjZGVmaW5lIF9fQUxJR05fQkVHSU4KKyAgICAjZW5kaWYgLyogX19DQ19BUk0gKi8KKyAgI2VuZGlmIC8qIF9fQUxJR05fQkVHSU4gKi8KKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisvKioKKyAgKiBAYnJpZWYgIF9fUkFNX0ZVTkMgZGVmaW5pdGlvbgorICAqLworI2lmIGRlZmluZWQgKCBfX0NDX0FSTSAgICkKKy8qIEFSTSBDb21waWxlcgorICAgLS0tLS0tLS0tLS0tCisgICBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSB0b29sY2hhaW4gb3B0aW9ucy4KKyAgIEZ1bmN0aW9ucyB0aGF0IGFyZSBleGVjdXRlZCBpbiBSQU0gc2hvdWxkIHJlc2lkZSBpbiBhIHNlcGFyYXRlIHNvdXJjZSBtb2R1bGUuCisgICBVc2luZyB0aGUgJ09wdGlvbnMgZm9yIEZpbGUnIGRpYWxvZyB5b3UgY2FuIHNpbXBseSBjaGFuZ2UgdGhlICdDb2RlIC8gQ29uc3QnCisgICBhcmVhIG9mIGEgbW9kdWxlIHRvIGEgbWVtb3J5IHNwYWNlIGluIHBoeXNpY2FsIFJBTS4KKyAgIEF2YWlsYWJsZSBtZW1vcnkgYXJlYXMgYXJlIGRlY2xhcmVkIGluIHRoZSAnVGFyZ2V0JyB0YWIgb2YgdGhlICdPcHRpb25zIGZvciBUYXJnZXQnCisgICBkaWFsb2cuCisqLworI2RlZmluZSBfX1JBTV9GVU5DCisKKyNkZWZpbmUgX19OT0lOTElORSBfX2F0dHJpYnV0ZV9fICggKG5vaW5saW5lKSApCisKKworI2VsaWYgZGVmaW5lZCAoIF9fSUNDQVJNX18gKQorLyogSUNDQVJNIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0tLS0KKyAgIFJBTSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgdXNpbmcgYSBzcGVjaWZpYyB0b29sY2hhaW4ga2V5d29yZCAiX19yYW1mdW5jIi4KKyovCisjZGVmaW5lIF9fUkFNX0ZVTkMgX19yYW1mdW5jCisKKyNkZWZpbmUgX19OT0lOTElORSBfUHJhZ21hKCJvcHRpbWl6ZSA9IG5vX2lubGluZSIpCisKKyNlbGlmIGRlZmluZWQgICAoICBfX0dOVUNfXyAgKQorLyogR05VIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0KKyAgUkFNIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCB1c2luZyBhIHNwZWNpZmljIHRvb2xjaGFpbiBhdHRyaWJ1dGUKKyAgICJfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuUmFtRnVuYyIpKSkiLgorKi8KKyNkZWZpbmUgX19SQU1fRlVOQyAgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLlJhbUZ1bmMiKSkpCisKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19fU1RNMzJMMHh4X0hBTF9ERUYgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfZG1hLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmNiMmM0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfZG1hLmgKQEAgLTAsMCArMSw2NzUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2RtYS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBETUEgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9IQUxfRE1BX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9ETUFfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUEKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfVHlwZXMgRE1BIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBETUEgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUmVxdWVzdDsgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJlcXVlc3Qgc2VsZWN0ZWQgZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9yZXF1ZXN0ICovCisKKyAgdWludDMyX3QgRGlyZWN0aW9uOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgdGhlIGRhdGEgd2lsbCBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBwZXJpcGhlcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWVtb3J5IHRvIG1lbW9yeSBvciBmcm9tIHBlcmlwaGVyYWwgdG8gbWVtb3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0RhdGFfdHJhbnNmZXJfZGlyZWN0aW9uICovCisKKyAgdWludDMyX3QgUGVyaXBoSW5jOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUGVyaXBoZXJhbCBhZGRyZXNzIHJlZ2lzdGVyIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfUGVyaXBoZXJhbF9pbmNyZW1lbnRlZF9tb2RlICovCisKKyAgdWludDMyX3QgTWVtSW5jOyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgbWVtb3J5IGFkZHJlc3MgcmVnaXN0ZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9NZW1vcnlfaW5jcmVtZW50ZWRfbW9kZSAqLworCisgIHVpbnQzMl90IFBlcmlwaERhdGFBbGlnbm1lbnQ7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBQZXJpcGhlcmFsIGRhdGEgd2lkdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfUGVyaXBoZXJhbF9kYXRhX3NpemUgKi8KKworICB1aW50MzJfdCBNZW1EYXRhQWxpZ25tZW50OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgTWVtb3J5IGRhdGEgd2lkdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTWVtb3J5X2RhdGFfc2l6ZSAqLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpb24gbW9kZSBvZiB0aGUgRE1BeSBDaGFubmVseC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9tb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhlIGNpcmN1bGFyIGJ1ZmZlciBtb2RlIGNhbm5vdCBiZSB1c2VkIGlmIHRoZSBtZW1vcnktdG8tbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0cmFuc2ZlciBpcyBjb25maWd1cmVkIG9uIHRoZSBzZWxlY3RlZCBDaGFubmVsICovCisKKyAgdWludDMyX3QgUHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNvZnR3YXJlIHByaW9yaXR5IGZvciB0aGUgRE1BeSBDaGFubmVseC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9Qcmlvcml0eV9sZXZlbCAqLworfSBETUFfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIERNQSBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfRE1BX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAvKiE8IERNQSBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAgICovCisgIEhBTF9ETUFfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgIC8qITwgRE1BIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICAgKi8KKyAgSEFMX0RNQV9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MDJVLCAgLyohPCBETUEgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAqLworICBIQUxfRE1BX1NUQVRFX1RJTUVPVVQgICAgICAgICAgID0gMHgwM1UsICAvKiE8IERNQSB0aW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICovCit9SEFMX0RNQV9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIERNQSBFcnJvciBDb2RlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0RNQV9GVUxMX1RSQU5TRkVSICAgICAgPSAweDAwVSwgICAgLyohPCBGdWxsIHRyYW5zZmVyICAgICAqLworICBIQUxfRE1BX0hBTEZfVFJBTlNGRVIgICAgICA9IDB4MDFVICAgICAvKiE8IEhhbGYgVHJhbnNmZXIgICAgICovCit9SEFMX0RNQV9MZXZlbENvbXBsZXRlVHlwZURlZjsKKworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBETUEgQ2FsbGJhY2sgSUQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRCAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IEZ1bGwgdHJhbnNmZXIgICAgICovCisgIEhBTF9ETUFfWEZFUl9IQUxGQ1BMVF9DQl9JRCAgICAgID0gMHgwMVUsICAgIC8qITwgSGFsZiB0cmFuc2ZlciAgICAgKi8KKyAgSEFMX0RNQV9YRkVSX0VSUk9SX0NCX0lEICAgICAgICAgPSAweDAyVSwgICAgLyohPCBFcnJvciAgICAgICAgICAgICAqLworICBIQUxfRE1BX1hGRVJfQUJPUlRfQ0JfSUQgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IEFib3J0ICAgICAgICAgICAgICovCisgIEhBTF9ETUFfWEZFUl9BTExfQ0JfSUQgICAgICAgICAgID0gMHgwNFUgICAgIC8qITwgQWxsICAgICAgICAgICAgICAgKi8KK31IQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIERNQSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYKK3sKKyAgRE1BX0NoYW5uZWxfVHlwZURlZiAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAqLworCisgIERNQV9Jbml0VHlwZURlZiAgICAgICBJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgTG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfRE1BX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSB0cmFuc2ZlciBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgICAgICAgICAgICAgICAgICAqUGFyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQYXJlbnQgb2JqZWN0IHN0YXRlICAgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICAgICAgICAgICAgICAgICAgKCogWGZlckNwbHRDYWxsYmFjaykoc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYgKiBoZG1hKTsgICAgIC8qITwgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICAgICAgICovCisKKyAgdm9pZCAgICAgICAgICAgICAgICAgICgqIFhmZXJIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19ETUFfSGFuZGxlVHlwZURlZiAqIGhkbWEpOyAvKiE8IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICAqLworCisgIHZvaWQgICAgICAgICAgICAgICAgICAoKiBYZmVyRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYgKiBoZG1hKTsgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgICAgICAgICAgKi8KKworICB2b2lkICAgICAgICAgICAgICAgICAgKCogWGZlckFib3J0Q2FsbGJhY2spKCBzdHJ1Y3QgX19ETUFfSGFuZGxlVHlwZURlZiAqIGhkbWEpOyAgIC8qITwgRE1BIHRyYW5zZmVyIGFib3J0IGNhbGxiYWNrICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIERNQV9UeXBlRGVmICAgICAgICAgICAgKkRtYUJhc2VBZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgQ2hhbm5lbCBCYXNlIEFkZHJlc3MgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgIENoYW5uZWxJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIENoYW5uZWwgSW5kZXggICAgICAgICAgICAgICAgICAgICovCisKK31ETUFfSGFuZGxlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfQ29uc3RhbnRzIERNQSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQV9FcnJvcl9Db2RlIERNQSBFcnJvciBDb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9OT05FICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX1RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAgIC8qITwgVHJhbnNmZXIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFfRVJST1JfTk9fWEZFUiAgICAgICAgICAgICAgMHgwMDAwMDAwNFUgICAgLyohPCBBYm9ydCByZXF1ZXN0ZWQgd2l0aCBubyBYZmVyIG9uZ29pbmcgICAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAweDAwMDAwMDIwVSAgICAvKiE8IFRpbWVvdXQgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX05PVF9TVVBQT1JURUQgICAgICAgIDB4MDAwMDAxMDBVICAgIC8qITwgTm90IHN1cHBvcnRlZCBtb2RlICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX3JlcXVlc3QgRE1BIHJlcXVlc3QKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJMMDEweDQpIHx8IGRlZmluZWQgKFNUTTMyTDAxMHg2KSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4OCkgfHwgZGVmaW5lZCAoU1RNMzJMMDEweEMpCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfMCAgICAgICAgICAgICAgICAgICAgIDBVCisjZGVmaW5lIERNQV9SRVFVRVNUXzEgICAgICAgICAgICAgICAgICAgICAxVQorI2RlZmluZSBETUFfUkVRVUVTVF80ICAgICAgICAgICAgICAgICAgICAgNFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfNSAgICAgICAgICAgICAgICAgICAgIDVVCisjZGVmaW5lIERNQV9SRVFVRVNUXzYgICAgICAgICAgICAgICAgICAgICA2VQorI2RlZmluZSBETUFfUkVRVUVTVF84ICAgICAgICAgICAgICAgICAgICAgOFUKKworI2RlZmluZSBJU19ETUFfQUxMX1JFUVVFU1QoUkVRVUVTVCkgKCgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfOCkpCisKKy8qIFNUTTMyTDAxMHg0IHx8IFNUTTMyTDAxMHg2IHx8IFNUTTMyTDAxMHg4IHx8IFNUTTMyTDAxMHhDICovCisKKyNlbGlmIGRlZmluZWQgKFNUTTMyTDAyMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKworI2RlZmluZSBETUFfUkVRVUVTVF8wICAgICAgICAgICAgICAgICAgICAgMFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfMSAgICAgICAgICAgICAgICAgICAgIDFVCisjZGVmaW5lIERNQV9SRVFVRVNUXzIgICAgICAgICAgICAgICAgICAgICAyVQorI2RlZmluZSBETUFfUkVRVUVTVF8zICAgICAgICAgICAgICAgICAgICAgM1UKKyNkZWZpbmUgRE1BX1JFUVVFU1RfNCAgICAgICAgICAgICAgICAgICAgIDRVCisjZGVmaW5lIERNQV9SRVFVRVNUXzUgICAgICAgICAgICAgICAgICAgICA1VQorI2RlZmluZSBETUFfUkVRVUVTVF82ICAgICAgICAgICAgICAgICAgICAgNlUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfNyAgICAgICAgICAgICAgICAgICAgIDdVCisjZGVmaW5lIERNQV9SRVFVRVNUXzggICAgICAgICAgICAgICAgICAgICA4VQorI2RlZmluZSBETUFfUkVRVUVTVF85ICAgICAgICAgICAgICAgICAgICAgOVUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfMTAgICAgICAgICAgICAgICAgICAgMTBVCisjZGVmaW5lIERNQV9SRVFVRVNUXzExICAgICAgICAgICAgICAgICAgIDExVSAgLyogQUVTIHByb2R1Y3Qgb25seSAqLworI2RlZmluZSBETUFfUkVRVUVTVF8xMiAgICAgICAgICAgICAgICAgICAxMlUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfMTMgICAgICAgICAgICAgICAgICAgMTNVCisjZGVmaW5lIERNQV9SRVFVRVNUXzE0ICAgICAgICAgICAgICAgICAgIDE0VQorI2RlZmluZSBETUFfUkVRVUVTVF8xNSAgICAgICAgICAgICAgICAgICAxNVUKKworI2RlZmluZSBJU19ETUFfQUxMX1JFUVVFU1QoUkVRVUVTVCkgKCgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfNykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfOSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBETUFfUkVRVUVTVF8xMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfMTMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzE0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBETUFfUkVRVUVTVF8xNSkpCisKKy8qIChTVE0zMkwwMjF4eCkgfHwgKFNUTTMyTDA0MXh4KSB8fCAoU1RNMzJMMDYxeHgpIHx8IChTVE0zMkwwNjJ4eCkgfHwgKFNUTTMyTDA2M3h4KSB8fCAoU1RNMzJMMDgxeHgpIHx8IChTVE0zMkwwODJ4eCkgfHwgKFNUTTMyTDA4M3h4KSAqLworCisjZWxzZQorCisjZGVmaW5lIERNQV9SRVFVRVNUXzAgICAgICAgICAgICAgICAgICAgICAwVQorI2RlZmluZSBETUFfUkVRVUVTVF8xICAgICAgICAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfMiAgICAgICAgICAgICAgICAgICAgIDJVCisjZGVmaW5lIERNQV9SRVFVRVNUXzMgICAgICAgICAgICAgICAgICAgICAzVQorI2RlZmluZSBETUFfUkVRVUVTVF80ICAgICAgICAgICAgICAgICAgICAgNFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfNSAgICAgICAgICAgICAgICAgICAgIDVVCisjZGVmaW5lIERNQV9SRVFVRVNUXzYgICAgICAgICAgICAgICAgICAgICA2VQorI2RlZmluZSBETUFfUkVRVUVTVF83ICAgICAgICAgICAgICAgICAgICAgN1UKKyNkZWZpbmUgRE1BX1JFUVVFU1RfOCAgICAgICAgICAgICAgICAgICAgIDhVCisjZGVmaW5lIERNQV9SRVFVRVNUXzkgICAgICAgICAgICAgICAgICAgICA5VQorI2RlZmluZSBETUFfUkVRVUVTVF8xMCAgICAgICAgICAgICAgICAgICAxMFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfMTIgICAgICAgICAgICAgICAgICAgMTJVCisjZGVmaW5lIERNQV9SRVFVRVNUXzEzICAgICAgICAgICAgICAgICAgIDEzVQorI2RlZmluZSBETUFfUkVRVUVTVF8xNCAgICAgICAgICAgICAgICAgICAxNFUKKyNkZWZpbmUgRE1BX1JFUVVFU1RfMTUgICAgICAgICAgICAgICAgICAgMTVVCisKKyNkZWZpbmUgSVNfRE1BX0FMTF9SRVFVRVNUKFJFUVVFU1QpICgoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzEwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBETUFfUkVRVUVTVF8xMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRE1BX1JFUVVFU1RfMTMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IERNQV9SRVFVRVNUXzE0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBETUFfUkVRVUVTVF8xNSkpCisKKyNlbmRpZiAvKiAoU1RNMzJMMDMxeHgpIHx8IChTVE0zMkwwNTF4eCkgfHwgKFNUTTMyTDA1Mnh4KSB8fCAoU1RNMzJMMDUzeHgpIHx8IChTVE0zMkwwNzF4eCkgfHwgKFNUTTMyTDA3Mnh4KSB8fCAoU1RNMzJMMDczeHgpICovCisKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9EYXRhX3RyYW5zZmVyX2RpcmVjdGlvbiBETUEgRGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBETUFfUEVSSVBIX1RPX01FTU9SWSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IFBlcmlwaGVyYWwgdG8gbWVtb3J5IGRpcmVjdGlvbiAqLworI2RlZmluZSBETUFfTUVNT1JZX1RPX1BFUklQSCAgICAgICAgIERNQV9DQ1JfRElSICAgICAgICAvKiE8IE1lbW9yeSB0byBwZXJpcGhlcmFsIGRpcmVjdGlvbiAqLworI2RlZmluZSBETUFfTUVNT1JZX1RPX01FTU9SWSAgICAgICAgIERNQV9DQ1JfTUVNMk1FTSAgICAvKiE8IE1lbW9yeSB0byBtZW1vcnkgZGlyZWN0aW9uICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfUGVyaXBoZXJhbF9pbmNyZW1lbnRlZF9tb2RlIERNQSBQZXJpcGhlcmFsIGluY3JlbWVudGVkIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfUElOQ19FTkFCTEUgICAgICAgICAgICAgIERNQV9DQ1JfUElOQyAgLyohPCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlIEVuYWJsZSAqLworI2RlZmluZSBETUFfUElOQ19ESVNBQkxFICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgLyohPCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlIERpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX01lbW9yeV9pbmNyZW1lbnRlZF9tb2RlIERNQSBNZW1vcnkgaW5jcmVtZW50ZWQgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIERNQV9NSU5DX0VOQUJMRSAgICAgICAgICAgICAgRE1BX0NDUl9NSU5DICAgLyohPCBNZW1vcnkgaW5jcmVtZW50IG1vZGUgRW5hYmxlICAqLworI2RlZmluZSBETUFfTUlOQ19ESVNBQkxFICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgIC8qITwgTWVtb3J5IGluY3JlbWVudCBtb2RlIERpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX1BlcmlwaGVyYWxfZGF0YV9zaXplIERNQSBQZXJpcGhlcmFsIGRhdGEgc2l6ZQorICAqIEB7CisgICovCisjZGVmaW5lIERNQV9QREFUQUFMSUdOX0JZVEUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEJ5dGUgICAgICovCisjZGVmaW5lIERNQV9QREFUQUFMSUdOX0hBTEZXT1JEICAgICAgRE1BX0NDUl9QU0laRV8wIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEhhbGZXb3JkICovCisjZGVmaW5lIERNQV9QREFUQUFMSUdOX1dPUkQgICAgICAgICAgRE1BX0NDUl9QU0laRV8xIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9NZW1vcnlfZGF0YV9zaXplIERNQSBNZW1vcnkgZGF0YSBzaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX01EQVRBQUxJR05fQllURSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLworI2RlZmluZSBETUFfTURBVEFBTElHTl9IQUxGV09SRCAgICAgIERNQV9DQ1JfTVNJWkVfMCAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IEhhbGZXb3JkICovCisjZGVmaW5lIERNQV9NREFUQUFMSUdOX1dPUkQgICAgICAgICAgRE1BX0NDUl9NU0laRV8xIC8qITwgTWVtb3J5IGRhdGEgYWxpZ25tZW50IDogV29yZCAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX21vZGUgRE1BIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfTk9STUFMICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAvKiE8IE5vcm1hbCBtb2RlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0NJUkNVTEFSICAgICAgICAgICAgICAgICBETUFfQ0NSX0NJUkMgICAgLyohPCBDaXJjdWxhciBtb2RlICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9Qcmlvcml0eV9sZXZlbCBETUEgUHJpb3JpdHkgbGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfUFJJT1JJVFlfTE9XICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IExvdyAgICAgICAqLworI2RlZmluZSBETUFfUFJJT1JJVFlfTUVESVVNICAgICAgICAgIERNQV9DQ1JfUExfMCAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IE1lZGl1bSAgICAqLworI2RlZmluZSBETUFfUFJJT1JJVFlfSElHSCAgICAgICAgICAgIERNQV9DQ1JfUExfMSAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IEhpZ2ggICAgICAqLworI2RlZmluZSBETUFfUFJJT1JJVFlfVkVSWV9ISUdIICAgICAgIERNQV9DQ1JfUEwgICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IFZlcnlfSGlnaCAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIERNQV9pbnRlcnJ1cHRfZW5hYmxlX2RlZmluaXRpb25zIERNQSBpbnRlcnJ1cHQgZW5hYmxlIGRlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX0lUX1RDICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfVENJRQorI2RlZmluZSBETUFfSVRfSFQgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9IVElFCisjZGVmaW5lIERNQV9JVF9URSAgICAgICAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1RFSUUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX2ZsYWdfZGVmaW5pdGlvbnMgRE1BIGZsYWcgZGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfRkxBR19HTDEgICAgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUYxCisjZGVmaW5lIERNQV9GTEFHX1RDMSAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUYxCisjZGVmaW5lIERNQV9GTEFHX0hUMSAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUYxCisjZGVmaW5lIERNQV9GTEFHX1RFMSAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUYxCisjZGVmaW5lIERNQV9GTEFHX0dMMiAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjIKKyNkZWZpbmUgRE1BX0ZMQUdfVEMyICAgICAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjIKKyNkZWZpbmUgRE1BX0ZMQUdfSFQyICAgICAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjIKKyNkZWZpbmUgRE1BX0ZMQUdfVEUyICAgICAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjIKKyNkZWZpbmUgRE1BX0ZMQUdfR0wzICAgICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGMworI2RlZmluZSBETUFfRkxBR19UQzMgICAgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGMworI2RlZmluZSBETUFfRkxBR19IVDMgICAgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGMworI2RlZmluZSBETUFfRkxBR19URTMgICAgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGMworI2RlZmluZSBETUFfRkxBR19HTDQgICAgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUY0CisjZGVmaW5lIERNQV9GTEFHX1RDNCAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUY0CisjZGVmaW5lIERNQV9GTEFHX0hUNCAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUY0CisjZGVmaW5lIERNQV9GTEFHX1RFNCAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY0CisjZGVmaW5lIERNQV9GTEFHX0dMNSAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjUKKyNkZWZpbmUgRE1BX0ZMQUdfVEM1ICAgICAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjUKKyNkZWZpbmUgRE1BX0ZMQUdfSFQ1ICAgICAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjUKKyNkZWZpbmUgRE1BX0ZMQUdfVEU1ICAgICAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjUKKyNkZWZpbmUgRE1BX0ZMQUdfR0w2ICAgICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGNgorI2RlZmluZSBETUFfRkxBR19UQzYgICAgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNgorI2RlZmluZSBETUFfRkxBR19IVDYgICAgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGNgorI2RlZmluZSBETUFfRkxBR19URTYgICAgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGNgorI2RlZmluZSBETUFfRkxBR19HTDcgICAgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUY3CisjZGVmaW5lIERNQV9GTEFHX1RDNyAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUY3CisjZGVmaW5lIERNQV9GTEFHX0hUNyAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUY3CisjZGVmaW5lIERNQV9GTEFHX1RFNyAgICAgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY3CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfTWFjcm9zIERNQSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBETUEgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXzogRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9ETUFfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRVNFVCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX186IERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiB8PSAgRE1BX0NDUl9FTikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgJj0gIH5ETUFfQ0NSX0VOKQorCisKKy8qIEludGVycnVwdCAmIEZsYWcgbWFuYWdlbWVudCAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXzogRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIGluZGV4LgorICAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJMMDEweDQpIHx8IGRlZmluZWQgKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMjF4eCkKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9UQ19GTEFHX0lOREVYKF9fSEFORExFX18pIFwKKygoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKT8gRE1BX0ZMQUdfVEMxIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSk/IERNQV9GTEFHX1RDMiA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpPyBETUFfRkxBR19UQzMgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKT8gRE1BX0ZMQUdfVEM0IDpcCisgRE1BX0ZMQUdfVEM1KQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9UQ19GTEFHX0lOREVYKF9fSEFORExFX18pIFwKKygoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKT8gRE1BX0ZMQUdfVEMxIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSk/IERNQV9GTEFHX1RDMiA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpPyBETUFfRkxBR19UQzMgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKT8gRE1BX0ZMQUdfVEM0IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSk/IERNQV9GTEFHX1RDNSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpPyBETUFfRkxBR19UQzYgOlwKKyAgIERNQV9GTEFHX1RDNykKKyNlbmRpZgorLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXzogRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgaW5kZXguCisgICovCisjaWYgZGVmaW5lZCAoU1RNMzJMMDEweDQpIHx8IGRlZmluZWQgKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMjF4eCkKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9IVF9GTEFHX0lOREVYKF9fSEFORExFX18pXAorKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpPyBETUFfRkxBR19IVDEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfSFQyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSk/IERNQV9GTEFHX0hUMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpPyBETUFfRkxBR19IVDQgOlwKKyBETUFfRkxBR19IVDUpCisjZWxzZQorI2RlZmluZSBfX0hBTF9ETUFfR0VUX0hUX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX0hUMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19IVDIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfSFQzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX0hUNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpPyBETUFfRkxBR19IVDUgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfSFQ2IDpcCisgICBETUFfRkxBR19IVDcpCisjZW5kaWYKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBUaGUgc3BlY2lmaWVkIHRyYW5zZmVyIGVycm9yIGZsYWcgaW5kZXguCisgICovCisjaWYgZGVmaW5lZCAoU1RNMzJMMDEweDQpIHx8IGRlZmluZWQgKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMjF4eCkKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9URV9GTEFHX0lOREVYKF9fSEFORExFX18pXAorKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpPyBETUFfRkxBR19URTEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfVEUyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSk/IERNQV9GTEFHX1RFMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpPyBETUFfRkxBR19URTQgOlwKKyBETUFfRkxBR19URTUpCisjZWxzZQorI2RlZmluZSBfX0hBTF9ETUFfR0VUX1RFX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX1RFMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19URTIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfVEUzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX1RFNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpPyBETUFfRkxBR19URTUgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfVEU2IDpcCisgICBETUFfRkxBR19URTcpCisjZW5kaWYKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCBHbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIFRoZSBzcGVjaWZpZWQgdHJhbnNmZXIgZXJyb3IgZmxhZyBpbmRleC4KKyAgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwMTB4NCkgfHwgZGVmaW5lZCAoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2RlZmluZSBfX0hBTF9ETUFfR0VUX0dJX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9JU1JfR0lGMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfSVNSX0dJRjIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0lTUl9HSUYzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9JU1JfR0lGNCA6XAorICAgRE1BX0lTUl9HSUY1KQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9HSV9GTEFHX0lOREVYKF9fSEFORExFX18pXAorKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpPyBETUFfSVNSX0dJRjEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0lTUl9HSUYyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSk/IERNQV9JU1JfR0lGMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpPyBETUFfSVNSX0dJRjQgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKT8gRE1BX0lTUl9HSUY1IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSk/IERNQV9JU1JfR0lGNiA6XAorICAgRE1BX0lTUl9HSUY3KQorI2VuZGlmCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgRE1BIENoYW5uZWwgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gR2V0IHRoZSBzcGVjaWZpZWQgZmxhZy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19UQ0lGeDogIFRyYW5zZmVyIGNvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfSFRJRng6ICBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfVEVJRng6ICBUcmFuc2ZlciBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9JU1JfR0lGeDogR2xvYmFsIGludGVycnVwdCBmbGFnCisgICogICAgICAgICBXaGVyZSB4IGNhbiBiZSAwXzQsIDFfNSwgMl82IG9yIDNfNyB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsIGZsYWcuCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgRkxBRyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoRE1BMS0+SVNSICYgKF9fRkxBR19fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhcnMgdGhlIERNQSBDaGFubmVsIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19UQ3g6ICBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0hUeDogIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19URXg6ICBUcmFuc2ZlciBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0dMeDogIEdsb2JhbCBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgV2hlcmUgeCBjYW4gYmUgMF80LCAxXzUsIDJfNiBvciAzXzcgdG8gc2VsZWN0IHRoZSBETUEgQ2hhbm5lbCBmbGFnLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9ETUFfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKERNQTEtPklGQ1IgPSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBETUEgaGFuZGxlCisgICogQHBhcmFtIF9fSU5URVJSVVBUX186IHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RDOiAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUOiAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaworICAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEU6ICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9ETUFfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBETUEgaGFuZGxlCisgICogQHBhcmFtIF9fSU5URVJSVVBUX186IHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RDOiAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUOiAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaworICAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEU6ICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9ETUFfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBETUEgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fOiBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERNQV9JVF9UQzogIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrCisgICogICAgICAgICAgICBAYXJnIERNQV9JVF9IVDogIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RFOiAgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0IG1hc2sKKyAgKiBAcmV0dmFsIFRoZSBzdGF0ZSBvZiBETUFfSVQgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiAmIChfX0lOVEVSUlVQVF9fKSkpCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgdHJhbnNmZXIuCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBETUEgaGFuZGxlCisgICogQHJldHZhbCBUaGUgbnVtYmVyIG9mIHJlbWFpbmluZyBkYXRhIHVuaXRzIGluIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIHRyYW5zZmVyLgorICAqLworI2RlZmluZSBfX0hBTF9ETUFfR0VUX0NPVU5URVIoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNORFRSKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9Jbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfRGVJbml0IChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfU3RhcnQgKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfU3RhcnRfSVQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0Fib3J0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUG9sbEZvclRyYW5zZmVyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0xldmVsQ29tcGxldGVUeXBlRGVmIENvbXBsZXRlTGV2ZWwsIHVpbnQzMl90IFRpbWVvdXQpOwordm9pZCBIQUxfRE1BX0lSUUhhbmRsZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9SZWdpc3RlckNhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHZvaWQgKCogcENhbGxiYWNrKSggRE1BX0hhbmRsZVR5cGVEZWYgKiBfaGRtYSkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9VblJlZ2lzdGVyQ2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX0RNQV9TdGF0ZVR5cGVEZWYgSEFMX0RNQV9HZXRTdGF0ZShETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfRE1BX0dldEVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBEZWZpbmUgdGhlIHByaXZhdGUgZ3JvdXAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIERNQV9Qcml2YXRlIERNQSBQcml2YXRlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19ETUFfRElSRUNUSU9OKERJUkVDVElPTikgKCgoRElSRUNUSU9OKSA9PSBETUFfUEVSSVBIX1RPX01FTU9SWSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJUkVDVElPTikgPT0gRE1BX01FTU9SWV9UT19QRVJJUEgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVJFQ1RJT04pID09IERNQV9NRU1PUllfVE9fTUVNT1JZKSkKKworI2RlZmluZSBJU19ETUFfQlVGRkVSX1NJWkUoU0laRSkgKCgoU0laRSkgPj0gMHgxVSkgJiYgKChTSVpFKSA8IDB4MTAwMDBVKSkKKworI2RlZmluZSBJU19ETUFfUEVSSVBIRVJBTF9JTkNfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBETUFfUElOQ19FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gRE1BX1BJTkNfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfRE1BX01FTU9SWV9JTkNfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBETUFfTUlOQ19FTkFCTEUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gRE1BX01JTkNfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfRE1BX1BFUklQSEVSQUxfREFUQV9TSVpFKFNJWkUpICgoKFNJWkUpID09IERNQV9QREFUQUFMSUdOX0JZVEUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBETUFfUERBVEFBTElHTl9IQUxGV09SRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRE1BX1BEQVRBQUxJR05fV09SRCkpCisKKyNkZWZpbmUgSVNfRE1BX01FTU9SWV9EQVRBX1NJWkUoU0laRSkgKCgoU0laRSkgPT0gRE1BX01EQVRBQUxJR05fQllURSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRE1BX01EQVRBQUxJR05fV09SRCApKQorCisjZGVmaW5lIElTX0RNQV9NT0RFKE1PREUpICgoKE1PREUpID09IERNQV9OT1JNQUwgKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBETUFfQ0lSQ1VMQVIpKQorCisjZGVmaW5lIElTX0RNQV9QUklPUklUWShQUklPUklUWSkgKCgoUFJJT1JJVFkpID09IERNQV9QUklPUklUWV9MT1cgKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX01FRElVTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSSU9SSVRZKSA9PSBETUFfUFJJT1JJVFlfSElHSCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJJT1JJVFkpID09IERNQV9QUklPUklUWV9WRVJZX0hJR0gpKQorCisvKioKKyAgKiBAfQorICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9ETUFfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfZmlyZXdhbGwuaCBiL0luYy9zdG0zMmwweHhfaGFsX2ZpcmV3YWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhMzg3NgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX2ZpcmV3YWxsLmgKQEAgLTAsMCArMSwzNjggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2ZpcmV3YWxsLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEZJUkVXQUxMIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfRklSRVdBTExfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfRklSRVdBTExfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDExeHgpICYmICFkZWZpbmVkIChTVE0zMkwwMjF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAzMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDQxeHgpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGSVJFV0FMTCAgRklSRVdBTEwKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGSVJFV0FMTF9FeHBvcnRlZF9UeXBlcyBGSVJFV0FMTCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBGSVJFV0FMTCBJbml0aWFsaXphdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ29kZVNlZ21lbnRTdGFydEFkZHJlc3M7ICAgICAgICAvKiE8IFByb3RlY3RlZCBjb2RlIHNlZ21lbnQgc3RhcnQgYWRkcmVzcy4gVGhpcyB2YWx1ZSBpcyAyNC1iaXQgbG9uZywgdGhlIDggTFNCIGJpdHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCBhbmQgZm9yY2VkIHRvIDAgaW4gb3JkZXIgdG8gYWxsb3cgYSAyNTYtYnl0ZSBncmFudWxhcml0eS4gKi8KKworICB1aW50MzJfdCBDb2RlU2VnbWVudExlbmd0aDsgICAgICAgICAgICAgIC8qITwgUHJvdGVjdGVkIGNvZGUgc2VnbWVudCBsZW5ndGggaW4gYnl0ZXMuIFRoaXMgdmFsdWUgaXMgMjItYml0IGxvbmcsIHRoZSA4IExTQiBiaXRzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgYW5kIGZvcmNlZCB0byAwIGZvciB0aGUgbGVuZ3RoIHRvIGJlIGEgbXVsdGlwbGUgb2YgMjU2IGJ5dGVzLiAqLworCisgIHVpbnQzMl90IE5vblZEYXRhU2VnbWVudFN0YXJ0QWRkcmVzczsgICAgLyohPCBQcm90ZWN0ZWQgbm9uLXZvbGF0aWxlIGRhdGEgc2VnbWVudCBzdGFydCBhZGRyZXNzLiBUaGlzIHZhbHVlIGlzIDI0LWJpdCBsb25nLCB0aGUgOCBMU0IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgYXJlIHJlc2VydmVkIGFuZCBmb3JjZWQgdG8gMCBpbiBvcmRlciB0byBhbGxvdyBhIDI1Ni1ieXRlIGdyYW51bGFyaXR5LiAqLworCisgIHVpbnQzMl90IE5vblZEYXRhU2VnbWVudExlbmd0aDsgICAgICAgICAgLyohPCBQcm90ZWN0ZWQgbm9uLXZvbGF0aWxlIGRhdGEgc2VnbWVudCBsZW5ndGggaW4gYnl0ZXMuIFRoaXMgdmFsdWUgaXMgMjItYml0IGxvbmcsIHRoZSA4IExTQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyBhcmUgcmVzZXJ2ZWQgYW5kIGZvcmNlZCB0byAwIGZvciB0aGUgbGVuZ3RoIHRvIGJlIGEgbXVsdGlwbGUgb2YgMjU2IGJ5dGVzLiAqLworCisgIHVpbnQzMl90IFZEYXRhU2VnbWVudFN0YXJ0QWRkcmVzczsgICAgICAgLyohPCBQcm90ZWN0ZWQgdm9sYXRpbGUgZGF0YSBzZWdtZW50IHN0YXJ0IGFkZHJlc3MuIFRoaXMgdmFsdWUgaXMgMTctYml0IGxvbmcsIHRoZSA2IExTQiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgcmVzZXJ2ZWQgYW5kIGZvcmNlZCB0byAwIGluIG9yZGVyIHRvIGFsbG93IGEgNjQtYnl0ZSBncmFudWxhcml0eS4gKi8KKworICB1aW50MzJfdCBWRGF0YVNlZ21lbnRMZW5ndGg7ICAgICAgICAgICAgIC8qITwgUHJvdGVjdGVkIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBsZW5ndGggaW4gYnl0ZXMuIFRoaXMgdmFsdWUgaXMgMTctYml0IGxvbmcsIHRoZSA2IExTQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyBhcmUgcmVzZXJ2ZWQgYW5kIGZvcmNlZCB0byAwIGZvciB0aGUgbGVuZ3RoIHRvIGJlIGEgbXVsdGlwbGUgb2YgNjQgYnl0ZXMuICovCisKKyAgdWludDMyX3QgVm9sYXRpbGVEYXRhRXhlY3V0aW9uOyAgICAgICAgICAvKiE8IFNldCBWREUgYml0IHNwZWNpZnlpbmcgd2hldGhlciBvciBub3QgdGhlIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBjYW4gYmUgZXhlY3V0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBWRFMgPSAxIChzZXQgYnkgcGFyYW1ldGVyIFZvbGF0aWxlRGF0YVNoYXJlZCksIFZERSBiaXQgaGFzIG5vIG1lYW5pbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZJUkVXQUxMX1ZvbGF0aWxlRGF0YV9FeGVjdXRhYmxlICovCisKKyAgdWludDMyX3QgVm9sYXRpbGVEYXRhU2hhcmVkOyAgICAgICAgICAgICAvKiE8IFNldCBWRFMgYml0IGluIHNwZWNpZnlpbmcgd2hldGhlciBvciBub3QgdGhlIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBjYW4gYmUgc2hhcmVkIHdpdGggYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLXByb3RlY3RlZCBhcHBsaWNhdGlvbiBjb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGSVJFV0FMTF9Wb2xhdGlsZURhdGFfU2hhcmVkICovCisKK31GSVJFV0FMTF9Jbml0VHlwZURlZjsKKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZJUkVXQUxMX0V4cG9ydGVkX0NvbnN0YW50cyBGSVJFV0FMTCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZJUkVXQUxMX1ZvbGF0aWxlRGF0YV9FeGVjdXRhYmxlICAgRklSRVdBTEwgdm9sYXRpbGUgZGF0YSBzZWdtZW50IGV4ZWN1dGlvbiBzdGF0dXMKKyAgKiBAeworICAqLworI2RlZmluZSBGSVJFV0FMTF9WT0xBVElMRURBVEFfTk9UX0VYRUNVVEFCTEUgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwVSkKKyNkZWZpbmUgRklSRVdBTExfVk9MQVRJTEVEQVRBX0VYRUNVVEFCTEUgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUZXX0NSX1ZERSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRklSRVdBTExfVm9sYXRpbGVEYXRhX1NoYXJlZCAgRklSRVdBTEwgdm9sYXRpbGUgZGF0YSBzZWdtZW50IHNoYXJlIHN0YXR1cworICAqIEB7CisgICovCisjZGVmaW5lIEZJUkVXQUxMX1ZPTEFUSUxFREFUQV9OT1RfU0hBUkVEICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwVSkKKyNkZWZpbmUgRklSRVdBTExfVk9MQVRJTEVEQVRBX1NIQVJFRCAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClGV19DUl9WRFMpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZJUkVXQUxMX1ByZV9Bcm0gRklSRVdBTEwgcHJlIGFybSBzdGF0dXMKKyAgKiBAeworICAqLworI2RlZmluZSBGSVJFV0FMTF9QUkVfQVJNX1JFU0VUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMFUpCisjZGVmaW5lIEZJUkVXQUxMX1BSRV9BUk1fU0VUICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpRldfQ1JfRlBBKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRklSRVdBTExfUHJpdmF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIElTX0ZJUkVXQUxMX0NPREVfU0VHTUVOVF9BRERSRVNTKEFERFJFU1MpICAgICAgICAoKChBRERSRVNTKSA+PSBGTEFTSF9CQVNFKSAmJiAoKEFERFJFU1MpIDwgKEZMQVNIX0JBU0UgKyBGTEFTSF9TSVpFKSkpCisjZGVmaW5lIElTX0ZJUkVXQUxMX0NPREVfU0VHTUVOVF9MRU5HVEgoQUREUkVTUywgTEVOR1RIKSAoKChBRERSRVNTKSArIChMRU5HVEgpKSA8PSAoRkxBU0hfQkFTRSArIEZMQVNIX1NJWkUpKQorCisjZGVmaW5lIElTX0ZJUkVXQUxMX05PTlZPTEFUSUxFREFUQV9TRUdNRU5UX0FERFJFU1MoQUREUkVTUykgICAgICAgICgoKEFERFJFU1MpID49IEZMQVNIX0JBU0UpICYmICgoQUREUkVTUykgPCAoRkxBU0hfQkFTRSArIEZMQVNIX1NJWkUpKSkKKyNkZWZpbmUgSVNfRklSRVdBTExfTk9OVk9MQVRJTEVEQVRBX1NFR01FTlRfTEVOR1RIKEFERFJFU1MsIExFTkdUSCkgKCgoQUREUkVTUykgKyAoTEVOR1RIKSkgPD0gKEZMQVNIX0JBU0UgKyBGTEFTSF9TSVpFKSkKKworI2RlZmluZSBJU19GSVJFV0FMTF9WT0xBVElMRURBVEFfU0VHTUVOVF9BRERSRVNTKEFERFJFU1MpICAgICAgICAoKChBRERSRVNTKSA+PSBTUkFNX0JBU0UpICYmICgoQUREUkVTUykgPCAoU1JBTV9CQVNFICsgU1JBTV9TSVpFX01BWCkpKQorI2RlZmluZSBJU19GSVJFV0FMTF9WT0xBVElMRURBVEFfU0VHTUVOVF9MRU5HVEgoQUREUkVTUywgTEVOR1RIKSAoKChBRERSRVNTKSArIChMRU5HVEgpKSA8PSAoU1JBTV9CQVNFICsgU1JBTV9TSVpFX01BWCkpCisKKworI2RlZmluZSBJU19GSVJFV0FMTF9WT0xBVElMRURBVEFfU0hBUkUoU0hBUkUpICgoKFNIQVJFKSA9PSBGSVJFV0FMTF9WT0xBVElMRURBVEFfTk9UX1NIQVJFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNIQVJFKSA9PSBGSVJFV0FMTF9WT0xBVElMRURBVEFfU0hBUkVEKSkKKworI2RlZmluZSBJU19GSVJFV0FMTF9WT0xBVElMRURBVEFfRVhFQ1VURShFWEVDVVRFKSAoKChFWEVDVVRFKSA9PSBGSVJFV0FMTF9WT0xBVElMRURBVEFfTk9UX0VYRUNVVEFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVhFQ1VURSkgPT0gRklSRVdBTExfVk9MQVRJTEVEQVRBX0VYRUNVVEFCTEUpKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGSVJFV0FMTF9FeHBvcnRlZF9NYWNyb3MgRklSRVdBTEwgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgRklSRVdBTEwgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHJldHZhbCBGSVJFV0FMTCBlbmFibGluZyBzdGF0dXMgKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSAgX19IQUxfRklSRVdBTExfSVNfRU5BQkxFRCgpICBIQUxfSVNfQklUX0NMUihTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfRldESVNFTikKKworCisvKiogQGJyaWVmIEVuYWJsZSBGSVJFV0FMTCBwcmUgYXJtLgorICAqIEBub3RlIFdoZW4gRlBBIGJpdCBpcyBzZXQsIGFueSBjb2RlIGV4ZWN1dGVkIG91dHNpZGUgdGhlIHByb3RlY3RlZCBzZWdtZW50CisgICogICAgICAgY2xvc2VzIHRoZSBGaXJld2FsbCwgb3RoZXJ3aXNlIGl0IGdlbmVyYXRlcyBhIHN5c3RlbSByZXNldC4KKyAgKiBAbm90ZSBUaGlzIG1hY3JvIHByb3ZpZGVzIHRoZSBzYW1lIHNlcnZpY2UgYXMgSEFMX0ZJUkVXQUxMX0VuYWJsZVByZUFybUZsYWcoKSBBUEkKKyAgKiAgICAgICBidXQgY2FuIGJlIGV4ZWN1dGVkIGluc2lkZSBhIGNvZGUgYXJlYSBwcm90ZWN0ZWQgYnkgdGhlIEZpcmV3YWxsLgorICAqIEBub3RlIFRoaXMgbWFjcm8gY2FuIGJlIGV4ZWN1dGVkIHdoYXRldmVyIHRoZSBGaXJld2FsbCBzdGF0ZSAob3BlbmVkIG9yIGNsb3NlZCkgd2hlbgorICAqICAgICAgIE5WRFNMIHJlZ2lzdGVyIGlzIGVxdWFsIHRvIDAuIE90aGVyd2lzZSAod2hlbiBOVkRTTCByZWdpc3RlciBpcyBkaWZmZXJlbnQgZnJvbQorICAqICAgICAgIDAsIHRoYXQgaXMsIHdoZW4gdGhlIG5vbiB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgaXMgZGVmaW5lZCksIHRoZSBtYWNybyBjYW4gYmUKKyAgKiAgICAgICBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIEZpcmV3YWxsIGlzIG9wZW5lZC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRklSRVdBTExfUFJFQVJNX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFNFVF9CSVQoRklSRVdBTEwtPkNSLCBGV19DUl9GUEEpIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIC8qIFJlYWQgYml0IGJhY2sgdG8gZW5zdXJlIGl0IGlzIHRha2VuIGludG8gYWNjb3VudCBieSBQZXJpcGhlcmFsICovIFwKKyAgICAgICAgICAgICAgICAgIC8qIChpbnRyb2R1Y2UgcHJvcGVyIGRlbGF5IGluc2lkZSBtYWNybyBleGVjdXRpb24pICovICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKEZJUkVXQUxMLT5DUiwgRldfQ1JfRlBBKSA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKworCisvKiogQGJyaWVmIERpc2FibGUgRklSRVdBTEwgcHJlIGFybS4KKyAgKiBAbm90ZSBXaGVuIEZQQSBiaXQgaXMgc2V0LCBhbnkgY29kZSBleGVjdXRlZCBvdXRzaWRlIHRoZSBwcm90ZWN0ZWQgc2VnbWVudAorICAqICAgICAgIGNsb3NlcyB0aGUgRmlyZXdhbGwsIG90aGVyd2lzZSwgaXQgZ2VuZXJhdGVzIGEgc3lzdGVtIHJlc2V0LgorICAqIEBub3RlIFRoaXMgbWFjcm8gcHJvdmlkZXMgdGhlIHNhbWUgc2VydmljZSBhcyBIQUxfRklSRVdBTExfRGlzYWJsZVByZUFybUZsYWcoKSBBUEkKKyAgKiAgICAgICBidXQgY2FuIGJlIGV4ZWN1dGVkIGluc2lkZSBhIGNvZGUgYXJlYSBwcm90ZWN0ZWQgYnkgdGhlIEZpcmV3YWxsLgorICAqIEBub3RlIFRoaXMgbWFjcm8gY2FuIGJlIGV4ZWN1dGVkIHdoYXRldmVyIHRoZSBGaXJld2FsbCBzdGF0ZSAob3BlbmVkIG9yIGNsb3NlZCkgd2hlbgorICAqICAgICAgIE5WRFNMIHJlZ2lzdGVyIGlzIGVxdWFsIHRvIDAuIE90aGVyd2lzZSAod2hlbiBOVkRTTCByZWdpc3RlciBpcyBkaWZmZXJlbnQgZnJvbQorICAqICAgICAgIDAsIHRoYXQgaXMsIHdoZW4gdGhlIG5vbiB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgaXMgZGVmaW5lZCksIHRoZSBtYWNybyBjYW4gYmUKKyAgKiAgICAgICBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIEZpcmV3YWxsIGlzIG9wZW5lZC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRklSRVdBTExfUFJFQVJNX0RJU0FCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIENMRUFSX0JJVChGSVJFV0FMTC0+Q1IsIEZXX0NSX0ZQQSkgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIC8qIFJlYWQgYml0IGJhY2sgdG8gZW5zdXJlIGl0IGlzIHRha2VuIGludG8gYWNjb3VudCBieSBQZXJpcGhlcmFsICovIFwKKyAgICAgICAgICAgICAgICAgIC8qIChpbnRyb2R1Y2UgcHJvcGVyIGRlbGF5IGluc2lkZSBtYWNybyBleGVjdXRpb24pICovICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKEZJUkVXQUxMLT5DUiwgRldfQ1JfRlBBKSA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKiBAYnJpZWYgRW5hYmxlIHZvbGF0aWxlIGRhdGEgc2hhcmluZyBpbiBzZXR0aW5nIFZEUyBiaXQuCisgICogQG5vdGUgV2hlbiBWRFMgYml0IGlzIHNldCwgdGhlIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBpcyBzaGFyZWQgd2l0aCBub24tcHJvdGVjdGVkCisgICogICAgICAgYXBwbGljYXRpb24gY29kZS4gSXQgY2FuIGJlIGFjY2Vzc2VkIHdoYXRldmVyIHRoZSBGaXJld2FsbCBzdGF0ZSAob3BlbmVkIG9yIGNsb3NlZCkuCisgICogQG5vdGUgVGhpcyBtYWNybyBjYW4gYmUgZXhlY3V0ZWQgaW5zaWRlIGEgY29kZSBhcmVhIHByb3RlY3RlZCBieSB0aGUgRmlyZXdhbGwuCisgICogQG5vdGUgVGhpcyBtYWNybyBjYW4gYmUgZXhlY3V0ZWQgd2hhdGV2ZXIgdGhlIEZpcmV3YWxsIHN0YXRlIChvcGVuZWQgb3IgY2xvc2VkKSB3aGVuCisgICogICAgICAgTlZEU0wgcmVnaXN0ZXIgaXMgZXF1YWwgdG8gMC4gT3RoZXJ3aXNlICh3aGVuIE5WRFNMIHJlZ2lzdGVyIGlzIGRpZmZlcmVudCBmcm9tCisgICogICAgICAgMCwgdGhhdCBpcywgd2hlbiB0aGUgbm9uIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBpcyBkZWZpbmVkKSwgdGhlIG1hY3JvIGNhbiBiZQorICAqICAgICAgIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgRmlyZXdhbGwgaXMgb3BlbmVkLgorICAqLworI2RlZmluZSBfX0hBTF9GSVJFV0FMTF9WT0xBVElMRURBVEFfU0hBUkVEX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgU0VUX0JJVChGSVJFV0FMTC0+Q1IsIEZXX0NSX1ZEUykgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgLyogUmVhZCBiaXQgYmFjayB0byBlbnN1cmUgaXQgaXMgdGFrZW4gaW50byBhY2NvdW50IGJ5IFBlcmlwaGVyYWwgKi8gXAorICAgICAgICAgICAgICAgICAgLyogKGludHJvZHVjZSBwcm9wZXIgZGVsYXkgaW5zaWRlIG1hY3JvIGV4ZWN1dGlvbikgKi8gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoRklSRVdBTEwtPkNSLCBGV19DUl9WRFMpIDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqIEBicmllZiBEaXNhYmxlIHZvbGF0aWxlIGRhdGEgc2hhcmluZyBpbiByZXNldHRpbmcgVkRTIGJpdC4KKyAgKiBAbm90ZSBXaGVuIFZEUyBiaXQgaXMgcmVzZXQsIHRoZSB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgaXMgbm90IHNoYXJlZCBhbmQgY2Fubm90IGJlCisgICogICAgICAgaGl0IGJ5IGEgbm9uIHByb3RlY3RlZCBleGVjdXRhYmxlIGNvZGUgd2hlbiB0aGUgRmlyZXdhbGwgaXMgY2xvc2VkLiBJZiBpdCBpcworICAqICAgICAgIGFjY2Vzc2VkIGluIHN1Y2ggYSBjb25kaXRpb24sIGEgc3lzdGVtIHJlc2V0IGlzIGdlbmVyYXRlZCBieSB0aGUgRmlyZXdhbGwuCisgICogQG5vdGUgVGhpcyBtYWNybyBjYW4gYmUgZXhlY3V0ZWQgaW5zaWRlIGEgY29kZSBhcmVhIHByb3RlY3RlZCBieSB0aGUgRmlyZXdhbGwuCisgICogQG5vdGUgVGhpcyBtYWNybyBjYW4gYmUgZXhlY3V0ZWQgd2hhdGV2ZXIgdGhlIEZpcmV3YWxsIHN0YXRlIChvcGVuZWQgb3IgY2xvc2VkKSB3aGVuCisgICogICAgICAgTlZEU0wgcmVnaXN0ZXIgaXMgZXF1YWwgdG8gMC4gT3RoZXJ3aXNlICh3aGVuIE5WRFNMIHJlZ2lzdGVyIGlzIGRpZmZlcmVudCBmcm9tCisgICogICAgICAgMCwgdGhhdCBpcywgd2hlbiB0aGUgbm9uIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBpcyBkZWZpbmVkKSwgdGhlIG1hY3JvIGNhbiBiZQorICAqICAgICAgIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgRmlyZXdhbGwgaXMgb3BlbmVkLgorICAqLworI2RlZmluZSBfX0hBTF9GSVJFV0FMTF9WT0xBVElMRURBVEFfU0hBUkVEX0RJU0FCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKEZJUkVXQUxMLT5DUiwgRldfQ1JfVkRTKSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgLyogUmVhZCBiaXQgYmFjayB0byBlbnN1cmUgaXQgaXMgdGFrZW4gaW50byBhY2NvdW50IGJ5IFBlcmlwaGVyYWwgKi8gXAorICAgICAgICAgICAgICAgICAgLyogKGludHJvZHVjZSBwcm9wZXIgZGVsYXkgaW5zaWRlIG1hY3JvIGV4ZWN1dGlvbikgKi8gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoRklSRVdBTEwtPkNSLCBGV19DUl9WRFMpIDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqIEBicmllZiBFbmFibGUgdm9sYXRpbGUgZGF0YSBleGVjdXRpb24gaW4gc2V0dGluZyBWREUgYml0LgorICAqIEBub3RlIFZERSBiaXQgaXMgaWdub3JlZCB3aGVuIFZEUyBpcyBzZXQuIElGIFZEUyA9IDEsIHRoZSBWb2xhdGlsZSBkYXRhIHNlZ21lbnQgY2FuIGJlCisgICogICAgICAgZXhlY3V0ZWQgd2hhdGV2ZXIgdGhlIFZERSBiaXQgdmFsdWUuCisgICogQG5vdGUgV2hlbiBWREUgYml0IGlzIHNldCAod2l0aCBWRFMgPSAwKSwgdGhlIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBpcyBleGVjdXRhYmxlLiBXaGVuCisgICogICAgICAgdGhlIEZpcmV3YWxsIGNhbGwgaXMgY2xvc2VkLCBhICJjYWxsIGdhdGUiIGVudHJ5IHByb2NlZHVyZSBpcyByZXF1aXJlZCB0byBvcGVuCisgICogICAgICAgZmlyc3QgdGhlIEZpcmV3YWxsLgorICAqIEBub3RlIFRoaXMgbWFjcm8gY2FuIGJlIGV4ZWN1dGVkIGluc2lkZSBhIGNvZGUgYXJlYSBwcm90ZWN0ZWQgYnkgdGhlIEZpcmV3YWxsLgorICAqIEBub3RlIFRoaXMgbWFjcm8gY2FuIGJlIGV4ZWN1dGVkIHdoYXRldmVyIHRoZSBGaXJld2FsbCBzdGF0ZSAob3BlbmVkIG9yIGNsb3NlZCkgd2hlbgorICAqICAgICAgIE5WRFNMIHJlZ2lzdGVyIGlzIGVxdWFsIHRvIDAuIE90aGVyd2lzZSAod2hlbiBOVkRTTCByZWdpc3RlciBpcyBkaWZmZXJlbnQgZnJvbQorICAqICAgICAgIDAsIHRoYXQgaXMsIHdoZW4gdGhlIG5vbiB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgaXMgZGVmaW5lZCksIHRoZSBtYWNybyBjYW4gYmUKKyAgKiAgICAgICBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIEZpcmV3YWxsIGlzIG9wZW5lZC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRklSRVdBTExfVk9MQVRJTEVEQVRBX0VYRUNVVElPTl9FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFNFVF9CSVQoRklSRVdBTEwtPkNSLCBGV19DUl9WREUpIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIC8qIFJlYWQgYml0IGJhY2sgdG8gZW5zdXJlIGl0IGlzIHRha2VuIGludG8gYWNjb3VudCBieSBQZXJpcGhlcmFsICovIFwKKyAgICAgICAgICAgICAgICAgIC8qIChpbnRyb2R1Y2UgcHJvcGVyIGRlbGF5IGluc2lkZSBtYWNybyBleGVjdXRpb24pICovICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKEZJUkVXQUxMLT5DUiwgRldfQ1JfVkRFKSA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKiBAYnJpZWYgRGlzYWJsZSB2b2xhdGlsZSBkYXRhIGV4ZWN1dGlvbiBpbiByZXNldHRpbmcgVkRFIGJpdC4KKyAgKiBAbm90ZSBWREUgYml0IGlzIGlnbm9yZWQgd2hlbiBWRFMgaXMgc2V0LiBJRiBWRFMgPSAxLCB0aGUgVm9sYXRpbGUgZGF0YSBzZWdtZW50IGNhbiBiZQorICAqICAgICAgIGV4ZWN1dGVkIHdoYXRldmVyIHRoZSBWREUgYml0IHZhbHVlLgorICAqIEBub3RlIFdoZW4gVkRFIGJpdCBpcyByZXNldCAod2l0aCBWRFMgPSAwKSwgdGhlIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBjYW5ub3QgIGJlIGV4ZWN1dGVkLgorICAqIEBub3RlIFRoaXMgbWFjcm8gY2FuIGJlIGV4ZWN1dGVkIGluc2lkZSBhIGNvZGUgYXJlYSBwcm90ZWN0ZWQgYnkgdGhlIEZpcmV3YWxsLgorICAqIEBub3RlIFRoaXMgbWFjcm8gY2FuIGJlIGV4ZWN1dGVkIHdoYXRldmVyIHRoZSBGaXJld2FsbCBzdGF0ZSAob3BlbmVkIG9yIGNsb3NlZCkgd2hlbgorICAqICAgICAgIE5WRFNMIHJlZ2lzdGVyIGlzIGVxdWFsIHRvIDAuIE90aGVyd2lzZSAod2hlbiBOVkRTTCByZWdpc3RlciBpcyBkaWZmZXJlbnQgZnJvbQorICAqICAgICAgIDAsIHRoYXQgaXMsIHdoZW4gdGhlIG5vbiB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgaXMgZGVmaW5lZCksIHRoZSBtYWNybyBjYW4gYmUKKyAgKiAgICAgICBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIEZpcmV3YWxsIGlzIG9wZW5lZC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRklSRVdBTExfVk9MQVRJTEVEQVRBX0VYRUNVVElPTl9ESVNBQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIENMRUFSX0JJVChGSVJFV0FMTC0+Q1IsIEZXX0NSX1ZERSkgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIC8qIFJlYWQgYml0IGJhY2sgdG8gZW5zdXJlIGl0IGlzIHRha2VuIGludG8gYWNjb3VudCBieSBQZXJpcGhlcmFsICovIFwKKyAgICAgICAgICAgICAgICAgIC8qIChpbnRyb2R1Y2UgcHJvcGVyIGRlbGF5IGluc2lkZSBtYWNybyBleGVjdXRpb24pICovICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKEZJUkVXQUxMLT5DUiwgRldfQ1JfVkRFKSA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKworLyoqIEBicmllZiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdm9sYXRpbGUgZGF0YSBzZWdtZW50IGlzIHNoYXJlZC4KKyAgKiBAbm90ZSBUaGlzIG1hY3JvIGNhbiBiZSBleGVjdXRlZCBpbnNpZGUgYSBjb2RlIGFyZWEgcHJvdGVjdGVkIGJ5IHRoZSBGaXJld2FsbC4KKyAgKiBAbm90ZSBUaGlzIG1hY3JvIGNhbiBiZSBleGVjdXRlZCB3aGF0ZXZlciB0aGUgRmlyZXdhbGwgc3RhdGUgKG9wZW5lZCBvciBjbG9zZWQpIHdoZW4KKyAgKiAgICAgICBOVkRTTCByZWdpc3RlciBpcyBlcXVhbCB0byAwLiBPdGhlcndpc2UgKHdoZW4gTlZEU0wgcmVnaXN0ZXIgaXMgZGlmZmVyZW50IGZyb20KKyAgKiAgICAgICAwLCB0aGF0IGlzLCB3aGVuIHRoZSBub24gdm9sYXRpbGUgZGF0YSBzZWdtZW50IGlzIGRlZmluZWQpLCB0aGUgbWFjcm8gY2FuIGJlCisgICogICAgICAgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBGaXJld2FsbCBpcyBvcGVuZWQuCisgICogQHJldHZhbCBWRFMgYml0IHNldHRpbmcgc3RhdHVzIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRklSRVdBTExfR0VUX1ZPTEFUSUxFREFUQV9TSEFSRUQoKSAoKEZJUkVXQUxMLT5DUiAmIEZXX0NSX1ZEUykgPT0gRldfQ1JfVkRTKQorCisvKiogQGJyaWVmIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgaXMgZGVjbGFyZWQgZXhlY3V0YWJsZS4KKyAgKiBAbm90ZSBUaGlzIG1hY3JvIGNhbiBiZSBleGVjdXRlZCBpbnNpZGUgYSBjb2RlIGFyZWEgcHJvdGVjdGVkIGJ5IHRoZSBGaXJld2FsbC4KKyAgKiBAbm90ZSBUaGlzIG1hY3JvIGNhbiBiZSBleGVjdXRlZCB3aGF0ZXZlciB0aGUgRmlyZXdhbGwgc3RhdGUgKG9wZW5lZCBvciBjbG9zZWQpIHdoZW4KKyAgKiAgICAgICBOVkRTTCByZWdpc3RlciBpcyBlcXVhbCB0byAwLiBPdGhlcndpc2UgKHdoZW4gTlZEU0wgcmVnaXN0ZXIgaXMgZGlmZmVyZW50IGZyb20KKyAgKiAgICAgICAwLCB0aGF0IGlzLCB3aGVuIHRoZSBub24gdm9sYXRpbGUgZGF0YSBzZWdtZW50IGlzIGRlZmluZWQpLCB0aGUgbWFjcm8gY2FuIGJlCisgICogICAgICAgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBGaXJld2FsbCBpcyBvcGVuZWQuCisgICogQHJldHZhbCBWREUgYml0IHNldHRpbmcgc3RhdHVzIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRklSRVdBTExfR0VUX1ZPTEFUSUxFREFUQV9FWEVDVVRJT04oKSAoKEZJUkVXQUxMLT5DUiAmIEZXX0NSX1ZERSkgPT0gRldfQ1JfVkRFKQorCisvKiogQGJyaWVmIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBGaXJld2FsbCBwcmUgYXJtIGJpdCBpcyBzZXQuCisgICogQG5vdGUgVGhpcyBtYWNybyBjYW4gYmUgZXhlY3V0ZWQgaW5zaWRlIGEgY29kZSBhcmVhIHByb3RlY3RlZCBieSB0aGUgRmlyZXdhbGwuCisgICogQG5vdGUgVGhpcyBtYWNybyBjYW4gYmUgZXhlY3V0ZWQgd2hhdGV2ZXIgdGhlIEZpcmV3YWxsIHN0YXRlIChvcGVuZWQgb3IgY2xvc2VkKSB3aGVuCisgICogICAgICAgTlZEU0wgcmVnaXN0ZXIgaXMgZXF1YWwgdG8gMC4gT3RoZXJ3aXNlICh3aGVuIE5WRFNMIHJlZ2lzdGVyIGlzIGRpZmZlcmVudCBmcm9tCisgICogICAgICAgMCwgdGhhdCBpcywgd2hlbiB0aGUgbm9uIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBpcyBkZWZpbmVkKSwgdGhlIG1hY3JvIGNhbiBiZQorICAqICAgICAgIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgRmlyZXdhbGwgaXMgb3BlbmVkLgorICAqIEByZXR2YWwgRlBBIGJpdCBzZXR0aW5nIHN0YXR1cyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0ZJUkVXQUxMX0dFVF9QUkVBUk0oKSAoKEZJUkVXQUxMLT5DUiAmIEZXX0NSX0ZQQSkgPT0gRldfQ1JfRlBBKQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgRklSRVdBTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEZJUkVXQUxMIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRklSRVdBTExfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBGdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GSVJFV0FMTF9Db25maWcoRklSRVdBTExfSW5pdFR5cGVEZWYgKiBmd19pbml0KTsKK3ZvaWQgSEFMX0ZJUkVXQUxMX0dldENvbmZpZyhGSVJFV0FMTF9Jbml0VHlwZURlZiAqIGZ3X2NvbmZpZyk7Cit2b2lkIEhBTF9GSVJFV0FMTF9FbmFibGVGaXJld2FsbCh2b2lkKTsKK3ZvaWQgSEFMX0ZJUkVXQUxMX0VuYWJsZVByZUFybUZsYWcodm9pZCk7Cit2b2lkIEhBTF9GSVJFV0FMTF9EaXNhYmxlUHJlQXJtRmxhZyh2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qIERlZmluZSB0aGUgcHJpdmF0ZSBncm91cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgRklSRVdBTExfUHJpdmF0ZSBGSVJFV0FMTCBQcml2YXRlCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZCAoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkIChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAyMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDMxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwNDF4eCkgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0hBTF9GSVJFV0FMTF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9mbGFzaC5oIGIvSW5jL3N0bTMybDB4eF9oYWxfZmxhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTlmODU5Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfZmxhc2guaApAQCAtMCwwICsxLDM3OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfZmxhc2guaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRmxhc2ggSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfRkxBU0hfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfRkxBU0hfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSAorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX1RJTUVPVVRfVkFMVUUgICAgICAoNTAwMDBVKSAvKiA1MCBzICovCisjZGVmaW5lIEZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUiBGTEFTSFNJWkVfQkFTRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19GTEFTSF9UWVBFUFJPR1JBTShfVkFMVUVfKSAgICgoX1ZBTFVFXykgPT0gRkxBU0hfVFlQRVBST0dSQU1fV09SRCkKKworI2RlZmluZSBJU19GTEFTSF9MQVRFTkNZKF9fTEFURU5DWV9fKSAoKChfX0xBVEVOQ1lfXykgPT0gRkxBU0hfTEFURU5DWV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEFURU5DWV9fKSA9PSBGTEFTSF9MQVRFTkNZXzEpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9UeXBlcyBGTEFTSCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRkxBU0ggUHJvY2VkdXJlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgRkxBU0hfUFJPQ19OT05FICAgICAgICAgICAgICA9IDAsCisgIEZMQVNIX1BST0NfUEFHRUVSQVNFICAgICAgICAgPSAxLAorICBGTEFTSF9QUk9DX1BST0dSQU0gICAgICAgICAgID0gMiwKK30gRkxBU0hfUHJvY2VkdXJlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBGTEFTSCBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fSU8gRkxBU0hfUHJvY2VkdXJlVHlwZURlZiBQcm9jZWR1cmVPbkdvaW5nOyAvKiE8IEludGVybmFsIHZhcmlhYmxlIHRvIGluZGljYXRlIHdoaWNoIHByb2NlZHVyZSBpcyBvbmdvaW5nIG9yIG5vdCBpbiBJVCBjb250ZXh0ICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgIE5iUGFnZXNUb0VyYXNlOyAgIC8qITwgSW50ZXJuYWwgdmFyaWFibGUgdG8gc2F2ZSB0aGUgcmVtYWluaW5nIHNlY3RvcnMgdG8gZXJhc2UgaW4gSVQgY29udGV4dCovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgIEFkZHJlc3M7ICAgICAgICAgIC8qITwgSW50ZXJuYWwgdmFyaWFibGUgdG8gc2F2ZSBhZGRyZXNzIHNlbGVjdGVkIGZvciBwcm9ncmFtIG9yIGVyYXNlICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgIFBhZ2U7ICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgdmFyaWFibGUgdG8gZGVmaW5lIHRoZSBjdXJyZW50IHBhZ2Ugd2hpY2ggaXMgZXJhc2luZyAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiE8IEZMQVNIIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgIC8qITwgRkxBU0ggZXJyb3IgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIX0Vycm9yX0NvZGVzICAqLworfSBGTEFTSF9Qcm9jZXNzVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfQ29uc3RhbnRzIEZMQVNIIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXJyb3JfQ29kZXMgRkxBU0ggRXJyb3IgQ29kZXMKKyAgKiBAeworICAqLworCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9OT05FICAgICAgMHgwMFUgIC8qITwgTm8gZXJyb3IgKi8KKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1BHQSAgICAgICAweDAxVSAgLyohPCBQcm9ncmFtbWluZyBhbGlnbm1lbnQgZXJyb3IgKi8KKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1dSUCAgICAgICAweDAyVSAgLyohPCBXcml0ZSBwcm90ZWN0aW9uIGVycm9yICovCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9PUFRWICAgICAgMHgwNFUgIC8qITwgT3B0aW9uIHZhbGlkaXR5IGVycm9yICovCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9TSVpFICAgICAgMHgwOFUgIC8qITwgICovCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9SRCAgICAgICAgMHgxMFUgIC8qITwgUmVhZCBwcm90ZWN0ZWQgZXJyb3IgKi8KKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX0ZXV0VSUiAgICAweDIwVSAgLyohPCBGTEFTSCBXcml0ZSBvciBFcmFzZSBvcGVyYXRpb24gYWJvcnRlZCAqLworI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfTk9UWkVSTyAgIDB4NDBVICAvKiE8IEZMQVNIIFdyaXRlIG9wZXJhdGlvbiBpcyBkb25lIGluIGEgbm90LWVyYXNlZCByZWdpb24gKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9QYWdlX1NpemUgRkxBU0ggc2l6ZSBpbmZvcm1hdGlvbgorICAqIEB7CisgICovCisKKyNkZWZpbmUgRkxBU0hfU0laRSAgICAgICAgICAgICAgICAodWludDMyX3QpKCgqKCh1aW50MzJfdCAqKUZMQVNIU0laRV9CQVNFKSYweEZGRkYpICogMTAyNFUpCisjZGVmaW5lIEZMQVNIX1BBR0VfU0laRSAgICAgICAgICAgKCh1aW50MzJfdCkxMjhVKSAgLyohPCBGTEFTSCBQYWdlIFNpemUgaW4gYnl0ZXMgKi8KKworI2RlZmluZSBGTEFTSF9FTkQgICAgICAgICAgICAgICAgIChGTEFTSF9CQVNFICsgRkxBU0hfU0laRSAtIDEpICAgIC8qITwgRkxBU0ggZW5kIGFkZHJlc3MgaW4gdGhlIGFsaWFzIHJlZ2lvbiAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKyNkZWZpbmUgRkxBU0hfQkFOSzJfQkFTRSAgICAgICAgICAoRkxBU0hfQkFTRSArIChGTEFTSF9TSVpFID4+IDEpKSAvKiE8IEZMQVNIIEJBTksyIGJhc2UgYWRkcmVzcyBpbiB0aGUgYWxpYXMgcmVnaW9uICovCisjZGVmaW5lIEZMQVNIX0JBTksxX0VORCAgICAgICAgICAgKEZMQVNIX0JBTksyX0JBU0UgLSAxKSAgICAgICAgICAgLyohPCBQcm9ncmFtIGVuZCBGTEFTSCBCQU5LMSBhZGRyZXNzICovCisjZGVmaW5lIEZMQVNIX0JBTksyX0VORCAgICAgICAgICAgKEZMQVNIX0VORCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBQcm9ncmFtIGVuZCBGTEFTSCBCQU5LMiBhZGRyZXNzICovCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9UeXBlX1Byb2dyYW0gRkxBU0ggVHlwZSBQcm9ncmFtCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRkxBU0hfVFlQRVBST0dSQU1fV09SRCAgICAgICAoKHVpbnQzMl90KTB4MDJVKSAgLyohPFByb2dyYW0gYSB3b3JkICgzMi1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9MYXRlbmN5IEZMQVNIIExhdGVuY3kKKyAgKiBAeworICAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAvKiE8IEZMQVNIIFplcm8gTGF0ZW5jeSBjeWNsZSAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzEgICAgICAgICAgICBGTEFTSF9BQ1JfTEFURU5DWSAgICAgICAgIC8qITwgRkxBU0ggT25lIExhdGVuY3kgY3ljbGUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9JbnRlcnJ1cHRzIEZMQVNIIEludGVycnVwdHMKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZMQVNIX0lUX0VPUCAgICAgICAgICAgICAgIEZMQVNIX1BFQ1JfRU9QSUUgIC8qITwgRW5kIG9mIHByb2dyYW1taW5nIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgRkxBU0hfSVRfRVJSICAgICAgICAgICAgICAgRkxBU0hfUEVDUl9FUlJJRSAgLyohPCBFcnJvciBpbnRlcnJ1cHQgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0ZsYWdzIEZMQVNIIEZsYWdzCisgICogQHsKKyAgKi8KKworI2RlZmluZSBGTEFTSF9GTEFHX0JTWSAgICAgICAgICAgICBGTEFTSF9TUl9CU1kgICAgICAgIC8qITwgRkxBU0ggQnVzeSBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRU9QICAgICAgICAgICAgIEZMQVNIX1NSX0VPUCAgICAgICAgLyohPCBGTEFTSCBFbmQgb2YgUHJvZ3JhbW1pbmcgZmxhZyAqLworI2RlZmluZSBGTEFTSF9GTEFHX0VOREhWICAgICAgICAgICBGTEFTSF9TUl9IVk9GRiAgICAgIC8qITwgRkxBU0ggRW5kIG9mIEhpZ2ggVm9sdGFnZSBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfUkVBRFkgICAgICAgICAgIEZMQVNIX1NSX1JFQURZICAgICAgLyohPCBGTEFTSCBSZWFkeSBmbGFnIGFmdGVyIGxvdyBwb3dlciBtb2RlICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfV1JQRVJSICAgICAgICAgIEZMQVNIX1NSX1dSUEVSUiAgICAgLyohPCBGTEFTSCBXcml0ZSBwcm90ZWN0ZWQgZXJyb3IgZmxhZyAqLworI2RlZmluZSBGTEFTSF9GTEFHX1BHQUVSUiAgICAgICAgICBGTEFTSF9TUl9QR0FFUlIgICAgIC8qITwgRkxBU0ggUHJvZ3JhbW1pbmcgQWxpZ25tZW50IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19TSVpFUlIgICAgICAgICAgRkxBU0hfU1JfU0laRVJSICAgICAvKiE8IEZMQVNIIFNpemUgZXJyb3IgZmxhZyAgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19PUFRWRVJSICAgICAgICAgRkxBU0hfU1JfT1BUVkVSUiAgICAvKiE8IEZMQVNIIE9wdGlvbiBWYWxpZGl0eSBlcnJvciBmbGFnICAqLworI2RlZmluZSBGTEFTSF9GTEFHX1JERVJSICAgICAgICAgICBGTEFTSF9TUl9SREVSUiAgICAgIC8qITwgRkxBU0ggUmVhZCBwcm90ZWN0ZWQgZXJyb3IgZmxhZyAqLworI2RlZmluZSBGTEFTSF9GTEFHX0ZXV0VSUiAgICAgICAgICBGTEFTSF9TUl9GV1dFUlIgICAgIC8qITwgRkxBU0ggV3JpdGUgb3IgRXJyYXNlIG9wZXJhdGlvbiBhYm9ydGVkICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfTk9UWkVST0VSUiAgICAgIEZMQVNIX1NSX05PVFpFUk9FUlIgLyohPCBGTEFTSCBSZWFkIHByb3RlY3RlZCBlcnJvciBmbGFnICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfS2V5cyBGTEFTSCBLZXlzCisgICogQHsKKyAgKi8KKworI2RlZmluZSBGTEFTSF9QREtFWTEgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDQxNTI2MzdVKSAvKiE8IEZsYXNoIHBvd2VyIGRvd24ga2V5MSAqLworI2RlZmluZSBGTEFTSF9QREtFWTIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4RkFGQkZDRkRVKSAvKiE8IEZsYXNoIHBvd2VyIGRvd24ga2V5MjogdXNlZCB3aXRoIEZMQVNIX1BES0VZMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB1bmxvY2sgdGhlIFJVTl9QRCBiaXQgaW4gRkxBU0hfQUNSICovCisKKyNkZWZpbmUgRkxBU0hfUEVLRVkxICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDg5QUJDREVGVSkgLyohPCBGbGFzaCBwcm9ncmFtIGVyYXNlIGtleTEgKi8KKyNkZWZpbmUgRkxBU0hfUEVLRVkyICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAyMDMwNDA1VSkgLyohPCBGbGFzaCBwcm9ncmFtIGVyYXNlIGtleTogdXNlZCB3aXRoIEZMQVNIX1BFS0VZMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdW5sb2NrIHRoZSB3cml0ZSBhY2Nlc3MgdG8gdGhlIEZMQVNIX1BFQ1IgcmVnaXN0ZXIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIEVFUFJPTSAqLworCisjZGVmaW5lIEZMQVNIX1BSR0tFWTEgICAgICAgICAgICAgICgodWludDMyX3QpMHg4QzlEQUVCRlUpIC8qITwgRmxhc2ggcHJvZ3JhbSBtZW1vcnkga2V5MSAqLworI2RlZmluZSBGTEFTSF9QUkdLRVkyICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTMxNDE1MTZVKSAvKiE8IEZsYXNoIHByb2dyYW0gbWVtb3J5IGtleTI6IHVzZWQgd2l0aCBGTEFTSF9QUkdLRVkyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB1bmxvY2sgdGhlIHByb2dyYW0gbWVtb3J5ICovCisKKyNkZWZpbmUgRkxBU0hfT1BUS0VZMSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZCRUFEOUM4VSkgLyohPCBGbGFzaCBvcHRpb24ga2V5MSAqLworI2RlZmluZSBGTEFTSF9PUFRLRVkyICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MjQyNTI2MjdVKSAvKiE8IEZsYXNoIG9wdGlvbiBrZXkyOiB1c2VkIHdpdGggRkxBU0hfT1BUS0VZMSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxvY2sgdGhlIHdyaXRlIGFjY2VzcyB0byB0aGUgb3B0aW9uIGJ5dGUgYmxvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIENNU0lTX0xlZ2FjeSAqLworCisjaWYgZGVmaW5lZCAoIF9fSUNDQVJNX18gKQorI2RlZmluZSBJbnRlcnJ1cHRUeXBlX0FDVExSX0RJU01DWUNJTlRfTXNrICAgICAgICAgSW50VHlwZV9BQ1RMUl9ESVNNQ1lDSU5UX01zaworI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfTWFjcm9zIEZMQVNIIEV4cG9ydGVkIE1hY3JvcworICogIEBicmllZiBtYWNyb3MgdG8gY29udHJvbCBGTEFTSCBmZWF0dXJlcworICogIEB7CisgKi8KKworCisvKiogQGRlZmdyb3VwIEZMQVNIX0ludGVycnVwdCBGTEFTSCBJbnRlcnJ1cHRzCisgKiAgQGJyaWVmIG1hY3JvcyB0byBoYW5kbGUgRkxBU0ggaW50ZXJydXB0cworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEZMQVNIIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gIEZMQVNIIGludGVycnVwdAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0lUX0VPUCBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIEludGVycnVwdAorICAqICAgICBAYXJnIEByZWYgRkxBU0hfSVRfRVJSIEVycm9yIEludGVycnVwdAorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9FTkFCTEVfSVQoX19JTlRFUlJVUFRfXykgIFNFVF9CSVQoKEZMQVNILT5QRUNSKSwgKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBGTEFTSCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBGTEFTSCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9JVF9FT1AgRW5kIG9mIEZMQVNIIE9wZXJhdGlvbiBJbnRlcnJ1cHQKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0lUX0VSUiBFcnJvciBJbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfRElTQUJMRV9JVChfX0lOVEVSUlVQVF9fKSAgQ0xFQVJfQklUKChGTEFTSC0+UEVDUiksICh1aW50MzJfdCkoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzcGVjaWZpZWQgRkxBU0ggZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIEZMQVNIIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX0JTWSAgICAgICAgIEZMQVNIIEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfRU9QICAgICAgICAgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19FTkRIViAgICAgICBGTEFTSCBFbmQgb2YgSGlnaCBWb2x0YWdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1JFQURZICAgICAgIEZMQVNIIFJlYWR5IGZsYWcgYWZ0ZXIgbG93IHBvd2VyIG1vZGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1BHQUVSUiAgICAgIEZMQVNIIFByb2dyYW1taW5nIEFsaWdubWVudCBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19TSVpFUlIgICAgICBGTEFTSCBTaXplIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX09QVFZFUlIgICAgIEZMQVNIIE9wdGlvbiB2YWxpZGl0eSBlcnJvciBmbGFnIChub3QgdmFsaWQgd2l0aCBTVE0zMkwwMzF4eC9TVE0zMkwwNDF4eCkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1JERVJSICAgICAgIEZMQVNIIFJlYWQgcHJvdGVjdGVkIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1dSUEVSUiAgICAgIEZMQVNIIFdyaXRlIHByb3RlY3RlZCBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19GV1dFUlIgICAgICBGTEFTSCBGZXRjaCBXaGlsZSBXcml0ZSBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19OT1RaRVJPRVJSICBOb3QgWmVybyBhcmVhIGVycm9yIGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKF9fRkxBR19fKSAgICgoKEZMQVNILT5TUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgRkxBU0ggZmxhZy4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgRkxBU0ggZmxhZ3MgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX0VPUCAgICAgICAgIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfUEdBRVJSICAgICAgRkxBU0ggUHJvZ3JhbW1pbmcgQWxpZ25tZW50IGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1NJWkVSUiAgICAgIEZMQVNIIFNpemUgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfT1BUVkVSUiAgICAgRkxBU0ggT3B0aW9uIHZhbGlkaXR5IGVycm9yIGZsYWcgKG5vdCB2YWxpZCB3aXRoIFNUTTMyTDAzMXh4L1NUTTMyTDA0MXh4KQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfUkRFUlIgICAgICAgRkxBU0ggUmVhZCBwcm90ZWN0ZWQgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfV1JQRVJSICAgICAgRkxBU0ggV3JpdGUgcHJvdGVjdGVkIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX0ZXV0VSUiAgICAgIEZMQVNIIEZldGNoIFdoaWxlIFdyaXRlIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX05PVFpFUk9FUlIgIE5vdCBaZXJvIGFyZWEgZXJyb3IgZmxhZworICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICgoRkxBU0gtPlNSKSA9IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgRkxBU0ggSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZmxhc2hfZXguaCIKKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2ZsYXNoX3JhbWZ1bmMuaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW0odWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IERhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW1fSVQodWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IERhdGEpOworCisvKiBGTEFTSCBJUlEgaGFuZGxlciBmdW5jdGlvbiAqLwordm9pZCAgICAgICBIQUxfRkxBU0hfSVJRSGFuZGxlcih2b2lkKTsKKy8qIENhbGxiYWNrcyBpbiBub24gYmxvY2tpbmcgbW9kZXMgKi8KK3ZvaWQgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2sodWludDMyX3QgUmV0dXJuVmFsdWUpOwordm9pZCAgICAgICBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayh1aW50MzJfdCBSZXR1cm5WYWx1ZSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfVW5sb2NrKHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX0xvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfVW5sb2NrKHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX0xvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfTGF1bmNoKHZvaWQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgSEFMX0ZMQVNIX0dldEVycm9yKHZvaWQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0hBTF9GTEFTSF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2ZsYXNoX2V4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF9mbGFzaF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NGE3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9mbGFzaF9leC5oCkBAIC0wLDAgKzEsODExIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9mbGFzaF9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBGbGFzaCBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9GTEFTSF9FWF9ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9GTEFTSF9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXgKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hFeF9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUiAgIEZMQVNIU0laRV9CQVNFCisKKyNkZWZpbmUgRkxBU0hfTkJQQUdFU19NQVggKEZMQVNIX1NJWkUgLyBGTEFTSF9QQUdFX1NJWkUpCisKKyNkZWZpbmUgV1JQX01BU0tfTE9XICAgICAgICAgICAgICAgICAoMHgwMDAwRkZGRlUpCisjZGVmaW5lIFdSUF9NQVNLX0hJR0ggICAgICAgICAgICAgICAgKDB4RkZGRjAwMDBVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hFeF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfRkxBU0hfVFlQRUVSQVNFKF9fVkFMVUVfXykgICAoKChfX1ZBTFVFX18pID09IEZMQVNIX1RZUEVFUkFTRV9QQUdFUykpCisKKyNkZWZpbmUgSVNfT1BUSU9OQllURShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPD0gKE9QVElPTkJZVEVfV1JQICB8IE9QVElPTkJZVEVfUkRQIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05CWVRFX1VTRVIgfCBPUFRJT05CWVRFX0JPUiB8IE9QVElPTkJZVEVfQk9PVF9CSVQxKSkpCisKKyNkZWZpbmUgSVNfV1JQU1RBVEUoX19WQUxVRV9fKSAgICAgICAgICAoKChfX1ZBTFVFX18pID09IE9CX1dSUFNUQVRFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IE9CX1dSUFNUQVRFX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfT0JfV1JQKF9fUEFHRV9fKSAgICAgICAgICAgICAoKChfX1BBR0VfXykgIT0gMHgwMDAwMDAwVSkpCisKKyNkZWZpbmUgSVNfT0JfUkRQKF9fTEVWRUxfXykgICAgICAgICAgICAoKChfX0xFVkVMX18pID09IE9CX1JEUF9MRVZFTF8wKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFVkVMX18pID09IE9CX1JEUF9MRVZFTF8xKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFVkVMX18pID09IE9CX1JEUF9MRVZFTF8yKSkKKworI2RlZmluZSBJU19PQl9CT1JfTEVWRUwoX19MRVZFTF9fKSAgICAgICgoKF9fTEVWRUxfXykgPT0gT0JfQk9SX09GRikgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFVkVMX18pID09IE9CX0JPUl9MRVZFTDEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRVZFTF9fKSA9PSBPQl9CT1JfTEVWRUwyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVWRUxfXykgPT0gT0JfQk9SX0xFVkVMMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFVkVMX18pID09IE9CX0JPUl9MRVZFTDQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRVZFTF9fKSA9PSBPQl9CT1JfTEVWRUw1KSkKKworI2RlZmluZSBJU19PQl9JV0RHX1NPVVJDRShfX1NPVVJDRV9fKSAgICgoKF9fU09VUkNFX18pID09IE9CX0lXREdfU1cpIHx8ICgoX19TT1VSQ0VfXykgPT0gT0JfSVdER19IVykpCisKKyNkZWZpbmUgSVNfT0JfU1RPUF9TT1VSQ0UoX19TT1VSQ0VfXykgICAoKChfX1NPVVJDRV9fKSA9PSBPQl9TVE9QX05PUlNUKSB8fCAoKF9fU09VUkNFX18pID09IE9CX1NUT1BfUlNUKSkKKworI2RlZmluZSBJU19PQl9TVERCWV9TT1VSQ0UoX19TT1VSQ0VfXykgICgoKF9fU09VUkNFX18pID09IE9CX1NUREJZX05PUlNUKSB8fCAoKF9fU09VUkNFX18pID09IE9CX1NUREJZX1JTVCkpCisKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfV1BSTU9EKSAmJiBkZWZpbmVkKEZMQVNIX09QVFJfQkZCMikKKworI2RlZmluZSBJU19PQkVYKF9fVkFMVUVfXykgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPD0gKE9QVElPTkJZVEVfUENST1AgfCBPUFRJT05CWVRFX0JPT1RDT05GSUcpKSAmJiAoKF9fVkFMVUVfXykgIT0gMFUpKQorCisjZWxpZiBkZWZpbmVkKEZMQVNIX09QVFJfV1BSTU9EKSAmJiAhZGVmaW5lZChGTEFTSF9PUFRSX0JGQjIpCisKKyNkZWZpbmUgSVNfT0JFWChfX1ZBTFVFX18pICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gT1BUSU9OQllURV9QQ1JPUCkKKworI2VsaWYgIWRlZmluZWQoRkxBU0hfT1BUUl9XUFJNT0QpICYmIGRlZmluZWQoRkxBU0hfT1BUUl9CRkIyKQorCisjZGVmaW5lIElTX09CRVgoX19WQUxVRV9fKSAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IE9QVElPTkJZVEVfQk9PVENPTkZJRykKKworI2VuZGlmIC8qIEZMQVNIX09QVFJfV1BSTU9EICYmIEZMQVNIX09QVFJfQkZCMiAqLworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX1dQUk1PRCkKKworI2RlZmluZSBJU19QQ1JPUFNUQVRFKF9fVkFMVUVfXykgICAgICAgICgoKF9fVkFMVUVfXykgPT0gT0JfUENST1BfU1RBVEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gT0JfUENST1BfU1RBVEVfRU5BQkxFKSkKKworI2RlZmluZSBJU19PQl9QQ1JPUChfX1BBR0VfXykgICAgICAgICAgICgoKF9fUEFHRV9fKSAhPSAweDAwMDAwMDBVKSkKKyNlbmRpZiAvKiBGTEFTSF9PUFRSX1dQUk1PRCAqLworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0JGQjIpCisKKyNkZWZpbmUgSVNfT0JfQk9PVF9CQU5LKF9fQkFOS19fKSAgICAgKCgoX19CQU5LX18pID09IE9CX0JPT1RfQkFOSzIpIHx8ICgoX19CQU5LX18pID09IE9CX0JPT1RfQkFOSzEpKQorCisjZW5kaWYgLyogRkxBU0hfT1BUUl9CRkIyICovCisKKyNkZWZpbmUgSVNfT0JfQk9PVDEoX19CT09UX0JJVDFfXykgICgoKF9fQk9PVF9CSVQxX18pID09IE9CX0JPT1RfQklUMV9SRVNFVCkgfHwgKChfX0JPT1RfQklUMV9fKSA9PSBPQl9CT09UX0JJVDFfU0VUKSkKKyNkZWZpbmUgSVNfVFlQRVBST0dSQU1EQVRBKF9fVkFMVUVfXykgICAoKChfX1ZBTFVFX18pID09IEZMQVNIX1RZUEVQUk9HUkFNREFUQV9CWVRFKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gRkxBU0hfVFlQRVBST0dSQU1EQVRBX0hBTEZXT1JEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBGTEFTSF9UWVBFUFJPR1JBTURBVEFfV09SRCkpCisKKworLyoqIEBkZWZncm91cCBGTEFTSEV4X0FkZHJlc3MgRkxBU0hFeCBBZGRyZXNzCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpCisKKyNkZWZpbmUgSVNfRkxBU0hfREFUQV9BRERSRVNTKF9fQUREUkVTU19fKSAgICAgICAgICAoKChfX0FERFJFU1NfXykgPj0gREFUQV9FRVBST01fQkFTRSkgJiYgKChfX0FERFJFU1NfXykgPD0gREFUQV9FRVBST01fQkFOSzJfRU5EKSkKKyNkZWZpbmUgSVNfRkxBU0hfREFUQV9CQU5LMV9BRERSRVNTKF9fQUREUkVTU19fKSAgICAoKChfX0FERFJFU1NfXykgPj0gREFUQV9FRVBST01fQkFTRSkgJiYgKChfX0FERFJFU1NfXykgPD0gREFUQV9FRVBST01fQkFOSzFfRU5EKSkKKyNkZWZpbmUgSVNfRkxBU0hfREFUQV9CQU5LMl9BRERSRVNTKF9fQUREUkVTU19fKSAgICAoKChfX0FERFJFU1NfXykgPj0gREFUQV9FRVBST01fQkFOSzJfQkFTRSkgJiYgKChfX0FERFJFU1NfXykgPD0gREFUQV9FRVBST01fQkFOSzJfRU5EKSkKKyNkZWZpbmUgSVNfRkxBU0hfUFJPR1JBTV9BRERSRVNTKF9fQUREUkVTU19fKSAgICAgICAoKChfX0FERFJFU1NfXykgPj0gRkxBU0hfQkFTRSkgICAgICAgJiYgKChfX0FERFJFU1NfXykgPCAgKEZMQVNIX0JBU0UgKyBGTEFTSF9TSVpFKSkpCisjZGVmaW5lIElTX0ZMQVNIX1BST0dSQU1fQkFOSzFfQUREUkVTUyhfX0FERFJFU1NfXykgKCgoX19BRERSRVNTX18pID49IEZMQVNIX0JBU0UpICAgICAgICYmICgoX19BRERSRVNTX18pIDwgIChGTEFTSF9CQVNFICsgKEZMQVNIX1NJWkUgPj4gMSkpKSkKKyNkZWZpbmUgSVNfRkxBU0hfUFJPR1JBTV9CQU5LMl9BRERSRVNTKF9fQUREUkVTU19fKSAoKChfX0FERFJFU1NfXykgPj0gRkxBU0hfQkFOSzJfQkFTRSkgJiYgKChfX0FERFJFU1NfXykgPCAgKEZMQVNIX0JBU0UgKyBGTEFTSF9TSVpFKSkpCisjZWxzZQorI2RlZmluZSBJU19GTEFTSF9EQVRBX0FERFJFU1MoX19BRERSRVNTX18pICAgICAgICAgICgoKF9fQUREUkVTU19fKSA+PSBEQVRBX0VFUFJPTV9CQVNFKSAmJiAoKF9fQUREUkVTU19fKSA8PSBEQVRBX0VFUFJPTV9FTkQpKQorI2RlZmluZSBJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoX19BRERSRVNTX18pICAgICAgICgoKF9fQUREUkVTU19fKSA+PSBGTEFTSF9CQVNFKSAgICAgICAmJiAoKF9fQUREUkVTU19fKSA8ICAoRkxBU0hfQkFTRSArIEZMQVNIX1NJWkUpKSkKKyNlbmRpZgorCisjZGVmaW5lIElTX05CUEFHRVMoX19QQUdFU19fKSAoKChfX1BBR0VTX18pID49IDEpICYmICgoX19QQUdFU19fKSA8PSBGTEFTSF9OQlBBR0VTX01BWCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfVHlwZXMgRkxBU0hFeCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRkxBU0ggRXJhc2Ugc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFR5cGVFcmFzZTsgICAvKiE8IFR5cGVFcmFzZTogUGFnZSBFcmFzZSBvbmx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIRXhfVHlwZV9FcmFzZSAqLworCisgIHVpbnQzMl90IFBhZ2VBZGRyZXNzOyAvKiE8IFBhZ2VBZGRyZXNzOiBJbml0aWFsIEZMQVNIIGFkZHJlc3MgdG8gYmUgZXJhc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZWxvbmdpbmcgdG8gRkxBU0ggUHJvZ3JhbW0gYWRkcmVzcyAoZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2VzKSAgKi8KKworICB1aW50MzJfdCBOYlBhZ2VzOyAgICAgLyohPCBOYlBhZ2VzOiBOdW1iZXIgb2YgcGFnZXMgdG8gYmUgZXJhc2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCAobWF4IG51bWJlciBvZiBwYWdlcyAtIHZhbHVlIG9mIEluaXRpYWwgcGFnZSkqLworCit9IEZMQVNIX0VyYXNlSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgRkxBU0ggT3B0aW9uIEJ5dGVzIFBST0dSQU0gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90ICBPcHRpb25UeXBlOyAgICAgICAvKiE8IE9wdGlvblR5cGU6IE9wdGlvbiBieXRlIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hFeF9PcHRpb25fVHlwZSAqLworCisgIHVpbnQzMl90ICBXUlBTdGF0ZTsgICAgICAgICAvKiE8IFdSUFN0YXRlOiBXcml0ZSBwcm90ZWN0aW9uIGFjdGl2YXRpb24gb3IgZGVhY3RpdmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIRXhfV1JQX1N0YXRlICovCisKKyAgdWludDMyX3QgV1JQU2VjdG9yOyAgICAgICAgIC8qITwgV1JQU2VjdG9yOiBUaGlzIGJpdGZpZWxkIHNwZWNpZmllcyB0aGUgc2VjdG9yIChzKSB3aGljaCBhcmUgd3JpdGUgcHJvdGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEZMQVNIRXhfT3B0aW9uX0J5dGVzX1dyaXRlX1Byb3RlY3Rpb24gKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpCisgIHVpbnQzMl90IFdSUFNlY3RvcjI7ICAgICAgICAvKiE8IFdSUFNlY3RvcjIgOiBUaGlzIGJpdGZpZWxkIHNwZWNpZmllcyB0aGUgc2VjdG9yKHMpIHVwcGVyIFNlY3RvcjMxIHdoaWNoIGFyZSB3cml0ZSBwcm90ZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgRkxBU0hFeF9PcHRpb25fQnl0ZXNfV3JpdGVfUHJvdGVjdGlvbjIgKi8KKyNlbmRpZgorCisgIHVpbnQ4X3QgICBSRFBMZXZlbDsgICAgICAgICAvKiE8IFJEUExldmVsOiBTZXQgdGhlIHJlYWQgcHJvdGVjdGlvbiBsZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSEV4X09wdGlvbl9CeXRlc19SZWFkX1Byb3RlY3Rpb24gKi8KKworICB1aW50OF90ICAgQk9STGV2ZWw7ICAgICAgICAgLyohPCBCT1JMZXZlbDogU2V0IHRoZSBCT1IgTGV2ZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hFeF9PcHRpb25fQnl0ZXNfQk9SX0xldmVsICovCisKKyAgdWludDhfdCAgIFVTRVJDb25maWc7ICAgICAgIC8qITwgVVNFUkNvbmZpZzogUHJvZ3JhbSB0aGUgRkxBU0ggVXNlciBPcHRpb24gQnl0ZTogSVdER19TVyAvIFJTVF9TVE9QIC8gUlNUX1NUREJZLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEZMQVNIRXhfT3B0aW9uX0J5dGVzX0lXYXRjaGRvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSEV4X09wdGlvbl9CeXRlc19uUlNUX1NUT1AgYW5kIEByZWYgRkxBU0hFeF9PcHRpb25fQnl0ZXNfblJTVF9TVERCWSovCisKKyAgdWludDhfdCBCT09UQml0MUNvbmZpZzsgICAgIC8qITwgQk9PVDFDb25maWc6IFRvZ2V0aGVyIHdpdGggaW5wdXQgcGFkIEJvb3QwLCB0aGlzIGJpdCBzZWxlY3RzIHRoZSBib290IHNvdXJjZSwgZmxhc2gsIHJhbSBvciBzeXN0ZW0gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hFeF9PcHRpb25fQnl0ZXNfQk9PVEJpdDEgKi8KK30gRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWY7CisKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfV1BSTU9EKSB8fCBkZWZpbmVkKEZMQVNIX09QVFJfQkZCMikKKy8qKgorICAqIEBicmllZiAgRkxBU0ggQWR2YW5jZWQgT3B0aW9uIEJ5dGVzIFByb2dyYW0gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE9wdGlvblR5cGU7ICAgICAgICAgIC8qITwgT3B0aW9uVHlwZTogT3B0aW9uIGJ5dGUgdG8gYmUgY29uZmlndXJlZCBmb3IgZXh0ZW5zaW9uIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIRXhfT3B0aW9uQWR2X1R5cGUgKi8KKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9XUFJNT0QpCisgIHVpbnQzMl90IFBDUk9QU3RhdGU7ICAgICAgICAgIC8qITwgUENST1BTdGF0ZTogUENST1AgYWN0aXZhdGlvbiBvciBkZWFjdGl2YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSEV4X1BDUk9QX1N0YXRlICovCisKKyAgdWludDMyX3QgUENST1BTZWN0b3I7ICAgICAgICAvKiE8IFBDUk9QU2VjdG9yIDogVGhpcyBiaXRmaWVsZCBzcGVjaWZpZXMgdGhlIHNlY3RvcihzKSB3aGljaCBhcmUgcmVhZC93cml0ZSBwcm90ZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEZMQVNIRXhfT3B0aW9uX0J5dGVzX1BDX1JlYWRXcml0ZV9Qcm90ZWN0aW9uICovCisKKyNpZiBkZWZpbmVkIChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KQorICB1aW50MzJfdCBQQ1JPUFNlY3RvcjI7ICAgICAgIC8qITwgUENST1BTZWN0b3IgOiBUaGlzIGJpdGZpZWxkIHNwZWNpZmllcyB0aGUgc2VjdG9yKHMpIHVwcGVyIFNlY3RvcjMxIHdoaWNoIGFyZSByZWFkL3dyaXRlIHByb3RlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgRkxBU0hFeF9PcHRpb25fQnl0ZXNfUENfUmVhZFdyaXRlX1Byb3RlY3Rpb24yICovCisjZW5kaWYgLyogU1RNMzJMMDcxeHggfHwgU1RNMzJMMDcyeHggfHwgU1RNMzJMMDczeHggfHwgU1RNMzJMMDgxeHggfHwgU1RNMzJMMDgyeHggfHwgU1RNMzJMMDgzeHggKi8KKyNlbmRpZiAvKiBGTEFTSF9PUFRSX1dQUk1PRCAqLworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0JGQjIpCisgIHVpbnQxNl90IEJvb3RDb25maWc7ICAgICAgICAgIC8qITwgQm9vdENvbmZpZzogc3BlY2lmaWVzIE9wdGlvbiBieXRlcyBmb3IgYm9vdCBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIRXhfT3B0aW9uX0J5dGVzX0JPT1QgKi8KKyNlbmRpZiAvKiBGTEFTSF9PUFRSX0JGQjIqLworfSBGTEFTSF9BZHZPQlByb2dyYW1Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBGTEFTSF9PUFRSX1dQUk1PRCB8fCBGTEFTSF9PUFRSX0JGQjIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIEZMQVNIRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X1R5cGVfRXJhc2UgRkxBU0hFeF9UeXBlX0VyYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRkxBU0hfVFlQRUVSQVNFX1BBR0VTICAgICAgICAgICAoKHVpbnQzMl90KTB4MDBVKSAgLyohPFBhZ2UgZXJhc2Ugb25seSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PcHRpb25fVHlwZSBGTEFTSEV4IE9wdGlvbiBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT1BUSU9OQllURV9XUlAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDFVKSAgLyohPFdSUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uKi8KKyNkZWZpbmUgT1BUSU9OQllURV9SRFAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDJVKSAgLyohPFJEUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uKi8KKyNkZWZpbmUgT1BUSU9OQllURV9VU0VSICAgICAgICAgICAoKHVpbnQzMl90KTB4MDRVKSAgLyohPFVTRVIgb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiovCisjZGVmaW5lIE9QVElPTkJZVEVfQk9SICAgICAgICAgICAgKCh1aW50MzJfdCkweDA4VSkgIC8qITxCT1Igb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiovCisjZGVmaW5lIE9QVElPTkJZVEVfQk9PVF9CSVQxICAgICAgKCh1aW50MzJfdCkweDEwVSkgIC8qITwgQk9PVCBQSU4xIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24qLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfV1JQX1N0YXRlIEZMQVNIRXggV1JQIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfV1JQU1RBVEVfRElTQUJMRSAgICAgICAgKCh1aW50MzJfdCkweDAwVSkgIC8qITxEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIG9mIHRoZSBkZXNpcmVkIHNlY3RvcnMqLworI2RlZmluZSBPQl9XUlBTVEFURV9FTkFCTEUgICAgICAgICAoKHVpbnQzMl90KTB4MDFVKSAgLyohPEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBvZiB0aGUgZGVzaXJlZCBzZWN0b3JzKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQgKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMjF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDMxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA0MXh4KQorLyoqIEBkZWZncm91cCBGTEFTSEV4X09wdGlvbl9CeXRlc19Xcml0ZV9Qcm90ZWN0aW9uIEZMQVNIIE9wdGlvbiBCeXRlcyBXcml0ZSBQcm90ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMHRvMzEgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IwICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczMydG82MyAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMSAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM2NHRvOTUgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjIgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzOTZ0bzEyNyAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IzICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczEyOHRvMTU5ICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNCAqLworI2RlZmluZSBPQl9XUlBfUGFnZXMxNjB0bzE5MSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjUgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMTkydG8yMjMgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I2ICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczIyNHRvMjU1ICAgICAgICgodWludDMyX3QpMHgwMDAwMDA4MFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNyAqLworI2RlZmluZSBPQl9XUlBfQWxsUGFnZXMgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwRkZVKSAvKiE8IFdyaXRlIHByb3RlY3Rpb24gb2YgYWxsIFNlY3RvcnMgKi8KKy8qKgorICAqIEB9CisgICovCisjZWxpZiBkZWZpbmVkIChTVE0zMkwwNTF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDUyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA1M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2M3h4KQorLyoqIEBkZWZncm91cCBGTEFTSEV4X09wdGlvbl9CeXRlc19Xcml0ZV9Qcm90ZWN0aW9uIEZMQVNIIE9wdGlvbiBCeXRlcyBXcml0ZSBQcm90ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMHRvMzEgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IwICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczMydG82MyAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMSAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM2NHRvOTUgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjIgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzOTZ0bzEyNyAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IzICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczEyOHRvMTU5ICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNCAqLworI2RlZmluZSBPQl9XUlBfUGFnZXMxNjB0bzE5MSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjUgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMTkydG8yMjMgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I2ICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczIyNHRvMjU1ICAgICAgICgodWludDMyX3QpMHgwMDAwMDA4MFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNyAqLworI2RlZmluZSBPQl9XUlBfUGFnZXMyNTZ0bzI4NyAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjggKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMjg4dG8zMTkgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I5ICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczMyMHRvMzUxICAgICAgICgodWludDMyX3QpMHgwMDAwMDQwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTAgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMzUydG8zODMgICAgICAgKCh1aW50MzJfdCkweDAwMDAwODAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IxMSAqLworI2RlZmluZSBPQl9XUlBfUGFnZXMzODR0bzQxNSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjEyICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczQxNnRvNDQ3ICAgICAgICgodWludDMyX3QpMHgwMDAwMjAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTMgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzNDQ4dG80NzkgICAgICAgKCh1aW50MzJfdCkweDAwMDA0MDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IxNCAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM0ODB0bzUxMSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjE1ICovCisjZGVmaW5lIE9CX1dSUF9BbGxQYWdlcyAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwRkZGRlUpIC8qITwgV3JpdGUgcHJvdGVjdGlvbiBvZiBhbGwgU2VjdG9ycyAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VsaWYgZGVmaW5lZCAoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PcHRpb25fQnl0ZXNfV3JpdGVfUHJvdGVjdGlvbiBGTEFTSCBPcHRpb24gQnl0ZXMgV3JpdGUgUHJvdGVjdGlvblAKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9XUlBfUGFnZXMwdG8zMSAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjAgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMzJ0bzYzICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IxICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczY0dG85NSAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMiAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM5NnRvMTI3ICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjMgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMTI4dG8xNTkgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I0ICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczE2MHRvMTkxICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNSAqLworI2RlZmluZSBPQl9XUlBfUGFnZXMxOTJ0bzIyMyAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjYgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMjI0dG8yNTUgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I3ICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczI1NnRvMjg3ICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yOCAqLworI2RlZmluZSBPQl9XUlBfUGFnZXMyODh0bzMxOSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAyMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjkgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzMzIwdG8zNTEgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IxMCAqLworI2RlZmluZSBPQl9XUlBfUGFnZXMzNTJ0bzM4MyAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjExICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczM4NHRvNDE1ICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTIgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzNDE2dG80NDcgICAgICAgKCh1aW50MzJfdCkweDAwMDAyMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IxMyAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM0NDh0bzQ3OSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjE0ICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczQ4MHRvNTExICAgICAgICgodWludDMyX3QpMHgwMDAwODAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTUgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzNTEydG81NDMgICAgICAgKCh1aW50MzJfdCkweDAwMDEwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IxNiAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM1NDR0bzU3NSAgICAgICAoKHVpbnQzMl90KTB4MDAwMjAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjE3ICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczU3NnRvNjA3ICAgICAgICgodWludDMyX3QpMHgwMDA0MDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTggKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzNjA4dG82MzkgICAgICAgKCh1aW50MzJfdCkweDAwMDgwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IxOSAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM2NDB0bzY3MSAgICAgICAoKHVpbnQzMl90KTB4MDAxMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjIwICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczY3MnRvNzAzICAgICAgICgodWludDMyX3QpMHgwMDIwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjEgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzNzA0dG83MzUgICAgICAgKCh1aW50MzJfdCkweDAwNDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IyMiAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM3MzZ0bzc2NyAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjIzICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczc2OHRvNzk5ICAgICAgICgodWludDMyX3QpMHgwMTAwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjQgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzODAwdG84MzEgICAgICAgKCh1aW50MzJfdCkweDAyMDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IyNSAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM4MzJ0bzg2MyAgICAgICAoKHVpbnQzMl90KTB4MDQwMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjI2ICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczg2NHRvODk1ICAgICAgICgodWludDMyX3QpMHgwODAwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjcgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzODk2dG85MjcgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IyOCAqLworI2RlZmluZSBPQl9XUlBfUGFnZXM5Mjh0bzk1OSAgICAgICAoKHVpbnQzMl90KTB4MjAwMDAwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjI5ICovCisjZGVmaW5lIE9CX1dSUF9QYWdlczk2MHRvOTkxICAgICAgICgodWludDMyX3QpMHg0MDAwMDAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzAgKi8KKyNkZWZpbmUgT0JfV1JQX1BhZ2VzOTkydG8xMDIzICAgICAgKCh1aW50MzJfdCkweDgwMDAwMDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IzMSAqLworI2RlZmluZSBPQl9XUlBfQWxsUGFnZXMgICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkZGRkZVKSAvKiE8V3JpdGUgIHByb3RlY3Rpb24gb2YgYWxsIFNlY3RvcnMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PcHRpb25fQnl0ZXNfV3JpdGVfUHJvdGVjdGlvbjIgRkxBU0ggT3B0aW9uIEJ5dGVzIFdyaXRlIFByb3RlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBPQl9XUlAyX1BhZ2VzMTAyNHRvMTA1NSAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjMyICovCisjZGVmaW5lIE9CX1dSUDJfUGFnZXMxMDU2dG8xMDg3ICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzMgKi8KKyNkZWZpbmUgT0JfV1JQMl9QYWdlczEwODh0bzExMTkgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IzNCAqLworI2RlZmluZSBPQl9XUlAyX1BhZ2VzMTEyMHRvMTE1MSAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjM1ICovCisjZGVmaW5lIE9CX1dSUDJfUGFnZXMxMTUydG8xMTgzICAgICgodWludDMyX3QpMHgwMDAwMDAxMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzYgKi8KKyNkZWZpbmUgT0JfV1JQMl9QYWdlczExODR0bzEyMTUgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IzNyAqLworI2RlZmluZSBPQl9XUlAyX1BhZ2VzMTIxNnRvMTI0NyAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjM4ICovCisjZGVmaW5lIE9CX1dSUDJfUGFnZXMxMjQ4dG8xMjc5ICAgICgodWludDMyX3QpMHgwMDAwMDA4MFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzkgKi8KKyNkZWZpbmUgT0JfV1JQMl9QYWdlczEyODB0bzEzMTEgICAgKCh1aW50MzJfdCkweDAwMDAwMTAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I0MCAqLworI2RlZmluZSBPQl9XUlAyX1BhZ2VzMTMxMnRvMTM0MyAgICAoKHVpbnQzMl90KTB4MDAwMDAyMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjQxICovCisjZGVmaW5lIE9CX1dSUDJfUGFnZXMxMzQ0dG8xMzc1ICAgICgodWludDMyX3QpMHgwMDAwMDQwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDIgKi8KKyNkZWZpbmUgT0JfV1JQMl9QYWdlczEzNzZ0bzE0MDcgICAgKCh1aW50MzJfdCkweDAwMDAwODAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I0MyAqLworI2RlZmluZSBPQl9XUlAyX1BhZ2VzMTQwOHRvMTQzOSAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjQ0ICovCisjZGVmaW5lIE9CX1dSUDJfUGFnZXMxNDQwdG8xNDcxICAgICgodWludDMyX3QpMHgwMDAwMjAwMFUpIC8qIFdyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDUgKi8KKyNkZWZpbmUgT0JfV1JQMl9QYWdlczE0NzJ0bzE1MDMgICAgKCh1aW50MzJfdCkweDAwMDA0MDAwVSkgLyogV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I0NiAqLworI2RlZmluZSBPQl9XUlAyX1BhZ2VzMTUwNHRvMTUzNSAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDBVKSAvKiBXcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjQ3ICovCisjZGVmaW5lIE9CX1dSUDJfQWxsUGFnZXMgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwRkZGRlUpIC8qITwgV3JpdGUgcHJvdGVjdGlvbiBvZiBhbGwgU2VjdG9ycyBXUlAyICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNUTTMyTDA3MXh4IHx8IFNUTTMyTDA3Mnh4IHx8IChTVE0zMkwwNzN4eCkgfHwgKFNUTTMyTDA4MXh4KSB8fCAoU1RNMzJMMDgyeHgpIHx8IChTVE0zMkwwODN4eCkgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X09wdGlvbl9CeXRlc19SZWFkX1Byb3RlY3Rpb24gRkxBU0hFeCBPcHRpb24gQnl0ZXMgUmVhZCBQcm90ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfUkRQX0xFVkVMXzAgICAgICAgICAoKHVpbnQ4X3QpMHhBQVUpCisjZGVmaW5lIE9CX1JEUF9MRVZFTF8xICAgICAgICAgKCh1aW50OF90KTB4QkJVKQorI2RlZmluZSBPQl9SRFBfTEVWRUxfMiAgICAgICAgICgodWludDhfdCkweENDVSkgLyogV2FybmluZzogV2hlbiBlbmFibGluZyByZWFkIHByb3RlY3Rpb24gbGV2ZWwgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgbm8gbW9yZSBwb3NzaWJsZSB0byBnbyBiYWNrIHRvIGxldmVsIDEgb3IgMCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT3B0aW9uX0J5dGVzX0JPUl9MZXZlbCBGTEFTSEV4IE9wdGlvbiBCeXRlcyBCT1IgTGV2ZWwKKyAgKiBAeworICAqLworCisjZGVmaW5lIE9CX0JPUl9PRkYgICAgICAgKCh1aW50OF90KTB4MDBVKSAvKiE8IEJPUiBpcyBkaXNhYmxlZCBhdCBwb3dlciBkb3duLCB0aGUgcmVzZXQgaXMgYXNzZXJ0ZWQgd2hlbiB0aGUgVkRECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXIgc3VwcGx5IHJlYWNoZXMgdGhlIFBEUihQb3dlciBEb3duIFJlc2V0KSB0aHJlc2hvbGQgKDEuNVYpICovCisjZGVmaW5lIE9CX0JPUl9MRVZFTDEgICAgKCh1aW50OF90KTB4MDhVKSAvKiE8IEJPUiBSZXNldCB0aHJlc2hvbGQgbGV2ZWxzIGZvciAxLjdWIC0gMS44ViBWREQgcG93ZXIgc3VwcGx5ICAgICovCisjZGVmaW5lIE9CX0JPUl9MRVZFTDIgICAgKCh1aW50OF90KTB4MDlVKSAvKiE8IEJPUiBSZXNldCB0aHJlc2hvbGQgbGV2ZWxzIGZvciAxLjlWIC0gMi4wViBWREQgcG93ZXIgc3VwcGx5ICAgICovCisjZGVmaW5lIE9CX0JPUl9MRVZFTDMgICAgKCh1aW50OF90KTB4MEFVKSAvKiE8IEJPUiBSZXNldCB0aHJlc2hvbGQgbGV2ZWxzIGZvciAyLjNWIC0gMi40ViBWREQgcG93ZXIgc3VwcGx5ICAgICovCisjZGVmaW5lIE9CX0JPUl9MRVZFTDQgICAgKCh1aW50OF90KTB4MEJVKSAvKiE8IEJPUiBSZXNldCB0aHJlc2hvbGQgbGV2ZWxzIGZvciAyLjU1ViAtIDIuNjVWIFZERCBwb3dlciBzdXBwbHkgICovCisjZGVmaW5lIE9CX0JPUl9MRVZFTDUgICAgKCh1aW50OF90KTB4MENVKSAvKiE8IEJPUiBSZXNldCB0aHJlc2hvbGQgbGV2ZWxzIGZvciAyLjhWIC0gMi45ViBWREQgcG93ZXIgc3VwcGx5ICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PcHRpb25fQnl0ZXNfSVdhdGNoZG9nIEZMQVNIRXggT3B0aW9uIEJ5dGVzIElXYXRjaGRvZworICAqIEB7CisgICovCisKKyNkZWZpbmUgT0JfSVdER19TVyAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDEwVSkgIC8qITwgU29mdHdhcmUgV0RHIHNlbGVjdGVkICovCisjZGVmaW5lIE9CX0lXREdfSFcgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiE8IEhhcmR3YXJlIFdERyBzZWxlY3RlZCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT3B0aW9uX0J5dGVzX25SU1RfU1RPUCBGTEFTSEV4IE9wdGlvbiBCeXRlcyBuUlNUX1NUT1AKKyAgKiBAeworICAqLworCisjZGVmaW5lIE9CX1NUT1BfTk9SU1QgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgyMFUpIC8qITwgTm8gcmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgaW4gU1RPUCAqLworI2RlZmluZSBPQl9TVE9QX1JTVCAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAvKiE8IFJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIGluIFNUT1AgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PcHRpb25fQnl0ZXNfblJTVF9TVERCWSBGTEFTSEV4IE9wdGlvbiBCeXRlcyBuUlNUX1NUREJZCisgICogQHsKKyAgKi8KKworI2RlZmluZSBPQl9TVERCWV9OT1JTVCAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4NDBVKSAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIGluIFNUQU5EQlkgKi8KKyNkZWZpbmUgT0JfU1REQllfUlNUICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVEFOREJZICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfV1BSTU9EKQorCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT3B0aW9uQWR2X1R5cGUgRkxBU0hFeCBPcHRpb24gQWR2YW5jZWQgVHlwZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgT1BUSU9OQllURV9QQ1JPUCAgICAgICAgKCh1aW50MzJfdCkweDAxVSkgIC8qITxQQ1JPUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEZMQVNIX09QVFJfV1BSTU9EICovCisKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfQkZCMikKKworLyoqIEBkZWZncm91cCBGTEFTSEV4X09wdGlvbkFkdl9UeXBlIEZMQVNIRXggT3B0aW9uIEFkdmFuY2VkIFR5cGUKKyAgKiBAeworICAqLworCisjZGVmaW5lIE9QVElPTkJZVEVfQk9PVENPTkZJRyAgICgodWludDMyX3QpMHgwMlUpICAvKiE8Qk9PVENvbmZpZyBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEZMQVNIX09QVFJfQkZCMiAqLworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX1dQUk1PRCkKKworLyoqIEBkZWZncm91cCAgRkxBU0hFeF9QQ1JPUF9TdGF0ZSBGTEFTSEV4IFBDUk9QIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfUENST1BfU1RBVEVfRElTQUJMRSAgICAgICAgKCh1aW50MzJfdCkweDAwVSkgIC8qITxEaXNhYmxlIFBDUk9QIGZvciBzZWxlY3RlZCBzZWN0b3JzICovCisjZGVmaW5lIE9CX1BDUk9QX1NUQVRFX0VOQUJMRSAgICAgICAgICgodWludDMyX3QpMHgwMVUpICAvKiE8RW5hYmxlIFBDUk9QIGZvciBzZWxlY3RlZCBzZWN0b3JzICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgIEZMQVNIRXhfU2VsZWN0aW9uX1Byb3RlY3Rpb25fTW9kZSBGTEFTSEV4IFNlbGVjdGlvbiBQcm90ZWN0aW9uIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9QQ1JPUF9ERVNFTEVDVEVEICAgICAoKHVpbnQxNl90KTB4MDAwMFUpICAgICAgICAgICAgLyohPCBEaXNhYmxlZCBQQ1JPUCwgbldQUmkgYml0cyB1c2VkIGZvciBXcml0ZSBQcm90ZWN0aW9uIG9uIHNlY3RvciBpICovCisjZGVmaW5lIE9CX1BDUk9QX1NFTEVDVEVEICAgICAgICgodWludDE2X3QpRkxBU0hfT1BUUl9XUFJNT0QpICAvKiE8IEVuYWJsZSBQQ1JPUCwgbldQUmkgYml0cyB1c2VkIGZvciBQQ1JvUCBQcm90ZWN0aW9uIG9uIHNlY3RvciBpICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBGTEFTSF9PUFRSX1dQUk1PRCAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KSB8fCAgZGVmaW5lZCAoU1RNMzJMMDMxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA0MXh4KQorLyoqIEBkZWZncm91cCBGTEFTSEV4X09wdGlvbl9CeXRlc19QQ19SZWFkV3JpdGVfUHJvdGVjdGlvbiBGTEFTSEV4IE9wdGlvbiBCeXRlcyBQQyBSZWFkL1dyaXRlIFByb3RlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBPQl9QQ1JPUF9QYWdlczB0bzMxICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qIFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IwICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzMzJ0bzYzICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjEgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM2NHRvOTUgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMiAqLworI2RlZmluZSBPQl9QQ1JPUF9QYWdlczk2dG8xMjcgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOFUpIC8qIFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IzICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzMTI4dG8xNTkgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjQgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMxNjB0bzE5MSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNSAqLworI2RlZmluZSBPQl9QQ1JPUF9QYWdlczE5MnRvMjIzICAgICAgICgodWludDMyX3QpMHgwMDAwMDA0MFUpIC8qIFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I2ICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzMjI0dG8yNTUgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwVSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjcgKi8KKyNkZWZpbmUgT0JfUENST1BfQWxsUGFnZXMgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwRkZVKSAvKiE8IFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBhbGwgU2VjdG9ycyAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbGlmIGRlZmluZWQgKFNUTTMyTDA1MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNTJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDUzeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYzeHgpCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT3B0aW9uX0J5dGVzX1BDX1JlYWRXcml0ZV9Qcm90ZWN0aW9uIEZMQVNIRXggT3B0aW9uIEJ5dGVzIFBDIFJlYWQvV3JpdGUgUHJvdGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzMHRvMzEgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjAgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMzMnRvNjMgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMSAqLworI2RlZmluZSBPQl9QQ1JPUF9QYWdlczY0dG85NSAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpIC8qIFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IyICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzOTZ0bzEyNyAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjMgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMxMjh0bzE1OSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNCAqLworI2RlZmluZSBPQl9QQ1JPUF9QYWdlczE2MHRvMTkxICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpIC8qIFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I1ICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzMTkydG8yMjMgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwVSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjYgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMyMjR0bzI1NSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNyAqLworI2RlZmluZSBPQl9QQ1JPUF9QYWdlczI1NnRvMjg3ICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMFUpIC8qIFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I4ICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzMjg4dG8zMTkgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwVSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjkgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMzMjB0bzM1MSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTAgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMzNTJ0bzM4MyAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTEgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMzODR0bzQxNSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTIgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM0MTZ0bzQ0NyAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTMgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM0NDh0bzQ3OSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTQgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM0ODB0bzUxMSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTUgKi8KKyNkZWZpbmUgT0JfUENST1BfQWxsUGFnZXMgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMEZGRkZVKSAvKiE8IFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBhbGwgU2VjdG9ycyAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9PcHRpb25fQnl0ZXNfUENfUmVhZFdyaXRlX1Byb3RlY3Rpb24gRkxBU0ggT3B0aW9uIEJ5dGVzIFBDIFJlYWQvV3JpdGUgUHJvdGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzMHRvMzEgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjAgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMzMnRvNjMgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMSAqLworI2RlZmluZSBPQl9QQ1JPUF9QYWdlczY0dG85NSAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpIC8qIFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3IyICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzOTZ0bzEyNyAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjMgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMxMjh0bzE1OSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNCAqLworI2RlZmluZSBPQl9QQ1JPUF9QYWdlczE2MHRvMTkxICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpIC8qIFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I1ICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzMTkydG8yMjMgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwVSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjYgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMyMjR0bzI1NSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNyAqLworI2RlZmluZSBPQl9QQ1JPUF9QYWdlczI1NnRvMjg3ICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMFUpIC8qIFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBTZWN0b3I4ICovCisjZGVmaW5lIE9CX1BDUk9QX1BhZ2VzMjg4dG8zMTkgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwVSkgLyogUEMgUmVhZC9Xcml0ZSBwcm90ZWN0aW9uIG9mIFNlY3RvcjkgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMzMjB0bzM1MSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTAgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMzNTJ0bzM4MyAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTEgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXMzODR0bzQxNSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTIgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM0MTZ0bzQ0NyAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTMgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM0NDh0bzQ3OSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTQgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM0ODB0bzUxMSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTUgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM1MTJ0bzU0MyAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTYgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM1NDR0bzU3NSAgICAgICAoKHVpbnQzMl90KTB4MDAwMjAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTcgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM1NzZ0bzYwNyAgICAgICAoKHVpbnQzMl90KTB4MDAwNDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTggKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM2MDh0bzYzOSAgICAgICAoKHVpbnQzMl90KTB4MDAwODAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMTkgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM2NDB0bzY3MSAgICAgICAoKHVpbnQzMl90KTB4MDAxMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjAgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM2NzJ0bzcwMyAgICAgICAoKHVpbnQzMl90KTB4MDAyMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjEgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM3MDR0bzczNSAgICAgICAoKHVpbnQzMl90KTB4MDA0MDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjIgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM3MzZ0bzc2NyAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjMgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM3Njh0bzc5OSAgICAgICAoKHVpbnQzMl90KTB4MDEwMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjQgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM4MDB0bzgzMSAgICAgICAoKHVpbnQzMl90KTB4MDIwMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjUgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM4MzJ0bzg2MyAgICAgICAoKHVpbnQzMl90KTB4MDQwMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjYgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM4NjR0bzg5NSAgICAgICAoKHVpbnQzMl90KTB4MDgwMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjcgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM4OTZ0bzkyNyAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjggKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM5Mjh0bzk1OSAgICAgICAoKHVpbnQzMl90KTB4MjAwMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMjkgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM5NjB0bzk5MSAgICAgICAoKHVpbnQzMl90KTB4NDAwMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzAgKi8KKyNkZWZpbmUgT0JfUENST1BfUGFnZXM5OTJ0bzEwMjMgICAgICAoKHVpbnQzMl90KTB4ODAwMDAwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzEgKi8KKyNkZWZpbmUgT0JfUENST1BfQWxsUGFnZXMgICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkZGRkZVKSAvKiE8UEMgUmVhZC9Xcml0ZSAgcHJvdGVjdGlvbiBvZiBhbGwgU2VjdG9ycyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X09wdGlvbl9CeXRlc19QQ19SZWFkV3JpdGVfUHJvdGVjdGlvbjIgRkxBU0ggT3B0aW9uIEJ5dGVzIFBDIFJlYWQvV3JpdGUgUHJvdGVjdGlvbiAoU2VjdG9yIDIpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTAyNHRvMTA1NSAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzIgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTA1NnRvMTA4NyAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzMgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTA4OHRvMTExOSAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzQgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTEyMHRvMTE1MSAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzUgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTE1MnRvMTE4MyAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzYgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTE4NHRvMTIxNSAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzcgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTIxNnRvMTI0NyAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzggKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTI0OHRvMTI3OSAgICAoKHVpbnQzMl90KTB4MDAwMDAwODBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yMzkgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTI4MHRvMTMxMSAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDAgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTMxMnRvMTM0MyAgICAoKHVpbnQzMl90KTB4MDAwMDAyMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDEgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTM0NHRvMTM3NSAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDIgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTM3NnRvMTQwNyAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDMgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTQwOHRvMTQzOSAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDQgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTQ0MHRvMTQ3MSAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDUgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTQ3MnRvMTUwMyAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDYgKi8KKyNkZWZpbmUgT0JfUENST1AyX1BhZ2VzMTUwNHRvMTUzNSAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDBVKSAvKiBQQyBSZWFkL1dyaXRlIHByb3RlY3Rpb24gb2YgU2VjdG9yNDcgKi8KKyNkZWZpbmUgT0JfUENST1AyX0FsbFBhZ2VzICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMEZGRkZVKSAvKiE8IFBDIFJlYWQvV3JpdGUgcHJvdGVjdGlvbiBvZiBhbGwgU2VjdG9ycyBQQ1JPUDIgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJMMDcxeHggfHwgU1RNMzJMMDcyeHggfHwgU1RNMzJMMDczeHggfHwgU1RNMzJMMDgxeHggfHwgU1RNMzJMMDgyeHggfHwgU1RNMzJMMDgzeHggKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X09wdGlvbl9CeXRlc19CT09UQml0MSBGTEFTSCBPcHRpb24gQnl0ZXMgQk9PVCBCaXQxIFNldHVwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfQk9PVF9CSVQxX1JFU0VUICAgICAgKHVpbnQ4X3QpKDB4MDBVKSAvKiE8IEJPT1QgQml0IDEgUmVzZXQgKi8KKyNkZWZpbmUgT0JfQk9PVF9CSVQxX1NFVCAgICAgICAgKHVpbnQ4X3QpKDB4MDFVKSAvKiE8IEJPT1QgQml0IDEgU2V0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfVHlwZV9Qcm9ncmFtX0RhdGEgRkxBU0hFeCBUeXBlIFByb2dyYW0gRGF0YQorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9CWVRFICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwVSkgIC8qITxQcm9ncmFtIGJ5dGUgKDgtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLiovCisjZGVmaW5lIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9IQUxGV09SRCAgICAgICAgKCh1aW50MzJfdCkweDAxVSkgIC8qITxQcm9ncmFtIGEgaGFsZi13b3JkICgxNi1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuKi8KKyNkZWZpbmUgRkxBU0hfVFlQRVBST0dSQU1EQVRBX1dPUkQgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDJVKSAgLyohPFByb2dyYW0gYSB3b3JkICgzMi1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9CRkIyKQorCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfT3B0aW9uX0J5dGVzX0JPT1QgRkxBU0hFeCBPcHRpb24gQnl0ZXMgQk9PVAorICAqIEB7CisgICovCisKKyNkZWZpbmUgT0JfQk9PVF9CQU5LMSAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAvKiE8ICBBdCBzdGFydHVwLCBpZiBib290IHBpbiAwIGFuZCBCT09UMSBiaXQgYXJlIHNldCBpbiBib290IGZyb20gdXNlciBGbGFzaCBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoaXMgcGFyYW1ldGVyIGlzIHNlbGVjdGVkIHRoZSBkZXZpY2Ugd2lsbCBib290IGZyb20gQmFuayAxIChEZWZhdWx0KSovCisjZGVmaW5lIE9CX0JPT1RfQkFOSzIgICAgICAgICAgICAgICAgICgodWludDhfdCkoRkxBU0hfT1BUUl9CRkIyID4+IDE2KSkgLyohPCBBdCBzdGFydHVwLCBpZiBib290IHBpbiAwIGFuZCBCT09UMSBiaXQgYXJlIHNldCBpbiBib290IGZyb20gdXNlciBGbGFzaCBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoaXMgcGFyYW1ldGVyIGlzIHNlbGVjdGVkIHRoZSBkZXZpY2Ugd2lsbCBib290IGZyb20gQmFuayAyICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogRkxBU0hfT1BUUl9CRkIyICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9FeHBvcnRlZF9NYWNyb3MgRkxBU0hFeCBFeHBvcnRlZCBNYWNyb3MKKyAqICBAeworICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBGTEFTSCBMYXRlbmN5LgorICAqIEBwYXJhbSAgX19MQVRFTkNZX18gRkxBU0ggTGF0ZW5jeQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8wICBGTEFTSCBaZXJvIExhdGVuY3kgY3ljbGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9MQVRFTkNZXzEgIEZMQVNIIE9uZSBMYXRlbmN5IGN5Y2xlCisgICogQHJldHZhbCBub25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX1NFVF9MQVRFTkNZKF9fTEFURU5DWV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9MQVRFTkNZLCAodWludDMyX3QpKF9fTEFURU5DWV9fKSkKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIEZMQVNIIExhdGVuY3kuCisgICogQHJldHZhbCBGTEFTSCBMYXRlbmN5CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9MQVRFTkNZXzAgIEZMQVNIIFplcm8gTGF0ZW5jeSBjeWNsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX0xBVEVOQ1lfMSAgRkxBU0ggT25lIExhdGVuY3kgY3ljbGUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSAgICAgKFJFQURfQklUKChGTEFTSC0+QUNSKSwgRkxBU0hfQUNSX0xBVEVOQ1kpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRkxBU0ggcHJlZmV0Y2ggYnVmZmVyLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9QUkVGRVRDSF9CVUZGRVJfRU5BQkxFKCkgICAgICBTRVRfQklUKChGTEFTSC0+QUNSKSwgRkxBU0hfQUNSX1BSRlRFTikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBGTEFTSCBwcmVmZXRjaCBidWZmZXIuCisgICogQHJldHZhbCBub25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX1BSRUZFVENIX0JVRkZFUl9ESVNBQkxFKCkgICAgIENMRUFSX0JJVCgoRkxBU0gtPkFDUiksIEZMQVNIX0FDUl9QUkZURU4pCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBGTEFTSCBCdWZmZXIgY2FjaGUuCisgICogQHJldHZhbCBub25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0JVRkZFUl9DQUNIRV9FTkFCTEUoKSAgICAgICAgIENMRUFSX0JJVCgoRkxBU0gtPkFDUiksIEZMQVNIX0FDUl9ESVNBQl9CVUYpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRkxBU0ggQnVmZmVyIGNhY2hlLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9CVUZGRVJfQ0FDSEVfRElTQUJMRSgpICAgICAgICBTRVRfQklUKChGTEFTSC0+QUNSKSwgRkxBU0hfQUNSX0RJU0FCX0JVRikKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEZMQVNIIHByZXJlYWQgYnVmZmVyLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9QUkVSRUFEX0JVRkZFUl9FTkFCTEUoKSAgICAgICBTRVRfQklUKChGTEFTSC0+QUNSKSwgRkxBU0hfQUNSX1BSRV9SRUFEKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEZMQVNIIHByZXJlYWQgYnVmZmVyLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9QUkVSRUFEX0JVRkZFUl9ESVNBQkxFKCkgICAgICBDTEVBUl9CSVQoKEZMQVNILT5BQ1IpLCBGTEFTSF9BQ1JfUFJFX1JFQUQpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBGTEFTSCBwb3dlciBkb3duIGR1cmluZyBTbGVlcCBtb2RlCisgICogQHJldHZhbCBub25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX1NMRUVQX1BPV0VSRE9XTl9FTkFCTEUoKSAgICAgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1NMRUVQX1BEKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEZMQVNIIHBvd2VyIGRvd24gZHVyaW5nIFNsZWVwIG1vZGUKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfU0xFRVBfUE9XRVJET1dOX0RJU0FCTEUoKSAgICAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9TTEVFUF9QRCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEZsYXNoIFJ1biBwb3dlciBkb3duIG1vZGUuCisgICogQG5vdGUgICBXcml0aW5nIHRoaXMgYml0ICB0byAwIHRoaXMgYml0LCBhdXRvbWF0aWNhbGx5IHRoZSBrZXlzIGFyZQorICAqICAgICAgICAgbG9zcyBhbmQgYSBuZXcgdW5sb2NrIHNlcXVlbmNlIGlzIG5lY2Vzc2FyeSB0byByZS13cml0ZSBpdCB0byAxLgorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9QT1dFUl9ET1dOX0VOQUJMRSgpIGRvIHsgRkxBU0gtPlBES0VZUiA9IEZMQVNIX1BES0VZMTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0gtPlBES0VZUiA9IEZMQVNIX1BES0VZMjsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVCgoRkxBU0gtPkFDUiksIEZMQVNIX0FDUl9SVU5fUEQpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRmxhc2ggUnVuIHBvd2VyIGRvd24gbW9kZS4KKyAgKiBAbm90ZSAgIFdyaXRpbmcgdGhpcyBiaXQgdG8gMCB0aGlzIGJpdCwgYXV0b21hdGljYWxseSB0aGUga2V5cyBhcmUKKyAgKiAgICAgICAgIGxvc3MgYW5kIGEgbmV3IHVubG9jayBzZXF1ZW5jZSBpcyBuZWNlc3NhcnkgdG8gcmUtd3JpdGUgaXQgdG8gMS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfUE9XRVJfRE9XTl9ESVNBQkxFKCkgZG8geyBGTEFTSC0+UERLRVlSID0gRkxBU0hfUERLRVkxOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0gtPlBES0VZUiA9IEZMQVNIX1BES0VZMjsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKChGTEFTSC0+QUNSKSwgRkxBU0hfQUNSX1JVTl9QRCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FcmFzZShGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0LCB1aW50MzJfdCAqUGFnZUVycm9yKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VyYXNlX0lUKEZMQVNIX0VyYXNlSW5pdFR5cGVEZWYgKnBFcmFzZUluaXQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfT0JQcm9ncmFtKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9GTEFTSEV4X09CR2V0Q29uZmlnKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KTsKKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9XUFJNT0QpIHx8IGRlZmluZWQoRkxBU0hfT1BUUl9CRkIyKQorCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9BZHZPQlByb2dyYW0gKEZMQVNIX0Fkdk9CUHJvZ3JhbUluaXRUeXBlRGVmICpwQWR2T0JJbml0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9GTEFTSEV4X0Fkdk9CR2V0Q29uZmlnKEZMQVNIX0Fkdk9CUHJvZ3JhbUluaXRUeXBlRGVmICpwQWR2T0JJbml0KTsKKworI2VuZGlmIC8qIEZMQVNIX09QVFJfV1BSTU9EIHx8IEZMQVNIX09QVFJfQkZCMiAqLworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX1dQUk1PRCkKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfT0JfU2VsZWN0UENST1Aodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9PQl9EZVNlbGVjdFBDUk9QKHZvaWQpOworCisjZW5kaWYgLyogRkxBU0hfT1BUUl9XUFJNT0QgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fVW5sb2NrKHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9Mb2NrKHZvaWQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX0VyYXNlKHVpbnQzMl90IEFkZHJlc3MpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9Qcm9ncmFtKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLCB1aW50MzJfdCBEYXRhKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fRW5hYmxlRml4ZWRUaW1lUHJvZ3JhbSh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fRGlzYWJsZUZpeGVkVGltZVByb2dyYW0odm9pZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfRkxBU0hfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfZmxhc2hfcmFtZnVuYy5oIGIvSW5jL3N0bTMybDB4eF9oYWxfZmxhc2hfcmFtZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5N2MzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9mbGFzaF9yYW1mdW5jLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2ZsYXNoX3JhbWZ1bmMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRkxBU0ggUkFNRlVOQyBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkwweHhfRkxBU0hfUkFNRlVOQ19ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0ZMQVNIX1JBTUZVTkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9SQU1GVU5DCisgICogQHsKKyAgKi8gCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9SQU1GVU5DX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qCisgICogQGJyaWVmICBGTEFTSCBtZW1vcnkgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGZyb20gaW50ZXJuYWwgU1JBTS4KKyAgKiAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbnNpZGUgdGhlICJzdG0zMmwweHhfaGFsX2ZsYXNoX3JhbWZ1bmMuYyIKKyAgKiAgICAgICAgIGZpbGUuCisgICovCisgIAorLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1JBTUZVTkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKK19fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRW5hYmxlUnVuUG93ZXJEb3duKHZvaWQpOworX19SQU1fRlVOQyBIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9EaXNhYmxlUnVuUG93ZXJEb3duKHZvaWQpOworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1JBTUZVTkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKEZMQVNIX1BFQ1JfUEFSQUxMQkFOSykKKworX19SQU1fRlVOQyBIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FcmFzZVBhcmFsbGVsUGFnZSh1aW50MzJfdCBQYWdlX0FkZHJlc3MxLCB1aW50MzJfdCBQYWdlX0FkZHJlc3MyKTsKK19fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfUHJvZ3JhbVBhcmFsbGVsSGFsZlBhZ2UodWludDMyX3QgQWRkcmVzczEsIHVpbnQzMl90KiBwQnVmZmVyMSwgdWludDMyX3QgQWRkcmVzczIsIHVpbnQzMl90KiBwQnVmZmVyMik7CisKKyNlbmRpZiAvKiBGTEFTSF9QRUNSX1BBUkFMTEJBTksgKi8KKworX19SQU1fRlVOQyBIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9IYWxmUGFnZVByb2dyYW0odWludDMyX3QgQWRkcmVzcywgdWludDMyX3QqIHBCdWZmZXIpOworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1JBTUZVTkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCitfX1JBTV9GVU5DICBIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9HZXRFcnJvcih1aW50MzJfdCAqRXJyb3IpOworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0ZMQVNIX1JBTUZVTkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfZ3Bpby5oIGIvSW5jL3N0bTMybDB4eF9oYWxfZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOGQwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9ncGlvLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2dwaW8uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgR1BJTyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9HUElPX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfSEFMX0dQSU9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJTyBHUElPCisgICogQHsKKyAgKi8gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9UeXBlcyBHUElPIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0luaXRfQ29uZmlndXJhdGlvbiBHUElPIGluaXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworLyoqIAorICAqIEBicmllZiAgIEdQSU8gSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovIAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUGluOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgR1BJTyBwaW5zIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEdQSU9fcGluc19kZWZpbmUgKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fbW9kZV9kZWZpbmUgKi8KKworICB1aW50MzJfdCBQdWxsOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBQdWxsLXVwIG9yIFB1bGwtRG93biBhY3RpdmF0aW9uIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19wdWxsX2RlZmluZSAqLworCisgIHVpbnQzMl90IFNwZWVkOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNwZWVkIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19zcGVlZF9kZWZpbmUgKi8KKworICB1aW50MzJfdCBBbHRlcm5hdGU7ICAvKiE8IFBlcmlwaGVyYWwgdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBzZWxlY3RlZCBwaW5zIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT0V4X0FsdGVybmF0ZV9mdW5jdGlvbl9zZWxlY3Rpb24gKi8KK31HUElPX0luaXRUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX1NldFJlc2V0X0RlZmluaXRpb24gIEdQSU8gc2V0IHJlc2V0IGRlZmluaXRpb24KKyAgKiBAeworICAqLworLyoqIAorICAqIEBicmllZiAgR1BJTyBCaXQgU0VUIGFuZCBCaXQgUkVTRVQgZW51bWVyYXRpb24gCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgR1BJT19QSU5fUkVTRVQgPSAwVSwKKyAgR1BJT19QSU5fU0VUCit9R1BJT19QaW5TdGF0ZTsKKy8qKgorICAqIEB9CisgICovCisKKworI2RlZmluZSBJU19HUElPX1BJTl9BQ1RJT04oX19BQ1RJT05fXykgKCgoX19BQ1RJT05fXykgPT0gR1BJT19QSU5fUkVTRVQpIHx8ICgoX19BQ1RJT05fXykgPT0gR1BJT19QSU5fU0VUKSkKKworLyoqCisgICogQH0KKyAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0NvbnN0YW50cyBHUElPIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19waW5zX2RlZmluZSBQaW4gZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEdQSU9fUElOXzAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxVSkgIC8qIFBpbiAwIHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzEgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAyVSkgIC8qIFBpbiAxIHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzIgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA0VSkgIC8qIFBpbiAyIHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzMgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4VSkgIC8qIFBpbiAzIHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzQgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDEwVSkgIC8qIFBpbiA0IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzUgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDIwVSkgIC8qIFBpbiA1IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzYgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDQwVSkgIC8qIFBpbiA2IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzcgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDgwVSkgIC8qIFBpbiA3IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzggICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMTAwVSkgIC8qIFBpbiA4IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzkgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMjAwVSkgIC8qIFBpbiA5IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzEwICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNDAwVSkgIC8qIFBpbiAxMCBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzExICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwODAwVSkgIC8qIFBpbiAxMSBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzEyICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgxMDAwVSkgIC8qIFBpbiAxMiBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzEzICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgyMDAwVSkgIC8qIFBpbiAxMyBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzE0ICAgICAgICAgICAgICAgICgodWludDE2X3QpMHg0MDAwVSkgIC8qIFBpbiAxNCBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzE1ICAgICAgICAgICAgICAgICgodWludDE2X3QpMHg4MDAwVSkgIC8qIFBpbiAxNSBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOX0FsbCAgICAgICAgICAgICAgICgodWludDE2X3QpMHhGRkZGVSkgIC8qIEFsbCBwaW5zIHNlbGVjdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisjZGVmaW5lIEdQSU9fUElOX01BU0sgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwRkZGRlUpIC8qIFBJTiBtYXNrIGZvciBhc3NlcnQgdGVzdCAqLworI2RlZmluZSBJU19HUElPX1BJTihfX1BJTl9fKSAgICAgICAgKCgoKF9fUElOX18pICYgR1BJT19QSU5fTUFTSykgIT0gKHVpbnQzMl90KTB4MDApICYmXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fUElOX18pICYgfkdQSU9fUElOX01BU0spID09ICh1aW50MzJfdCkweDAwKSkKKworLyoqIEBkZWZncm91cCBHUElPX21vZGVfZGVmaW5lIE1vZGUgZGVmaW5pdGlvbgorICAqIEBicmllZiBHUElPIENvbmZpZ3VyYXRpb24gTW9kZSAKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WDB5ejAwWVoKKyAgKiAgICAgICAgICAgLSBYICA6IEdQSU8gbW9kZSBvciBFWFRJIE1vZGUKKyAgKiAgICAgICAgICAgLSB5ICA6IEV4dGVybmFsIElUIG9yIEV2ZW50IHRyaWdnZXIgZGV0ZWN0aW9uIAorICAqICAgICAgICAgICAtIHogIDogSU8gY29uZmlndXJhdGlvbiBvbiBFeHRlcm5hbCBJVCBvciBFdmVudAorICAqICAgICAgICAgICAtIFkgIDogT3V0cHV0IHR5cGUgKFB1c2ggUHVsbCBvciBPcGVuIERyYWluKQorICAqICAgICAgICAgICAtIFogIDogSU8gRGlyZWN0aW9uIG1vZGUgKElucHV0LCBPdXRwdXQsIEFsdGVybmF0ZSBvciBBbmFsb2cpCisgICogQHsKKyAgKi8gCisjZGVmaW5lICBHUElPX01PREVfSU5QVVQgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgIC8qITwgSW5wdXQgRmxvYXRpbmcgTW9kZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX09VVFBVVF9QUCAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgICAvKiE8IE91dHB1dCBQdXNoIFB1bGwgTW9kZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9PVVRQVVRfT0QgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMVUpICAgLyohPCBPdXRwdXQgT3BlbiBEcmFpbiBNb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBHUElPX01PREVfQUZfUFAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAgIC8qITwgQWx0ZXJuYXRlIEZ1bmN0aW9uIFB1c2ggUHVsbCBNb2RlICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0FGX09EICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEyVSkgICAvKiE8IEFsdGVybmF0ZSBGdW5jdGlvbiBPcGVuIERyYWluIE1vZGUgICAgKi8KKworI2RlZmluZSAgR1BJT19NT0RFX0FOQUxPRyAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkgICAvKiE8IEFuYWxvZyBNb2RlICAqLworICAgIAorI2RlZmluZSAgR1BJT19NT0RFX0lUX1JJU0lORyAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMTEwMDAwVSkgICAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9JVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDIxMDAwMFUpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAgICovCisjZGVmaW5lICBHUElPX01PREVfSVRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAzMTAwMDBVKSAgIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBSaXNpbmcvRmFsbGluZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICAqLworIAorI2RlZmluZSAgR1BJT19NT0RFX0VWVF9SSVNJTkcgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMTIwMDAwVSkgICAvKiE8IEV4dGVybmFsIEV2ZW50IE1vZGUgd2l0aCBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAgICAgICAgICovCisjZGVmaW5lICBHUElPX01PREVfRVZUX0ZBTExJTkcgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAyMjAwMDBVKSAgIC8qITwgRXh0ZXJuYWwgRXZlbnQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9FVlRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICgodWludDMyX3QpMHgxMDMyMDAwMFUpICAgLyohPCBFeHRlcm5hbCBFdmVudCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZGVmaW5lIElTX0dQSU9fTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IEdQSU9fTU9ERV9JTlBVVCkgICAgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfT1VUUFVUX1BQKSAgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX09VVFBVVF9PRCkgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9BRl9QUCkgICAgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfQUZfT0QpICAgICAgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lUX1JJU0lORykgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9JVF9GQUxMSU5HKSAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfSVRfUklTSU5HX0ZBTExJTkcpICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0VWVF9SSVNJTkcpICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9FVlRfRkFMTElORykgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBHUElPX01PREVfRVZUX1JJU0lOR19GQUxMSU5HKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0FOQUxPRykpCisKKworLyoqIEBkZWZncm91cCBHUElPX3NwZWVkX2RlZmluZSBTcGVlZCBkZWZpbml0aW9uCisgICogQGJyaWVmIEdQSU8gT3V0cHV0IE1heGltdW0gZnJlcXVlbmN5CisgICogQHsKKyAgKi8gIAorI2RlZmluZSAgR1BJT19TUEVFRF9GUkVRX0xPVyAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgIC8qITwgcmFuZ2UgdXAgdG8gMC40IE1IeiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBwcm9kdWN0IGRhdGFzaGVldCAqLworI2RlZmluZSAgR1BJT19TUEVFRF9GUkVRX01FRElVTSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgIC8qITwgcmFuZ2UgMC40IE1IeiB0byAyIE1IeiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBwcm9kdWN0IGRhdGFzaGVldCAqLworI2RlZmluZSAgR1BJT19TUEVFRF9GUkVRX0hJR0ggICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgIC8qITwgcmFuZ2UgICAyIE1IeiB0byAxMCBNSHosIHBsZWFzZSByZWZlciB0byB0aGUgcHJvZHVjdCBkYXRhc2hlZXQgKi8KKyNkZWZpbmUgIEdQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0ggICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwM1UpICAvKiE8IHJhbmdlICAxMCBNSHogdG8gMzUgTUh6LCBwbGVhc2UgcmVmZXIgdG8gdGhlIHByb2R1Y3QgZGF0YXNoZWV0ICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNkZWZpbmUgSVNfR1BJT19TUEVFRChfX1NQRUVEX18pICgoKF9fU1BFRURfXykgPT0gR1BJT19TUEVFRF9GUkVRX0xPVyAgICAgKSAgfHwgKChfX1NQRUVEX18pID09IEdQSU9fU1BFRURfRlJFUV9NRURJVU0gICAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TUEVFRF9fKSA9PSBHUElPX1NQRUVEX0ZSRVFfSElHSCAgKSB8fCAoKF9fU1BFRURfXykgPT0gR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSCkpCisKKworIC8qKiBAZGVmZ3JvdXAgR1BJT19wdWxsX2RlZmluZSBQdWxsIGRlZmluaXRpb24KKyAgICogQGJyaWVmIEdQSU8gUHVsbC1VcCBvciBQdWxsLURvd24gQWN0aXZhdGlvbgorICAgKiBAeworICAgKi8gIAorI2RlZmluZSAgR1BJT19OT1BVTEwgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgLyohPCBObyBQdWxsLXVwIG9yIFB1bGwtZG93biBhY3RpdmF0aW9uICAqLworI2RlZmluZSAgR1BJT19QVUxMVVAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAgLyohPCBQdWxsLXVwIGFjdGl2YXRpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19QVUxMRE9XTiAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpICAgLyohPCBQdWxsLWRvd24gYWN0aXZhdGlvbiAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZGVmaW5lIElTX0dQSU9fUFVMTChfX1BVTExfXykgKCgoX19QVUxMX18pID09IEdQSU9fTk9QVUxMKSB8fCAoKF9fUFVMTF9fKSA9PSBHUElPX1BVTExVUCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFVMTF9fKSA9PSBHUElPX1BVTExET1dOKSkKKworICAKKy8qKgorICAqIEB9CisgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX01hY3JvIEdQSU8gRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBFWFRJIGxpbmUgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUoMC4uMTUpCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRVhUSV9MSU5FX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9HRVRfRkxBRyhfX0VYVElfTElORV9fKSAoRVhUSS0+UFIgJiAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIHRoZSBFWFRJJ3MgbGluZSBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgZmxhZ3MgdG8gY2xlYXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUgKDAuLjE1KQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9HUElPX0VYVElfQ0xFQVJfRkxBRyhfX0VYVElfTElORV9fKSAoRVhUSS0+UFIgPSAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBFWFRJIGxpbmUgaXMgYXNzZXJ0ZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSgwLi4xNSkKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19FWFRJX0xJTkVfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0dFVF9JVChfX0VYVElfTElORV9fKSAoRVhUSS0+UFIgJiAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIHRoZSBFWFRJJ3MgbGluZSBwZW5kaW5nIGJpdHMuCisgICogQHBhcmFtICBfX0VYVElfTElORV9fIHNwZWNpZmllcyB0aGUgRVhUSSBsaW5lcyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUgKDAuLjE1KQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9HUElPX0VYVElfQ0xFQVJfSVQoX19FWFRJX0xJTkVfXykgKEVYVEktPlBSID0gKF9fRVhUSV9MSU5FX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlcyBhIFNvZnR3YXJlIGludGVycnVwdCBvbiBzZWxlY3RlZCBFWFRJIGxpbmUuCisgICogQHBhcmFtICBfX0VYVElfTElORV9fIHNwZWNpZmllcyB0aGUgRVhUSSBsaW5lIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlKDAuLjE1KQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9HUElPX0VYVElfR0VORVJBVEVfU1dJVChfX0VYVElfTElORV9fKSAoRVhUSS0+U1dJRVIgfD0gKF9fRVhUSV9MSU5FX18pKQorCisvKioKKyAgKiBAfQorICAqLworLyogSW5jbHVkZSBHUElPIEhBTCBFeHRlbnNpb24gbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9ncGlvX2V4LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnMgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQHsKKyAqLwordm9pZCAgSEFMX0dQSU9fSW5pdChHUElPX1R5cGVEZWYgICpHUElPeCwgR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0KTsKK3ZvaWQgIEhBTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgICpHUElPeCwgdWludDMyX3QgR1BJT19QaW4pOworLyoqCisgICogQH0KKyAgKi8KKworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEB7CisgKi8KK0dQSU9fUGluU3RhdGUgSEFMX0dQSU9fUmVhZFBpbihHUElPX1R5cGVEZWYqIEdQSU94LCB1aW50MTZfdCBHUElPX1Bpbik7Cit2b2lkICAgICAgICAgIEhBTF9HUElPX1dyaXRlUGluKEdQSU9fVHlwZURlZiogR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluLCBHUElPX1BpblN0YXRlIFBpblN0YXRlKTsKK3ZvaWQgICAgICAgICAgSEFMX0dQSU9fVG9nZ2xlUGluKEdQSU9fVHlwZURlZiogR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9HUElPX0xvY2tQaW4oR1BJT19UeXBlRGVmKiBHUElPeCwgdWludDE2X3QgR1BJT19QaW4pOwordm9pZCAgICAgICAgICBIQUxfR1BJT19FWFRJX0lSUUhhbmRsZXIodWludDE2X3QgR1BJT19QaW4pOwordm9pZCAgICAgICAgICBIQUxfR1BJT19FWFRJX0NhbGxiYWNrKHVpbnQxNl90IEdQSU9fUGluKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIERlZmluZSB0aGUgcHJpdmF0ZSBncm91cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19Qcml2YXRlIEdQSU8gUHJpdmF0ZQorICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioKKyAgKiBAfQorICAqLyAKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0hBTF9HUElPX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfZ3Bpb19leC5oIGIvSW5jL3N0bTMybDB4eF9oYWxfZ3Bpb19leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZGMyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9ncGlvX2V4LmgKQEAgLTAsMCArMSwyNTA2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9ncGlvX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEdQSU8gSEFMIEV4dGVuc2lvbiBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkwweHhfSEFMX0dQSU9fRVhfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfR1BJT19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXggR1BJT0V4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIEdQSU9FeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLyAKKyAgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJMMDgzeHgvU1RNMzJMMDczeHgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQgKFNUTTMyTDA4M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkKKworLyogVGhlIHRhYmxlIGJlbG93IGdpdmVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBkaWZmZXJlbnQgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBwZXIgcG9ydC4KKyAqIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgeW91cnNlbGYgdG8gdGhlIHByb2R1Y3QgZGF0YSBzaGVldC4KKyAqCisgKi8KKworLyogICAgIHwgICBBRjAgIHwgICBBRjEgIHwgICBBRjIgIHwgICBBRjMgIHwgICBBRjQgIHwgICBBRjUgIHwgICBBRjYgIHwgICBBRjcgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQQTAgfCAgICAgICAgfCAgICAgICAgfFRJTTJfQzEgfFRTQyAgICAgfFVTQVJUMiAgfFRJTTJfVFIgfFVTQVJUNCAgfENPTVAxICAgfAorICogUEExIHxFVkVOVE9VVHxMQ0QgICAgIHxUSU0yX0MyIHxUU0MgICAgIHxVU0FSVDIgIHxUSU0yMV9UUnxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBBMiB8VElNMjFfQzF8TENEICAgICB8VElNMl9DMyB8VFNDICAgICB8VVNBUlQyICB8ICAgICAgICB8TFBVQVJUMSB8Q09NUDIgICB8CisgKiBQQTMgfFRJTTIxX0MyfExDRCAgICAgfFRJTTJfQzQgfFRTQyAgICAgfFVTQVJUMiAgfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfAorICogUEE0IHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHxUU0MgICAgIHxVU0FSVDIgIHxUSU0yMl9UUnwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBNSB8U1BJMSAgICB8ICAgICAgICB8VElNMl9UUiB8VFNDICAgICB8ICAgICAgICB8VElNMl9DMSB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTYgfFNQSTEgICAgfExDRCAgICAgfFRJTTNfQzEgfFRTQyAgICAgfExQVUFSVDEgfFRJTTIyX0MxfEVWRU5UT1VUfENPTVAxICAgfAorICogUEE3IHxTUEkxICAgIHxMQ0QgICAgIHxUSU0zX0MyIHxUU0MgICAgIHwgICAgICAgIHxUSU0yMl9DMnxFVkVOVE9VVHxDT01QMiAgIHwKKyAqIFBBOCB8TUNPICAgICB8TENEICAgICB8VVNCICAgICB8RVZFTlRPVVR8VVNBUlQxICB8ICAgICAgICB8ICAgICAgICB8STJDMyAgICB8CisgKiBQQTkgfE1DTyAgICAgfExDRCAgICAgfCAgICAgICAgfFRTQyAgICAgfFVTQVJUMSAgfCAgICAgICAgfEkyQzEgICAgfEkyQzMgICAgfAorICogUEExMHwgICAgICAgIHxMQ0QgICAgIHwgICAgICAgIHxUU0MgICAgIHxVU0FSVDEgIHwgICAgICAgIHxJMkMxICAgIHwgICAgICAgIHwKKyAqIFBBMTF8U1BJMSAgICB8ICAgICAgICB8RVZFTlRPVVR8VFNDICAgICB8VVNBUlQxICB8ICAgICAgICB8STJDMiAgICB8Q09NUDEgICB8CisgKiBQQTEyfFNQSTEgICAgfCAgICAgICAgfEVWRU5UT1VUfFRTQyAgICAgfFVTQVJUMSAgfCAgICAgICAgfEkyQzIgICAgfENPTVAyICAgfAorICogUEExM3xTV0RJTyAgIHwgICAgICAgIHxVU0IgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxMUFVBUlQxIHwgICAgICAgIHwKKyAqIFBBMTR8U1dDTEsgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQyICB8ICAgICAgICB8TFBVQVJUMSB8ICAgICAgICB8CisgKiBQQTE1fFNQSTEgICAgfExDRCAgICAgfFRJTTJfVFIgfEVWRU5UT1VUfFVTQVJUMiAgfFRJTTJfQzEgfFVTQVJUNCAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBCMCB8RVZFTlRPVVR8TENEICAgICB8VElNM19DMyB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjEgfCAgICAgICAgfExDRCAgICAgfFRJTTNfQzQgfFRTQyAgICAgfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIyIHwgICAgICAgIHwgICAgICAgIHxMUFRJTTFfT3xUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxJMkMzICAgIHwKKyAqIFBCMyB8U1BJMSAgICB8TENEICAgICB8VElNMl9DMiB8VFNDICAgICB8RVZFTlRPVVR8VVNBUlQxICB8VVNBUlQ1ICB8ICAgICAgICB8CisgKiBQQjQgfFNQSTEgICAgfExDRCAgICAgfFRJTTNfQzEgfFRTQyAgICAgfFRJTTIyX0MxfFVTQVJUMSAgfFVTQVJUNSAgfEkyQzMgICAgfAorICogUEI1IHxTUEkxICAgIHxMQ0QgICAgIHxMUFRJTTFfSXxJMkMxICAgIHxUSU0zX0MyIHxVU0FSVDEgIHxVU0FSVDUgIHwgICAgICAgIHwKKyAqICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VElNMjJfQzJ8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjYgfFVTQVJUMSAgfEkyQzEgICAgfExQVElNMV9UfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI3IHxVU0FSVDEgIHxJMkMxICAgIHxMUFRJTTFfSXxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBCOCB8ICAgICAgICB8TENEICAgICB8ICAgICAgICB8VFNDICAgICB8STJDMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjkgfCAgICAgICAgfExDRCAgICAgfEVWRU5UT1VUfCAgICAgICAgfEkyQzEgICAgfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIxMHwgICAgICAgIHxMQ0QgICAgIHxUSU0yX0MzIHxUU0MgICAgIHxMUFVBUlQxIHxTUEkyICAgIHxJMkMyICAgIHxMUFVBUlQxIHwKKyAqIFBCMTF8RVZFTlRPVVR8TENEICAgICB8VElNMl9DNCB8VFNDICAgICB8TFBVQVJUMSB8ICAgICAgICB8STJDMiAgICB8TFBVQVJUMSB8CisgKiBQQjEyfFNQSTIgICAgfExDRCAgICAgfExQVUFSVDEgfFRTQyAgICAgfCAgICAgICAgfEkyQzIgICAgfEVWRU5UT1VUfCAgICAgICAgfAorICogUEIxM3xTUEkyICAgIHxMQ0QgICAgIHxNQ08gICAgIHxUU0MgICAgIHxMUFVBUlQxIHxJMkMyICAgIHxUSU0yMV9DMXwgICAgICAgIHwKKyAqIFBCMTR8U1BJMiAgICB8TENEICAgICB8UlRDICAgICB8VFNDICAgICB8TFBVQVJUMSB8STJDMiAgICB8VElNMjFfQzJ8ICAgICAgICB8CisgKiBQQjE1fFNQSTIgICAgfExDRCAgICAgfFJUQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBDMCB8TFBUSU0xX0l8TENEICAgICB8RVZFTlRPVVR8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8TFBVQVJUMSB8STJDMyAgICB8CisgKiBQQzEgfExQVElNMV9PfExDRCAgICAgfEVWRU5UT1VUfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfExQVUFSVDEgfEkyQzMgICAgfAorICogUEMyIHxMUFRJTTFfSXxMQ0QgICAgIHxTUEkyICAgIHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMyB8TFBUSU0xX1R8TENEICAgICB8U1BJMiAgICB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzQgfEVWRU5UT1VUfExDRCAgICAgfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM1IHwgICAgICAgIHxMQ0QgICAgIHxMUFVBUlQxIHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDNiB8VElNMjJfQzF8TENEICAgICB8VElNM19DMSB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzcgfFRJTTIyX0MyfExDRCAgICAgfFRJTTNfQzIgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM4IHxUSU0yMl9UUnxMQ0QgICAgIHxUSU0zX0MzIHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDOSB8VElNMjFfVFJ8TENEICAgICB8VVNCICAgICB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8STJDMyAgICB8CisgKiAgICAgfCAgICAgICAgfCAgICAgICAgfFRJTTNfQzQgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxMHxMUFVBUlQxIHxMQ0QgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBDMTF8TFBVQVJUMSB8TENEICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ0ICB8ICAgICAgICB8CisgKiBQQzEyfCAgICAgICAgfExDRCAgICAgfFVTQVJUNSAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUNCAgfCAgICAgICAgfAorICogUEMxM3wgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzE1fCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBEMCB8VElNMjFfQzF8U1BJMiAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDEgfCAgICAgICAgfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQyIHxMUFVBUlQxIHxMQ0QgICAgIHxUSU0zX1RSIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDUgIHwgICAgICAgIHwKKyAqIFBEMyB8VVNBUlQyICB8TENEICAgICB8U1BJMiAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDQgfFVTQVJUMiAgfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQ1IHxVU0FSVDIgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBENiB8VVNBUlQyICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDcgfFVTQVJUMiAgfFRJTTIxX0MyfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQ4IHxMUFVBUlQxIHxMQ0QgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEOSB8TFBVQVJUMSB8TENEICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDEwfCAgICAgICAgfExDRCAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQxMXxMUFVBUlQxIHxMQ0QgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEMTJ8TFBVQVJUMSB8TENEICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDEzfCAgICAgICAgfExDRCAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQxNHwgICAgICAgIHxMQ0QgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEMTV8VVNCICAgICB8TENEICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEUwIHwgICAgICAgIHxMQ0QgICAgIHxFVkVOVE9VVHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFMSB8ICAgICAgICB8TENEICAgICB8RVZFTlRPVVR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTIgfCAgICAgICAgfExDRCAgICAgfFRJTTNfVFIgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEUzIHxUSU0yMl9DMXxMQ0QgICAgIHxUSU0zX0MxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFNCB8VElNMjJfQzJ8ICAgICAgICB8VElNM19DMiB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTUgfFRJTTIxX0MxfCAgICAgICAgfFRJTTNfQzMgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEU2IHxUSU0yMV9DMnwgICAgICAgIHxUSU0zX0M0IHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFNyB8ICAgICAgICB8TENEICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ1ICB8ICAgICAgICB8CisgKiBQRTggfCAgICAgICAgfExDRCAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUNCAgfCAgICAgICAgfAorICogUEU5IHxUSU0yX0MxIHxMQ0QgICAgIHxUSU0yX1RSIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBFMTB8VElNMl9DMiB8TENEICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ1ICB8ICAgICAgICB8CisgKiBQRTExfFRJTTJfQzMgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUNSAgfCAgICAgICAgfAorICogUEUxMnxUSU0yX0M0IHwgICAgICAgIHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFMTN8ICAgICAgICB8TENEICAgICB8U1BJMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTE0fCAgICAgICAgfExDRCAgICAgfFNQSTEgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEUxNXwgICAgICAgIHxMQ0QgICAgIHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQSDAgfFVTQiAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEgxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBIOSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQSDEwfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICoKKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uIEFsdGVybmF0ZSBmdW5jdGlvbiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjAKKyAqLworI2RlZmluZSBHUElPX0FGMF9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAwVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NXRElPICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dESU8gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dDTEsgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0NMSyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDEgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMF9USU0yMiAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRJTTIyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMF9USU0yICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1VTQiAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVVNCIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKy8qKgorICoKKyAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMQorICovCisjZGVmaW5lIEdQSU9fQUYxX0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjFfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMV9USU0yMSAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYxX0xDRCAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogTENEIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKy8qKgorICoKKyAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMgorICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMl9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAyVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfTFBVQVJUMSAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMl9NQ08gICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1JUQyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogUlRDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMl9VU0FSVDUgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFVTQVJUNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYyX1NQSTEgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfVVNCICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBVU0IgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworLyoqCisgKgorICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYzCisgKi8KKyNkZWZpbmUgR1BJT19BRjNfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGM19JMkMxICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYzX1RTQyAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogVFNDICBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKy8qKgorICoKKyAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNAorICovCisjZGVmaW5lIEdQSU9fQUY0X1VTQVJUMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY0X0xQVUFSVDEgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1VTQVJUMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY0X0VWRU5UT1VUICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTIyICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTMgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzEgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisvKioKKyAqCisgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjUKKyAqLworI2RlZmluZSBHUElPX0FGNV9USU0yICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMjIgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNV9VU0FSVDEgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfSTJDMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworLyoqCisgKgorICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY2CisgKi8KKworI2RlZmluZSBHUElPX0FGNl9VU0FSVDQgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFVTQVJUNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY2X0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JMkMxICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY2X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogSTJDMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjZfVVNBUlQ1ICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBVU0FSVDUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNl9USU0yMSAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisvKioKKyAqCisgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjcKKyAqLworI2RlZmluZSBHUElPX0FGN19DT01QMSAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ09NUDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY3X0NPTVAyICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjdfSTJDMyAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIEkyQzMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGN19MUFVBUlQxICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisvKioKKyAgKgorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9Qcml2YXRlICBHUElPRXggUHJpdmF0ZQorICogQHsKKyAqLworLyoqCisgKiAgSVNfR1BJT19BRiBtYWNybyBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgSVNfR1BJT19BRihBRikgICAgICAgICAoKEFGKSA8PSAodWludDhfdCkweDA3KQorCisgLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiAoU1RNMzJMMDgzeHgpIHx8IChTVE0zMkwwNzN4eCkgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkwwODJ4eCBhbmQgU1RNMzJMMDcyeHgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzJ4eCkKKworLyogVGhlIHRhYmxlIGJlbG93IGdpdmVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBkaWZmZXJlbnQgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBwZXIgcG9ydC4KKyAqIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgeW91cnNlbGYgdG8gdGhlIHByb2R1Y3QgZGF0YSBzaGVldC4KKyAqLworCisKKy8qICAgICB8ICAgQUYwICB8ICAgQUYxICB8ICAgQUYyICB8ICAgQUYzICB8ICAgQUY0ICB8ICAgQUY1ICB8ICAgQUY2ICB8ICAgQUY3ICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEEwIHwgICAgICAgIHwgICAgICAgIHxUSU0yX0MxIHxUU0MgICAgIHxVU0FSVDIgIHxUSU0yX1RSIHxVU0FSVDQgIHxDT01QMSAgIHwKKyAqIFBBMSB8RVZFTlRPVVR8ICAgICAgICB8VElNMl9DMiB8VFNDICAgICB8VVNBUlQyICB8VElNMjFfVFJ8VVNBUlQ0ICB8ICAgICAgICB8CisgKiBQQTIgfFRJTTIxX0MxfCAgICAgICAgfFRJTTJfQzMgfFRTQyAgICAgfFVTQVJUMiAgfCAgICAgICAgfExQVUFSVDEgfENPTVAyICAgfAorICogUEEzIHxUSU0yMV9DMnwgICAgICAgIHxUSU0yX0M0IHxUU0MgICAgIHxVU0FSVDIgIHwgICAgICAgIHxMUFVBUlQxIHwgICAgICAgIHwKKyAqIFBBNCB8U1BJMSAgICB8ICAgICAgICB8ICAgICAgICB8VFNDICAgICB8VVNBUlQyICB8VElNMjJfVFJ8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTUgfFNQSTEgICAgfCAgICAgICAgfFRJTTJfVFIgfFRTQyAgICAgfCAgICAgICAgfFRJTTJfQzEgfCAgICAgICAgfCAgICAgICAgfAorICogUEE2IHxTUEkxICAgIHwgICAgICAgIHxUSU0zX0MxIHxUU0MgICAgIHxMUFVBUlQxIHxUSU0yMl9DMXxFVkVOVE9VVHxDT01QMSAgIHwKKyAqIFBBNyB8U1BJMSAgICB8ICAgICAgICB8VElNM19DMiB8VFNDICAgICB8ICAgICAgICB8VElNMjJfQzJ8RVZFTlRPVVR8Q09NUDIgICB8CisgKiBQQTggfE1DTyAgICAgfCAgICAgICAgfFVTQiAgICAgfEVWRU5UT1VUfFVTQVJUMSAgfCAgICAgICAgfCAgICAgICAgfEkyQzMgICAgfAorICogUEE5IHxNQ08gICAgIHwgICAgICAgIHwgICAgICAgIHxUU0MgICAgIHxVU0FSVDEgIHwgICAgICAgIHxJMkMxICAgIHxJMkMzICAgIHwKKyAqIFBBMTB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VFNDICAgICB8VVNBUlQxICB8ICAgICAgICB8STJDMSAgICB8ICAgICAgICB8CisgKiBQQTExfFNQSTEgICAgfCAgICAgICAgfEVWRU5UT1VUfFRTQyAgICAgfFVTQVJUMSAgfCAgICAgICAgfEkyQzIgICAgfENPTVAxICAgfAorICogUEExMnxTUEkxICAgIHwgICAgICAgIHxFVkVOVE9VVHxUU0MgICAgIHxVU0FSVDEgIHwgICAgICAgIHxJMkMyICAgIHxDT01QMiAgIHwKKyAqIFBBMTN8U1dESU8gICB8ICAgICAgICB8VVNCICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8TFBVQVJUMSB8ICAgICAgICB8CisgKiBQQTE0fFNXQ0xLICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUMiAgfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfAorICogUEExNXxTUEkxICAgIHwgICAgICAgIHxUSU0yX1RSIHxFVkVOVE9VVHxVU0FSVDIgIHxUSU0yX0MxIHxVU0FSVDQgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQQjAgfEVWRU5UT1VUfCAgICAgICAgfFRJTTNfQzMgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIxIHwgICAgICAgIHwgICAgICAgIHxUSU0zX0M0IHxUU0MgICAgIHxMUFVBUlQxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCMiB8ICAgICAgICB8ICAgICAgICB8TFBUSU0xX098VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8STJDMyAgICB8CisgKiBQQjMgfFNQSTEgICAgfCAgICAgICAgfFRJTTJfQzIgfFRTQyAgICAgfEVWRU5UT1VUfFVTQVJUMSAgfFVTQVJUNSAgfCAgICAgICAgfAorICogUEI0IHxTUEkxICAgIHwgICAgICAgIHxUSU0zX0MxIHxUU0MgICAgIHxUSU0yMl9DMXxVU0FSVDEgIHxVU0FSVDUgIHxJMkMzICAgIHwKKyAqIFBCNSB8U1BJMSAgICB8ICAgICAgICB8TFBUSU0xX0l8STJDMSAgICB8VElNM19DMiB8VVNBUlQxICB8VVNBUlQ1ICB8ICAgICAgICB8CisgKiAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFRJTTIyX0MyfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI2IHxVU0FSVDEgIHxJMkMxICAgIHxMUFRJTTFfVHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCNyB8VVNBUlQxICB8STJDMSAgICB8TFBUSU0xX0l8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ0ICB8ICAgICAgICB8CisgKiBQQjggfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFRTQyAgICAgfEkyQzEgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI5IHwgICAgICAgIHwgICAgICAgIHxFVkVOVE9VVHwgICAgICAgIHxJMkMxICAgIHxTUEkyICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCMTB8ICAgICAgICB8ICAgICAgICB8VElNMl9DMyB8VFNDICAgICB8TFBVQVJUMSB8U1BJMiAgICB8STJDMiAgICB8TFBVQVJUMSB8CisgKiBQQjExfEVWRU5UT1VUfCAgICAgICAgfFRJTTJfQzQgfFRTQyAgICAgfExQVUFSVDEgfCAgICAgICAgfEkyQzIgICAgfExQVUFSVDEgfAorICogUEIxMnxTUEkyICAgIHwgICAgICAgIHxMUFVBUlQxIHxUU0MgICAgIHwgICAgICAgIHxJMkMyICAgIHxFVkVOVE9VVHwgICAgICAgIHwKKyAqIFBCMTN8U1BJMiAgICB8ICAgICAgICB8TUNPICAgICB8VFNDICAgICB8TFBVQVJUMSB8STJDMiAgICB8VElNMjFfQzF8ICAgICAgICB8CisgKiBQQjE0fFNQSTIgICAgfCAgICAgICAgfFJUQyAgICAgfFRTQyAgICAgfExQVUFSVDEgfEkyQzIgICAgfFRJTTIxX0MyfCAgICAgICAgfAorICogUEIxNXxTUEkyICAgIHwgICAgICAgIHxSVEMgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQQzAgfExQVElNMV9JfCAgICAgICAgfEVWRU5UT1VUfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfExQVUFSVDEgfEkyQzMgICAgfAorICogUEMxIHxMUFRJTTFfT3wgICAgICAgIHxFVkVOVE9VVHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHxMUFVBUlQxIHxJMkMzICAgIHwKKyAqIFBDMiB8TFBUSU0xX0l8ICAgICAgICB8U1BJMiAgICB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzMgfExQVElNMV9UfCAgICAgICAgfFNQSTIgICAgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM0IHxFVkVOVE9VVHwgICAgICAgIHxMUFVBUlQxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDNSB8ICAgICAgICB8ICAgICAgICB8TFBVQVJUMSB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzYgfFRJTTIyX0MxfCAgICAgICAgfFRJTTNfQzEgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM3IHxUSU0yMl9DMnwgICAgICAgIHxUSU0zX0MyIHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDOCB8VElNMjJfVFJ8ICAgICAgICB8VElNM19DMyB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzkgfFRJTTIxX1RSfCAgICAgICAgfFVTQiAgICAgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfEkyQzMgICAgfAorICogICAgIHwgICAgICAgIHwgICAgICAgIHxUSU0zX0M0IHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTB8TFBVQVJUMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ0ICB8ICAgICAgICB8CisgKiBQQzExfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUNCAgfCAgICAgICAgfAorICogUEMxMnwgICAgICAgIHwgICAgICAgIHxVU0FSVDUgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBDMTN8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzE0fCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxNXwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQRDAgfFRJTTIxX0MxfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQxIHwgICAgICAgIHxTUEkyICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEMiB8TFBVQVJUMSB8ICAgICAgICB8VElNM19UUiB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ1ICB8ICAgICAgICB8CisgKiBQRDMgfFVTQVJUMiAgfCAgICAgICAgfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQ0IHxVU0FSVDIgIHxTUEkyICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBENSB8VVNBUlQyICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDYgfFVTQVJUMiAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQ3IHxVU0FSVDIgIHxUSU0yMV9DMnwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEOCB8TFBVQVJUMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDkgfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQxMHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEMTF8TFBVQVJUMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDEyfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQxM3wgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEMTR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDE1fFVTQiAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBFMCB8ICAgICAgICB8ICAgICAgICB8RVZFTlRPVVR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTEgfCAgICAgICAgfCAgICAgICAgfEVWRU5UT1VUfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEUyIHwgICAgICAgIHwgICAgICAgIHxUSU0zX1RSIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFMyB8VElNMjJfQzF8ICAgICAgICB8VElNM19DMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTQgfFRJTTIyX0MyfCAgICAgICAgfFRJTTNfQzIgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEU1IHxUSU0yMV9DMXwgICAgICAgIHxUSU0zX0MzIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFNiB8VElNMjFfQzJ8ICAgICAgICB8VElNM19DNCB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTcgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUNSAgfCAgICAgICAgfAorICogUEU4IHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBFOSB8VElNMl9DMSB8ICAgICAgICB8VElNMl9UUiB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ0ICB8ICAgICAgICB8CisgKiBQRTEwfFRJTTJfQzIgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUNSAgfCAgICAgICAgfAorICogUEUxMXxUSU0yX0MzIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDUgIHwgICAgICAgIHwKKyAqIFBFMTJ8VElNMl9DNCB8ICAgICAgICB8U1BJMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTEzfCAgICAgICAgfCAgICAgICAgfFNQSTEgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEUxNHwgICAgICAgIHwgICAgICAgIHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFMTV8ICAgICAgICB8ICAgICAgICB8U1BJMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEgwIHxVU0IgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBIMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQSDkgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEgxMHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqCisgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfQWx0ZXJuYXRlX2Z1bmN0aW9uX3NlbGVjdGlvbiBBbHRlcm5hdGUgZnVuY3Rpb24gc2VsZWN0aW9uCisgKiBAeworICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYwCisgKi8KKyNkZWZpbmUgR1BJT19BRjBfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9USU0yMSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NQSTEgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfTUNPICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBNQ08gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9TV0RJTyAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXRElPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NXQ0xLICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dDTEsgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMF9TUEkyICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMjIgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9MUFVBUlQxICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYwX1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMF9VU0IgICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFVTQiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMQorICovCisjZGVmaW5lIEdQSU9fQUYxX0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjFfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMV9USU0yMSAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMgorICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9USU0zICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYyX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMl9MUFVBUlQxICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfTUNPICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBNQ08gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1JUQyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogUlRDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9TUEkyICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfVVNBUlQ1ICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBVU0FSVDUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1NQSTEgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9VU0IgICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFVTQiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYzCisgKi8KKyNkZWZpbmUgR1BJT19BRjNfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYzX0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGM19UU0MgICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRTQyAgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY0CisgKi8KKyNkZWZpbmUgR1BJT19BRjRfVVNBUlQyICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY0X0xQVUFSVDEgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfRVZFTlRPVVQgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTIyICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNF9USU0zICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNQorICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMjEgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU0yMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNV9USU0yMiAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY1X1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfSTJDMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNgorICovCisjZGVmaW5lIEdQSU9fQUY2X1VTQVJUNCAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVVNBUlQ0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY2X0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY2X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY2X0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUY2X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogSTJDMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUY2X1VTQVJUNSAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVVNBUlQ1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY2X1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisvKioKKyAgKgorICAqLworCisgLyoKKyAgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY3CisgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDEgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGN19DT01QMiAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ09NUDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY3X0kyQzMgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBJMkMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjdfTFBVQVJUMSAgICAgICgodWludDhfdCkweDA3VSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworLyoqCisgICoKKyAgKi8KKworIC8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X1ByaXZhdGUgIEdQSU9FeCBQcml2YXRlCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBJU19HUElPX0FGIG1hY3JvIGRlZmluaXRpb24KKyAqLworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICgoQUYpIDw9ICh1aW50OF90KTB4MDcpCisKKyAvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIChTVE0zMkwwODJ4eCkgfHwgKFNUTTMyTDA3Mnh4KSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJMMDgxeHggYW5kIFNUTTMyTDA3MXh4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwODF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDcxeHgpCisKKy8qIFRoZSB0YWJsZSBiZWxvdyBnaXZlcyBhbiBvdmVydmlldyBvZiB0aGUgZGlmZmVyZW50IGFsdGVybmF0ZSBmdW5jdGlvbnMgcGVyIHBvcnQuCisgKiBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHlvdXJzZWxmIHRvIHRoZSBwcm9kdWN0IGRhdGEgc2hlZXQuCisgKgorICovCisKKworLyogICAgIHwgICBBRjAgIHwgICBBRjEgIHwgICBBRjIgIHwgICBBRjMgIHwgICBBRjQgIHwgICBBRjUgIHwgICBBRjYgIHwgICBBRjcgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQQTAgfCAgICAgICAgfCAgICAgICAgfFRJTTJfQzEgfCAgICAgICAgfFVTQVJUMiAgfFRJTTJfVFIgfFVTQVJUNCAgfENPTVAxICAgfAorICogUEExIHxFVkVOVE9VVHwgICAgICAgIHxUSU0yX0MyIHwgICAgICAgIHxVU0FSVDIgIHxUSU0yMV9UUnxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBBMiB8VElNMjFfQzF8ICAgICAgICB8VElNMl9DMyB8ICAgICAgICB8VVNBUlQyICB8ICAgICAgICB8TFBVQVJUMSB8Q09NUDIgICB8CisgKiBQQTMgfFRJTTIxX0MyfCAgICAgICAgfFRJTTJfQzQgfCAgICAgICAgfFVTQVJUMiAgfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfAorICogUEE0IHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDIgIHxUSU0yMl9UUnwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBNSB8U1BJMSAgICB8ICAgICAgICB8VElNMl9UUiB8ICAgICAgICB8ICAgICAgICB8VElNMl9DMSB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTYgfFNQSTEgICAgfCAgICAgICAgfFRJTTNfQzEgfCAgICAgICAgfExQVUFSVDEgfFRJTTIyX0MxfEVWRU5UT1VUfENPTVAxICAgfAorICogUEE3IHxTUEkxICAgIHwgICAgICAgIHxUSU0zX0MyIHwgICAgICAgIHwgICAgICAgIHxUSU0yMl9DMnxFVkVOVE9VVHxDT01QMiAgIHwKKyAqIFBBOCB8TUNPICAgICB8ICAgICAgICB8ICAgICAgICB8RVZFTlRPVVR8VVNBUlQxICB8ICAgICAgICB8ICAgICAgICB8STJDMyAgICB8CisgKiBQQTkgfE1DTyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUMSAgfCAgICAgICAgfEkyQzEgICAgfEkyQzMgICAgfAorICogUEExMHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDEgIHwgICAgICAgIHxJMkMxICAgIHwgICAgICAgIHwKKyAqIFBBMTF8U1BJMSAgICB8ICAgICAgICB8RVZFTlRPVVR8ICAgICAgICB8VVNBUlQxICB8ICAgICAgICB8STJDMiAgICB8Q09NUDEgICB8CisgKiBQQTEyfFNQSTEgICAgfCAgICAgICAgfEVWRU5UT1VUfCAgICAgICAgfFVTQVJUMSAgfCAgICAgICAgfEkyQzIgICAgfENPTVAyICAgfAorICogUEExM3xTV0RJTyAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxMUFVBUlQxIHwgICAgICAgIHwKKyAqIFBBMTR8U1dDTEsgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQyICB8ICAgICAgICB8TFBVQVJUMSB8ICAgICAgICB8CisgKiBQQTE1fFNQSTEgICAgfCAgICAgICAgfFRJTTJfVFIgfEVWRU5UT1VUfFVTQVJUMiAgfFRJTTJfQzEgfFVTQVJUNCAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBCMCB8RVZFTlRPVVR8ICAgICAgICB8VElNM19DMyB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjEgfCAgICAgICAgfCAgICAgICAgfFRJTTNfQzQgfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIyIHwgICAgICAgIHwgICAgICAgIHxMUFRJTTFfT3wgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxJMkMzICAgIHwKKyAqIFBCMyB8U1BJMSAgICB8ICAgICAgICB8VElNMl9DMiB8ICAgICAgICB8RVZFTlRPVVR8VVNBUlQxICB8VVNBUlQ1ICB8ICAgICAgICB8CisgKiBQQjQgfFNQSTEgICAgfCAgICAgICAgfFRJTTNfQzEgfCAgICAgICAgfFRJTTIyX0MxfFVTQVJUMSAgfFVTQVJUNSAgfEkyQzMgICAgfAorICogUEI1IHxTUEkxICAgIHwgICAgICAgIHxMUFRJTTFfSXxJMkMxICAgIHxUSU0zX0MyIHxVU0FSVDEgIHxVU0FSVDUgIHwgICAgICAgIHwKKyAqICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VElNMjJfQzJ8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjYgfFVTQVJUMSAgfEkyQzEgICAgfExQVElNMV9UfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI3IHxVU0FSVDEgIHxJMkMxICAgIHxMUFRJTTFfSXwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBCOCB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8STJDMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjkgfCAgICAgICAgfCAgICAgICAgfEVWRU5UT1VUfCAgICAgICAgfEkyQzEgICAgfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIxMHwgICAgICAgIHwgICAgICAgIHxUSU0yX0MzIHwgICAgICAgIHxMUFVBUlQxIHxTUEkyICAgIHxJMkMyICAgIHxMUFVBUlQxIHwKKyAqIFBCMTF8RVZFTlRPVVR8ICAgICAgICB8VElNMl9DNCB8ICAgICAgICB8TFBVQVJUMSB8ICAgICAgICB8STJDMiAgICB8TFBVQVJUMSB8CisgKiBQQjEyfFNQSTIgICAgfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfEkyQzIgICAgfEVWRU5UT1VUfCAgICAgICAgfAorICogUEIxM3xTUEkyICAgIHwgICAgICAgIHxNQ08gICAgIHwgICAgICAgIHxMUFVBUlQxIHxJMkMyICAgIHxUSU0yMV9DMXwgICAgICAgIHwKKyAqIFBCMTR8U1BJMiAgICB8ICAgICAgICB8UlRDICAgICB8ICAgICAgICB8TFBVQVJUMSB8STJDMiAgICB8VElNMjFfQzJ8ICAgICAgICB8CisgKiBQQjE1fFNQSTIgICAgfCAgICAgICAgfFJUQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBDMCB8TFBUSU0xX0l8ICAgICAgICB8RVZFTlRPVVR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8TFBVQVJUMSB8STJDMyAgICB8CisgKiBQQzEgfExQVElNMV9PfCAgICAgICAgfEVWRU5UT1VUfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfExQVUFSVDEgfEkyQzMgICAgfAorICogUEMyIHxMUFRJTTFfSXwgICAgICAgIHxTUEkyICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMyB8TFBUSU0xX1R8ICAgICAgICB8U1BJMiAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzQgfEVWRU5UT1VUfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM1IHwgICAgICAgIHwgICAgICAgIHxMUFVBUlQxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDNiB8VElNMjJfQzF8ICAgICAgICB8VElNM19DMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzcgfFRJTTIyX0MyfCAgICAgICAgfFRJTTNfQzIgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM4IHxUSU0yMl9UUnwgICAgICAgIHxUSU0zX0MzIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDOSB8VElNMjFfVFJ8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8STJDMyAgICB8CisgKiAgICAgfCAgICAgICAgfCAgICAgICAgfFRJTTNfQzQgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxMHxMUFVBUlQxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBDMTF8TFBVQVJUMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ0ICB8ICAgICAgICB8CisgKiBQQzEyfCAgICAgICAgfCAgICAgICAgfFVTQVJUNSAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUNCAgfCAgICAgICAgfAorICogUEMxM3wgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzE1fCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBEMCB8VElNMjFfQzF8U1BJMiAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDEgfCAgICAgICAgfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQyIHxMUFVBUlQxIHwgICAgICAgIHxUSU0zX1RSIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDUgIHwgICAgICAgIHwKKyAqIFBEMyB8VVNBUlQyICB8ICAgICAgICB8U1BJMiAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDQgfFVTQVJUMiAgfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQ1IHxVU0FSVDIgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBENiB8VVNBUlQyICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDcgfFVTQVJUMiAgfFRJTTIxX0MyfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQ4IHxMUFVBUlQxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEOSB8TFBVQVJUMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDEwfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQxMXxMUFVBUlQxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEMTJ8TFBVQVJUMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRDEzfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEQxNHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBEMTV8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEUwIHwgICAgICAgIHwgICAgICAgIHxFVkVOVE9VVHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFMSB8ICAgICAgICB8ICAgICAgICB8RVZFTlRPVVR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTIgfCAgICAgICAgfCAgICAgICAgfFRJTTNfVFIgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEUzIHxUSU0yMl9DMXwgICAgICAgIHxUSU0zX0MxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFNCB8VElNMjJfQzJ8ICAgICAgICB8VElNM19DMiB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTUgfFRJTTIxX0MxfCAgICAgICAgfFRJTTNfQzMgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEU2IHxUSU0yMV9DMnwgICAgICAgIHxUSU0zX0M0IHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFNyB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ1ICB8ICAgICAgICB8CisgKiBQRTggfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUNCAgfCAgICAgICAgfAorICogUEU5IHxUSU0yX0MxIHwgICAgICAgIHxUSU0yX1RSIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDQgIHwgICAgICAgIHwKKyAqIFBFMTB8VElNMl9DMiB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQ1ICB8ICAgICAgICB8CisgKiBQRTExfFRJTTJfQzMgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUNSAgfCAgICAgICAgfAorICogUEUxMnxUSU0yX0M0IHwgICAgICAgIHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBFMTN8ICAgICAgICB8ICAgICAgICB8U1BJMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQRTE0fCAgICAgICAgfCAgICAgICAgfFNQSTEgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEUxNXwgICAgICAgIHwgICAgICAgIHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQSDAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEgxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBIOSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQSDEwfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICoKKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uIEFsdGVybmF0ZSBmdW5jdGlvbiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjAKKyAqCisgKi8KKyNkZWZpbmUgR1BJT19BRjBfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9USU0yMSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NQSTEgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfTUNPICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBNQ08gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9TV0RJTyAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXRElPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NXQ0xLICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dDTEsgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMF9TUEkyICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMjIgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9MUFVBUlQxICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYwX1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjEKKyAqCisgKi8KKyNkZWZpbmUgR1BJT19BRjFfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMV9TUEkyICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYyCisgKgorICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMyAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMl9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAyVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfTFBVQVJUMSAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMl9NQ08gICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1JUQyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogUlRDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMl9VU0FSVDUgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFVTQVJUNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYyX1NQSTEgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYzCisgKiBAeworICovCisjZGVmaW5lIEdQSU9fQUYzX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjNfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjQKKyAqCisgKi8KKyNkZWZpbmUgR1BJT19BRjRfVVNBUlQyICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY0X0xQVUFSVDEgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfRVZFTlRPVVQgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTIyICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNF9USU0zICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNF9JMkMxICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjUKKyAqCisgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNV9USU0yMSAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIyICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMjIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNV9TUEkyICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfSTJDMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNgorICoKKyAqLworI2RlZmluZSBHUElPX0FGNl9VU0FSVDQgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFVTQVJUNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY2X0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNl9JMkMyICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY2X1VTQVJUNSAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVVNBUlQ1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjZfVElNMjEgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBUSU0yMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjcKKyAqCisgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDEgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGN19DT01QMiAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ09NUDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY3X0kyQzMgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBJMkMzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGN19MUFVBUlQxICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X1ByaXZhdGUgIEdQSU9FeCBQcml2YXRlCisgKiBAeworICovCisKKyAvKioKKyAqIElTX0dQSU9fQUYgbWFjcm8gZGVmaW5pdGlvbgorICovCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgKChBRikgPD0gKHVpbnQ4X3QpMHgwNykKKworIC8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogKFNUTTMyTDA4MXh4KSB8fCAoU1RNMzJMMDcxeHgpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJMMDUzeHgvU1RNMzJMMDYzeHgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYzeHgpCisKKy8qIFRoZSB0YWJsZSBiZWxvdyBnaXZlcyBhbiBvdmVydmlldyBvZiB0aGUgZGlmZmVyZW50IGFsdGVybmF0ZSBmdW5jdGlvbnMgcGVyIHBvcnQuCisgKiBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHlvdXJzZWxmIHRvIHRoZSBwcm9kdWN0IGRhdGEgc2hlZXQuCisgKgorICovCisvKiAgICAgfCAgIEFGMCAgfCAgIEFGMSAgfCAgIEFGMiAgfCAgIEFGMyAgfCAgIEFGNCAgfCAgIEFGNSAgfCAgIEFGNiAgfCAgIEFGNyAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBBMCB8ICAgICAgICB8ICAgICAgICB8VElNMl9DMSB8VFNDICAgICB8VVNBUlQyICB8VElNMl9UUiB8ICAgICAgICB8Q09NUDEgICB8CisgKiBQQTEgfEVWRU5UT1VUfExDRCAgICAgfFRJTTJfQzIgfFRTQyAgICAgfFVTQVJUMiAgfFRJTTIxX1RSfCAgICAgICAgfCAgICAgICAgfAorICogUEEyIHxUSU0yMV9DMXxMQ0QgICAgIHxUSU0yX0MzIHxUU0MgICAgIHxVU0FSVDIgIHwgICAgICAgIHwgICAgICAgIHxDT01QMiAgIHwKKyAqIFBBMyB8VElNMjFfQzJ8TENEICAgICB8VElNMl9DNCB8VFNDICAgICB8VVNBUlQyICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTQgfFNQSTEgICAgfCAgICAgICAgfCAgICAgICAgfFRTQyAgICAgfFVTQVJUMiAgfFRJTTIyX1RSfCAgICAgICAgfCAgICAgICAgfAorICogUEE1IHxTUEkxICAgIHwgICAgICAgIHxUSU0yX1RSIHxUU0MgICAgIHwgICAgICAgIHxUSU0yX0MxIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBNiB8U1BJMSAgICB8TENEICAgICB8ICAgICAgICB8VFNDICAgICB8TFBVQVJUICB8VElNMjJfQzF8RVZFTlRPVVR8Q09NUDEgICB8CisgKiBQQTcgfFNQSTEgICAgfExDRCAgICAgfCAgICAgICAgfFRTQyAgICAgfCAgICAgICAgfFRJTTIyX0MyfEVWRU5UT1VUfENPTVAyICAgfAorICogUEE4IHxNQ08gICAgIHxMQ0QgICAgIHxVU0IgICAgIHxFVkVOVE9VVHxVU0FSVDEgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBOSB8TUNPICAgICB8TENEICAgICB8ICAgICAgICB8VFNDICAgICB8VVNBUlQxICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTEwfCAgICAgICAgfExDRCAgICAgfCAgICAgICAgfFRTQyAgICAgfFVTQVJUMSAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEExMXxTUEkxICAgIHwgICAgICAgIHxFVkVOVE9VVHxUU0MgICAgIHxVU0FSVDEgIHwgICAgICAgIHwgICAgICAgIHxDT01QMSAgIHwKKyAqIFBBMTJ8U1BJMSAgICB8ICAgICAgICB8RVZFTlRPVVR8VFNDICAgICB8VVNBUlQxICB8ICAgICAgICB8ICAgICAgICB8Q09NUDIgICB8CisgKiBQQTEzfFNXRElPICAgfCAgICAgICAgfFVTQiAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEExNHxTV0NMSyAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDIgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBMTV8U1BJMSAgICB8TENEICAgICB8VElNMl9UUiB8RVZFTlRPVVR8VVNBUlQyICB8VElNMl9DMSB8ICAgICAgICB8ICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEIwIHxFVkVOVE9VVHxMQ0QgICAgIHwgICAgICAgIHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCMSB8ICAgICAgICB8TENEICAgICB8ICAgICAgICB8VFNDICAgICB8TFBVQVJUMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjIgfCAgICAgICAgfCAgICAgICAgfExQVElNMV9PfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIzIHxTUEkxICAgIHxMQ0QgICAgIHxUSU0yX0MyIHxUU0MgICAgIHxFVkVOVE9VVHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCNCB8U1BJMSAgICB8TENEICAgICB8RVZFTlRPVVR8VFNDICAgICB8VElNMjJfQzF8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjUgfFNQSTEgICAgfExDRCAgICAgfExQVElNMV9JfEkyQzEgICAgfFRJTTIyX0MyfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI2IHxVU0FSVDEgIHxJMkMxICAgIHxMUFRJTTFfVHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCNyB8VVNBUlQxICB8STJDMSAgICB8TFBUSU0xX0l8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjggfCAgICAgICAgfExDRCAgICAgfCAgICAgICAgfFRTQyAgICAgfEkyQzEgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI5IHwgICAgICAgIHxMQ0QgICAgIHxFVkVOVE9VVHwgICAgICAgIHxJMkMxICAgIHxTUEkyICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCMTB8ICAgICAgICB8TENEICAgICB8VElNMl9DMyB8VFNDICAgICB8TFBVQVJUMSB8U1BJMiAgICB8STJDMiAgICB8ICAgICAgICB8CisgKiBQQjExfEVWRU5UT1VUfExDRCAgICAgfFRJTTJfQzQgfFRTQyAgICAgfExQVUFSVDEgfCAgICAgICAgfEkyQzIgICAgfCAgICAgICAgfAorICogUEIxMnxTUEkyICAgIHxMQ0QgICAgIHxMUFVBUlQxIHxUU0MgICAgIHwgICAgICAgIHxJMkMyICAgIHxFVkVOVE9VVHwgICAgICAgIHwKKyAqIFBCMTN8U1BJMiAgICB8TENEICAgICB8ICAgICAgICB8VFNDICAgICB8TFBVQVJUMSB8STJDMiAgICB8VElNMjFfQzF8ICAgICAgICB8CisgKiBQQjE0fFNQSTIgICAgfExDRCAgICAgfFJUQyAgICAgfFRTQyAgICAgfExQVUFSVDEgfEkyQzIgICAgfFRJTTIxX0MyfCAgICAgICAgfAorICogUEIxNXxTUEkyICAgIHxMQ0QgICAgIHxSVEMgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQQzAgfExQVElNMV9JfExDRCAgICAgfEVWRU5UT1VUfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxIHxMUFRJTTFfT3xMQ0QgICAgIHxFVkVOVE9VVHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMiB8TFBUSU0xX0l8TENEICAgICB8U1BJMiAgICB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzMgfExQVElNMV9UfExDRCAgICAgfFNQSTIgICAgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM0IHxFVkVOVE9VVHxMQ0QgICAgIHxMUFVBUlQgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDNSB8ICAgICAgICB8TENEICAgICB8TFBVQVJUICB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzYgfFRJTTIyX0MxfExDRCAgICAgfCAgICAgICAgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM3IHxUSU0yMl9DMnxMQ0QgICAgIHwgICAgICAgIHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDOCB8VElNMjJfVFJ8TENEICAgICB8ICAgICAgICB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzkgfFRJTTIxX1RSfExDRCAgICAgfFVTQiAgICAgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxMHxMUFVBUlQgIHxMQ0QgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTF8TFBVQVJUICB8TENEICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzEyfCAgICAgICAgfExDRCAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxM3wgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzE1fCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBEMiB8TFBVQVJUICB8TENEICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEgwIHxVU0IgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBIMSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiAgKgorICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X0FsdGVybmF0ZV9mdW5jdGlvbl9zZWxlY3Rpb24gQWx0ZXJuYXRlIGZ1bmN0aW9uIHNlbGVjdGlvbgorICogQHsKKyAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMAorICovCisjZGVmaW5lIEdQSU9fQUYwX1NQSTEgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDEgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYwX1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfTFBVQVJUMSAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMF9VU0IgICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFVTQiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVFNDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUU0MgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9USU0yICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMjIgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAwVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX01DTyAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTUNPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dESU8gICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0RJTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9TV0NMSyAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXQ0xLIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisvKioKKyAgKgorICAqLworCisgLyoKKyAgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYxCisgKi8KKyNkZWZpbmUgR1BJT19BRjFfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMV9TUEkyICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYxX0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjFfTENEICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBMQ0QgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjIKKyAqLworI2RlZmluZSBHUElPX0FGMl9TUEkyICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfTFBVQVJUMSAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1VTQiAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVVNCIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9MUFRJTTEgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIExQVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMl9SVEMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFJUQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYzCisgKi8KKyNkZWZpbmUgR1BJT19BRjNfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGM19UU0MgICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIFRTQyAgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYzX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY0CisgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY0X1VTQVJUMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDIgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfTFBVQVJUMSAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTIyICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNF9FVkVOVE9VVCAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKgorICAqCisgICovCisKKyAvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNQorICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfSTJDMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNV9USU0yICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMjIgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjYKKyAqLworI2RlZmluZSBHUElPX0FGNl9JMkMyICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGNl9USU0yMSAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNl9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjcKKyAqLworI2RlZmluZSBHUElPX0FGN19DT01QMSAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ09NUDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY3X0NPTVAyICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X1ByaXZhdGUgIEdQSU9FeCBQcml2YXRlCisgKiBAeworICovCisvKioKKyAqIEBicmllZiAgSVNfR1BJT19BRiBtYWNybyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICgoQUYpIDw9ICh1aW50OF90KTB4MDcpCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkwwNTN4eCB8fCBTVE0zMkwwNjN4eCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNUTTMyTDA1Mnh4L1NUTTMyTDA2Mnh4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZCAoU1RNMzJMMDUyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2Mnh4KQorCisvKiBUaGUgdGFibGUgYmVsb3cgZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGRpZmZlcmVudCBhbHRlcm5hdGUgZnVuY3Rpb25zIHBlciBwb3J0LgorICogRm9yIG1vcmUgZGV0YWlscyByZWZlciB5b3Vyc2VsZiB0byB0aGUgcHJvZHVjdCBkYXRhIHNoZWV0LgorICoKKyAqLworLyogICAgIHwgICBBRjAgIHwgICBBRjEgIHwgICBBRjIgIHwgICBBRjMgIHwgICBBRjQgIHwgICBBRjUgIHwgICBBRjYgIHwgICBBRjcgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQQTAgfCAgICAgICAgfCAgICAgICAgfFRJTTJfQzEgfFRTQyAgICAgfFVTQVJUMiAgfFRJTTJfVFIgfCAgICAgICAgfENPTVAxICAgfAorICogUEExIHxFVkVOVE9VVHwgICAgICAgIHxUSU0yX0MyIHxUU0MgICAgIHxVU0FSVDIgIHxUSU0yMV9UUnwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBMiB8VElNMjFfQzF8ICAgICAgICB8VElNMl9DMyB8VFNDICAgICB8VVNBUlQyICB8ICAgICAgICB8ICAgICAgICB8Q09NUDIgICB8CisgKiBQQTMgfFRJTTIxX0MyfCAgICAgICAgfFRJTTJfQzQgfFRTQyAgICAgfFVTQVJUMiAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEE0IHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHxUU0MgICAgIHxVU0FSVDIgIHxUSU0yMl9UUnwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBNSB8U1BJMSAgICB8ICAgICAgICB8VElNMl9UUiB8VFNDICAgICB8ICAgICAgICB8VElNMl9DMSB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTYgfFNQSTEgICAgfCAgICAgICAgfCAgICAgICAgfFRTQyAgICAgfExQVUFSVCAgfFRJTTIyX0MxfEVWRU5UT1VUfENPTVAxICAgfAorICogUEE3IHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHxUU0MgICAgIHwgICAgICAgIHxUSU0yMl9DMnxFVkVOVE9VVHxDT01QMiAgIHwKKyAqIFBBOCB8TUNPICAgICB8ICAgICAgICB8VVNCICAgICB8RVZFTlRPVVR8VVNBUlQxICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTkgfE1DTyAgICAgfCAgICAgICAgfCAgICAgICAgfFRTQyAgICAgfFVTQVJUMSAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEExMHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxUU0MgICAgIHxVU0FSVDEgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBMTF8U1BJMSAgICB8ICAgICAgICB8RVZFTlRPVVR8VFNDICAgICB8VVNBUlQxICB8ICAgICAgICB8ICAgICAgICB8Q09NUDEgICB8CisgKiBQQTEyfFNQSTEgICAgfCAgICAgICAgfEVWRU5UT1VUfFRTQyAgICAgfFVTQVJUMSAgfCAgICAgICAgfCAgICAgICAgfENPTVAyICAgfAorICogUEExM3xTV0RJTyAgIHwgICAgICAgIHxVU0IgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBMTR8U1dDTEsgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQyICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTE1fFNQSTEgICAgfCAgICAgICAgfFRJTTJfVFIgfEVWRU5UT1VUfFVTQVJUMiAgfFRJTTJfQzEgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBCMCB8RVZFTlRPVVR8ICAgICAgICB8ICAgICAgICB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFRTQyAgICAgfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIyIHwgICAgICAgIHwgICAgICAgIHxMUFRJTTFfT3xUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCMyB8U1BJMSAgICB8ICAgICAgICB8VElNMl9DMiB8VFNDICAgICB8RVZFTlRPVVR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjQgfFNQSTEgICAgfCAgICAgICAgfEVWRU5UT1VUfFRTQyAgICAgfFRJTTIyX0MxfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI1IHxTUEkxICAgIHwgICAgICAgIHxMUFRJTTFfSXxJMkMxICAgIHxUSU0yMl9DMnwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCNiB8VVNBUlQxICB8STJDMSAgICB8TFBUSU0xX1R8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjcgfFVTQVJUMSAgfEkyQzEgICAgfExQVElNMV9JfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI4IHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxUU0MgICAgIHxJMkMxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCOSB8ICAgICAgICB8ICAgICAgICB8RVZFTlRPVVR8ICAgICAgICB8STJDMSAgICB8U1BJMiAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjEwfCAgICAgICAgfCAgICAgICAgfFRJTTJfQzMgfFRTQyAgICAgfExQVUFSVDEgfFNQSTIgICAgfEkyQzIgICAgfCAgICAgICAgfAorICogUEIxMXxFVkVOVE9VVHwgICAgICAgIHxUSU0yX0M0IHxUU0MgICAgIHxMUFVBUlQxIHwgICAgICAgIHxJMkMyICAgIHwgICAgICAgIHwKKyAqIFBCMTJ8U1BJMiAgICB8ICAgICAgICB8TFBVQVJUMSB8VFNDICAgICB8ICAgICAgICB8STJDMiAgICB8RVZFTlRPVVR8ICAgICAgICB8CisgKiBQQjEzfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfFRTQyAgICAgfExQVUFSVDEgfEkyQzIgICAgfFRJTTIxX0MxfCAgICAgICAgfAorICogUEIxNHxTUEkyICAgIHwgICAgICAgIHxSVEMgICAgIHxUU0MgICAgIHxMUFVBUlQxIHxJMkMyICAgIHxUSU0yMV9DMnwgICAgICAgIHwKKyAqIFBCMTV8U1BJMiAgICB8ICAgICAgICB8UlRDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEMwIHxMUFRJTTFfSXwgICAgICAgIHxFVkVOVE9VVHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMSB8TFBUSU0xX098ICAgICAgICB8RVZFTlRPVVR8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzIgfExQVElNMV9JfCAgICAgICAgfFNQSTIgICAgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMzIHxMUFRJTTFfVHwgICAgICAgIHxTUEkyICAgIHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDNCB8RVZFTlRPVVR8ICAgICAgICB8TFBVQVJUICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzUgfCAgICAgICAgfCAgICAgICAgfExQVUFSVCAgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM2IHxUSU0yMl9DMXwgICAgICAgIHwgICAgICAgIHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDNyB8VElNMjJfQzJ8ICAgICAgICB8ICAgICAgICB8VFNDICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzggfFRJTTIyX1RSfCAgICAgICAgfCAgICAgICAgfFRTQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM5IHxUSU0yMV9UUnwgICAgICAgIHxVU0IgICAgIHxUU0MgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTB8TFBVQVJUICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzExfExQVUFSVCAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxMnwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTN8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzE0fCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxNXwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQRDIgfExQVUFSVCAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBIMCB8VVNCICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQSDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogICoKKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uIEFsdGVybmF0ZSBmdW5jdGlvbiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjAKKyAqLworI2RlZmluZSBHUElPX0FGMF9TUEkxICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVVNCICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBVU0IgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9MUFRJTTEgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIExQVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RTQyAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVFNDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMF9USU0yMSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTIyICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVElNMjIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NXRElPICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dESU8gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dDTEsgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0NMSyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjEKKyAqLworI2RlZmluZSBHUElPX0FGMV9TUEkxICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYxX1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjFfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworLyoqCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYyCisgKi8KKyNkZWZpbmUgR1BJT19BRjJfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMl9VU0IgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFVTQiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAyVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfUlRDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBSVEMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMworICovCisjZGVmaW5lIEdQSU9fQUYzX0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjNfVFNDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBUU0MgIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGM19FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNAorICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzEgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfVVNBUlQyICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY0X0xQVUFSVDEgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNF9USU0yMiAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMjIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfRVZFTlRPVVQgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNQorICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfSTJDMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNV9USU0yICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMjIgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjYKKyAqLworI2RlZmluZSBHUElPX0FGNl9JMkMyICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGNl9USU0yMSAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNl9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjcKKyAqLworI2RlZmluZSBHUElPX0FGN19DT01QMSAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyogQ09NUDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY3X0NPTVAyICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X1ByaXZhdGUgIEdQSU9FeCBQcml2YXRlCisgKiBAeworICovCisvKioKKyAqIEBicmllZiAgSVNfR1BJT19BRiBtYWNybyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICgoQUYpIDw9ICh1aW50OF90KTB4MDcpCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJMMDUyeHggfHwgU1RNMzJMMDYyeHggKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkwwNTF4eC9TVE0zMkwwNjF4eC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQgKFNUTTMyTDA1MXh4KXx8IGRlZmluZWQgKFNUTTMyTDA2MXh4KQorLyogVGhlIHRhYmxlIGJlbG93IGdpdmVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBkaWZmZXJlbnQgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBwZXIgcG9ydC4KKyAqIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgeW91cnNlbGYgdG8gdGhlIHByb2R1Y3QgZGF0YSBzaGVldC4KKyAqCisgKi8KKy8qICAgICB8ICAgQUYwICB8ICAgQUYxICB8ICAgQUYyICB8ICAgQUYzICB8ICAgQUY0ICB8ICAgQUY1ICB8ICAgQUY2ICB8ICAgQUY3ICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEEwIHwgICAgICAgIHwgICAgICAgIHxUSU0yX0MxIHwgICAgICAgIHxVU0FSVDIgIHxUSU0yX1RSIHwgICAgICAgIHxDT01QMSAgIHwKKyAqIFBBMSB8RVZFTlRPVVR8ICAgICAgICB8VElNMl9DMiB8ICAgICAgICB8VVNBUlQyICB8VElNMjFfVFJ8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTIgfFRJTTIxX0MxfCAgICAgICAgfFRJTTJfQzMgfCAgICAgICAgfFVTQVJUMiAgfCAgICAgICAgfCAgICAgICAgfENPTVAyICAgfAorICogUEEzIHxUSU0yMV9DMnwgICAgICAgIHxUSU0yX0M0IHwgICAgICAgIHxVU0FSVDIgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBNCB8U1BJMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQyICB8VElNMjJfVFJ8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTUgfFNQSTEgICAgfCAgICAgICAgfFRJTTJfVFIgfCAgICAgICAgfCAgICAgICAgfFRJTTJfQzEgfCAgICAgICAgfCAgICAgICAgfAorICogUEE2IHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxMUFVBUlQgIHxUSU0yMl9DMXxFVkVOVE9VVHxDT01QMSAgIHwKKyAqIFBBNyB8U1BJMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VElNMjJfQzJ8RVZFTlRPVVR8Q09NUDIgICB8CisgKiBQQTggfE1DTyAgICAgfCAgICAgICAgfCAgICAgICAgfEVWRU5UT1VUfFVTQVJUMSAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEE5IHxNQ08gICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDEgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBMTB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQxICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTExfFNQSTEgICAgfCAgICAgICAgfEVWRU5UT1VUfCAgICAgICAgfFVTQVJUMSAgfCAgICAgICAgfCAgICAgICAgfENPTVAxICAgfAorICogUEExMnxTUEkxICAgIHwgICAgICAgIHxFVkVOVE9VVHwgICAgICAgIHxVU0FSVDEgIHwgICAgICAgIHwgICAgICAgIHxDT01QMiAgIHwKKyAqIFBBMTN8U1dESU8gICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTE0fFNXQ0xLICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUMiAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEExNXxTUEkxICAgIHwgICAgICAgIHxUSU0yX1RSIHxFVkVOVE9VVHxVU0FSVDIgIHxUSU0yX0MxIHwgICAgICAgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQQjAgfEVWRU5UT1VUfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxMUFVBUlQxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCMiB8ICAgICAgICB8ICAgICAgICB8TFBUSU0xX098ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjMgfFNQSTEgICAgfCAgICAgICAgfFRJTTJfQzIgfCAgICAgICAgfEVWRU5UT1VUfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI0IHxTUEkxICAgIHwgICAgICAgIHxFVkVOVE9VVHwgICAgICAgIHxUSU0yMl9DMXwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCNSB8U1BJMSAgICB8ICAgICAgICB8TFBUSU0xX0l8STJDMSAgICB8VElNMjJfQzJ8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjYgfFVTQVJUMSAgfEkyQzEgICAgfExQVElNMV9UfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI3IHxVU0FSVDEgIHxJMkMxICAgIHxMUFRJTTFfSXwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCOCB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8STJDMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjkgfCAgICAgICAgfCAgICAgICAgfEVWRU5UT1VUfCAgICAgICAgfEkyQzEgICAgfFNQSTIgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIxMHwgICAgICAgIHwgICAgICAgIHxUSU0yX0MzIHwgICAgICAgIHxMUFVBUlQxIHxTUEkyICAgIHxJMkMyICAgIHwgICAgICAgIHwKKyAqIFBCMTF8RVZFTlRPVVR8ICAgICAgICB8VElNMl9DNCB8ICAgICAgICB8TFBVQVJUMSB8ICAgICAgICB8STJDMiAgICB8ICAgICAgICB8CisgKiBQQjEyfFNQSTIgICAgfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfCAgICAgICAgfEkyQzIgICAgfEVWRU5UT1VUfCAgICAgICAgfAorICogUEIxM3xTUEkyICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxMUFVBUlQxIHxJMkMyICAgIHxUSU0yMV9DMXwgICAgICAgIHwKKyAqIFBCMTR8U1BJMiAgICB8ICAgICAgICB8UlRDICAgICB8ICAgICAgICB8TFBVQVJUMSB8STJDMiAgICB8VElNMjFfQzJ8ICAgICAgICB8CisgKiBQQjE1fFNQSTIgICAgfCAgICAgICAgfFJUQyAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBDMCB8TFBUSU0xX0l8ICAgICAgICB8RVZFTlRPVVR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzEgfExQVElNMV9PfCAgICAgICAgfEVWRU5UT1VUfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMyIHxMUFRJTTFfSXwgICAgICAgIHxTUEkyICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMyB8TFBUSU0xX1R8ICAgICAgICB8U1BJMiAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzQgfEVWRU5UT1VUfCAgICAgICAgfExQVUFSVCAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM1IHwgICAgICAgIHwgICAgICAgIHxMUFVBUlQgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDNiB8VElNMjJfQzF8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzcgfFRJTTIyX0MyfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEM4IHxUSU0yMl9UUnwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDOSB8VElNMjFfVFJ8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzEwfExQVUFSVCAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxMXxMUFVBUlQgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTJ8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzEzfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEMxNHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTV8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEQyIHxMUFVBUlQgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBQSDAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEgxIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqICAqCisgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfQWx0ZXJuYXRlX2Z1bmN0aW9uX3NlbGVjdGlvbiBBbHRlcm5hdGUgZnVuY3Rpb24gc2VsZWN0aW9uCisgKiBAeworICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYwCisgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMF9TUEkyICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMF9MUFVBUlQxICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMF9USU0yMSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTIyICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVElNMjIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NXRElPICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dESU8gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dDTEsgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0NMSyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjEKKyAqLworI2RlZmluZSBHUElPX0FGMV9TUEkxICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYxX1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyogU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjFfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworIC8qCisgICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMgorICovCisjZGVmaW5lIEdQSU9fQUYyX1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9MUFVBUlQxICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfVVNCICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBVU0IgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMl9USU0yICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYyX1JUQyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogUlRDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjMKKyAqLworI2RlZmluZSBHUElPX0FGM19JMkMxICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYzX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY0CisgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY0X1VTQVJUMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDIgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfTFBVQVJUMSAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTIyICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNF9FVkVOVE9VVCAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY1CisgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNV9JMkMyICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMjEgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU0yMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNV9USU0yMiAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNgorICovCisjZGVmaW5lIEdQSU9fQUY2X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogSTJDMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUY2X1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY2X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNworICovCisjZGVmaW5lIEdQSU9fQUY3X0NPTVAxICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpICAvKiBDT01QMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDIgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfUHJpdmF0ZSAgR1BJT0V4IFByaXZhdGUKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgIElTX0dQSU9fQUYgbWFjcm8gZGVmaW5pdGlvbgorICovCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgKChBRikgPD0gKHVpbnQ4X3QpMHgwNykKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTVE0zMkwwNTF4eC9TVE0zMkwwNjF4eCovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJMMDMxeHgvU1RNMzJMMDQxeHgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwMzF4eCl8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkKKy8qIFRoZSB0YWJsZSBiZWxvdyBnaXZlcyBhbiBvdmVydmlldyBvZiB0aGUgZGlmZmVyZW50IGFsdGVybmF0ZSBmdW5jdGlvbnMgcGVyIHBvcnQuCisgKiBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHlvdXJzZWxmIHRvIHRoZSBwcm9kdWN0IGRhdGEgc2hlZXQuCisgKgorICovCisvKiAgICAgfCAgIEFGMCAgfCAgIEFGMSAgfCAgIEFGMiAgfCAgIEFGMyAgfCAgIEFGNCAgfCAgIEFGNSAgfCAgIEFGNiAgfCAgIEFGNyAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIFBBMCB8ICAgICAgICB8TFBUSU0xICB8VElNMl9DMSB8ICAgICAgICB8VVNBUlQyICB8VElNMl9UUiB8ICAgICAgICB8Q09NUDEgICB8CisgKiBQQTEgfEVWRU5UT1VUfExQVElNMSAgfFRJTTJfQzIgfEkyQzEgICAgfFVTQVJUMiAgfFRJTTIxX1RSfCAgICAgICAgfCAgICAgICAgfAorICogUEEyIHxUSU0yMV9DMXwgICAgICAgIHxUSU0yX0MzIHwgICAgICAgIHxVU0FSVDIgIHwgICAgICAgIHxMUFVBUlQxIHxDT01QMiAgIHwKKyAqIFBBMyB8VElNMjFfQzJ8ICAgICAgICB8VElNMl9DNCB8ICAgICAgICB8VVNBUlQyICB8ICAgICAgICB8TFBVQVJUMSB8ICAgICAgICB8CisgKiBQQTQgfFNQSTEgICAgfExQVElNMSAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUMiAgfFRJTTIyX1RSfCAgICAgICAgfCAgICAgICAgfAorICogUEE1IHxTUEkxICAgIHxMUFRJTTEgIHxUSU0yX1RSIHwgICAgICAgIHwgICAgICAgIHxUSU0yX0MxIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBNiB8U1BJMSAgICB8TFBUSU0xICB8ICAgICAgICB8ICAgICAgICB8TFBVQVJUICB8VElNMjJfQzF8RVZFTlRPVVR8Q09NUDEgICB8CisgKiBQQTcgfFNQSTEgICAgfExQVElNMSAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUMiAgfFRJTTIyX0MyfEVWRU5UT1VUfENPTVAyICAgfAorICogUEE4IHxNQ08gICAgIHwgICAgICAgIHxMUFRJTTEgIHxFVkVOVE9VVHxVU0FSVDIgIHxUSU0yX0MxIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBBOSB8TUNPICAgICB8STJDMSAgICB8ICAgICAgICB8ICAgICAgICB8VVNBUlQyICB8VElNMjJfQzF8ICAgICAgICB8ICAgICAgICB8CisgKiBQQTEwfCAgICAgICAgfEkyQzEgICAgfCAgICAgICAgfCAgICAgICAgfFVTQVJUMiAgfFRJTTIyX0MyfCAgICAgICAgfCAgICAgICAgfAorICogUEExMXxTUEkxICAgIHwgICAgICAgIHxFVkVOVE9VVHwgICAgICAgIHxVU0FSVDIgIHxUSU0yMV9DMnwgICAgICAgIHxDT01QMSAgIHwKKyAqIFBBMTJ8U1BJMSAgICB8ICAgICAgICB8RVZFTlRPVVR8ICAgICAgICB8VVNBUlQyICB8ICAgICAgICB8ICAgICAgICB8Q09NUDIgICB8CisgKiBQQTEzfFNXRElPICAgfExQVElNMSAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfAorICogUEExNHxTV0NMSyAgIHxMUFRJTTEgIHwgICAgICAgIHxJMkMxICAgIHxVU0FSVDIgIHwgICAgICAgIHxMUFVBUlQxIHwgICAgICAgIHwKKyAqIFBBMTV8U1BJMSAgICB8ICAgICAgICB8VElNMl9UUiB8RVZFTlRPVVR8VVNBUlQyICB8VElNMl9DMSB8ICAgICAgICB8ICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorICogUEIwIHxFVkVOVE9VVHxTUEkxICAgIHwgICAgICAgIHwgICAgICAgIHxVU0FSVDIgIHxUSU0yX0MzIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCMSB8VVNBUlQyICB8U1BJMSAgICB8ICAgICAgICB8ICAgICAgICB8TFBVQVJUMSB8VElNMl9DNCB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjIgfCAgICAgICAgfCAgICAgICAgfExQVElNMV9PfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEIzIHxTUEkxICAgIHwgICAgICAgIHxUSU0yX0MyIHwgICAgICAgIHxFVkVOVE9VVHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCNCB8U1BJMSAgICB8ICAgICAgICB8RVZFTlRPVVR8ICAgICAgICB8VElNMjJfQzF8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjUgfFNQSTEgICAgfCAgICAgICAgfExQVElNMV9JfEkyQzEgICAgfFRJTTIyX0MyfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI2IHxVU0FSVDIgIHxJMkMxICAgIHxMUFRJTTFfVHwgICAgICAgIHwgICAgICAgIHxUSU0yMV9DMXwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCNyB8VVNBUlQyICB8STJDMSAgICB8TFBUSU0xX0l8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQjggfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfEkyQzEgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICogUEI5IHwgICAgICAgIHwgICAgICAgIHxFVkVOVE9VVHwgICAgICAgIHxJMkMxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBCMTB8ICAgICAgICB8ICAgICAgICB8VElNMl9DMyB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8TFBVQVJUMSB8ICAgICAgICB8CisgKiBQQjExfEVWRU5UT1VUfCAgICAgICAgfFRJTTJfQzQgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfAorICogUEIxMnxTUEkyICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHxFVkVOVE9VVHwgICAgICAgIHwKKyAqIFBCMTN8U1BJMiAgICB8ICAgICAgICB8TUNPICAgICB8ICAgICAgICB8ICAgICAgICB8VElNMjFfQzF8TFBVQVJUMSB8ICAgICAgICB8CisgKiBQQjE0fFNQSTIgICAgfCAgICAgICAgfFJUQyAgICAgfCAgICAgICAgfCAgICAgICAgfFRJTTIxX0MyfExQVUFSVDEgfCAgICAgICAgfAorICogUEIxNXxTUEkyICAgIHwgICAgICAgIHxSVEMgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisgKiBQQzAgfExQVElNMV9JfCAgICAgICAgfEVWRU5UT1VUfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfExQVUFSVDEgfCAgICAgICAgfAorICogUEMxM3wgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwKKyAqIFBDMTR8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQQzE1fCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKyAqIFBIMCB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiBQSDEgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uIEFsdGVybmF0ZSBmdW5jdGlvbiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjAKKyAqLworI2RlZmluZSBHUElPX0FGMF9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAwVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfTUNPICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBNQ08gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9TV0RJTyAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXRElPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NXQ0xLICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dDTEsgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYxCisgKi8KKyNkZWZpbmUgR1BJT19BRjFfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjFfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjFfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYyCisgKi8KKyNkZWZpbmUgR1BJT19BRjJfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9NQ08gICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYyX1JUQyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogUlRDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjMKKyAqLworI2RlZmluZSBHUElPX0FGM19JMkMxICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYzX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNAorICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNF9MUFVBUlQxICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTIyICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMjIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY1CisgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNV9USU0yMSAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIyICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMjIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY2CisgKi8KKyNkZWZpbmUgR1BJT19BRjZfTFBVQVJUMSAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNl9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjcKKyAqLworI2RlZmluZSBHUElPX0FGN19DT01QMSAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGN19DT01QMiAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfUHJpdmF0ZSAgR1BJT0V4IFByaXZhdGUKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmICBJU19HUElPX0FGIG1hY3JvIGRlZmluaXRpb24KKyAqLworCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgKChBRikgPD0gKHVpbnQ4X3QpMHgwNykKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyTDAzMXh4L1NUTTMyTDA0MXh4Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkwwMTF4eC9TVE0zMkwwMjF4eC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQgKFNUTTMyTDAxMXh4KXx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KQorLyogVGhlIHRhYmxlIGJlbG93IGdpdmVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBkaWZmZXJlbnQgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBwZXIgcG9ydC4KKyAqIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgeW91cnNlbGYgdG8gdGhlIHByb2R1Y3QgZGF0YSBzaGVldC4KKyAqCisgKi8KKy8qICAgICB8ICAgQUYwICAgfCAgIEFGMSAgICB8ICAgQUYyICB8ICAgQUYzICAgfCAgIEFGNCAgICB8ICAgQUY1ICB8ICAgQUY2ICAgICB8ICAgQUY3ICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogUEEwIHxVU0FSVDJfUlh8TFBUSU0xX0lOMXxUSU0yX0MxICB8ICAgICAgICB8VVNBUlQyX0NUU3xUSU0yX0VUUnxMUFVBUlQxX1JYIHxDT01QMV9PVVR8CisgKiBQQTEgfEVWRU5UT1VUIHxMUFRJTTFfSU4yfFRJTTJfQzIgIHxJMkMxICAgIHxVU0FSVDJfUlRTfFRJTTIxX1RSfExQVUFSVDFfVFggfCAgICAgICAgIHwKKyAqIFBBMiB8VElNMjFfQzEgfCAgICAgICAgICB8VElNMl9DMyAgfCAgICAgICAgfFVTQVJUMl9UWCB8ICAgICAgICB8TFBVQVJUMV9UWCB8Q09NUDJfT1VUfAorICogUEEzIHxUSU0yMV9DMiB8ICAgICAgICAgIHxUSU0yX0M0ICB8ICAgICAgICB8VVNBUlQyX1JYIHwgICAgICAgIHxMUFVBUlQxX1JYIHwgICAgICAgICB8CisgKiBQQTQgfFNQSTEgICAgIHxMUFRJTTFfSU4xfExQVElNMV9UUnxJMkMxX1NDTHxVU0FSVDJfQ0sgfFRJTTJfVFIgfExQVUFSVDFfVFggfENPTVAyX09VVHwKKyAqIFBBNSB8U1BJMSAgICAgfExQVElNMV9JTjJ8VElNMl9UUiAgfCAgICAgICAgfCAgICAgICAgICB8VElNMl9DMSB8ICAgICAgICAgICB8ICAgICAgICAgfAorICogUEE2IHxTUEkxICAgICB8TFBUSU0xX0VUUnwgICAgICAgICB8ICAgICAgICB8TFBVQVJUMV9DVHwgICAgICAgIHxFVkVOVE9VVCAgIHxDT01QMV9PVVR8CisgKiBQQTcgfFNQSTEgICAgIHxMUFRJTTFfT1VUfCAgICAgICAgIHwgICAgICAgIHxVU0FSVDJfQ1RTfFRJTTIxX1QgfEVWRU5UT1VUICAgfENPTVAyX09VVHwKKyAqIFBBOCB8TUNPICAgICAgfCAgICAgICAgICB8TFBUSU0xX0kxfEVWRU5UT1VUfFVTQVJUMl9DSyB8VElNMl9DMSB8ICAgICAgICAgICB8ICAgICAgICAgfAorICogUEE5IHxNQ08gICAgICB8STJDMV9TQ0wgIHxMUFRJTTFfTyB8ICAgICAgICB8VVNBUlQyX1RYIHxUSU0yMV9DMnwgICAgICAgICAgIHxDT01QMV9PVVR8CisgKiBQQTEwfFRJTTIxX0MxIHxJMkMxX1NEQSAgfFJUQ19SRUZJTnwgICAgICAgIHxVU0FSVDJfUlggfFRJTTJfQzMgfCAgICAgICAgICAgfENPTVAxX09VVHwKKyAqIFBBMTF8U1BJMSAgICAgfExQVElNMV9PVVR8RVZFTlRPVVQgfCAgICAgICAgfFVTQVJUMl9DVFN8VElNMjFfQzJ8ICAgICAgICAgICB8Q09NUDFfT1VUfAorICogUEExMnxTUEkxICAgICB8ICAgICAgICAgIHxFVkVOVE9VVCB8ICAgICAgICB8VVNBUlQyX1JUU3wgICAgICAgIHwgICAgICAgICAgIHxDT01QMl9PVVR8CisgKiBQQTEzfFNXRElPICAgIHxMUFRJTTFfVCAgfCAgICAgICAgIHxJMkMxX1NEQXwgICAgICAgICAgfFNQSTEgICAgfExQVUFSVDFfUlggfENPTVAxX09VVHwKKyAqIFBBMTR8U1dDTEsgICAgfExQVElNMV9PICB8ICAgICAgICAgfEkyQzFfU01CfFVTQVJUMl9UWCB8U1BJMSAgICB8TFBVQVJUMV9UWCB8Q09NUDJfT1VUfAorICogUEExNXxTUEkxICAgICB8ICAgICAgICAgIHxUSU0yX1RSICB8RVZFTlRPVVR8VVNBUlQyX1JYIHxUSU0yX0MxIHwgICAgICAgICAgIHwgICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwKKyAqIFBCMCB8RVZFTlRPVVQgfFNQSTEgICAgICB8VElNMl9DMiAgfCAgICAgICAgfFVTQVJUMl9SVFN8VElNMl9DMyB8ICAgICAgICAgICB8ICAgICAgICAgfAorICogUEIxIHxVU0FSVDJfQ0t8U1BJMSAgICAgIHxMUFRJTTFfSTF8ICAgICAgICB8TFBVQVJUMV9SVHxUSU0yX0M0IHwgICAgICAgICAgIHwgICAgICAgICB8CisgKiBQQjIgfCAgICAgICAgIHwgICAgICAgICAgfExQVElNMV9PIHwgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwKKyAqIFBCMyB8U1BJMSAgICAgfCAgICAgICAgICB8VElNMl9DMiAgfCAgICAgICAgfEVWRU5UT1VUICB8ICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfAorICogUEI0IHxTUEkxICAgICB8ICAgICAgICAgIHxFVkVOVE9VVCB8ICAgICAgICB8ICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8CisgKiBQQjUgfFNQSTEgICAgIHwgICAgICAgICAgfExQVElNMV9JMXxJMkMxICAgIHwgICAgICAgICAgfFRJTTIxX0MxfCAgICAgICAgICAgfCAgICAgICAgIHwKKyAqIFBCNiB8VVNBUlQyX1RYfEkyQzFfU0NMICB8TFBUSU0xX1QgfCAgICAgICAgfCAgICAgICAgICB8VElNMl9DMyB8TFBVQVJUMV9UWCB8ICAgICAgICAgfAorICogUEI3IHxVU0FSVDJfUlh8STJDMSAgICAgIHxMUFRJTTFfSTJ8ICAgICAgICB8ICAgICAgICAgIHxUSU0yX0M0IHxMUFVBUlQxX1JYIHwgICAgICAgICB8CisgKiBQQjggfFVTQVJUMl9UWHwgICAgICAgICAgfEVWRU5UT1VUIHwgICAgICAgIHxJMkMxICAgICAgfFNQSTEgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwKKyAqIFBCOSB8ICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8CisgKiBQQzE0fCAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwKKyAqIFBDMTV8ICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8CisgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfQWx0ZXJuYXRlX2Z1bmN0aW9uX3NlbGVjdGlvbiBBbHRlcm5hdGUgZnVuY3Rpb24gc2VsZWN0aW9uCisgKiBAeworICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYwCisgKi8KKyNkZWZpbmUgR1BJT19BRjBfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9USU0yMSAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NQSTEgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NXRElPICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dESU8gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dDTEsgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0NMSyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqICBBbHRlcm5hdGUgZnVuY3Rpb24gQUYxCisgKi8KKyNkZWZpbmUgR1BJT19BRjFfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjFfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjFfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKgorICAqCisgICovCisKKy8qICBBbHRlcm5hdGUgZnVuY3Rpb24gQUYyCisgKgorICovCisjZGVmaW5lIEdQSU9fQUYyX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMl9USU0yICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfUlRDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBSVEMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjMKKyAqLworI2RlZmluZSBHUElPX0FGM19JMkMxICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYzX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNAorICovCisjZGVmaW5lIEdQSU9fQUY0X0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNF9MUFVBUlQxICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY0X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNQorICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMjEgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU0yMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY2CisgKi8KKyNkZWZpbmUgR1BJT19BRjZfTFBVQVJUMSAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNl9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjcKKyAqLworI2RlZmluZSBHUElPX0FGN19DT01QMSAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGN19DT01QMiAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfUHJpdmF0ZSAgR1BJT0V4IFByaXZhdGUKKyAqIEB7CisgKi8KKy8qKgorICogIElTX0dQSU9fQUYgbWFjcm8gZGVmaW5pdGlvbgorICovCisKKyNkZWZpbmUgSVNfR1BJT19BRihBRikgICAgICAgICAoKEFGKSA8PSAodWludDhfdCkweDA3KQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1RNMzJMMDExeHgvU1RNMzJMMDIxeHgqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkwwMTB4QiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZCAoU1RNMzJMMDEweEIpCisvKiBUaGUgdGFibGUgYmVsb3cgZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGRpZmZlcmVudCBhbHRlcm5hdGUgZnVuY3Rpb25zIHBlciBwb3J0LgorICogRm9yIG1vcmUgZGV0YWlscyByZWZlciB5b3Vyc2VsZiB0byB0aGUgcHJvZHVjdCBkYXRhIHNoZWV0LgorICoKKyAqLworLyogICAgIHwgICBBRjAgICAgIHwgICBBRjEgICAgfCAgIEFGMiAgICAgfCAgIEFGMyAgIHwgICBBRjQgICAgIHwgICBBRjUgICB8ICAgQUY2ICAgICB8ICAgQUY3ICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisgKiBQQTAgfCAgICAgICAgICAgfCAgICAgICAgICB8VElNMl9DSDEgICB8ICAgICAgICAgfFVTQVJUMl9DVFMgfFRJTTJfRVRSIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICogUEExIHxFVkVOVE9VVCAgIHwgICAgICAgICAgfFRJTTJfQ0gyICAgfCAgICAgICAgIHxVU0FSVDJfUlRTIHxUSU0yMV9FVFJ8ICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqIFBBMiB8VElNMjFfQ0gxICB8ICAgICAgICAgIHxUSU0yX0NIMyAgIHwgICAgICAgICB8VVNBUlQyX1RYICB8ICAgICAgICAgfExQVUFSVDFfVFggfCAgICAgICAgICB8CisgKiBQQTMgfFRJTTIxX0NIMiAgfCAgICAgICAgICB8VElNMl9DSDQgICB8ICAgICAgICAgfFVTQVJUMl9SWCAgfCAgICAgICAgIHxMUFVBUlQxX1JYIHwgICAgICAgICAgfAorICogUEE0IHxTUEkxX05TUyAgIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHxVU0FSVDJfQ0sgIHxUSU0yMl9FVFJ8ICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqIFBBNSB8U1BJMV9TQ0sgICB8ICAgICAgICAgIHxUSU0yX0VUUiAgIHwgICAgICAgICB8ICAgICAgICAgICB8VElNMl9DSDEgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQTYgfFNQSTFfTUlTTyAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfExQVUFSVDFfQ1RTfFRJTTIyX0NIMXxFVkVOVE9VVCAgIHwgICAgICAgICAgfAorICogUEE3IHxTUEkxX01PU0kgIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHxUSU0yMl9DSDJ8RVZFTlRPVVQgICB8ICAgICAgICAgIHwKKyAqIFBBOCB8TUNPICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgIHxFVkVOVE9VVCB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQTkgfE1DTyAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHxJMkMxX1NDTCAgIHwgICAgICAgICAgfAorICogUEExMHwgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8STJDMV9TREEgICB8ICAgICAgICAgIHwKKyAqIFBBMTF8U1BJMV9NSVNPICB8ICAgICAgICAgIHxFVkVOVE9VVCAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQTEyfFNQSTFfTU9TSSAgfCAgICAgICAgICB8RVZFTlRPVVQgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICogUEExM3xTV0RJTyAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8TFBVQVJUMV9SWCB8ICAgICAgICAgIHwKKyAqIFBBMTR8U1dDTEsgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8VVNBUlQyX1RYICB8ICAgICAgICAgfExQVUFSVDFfVFggfCAgICAgICAgICB8CisgKiBQQTE1fFNQSTFfTlNTICAgfCAgICAgICAgICB8VElNMl9FVFIgICB8RVZFTlRPVVQgfFVTQVJUMl9SWCAgfFRJTTJfQ0gxIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKyAqIFBCMCB8RVZFTlRPVVQgICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQjEgfCAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfExQVUFSVDFfUlRTfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICogUEIyIHwgICAgICAgICAgIHwgICAgICAgICAgfExQVElNMV9PVVQgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqIFBCMyB8U1BJMV9TQ0sgICB8ICAgICAgICAgIHxUSU0yX0NIMiAgIHwgICAgICAgICB8RVZFTlRPVVQgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQjQgfFNQSTFfTUlTTyAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfFRJTTIyX0NIMSAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICogUEI1IHxTUEkxX01PU0kgIHwgICAgICAgICAgfExQVElNMV9JTjEgfEkyQzFfU01CQXxUSU0yMl9DSDIgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqIFBCNiB8ICAgICAgICAgICB8STJDMV9TQ0wgIHxMUFRJTTFfRVRSIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQjcgfCAgICAgICAgICAgfEkyQzFfU0RBICB8TFBUSU0xX0lOMiB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICogUEI4IHwgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHxJMkMxX1NDTCAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqIFBCOSB8ICAgICAgICAgICB8ICAgICAgICAgIHxFVkVOVE9VVCAgIHwgICAgICAgICB8STJDMV9TREEgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQjEwfCAgICAgICAgICAgfCAgICAgICAgICB8VElNMl9DSDMgICB8ICAgICAgICAgfExQVUFSVDFfVFggfCAgICAgICAgIHwgICAgICAgICAgIHxMUFVBUlQxX1JYfAorICogUEIxMXxFVkVOVE9VVCAgIHwgICAgICAgICAgfFRJTTJfQ0g0ICAgfCAgICAgICAgIHxMUFVBUlQxX1JYIHwgICAgICAgICB8ICAgICAgICAgICB8TFBVQVJUMV9UWHwKKyAqIFBCMTJ8ICAgICAgICAgICB8ICAgICAgICAgIHxMUFVBUlQxX1JUU3wgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfEVWRU5UT1VUICAgfCAgICAgICAgICB8CisgKiBQQjEzfCAgICAgICAgICAgfCAgICAgICAgICB8TUNPICAgICAgICB8ICAgICAgICAgfExQVUFSVDFfQ1RTfCAgICAgICAgIHxUSU0yMV9DSDEgIHwgICAgICAgICAgfAorICogUEIxNHwgICAgICAgICAgIHwgICAgICAgICAgfFJUQ19PVVQgICAgfCAgICAgICAgIHxMUFVBUlQxX1JUU3wgICAgICAgICB8VElNMjFfQ0gyICB8ICAgICAgICAgIHwKKyAqIFBCMTV8ICAgICAgICAgICB8ICAgICAgICAgIHxSVENfUkVGSU4gIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorICogUEMwIHxMUFRJTTFfSU4xIHwgICAgICAgICAgfEVWRU5UT1VUICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8TFBVQVJUMV9SWCB8ICAgICAgICAgIHwKKyAqIFBDMSB8TFBUSU0xX09VVCB8ICAgICAgICAgIHxFVkVOVE9VVCAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfExQVUFSVDFfVFggfCAgICAgICAgICB8CisgKiBQQzIgfExQVElNMV9JTjIgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICogUEMzIHxMUFRJTTFfRVRSIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqIFBDNCB8RVZFTlRPVVQgICB8ICAgICAgICAgIHxMUFVBUlQxX1RYIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQzUgfCAgICAgICAgICAgfCAgICAgICAgICB8TFBVQVJUMV9SWCB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICogUEM2IHxUSU0yMl9DSDEgIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqIFBDNyB8VElNMjJfQ0gyICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQzggfFRJTTIyX0VUUiAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICogUEM5IHxUSU0yMV9FVFIgIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqIFBDMTB8TFBVQVJUMV9UWCB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKiBQQzExfExQVUFSVDFfUlggfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKyAqIFBEMiB8TFBVQVJUMV9SVFN8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyoqIEBkZWZncm91cCBHUElPRXhfQWx0ZXJuYXRlX2Z1bmN0aW9uX3NlbGVjdGlvbiBBbHRlcm5hdGUgZnVuY3Rpb24gc2VsZWN0aW9uCisgKiBAeworICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYwCisgKgorICovCisjZGVmaW5lIEdQSU9fQUYwX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMjEgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9TUEkxICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX01DTyAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTUNPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dESU8gICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0RJTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9TV0NMSyAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXQ0xLIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMjIgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9MUFVBUlQxICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMQorICoKKyAqLworI2RlZmluZSBHUElPX0FGMV9JMkMxICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMgorICoKKyAqLworI2RlZmluZSBHUElPX0FGMl9USU0yICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMl9MUFVBUlQxICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYyX01DTyAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogTUNPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfUlRDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBSVEMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjMKKyAqIEB7CisgKi8KKyNkZWZpbmUgR1BJT19BRjNfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGM19JMkMxICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNAorICoKKyAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDIgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfTFBVQVJUMSAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY0X0VWRU5UT1VUICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0yMiAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogVElNMjIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY1CisgKgorICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMjEgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBUSU0yMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNV9USU0yMiAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNgorICoKKyAqLworI2RlZmluZSBHUElPX0FGNl9MUFVBUlQxICAgICAgICgodWludDhfdCkweDA2VSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY2X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY2X0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfVElNMjEgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBUSU0yMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjcKKyAqCisgKi8KKyNkZWZpbmUgR1BJT19BRjdfTFBVQVJUMSAgICAgICgodWludDhfdCkweDA3VSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisvKioKKyAgKgorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9Qcml2YXRlICBHUElPRXggUHJpdmF0ZQorICogQHsKKyAqLworCisgLyoqCisgKiBJU19HUElPX0FGIG1hY3JvIGRlZmluaXRpb24KKyAqLworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICgoQUYpIDw9ICh1aW50OF90KTB4MDcpCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkwwMTB4QiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNUTTMyTDAxMHg4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZCAoU1RNMzJMMDEweDgpCisvKiBUaGUgdGFibGUgYmVsb3cgZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGRpZmZlcmVudCBhbHRlcm5hdGUgZnVuY3Rpb25zIHBlciBwb3J0LgorICogRm9yIG1vcmUgZGV0YWlscyByZWZlciB5b3Vyc2VsZiB0byB0aGUgcHJvZHVjdCBkYXRhIHNoZWV0LgorICoKKyAqLworLyogICAgICB8ICAgQUYwICAgICAgIHwgICBBRjEgICAgICB8ICAgQUYyICAgICAgIHwgICBBRjMgICAgfCAgIEFGNCAgICAgIHwgICBBRjUgICAgICB8ICAgQUY2ICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKyAqIFBBMCAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgfCBUSU0yX0NIMSAgICB8ICAgICAgICAgIHwgVVNBUlQyX0NUUyAgfCBUSU0yX0VUUiAgfCAgICAgICAgICAgfAorICogUEExICB8IEVWRU5UT1VUICAgIHwgICAgICAgICAgICB8IFRJTTJfQ0gyICAgIHwgICAgICAgICAgfCBVU0FSVDJfUlRTICB8IFRJTTIxX0VUUiB8ICAgICAgICAgICB8CisgKiBQQTIgIHwgVElNMjFfQ0gxICAgfCAgICAgICAgICAgIHwgVElNMl9DSDMgICAgfCAgICAgICAgICB8IFVTQVJUMl9UWCAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBBMyAgfCBUSU0yMV9DSDIgICB8ICAgICAgICAgICAgfCBUSU0yX0NINCAgICB8ICAgICAgICAgIHwgVVNBUlQyX1JYICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEE0ICB8IFNQSTFfTlNTICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgfCBVU0FSVDJfQ0sgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQTUgIHwgU1BJMV9TQ0sgICAgfCAgICAgICAgICAgIHwgVElNMl9FVFIgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgIHwgVElNMl9DSDEgIHwgICAgICAgICAgIHwKKyAqIFBBNiAgfCBTUEkxX01JU08gICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgIHwgTFBVQVJUMV9DVFMgfCAgICAgICAgICAgfCBFVkVOVE9VVCAgfAorICogUEE3ICB8IFNQSTFfTU9TSSAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8IEVWRU5UT1VUICB8CisgKiBQQTggIHwgTUNPICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBFVkVOVE9VVCB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBBOSAgfCBNQ08gICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEExMCB8ICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQTExIHwgU1BJMV9NSVNPICAgfCAgICAgICAgICAgIHwgRVZFTlRPVVQgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBBMTIgfCBTUEkxX01PU0kgICB8ICAgICAgICAgICAgfCBFVkVOVE9VVCAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEExMyB8IFNXRElPICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQTE0IHwgU1dDTEsgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICB8IFVTQVJUMl9UWCAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBBMTUgfCBTUEkxX05TUyAgICB8ICAgICAgICAgICAgfCBUSU0yX0VUUiAgICB8IEVWRU5UT1VUIHwgVVNBUlQyX1JYICAgfCBUSU0yX0NIMSAgfCAgICAgICAgICAgfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisgKiBQQjAgIHwgRVZFTlRPVVQgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBCMSAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgIHwgTFBVQVJUMV9SVFMgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEIyICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICB8IExQVElNMV9PVVQgIHwgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQjMgIHwgU1BJMV9TQ0sgICAgfCAgICAgICAgICAgIHwgVElNMl9DSDIgICAgfCAgICAgICAgICB8IEVWRU5UT1VUICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBCNCAgfCBTUEkxX01JU08gICB8IEVWRU5UT1VUICAgfCAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEI1ICB8IFNQSTFfTU9TSSAgIHwgTFBUSU0xX0lOMSB8IEkyQzFfU01CQSAgIHwgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQjYgIHwgICAgICAgICAgICAgfCBJMkMxX1NDTCAgIHwgTFBUSU0xX0VUUiAgfCAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBCNyAgfCAgICAgICAgICAgICB8IEkyQzFfU0RBICAgfCBMUFRJTTFfSU4yICB8ICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEI4ICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgfCBJMkMxX1NDTCAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQjkgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgRVZFTlRPVVQgICAgfCAgICAgICAgICB8IEkyQzFfU0RBICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBCMTAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgfCBUSU0yX0NIMyAgICB8ICAgICAgICAgIHwgTFBVQVJUMV9UWCAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEIxMSB8IEVWRU5UT1VUICAgIHwgICAgICAgICAgICB8IFRJTTJfQ0g0ICAgIHwgICAgICAgICAgfCBMUFVBUlQxX1JYICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQjEyIHwgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgTFBVQVJUMV9SVFMgfCAgICAgICAgICB8ICAgICAgICAgICAgIHwgRVZFTlRPVVQgIHwgICAgICAgICAgIHwKKyAqIFBCMTMgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgIHwgTFBVQVJUMV9DVFMgfCAgICAgICAgICAgfCBUSU0yMV9DSDEgfAorICogUEIxNCB8ICAgICAgICAgICAgIHwgICAgICAgICAgICB8IFJUQ19PVVQgICAgIHwgICAgICAgICAgfCBMUFVBUlQxX1JUUyB8ICAgICAgICAgICB8IFRJTTIxX0NIMiB8CisgKiBQQjE1IHwgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgUlRDX1JFRklOICAgfCAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorICogUEMwICB8IExQVElNMV9JTjEgIHwgICAgICAgICAgICB8IEVWRU5UT1VUICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQzEgIHwgTFBUSU0xX09VVCAgfCAgICAgICAgICAgIHwgRVZFTlRPVVQgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBDMiAgfCBMUFRJTTFfSU4yICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEMzICB8IExQVElNMV9FVFIgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQzQgIHwgRVZFTlRPVVQgICAgfCAgICAgICAgICAgIHwgTFBVQVJUMV9UWCAgfCAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBDNSAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgfCBMUFVBUlQxX1JYICB8ICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEM5ICB8IFRJTTIxX0VUUiAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiBQQzEwIHwgTFBVQVJUMV9UWCAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIFBDMTEgfCBMUFVBUlQxX1JYICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAorICogUEQyICB8IExQVUFSVDFfUlRTIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKyAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uIEFsdGVybmF0ZSBmdW5jdGlvbiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjAKKyAqLworI2RlZmluZSBHUElPX0FGMF9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAwVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NXRElPICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dESU8gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dDTEsgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0NMSyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9MUFRJTTEgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIExQVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYxCisgKi8KKyNkZWZpbmUgR1BJT19BRjFfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworIC8qCisgICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMgorICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAyVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMl9SVEMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFJUQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYzCisgKi8KKyNkZWZpbmUgR1BJT19BRjNfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGM19FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNAorICovCisjZGVmaW5lIEdQSU9fQUY0X1VTQVJUMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNF9MUFVBUlQxICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY0X0VWRU5UT1VUICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjUKKyAqLworI2RlZmluZSBHUElPX0FGNV9USU0yICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNgorICovCisjZGVmaW5lIEdQSU9fQUY2X1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY2X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisvKioKKyAgKgorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X1ByaXZhdGUgIEdQSU9FeCBQcml2YXRlCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmICBJU19HUElPX0FGIG1hY3JvIGRlZmluaXRpb24KKyAqLworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICgoQUYpIDw9ICh1aW50OF90KTB4MDYpCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJMMDEweDggKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNUTTMyTDAxMHg2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZCAoU1RNMzJMMDEweDYpCisvKiBUaGUgdGFibGUgYmVsb3cgZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGRpZmZlcmVudCBhbHRlcm5hdGUgZnVuY3Rpb25zIHBlciBwb3J0LgorICogRm9yIG1vcmUgZGV0YWlscyByZWZlciB5b3Vyc2VsZiB0byB0aGUgcHJvZHVjdCBkYXRhIHNoZWV0LgorICoKKyAqLworLyogICAgICB8ICAgQUYwICAgICAgfCAgIEFGMSAgICAgIHwgICBBRjIgICAgICB8ICAgICBBRjMgICAgIHwgICBBRjQgICAgICAgfCAgIEFGNSAgICAgfCAgIEFGNiAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisgKiBQQTEgIHwgRVZFTlRPVVQgICB8IExQVElNMV9JTjIgfCBUSU0yX0NIMiAgIHwgSTJDMV9TTUJBICAgfCBVU0FSVDJfUlRTICB8IFRJTTIxX0VUUiB8ICAgICAgICAgICAgfAorICogUEEyICB8IFRJTTIxX0NIMSAgfCAgICAgICAgICAgIHwgVElNMl9DSDMgICB8ICAgICAgICAgICAgIHwgVVNBUlQyX1RYICAgfCAgICAgICAgICAgfCBMUFVBUlQxX1RYIHwKKyAqIFBBMyAgfCBUSU0yMV9DSDIgIHwgICAgICAgICAgICB8IFRJTTJfQ0g0ICAgfCAgICAgICAgICAgICB8IFVTQVJUMl9SWCAgIHwgICAgICAgICAgIHwgTFBVQVJUMV9SWCB8CisgKiBQQTQgIHwgU1BJMV9OU1MgICB8IExQVElNMV9JTjEgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBVU0FSVDJfQ0sgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgfAorICogUEE1ICB8IFNQSTFfU0NLICAgfCBMUFRJTTFfSU4yIHwgVElNMl9FVFIgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBUSU0yX0NIMSAgfCAgICAgICAgICAgIHwKKyAqIFBBNiAgfCBTUEkxX01JU08gIHwgTFBUSU0xX0VUUiB8ICAgICAgICAgICAgfCAgICAgICAgICAgICB8IExQVUFSVDFfQ1RTIHwgICAgICAgICAgIHwgRVZFTlRPVVQgICB8CisgKiBQQTcgIHwgU1BJMV9NT1NJICB8IExQVElNMV9PVVQgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBVU0FSVDJfQ1RTICB8ICAgICAgICAgICB8IEVWRU5UT1VUICAgfAorICogUEE4ICB8IE1DTyAgICAgICAgfCAgICAgICAgICAgIHwgTFBUSU0xX0lOMSB8IEVWRU5UT1VUICAgIHwgVVNBUlQyX0NLICAgfCBUSU0yX0NIMSAgfCAgICAgICAgICAgIHwKKyAqIFBBOSAgfCBNQ08gICAgICAgIHwgSTJDMV9TQ0wgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICB8IFVTQVJUMl9UWCAgIHwgICAgICAgICAgIHwgICAgICAgICAgICB8CisgKiBQQTEwIHwgICAgICAgICAgICB8IEkyQzFfU0RBICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBVU0FSVDJfUlggICB8ICAgICAgICAgICB8ICAgICAgICAgICAgfAorICogUEExMSB8IFNQSTFfTUlTTyAgfCAgICAgICAgICAgIHwgRVZFTlRPVVQgICB8ICAgICAgICAgICAgIHwgVVNBUlQyX0NUUyAgfCBUSU0yMV9DSDIgfCAgICAgICAgICAgIHwKKyAqIFBBMTIgfCBTUEkxX01PU0kgIHwgICAgICAgICAgICB8IEVWRU5UT1VUICAgfCAgICAgICAgICAgICB8IFVTQVJUMl9SVFMgIHwgICAgICAgICAgIHwgICAgICAgICAgICB8CisgKiBQQTEzIHwgU1dESU8gICAgICB8IExQVElNMV9FVFIgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8IExQVUFSVDFfUlggfAorICogUEExNCB8IFNXQ0xLICAgICAgfCBMUFRJTTFfT1VUIHwgICAgICAgICAgICB8IEkyQzFfU01CQSAgIHwgVVNBUlQyX1RYICAgfCAgICAgICAgICAgfCBMUFVBUlQxX1RYIHwKKyAqIFBBMTUgfCBTUEkxX05TUyAgIHwgICAgICAgICAgICB8IFRJTTJfRVRSICAgfCBFVkVOVE9VVCAgICB8IFVTQVJUMl9SWCAgIHwgVElNMl9DSDEgIHwgICAgICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorICogUEIwICB8IEVWRU5UT1VUICAgfCBTUEkxX01JU08gIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgVVNBUlQyX1JUUyAgfCBUSU0yX0NIMyAgfCAgICAgICAgICAgIHwKKyAqIFBCMSAgfCBVU0FSVDJfQ0sgIHwgU1BJMV9NT1NJICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICB8IExQVUFSVDFfUlRTIHwgVElNMl9DSDQgIHwgICAgICAgICAgICB8CisgKiBQQjIgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCBMUFRJTTFfT1VUIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgfAorICogUEIzICB8IFNQSTFfU0NLICAgfCAgICAgICAgICAgIHwgVElNMl9DSDIgICB8ICAgICAgICAgICAgIHwgRVZFTlRPVVQgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgIHwKKyAqIFBCNCAgfCBTUEkxX01JU08gIHwgICAgICAgICAgICB8IEVWRU5UT1VUICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICB8CisgKiBQQjUgIHwgU1BJMV9NT1NJICB8IExQVElNMV9JTjEgfCBJMkMxX1NNQkEgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgfAorICogUEI2ICB8IFVTQVJUMl9UWCAgfCBJMkMxX1NDTCAgIHwgTFBUSU0xX0VUUiB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBUSU0yMV9DSDEgfCAgICAgICAgICAgIHwKKyAqIFBCNyAgfCBVU0FSVDJfUlggIHwgSTJDMV9TREEgICB8IExQVElNMV9JTjIgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICB8CisgKiBQQjggIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgfCBJMkMxX1NDTCAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgfAorICogUEI5ICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgRVZFTlRPVVQgICB8ICAgICAgICAgICAgIHwgSTJDMV9TREEgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgIHwKKyAqIFBCMTAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8IFRJTTJfQ0gzICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgTFBVQVJUMV9UWCB8CisgKiBQQjExIHwgRVZFTlRPVVQgICB8ICAgICAgICAgICAgfCBUSU0yX0NINCAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8IExQVUFSVDFfUlggfAorICogUEIxMiB8IFNQSTFfTlNTICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgfCBFVkVOVE9VVCAgIHwKKyAqIFBCMTMgfCBTUEkxX1NDSyAgIHwgICAgICAgICAgICB8IE1DTyAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgVElNMjFfQ0gxIHwgTFBVQVJUMV9DVFN8CisgKiBQQjE0IHwgU1BJMV9NSVNPICB8ICAgICAgICAgICAgfCBSVENfT1VUICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IFRJTTIxX0NIMiB8IExQVUFSVDFfUlRTfAorICogUEIxNSB8IFNQSTFfTU9TSSAgfCAgICAgICAgICAgIHwgUlRDX1JFRklOICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgIHwKKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisgKiBQQzAgIHwgTFBUSU0xX0lOMSB8ICAgICAgICAgICAgfCBFVkVOVE9VVCAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICB8IExQVUFSVDFfUlggfAorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKyovCisvKiogQGRlZmdyb3VwIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uIEFsdGVybmF0ZSBmdW5jdGlvbiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjAKKyAqLworI2RlZmluZSBHUElPX0FGMF9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAwVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1NXRElPICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogU1dESU8gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dDTEsgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0NMSyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYxCisgKi8KKyNkZWZpbmUgR1BJT19BRjFfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjFfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYyCisgKi8KKyNkZWZpbmUgR1BJT19BRjJfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9NQ08gICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIE1DTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMl9SVEMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFJUQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUYzCisgKi8KKyNkZWZpbmUgR1BJT19BRjNfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGM19FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAzVSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjQKKyAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDIgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY0X0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNF9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDA0VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjUKKyAqLworI2RlZmluZSBHUElPX0FGNV9USU0yICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY2CisgKi8KKyNkZWZpbmUgR1BJT19BRjZfTFBVQVJUMSAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNl9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDA2VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjcKKyAqLworI2RlZmluZSBHUElPX0FGN19DT01QMSAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGN19DT01QMiAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qIENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworLyoqCisgICoKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfUHJpdmF0ZSAgR1BJT0V4IFByaXZhdGUKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmICBJU19HUElPX0FGIG1hY3JvIGRlZmluaXRpb24KKyAqLworCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgKChBRikgPD0gKHVpbnQ4X3QpMHgwNikKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyTDAxMHg2ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJMMDEweDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwMTB4NCkKKy8qIFRoZSB0YWJsZSBiZWxvdyBnaXZlcyBhbiBvdmVydmlldyBvZiB0aGUgZGlmZmVyZW50IGFsdGVybmF0ZSBmdW5jdGlvbnMgcGVyIHBvcnQuCisgKiBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHlvdXJzZWxmIHRvIHRoZSBwcm9kdWN0IGRhdGEgc2hlZXQuCisgKgorICovCisvKiAgICAgIHwgICBBRjAgICAgIHwgICBBRjEgICAgICB8ICAgQUYyICAgICAgfCAgICAgQUYzICAgICB8ICAgQUY0ICAgICAgIHwgICBBRjUgICAgIHwgICBBRjYgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIF9fX19fX19fX19fX19fX19fX19fX19fX198CisgKiBQQTAgIHwgVVNBUlQyX1JYIHwgTFBUSU0xX0lOMSB8IFRJTTJfQ0gxICAgfCAgICAgICAgICAgICB8IFVTQVJUMl9DVFMgIHwgVElNMl9FVFIgIHwgTFBVQVJUMV9SWCB8CisgKiBQQTEgIHwgRVZFTlRPVVQgIHwgTFBUSU0xX0lOMiB8IFRJTTJfQ0gyICAgfCBJMkMxX1NNQkEgICB8IFVTQVJUMl9SVFMgIHwgVElNMjFfRVRSIHwgTFBVQVJUMV9UWCB8CisgKiBQQTIgIHwgVElNMjFfQ0gxIHwgICAgICAgICAgICB8IFRJTTJfQ0gzICAgfCAgICAgICAgICAgICB8IFVTQVJUMl9UWCAgIHwgICAgICAgICAgIHwgTFBVQVJUMV9UWCB8CisgKiBQQTMgIHwgVElNMjFfQ0gyIHwgICAgICAgICAgICB8IFRJTTJfQ0g0ICAgfCAgICAgICAgICAgICB8IFVTQVJUMl9SWCAgIHwgICAgICAgICAgIHwgTFBVQVJUMV9SWCB8CisgKiBQQTQgIHwgU1BJMV9OU1MgIHwgTFBUSU0xX0lOMSB8IExQVElNMV9FVFIgfCBJMkMxX1NDTCAgICB8IFVTQVJUMl9DSyAgIHwgVElNMl9FVFIgIHwgTFBVQVJUMV9UWCB8CisgKiBQQTUgIHwgU1BJMV9TQ0sgIHwgTFBUSU0xX0lOMiB8IFRJTTJfRVRSICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgVElNMl9DSDEgIHwgICAgICAgICAgICB8CisgKiBQQTYgIHwgU1BJMV9NSVNPIHwgTFBUSU0xX0VUUiB8ICAgICAgICAgICAgfCBMUFVBUlQxX0NUUyB8ICAgICAgICAgICAgIHwgRVZFTlRPVVQgIHwgICAgICAgICAgICB8CisgKiBQQTcgIHwgU1BJMV9NT1NJIHwgTFBUSU0xX09VVCB8ICAgICAgICAgICAgfCBVU0FSVDJfQ1RTICB8IFRJTTIxX0VUUiAgIHwgRVZFTlRPVVQgIHwgICAgICAgICAgICB8CisgKiBQQTggIHwgTUNPICAgICAgIHwgICAgICAgICAgICB8IExQVElNMV9JTjEgfCBFVkVOVE9VVCAgICB8IFVTQVJUMl9DSyAgIHwgVElNMl9DSDEgIHwgICAgICAgICAgICB8CisgKiBQQTkgIHwgTUNPICAgICAgIHwgSTJDMV9TQ0wgICB8IExQVElNMV9PVVQgfCAgICAgICAgICAgICB8IFVTQVJUMl9UWCAgIHwgVElNMjFfQ0gyIHwgICAgICAgICAgICB8CisgKiBQQTEwIHwgVElNMjFfQ0gxIHwgSTJDMV9TREEgICB8IFJUQ19SRUZJTiAgfCAgICAgICAgICAgICB8IFVTQVJUMl9SWCAgIHwgVElNMl9DSDMgIHwgICAgICAgICAgICB8CisgKiBQQTExIHwgU1BJMV9NSVNPIHwgTFBUSU0xX09VVCB8IEVWRU5UT1VUICAgfCAgICAgICAgICAgICB8IFVTQVJUMl9DVFMgIHwgVElNMjFfQ0gyIHwgICAgICAgICAgICB8CisgKiBQQTEyIHwgU1BJMV9NT1NJIHwgICAgICAgICAgICB8IEVWRU5UT1VUICAgfCAgICAgICAgICAgICB8IFVTQVJUMl9SVFMgIHwgICAgICAgICAgIHwgICAgICAgICAgICB8CisgKiBQQTEzIHwgU1dESU8gICAgIHwgTFBUSU0xX0VUUiB8ICAgICAgICAgICAgfCBJMkMxX1NEQSAgICB8ICAgICAgICAgICAgIHwgU1BJMV9TQ0sgIHwgTFBVQVJUMV9SWCB8CisgKiBQQTE0IHwgU1dDTEsgICAgIHwgTFBUSU0xX09VVCB8ICAgICAgICAgICAgfCBJMkMxX1NNQkEgICB8IFVTQVJUMl9UWCAgIHwgU1BJMV9NSVNPIHwgTFBVQVJUMV9UWCB8CisgKiBQQTE1IHwgU1BJMV9OU1MgIHwgICAgICAgICAgICB8IFRJTTJfRVRSICAgfCBFVkVOVE9VVCAgICB8IFVTQVJUMl9SWCAgIHwgVElNMl9DSDEgIHwgICAgICAgICAgICB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisgKiBQQjAgIHwgRVZFTlRPVVQgIHwgU1BJMV9NSVNPICB8IFRJTTJfQ0gyICAgfCAgICAgICAgICAgICB8IFVTQVJUMl9SVFMgIHwgVElNMl9DSDMgIHwgICAgICAgICAgICB8CisgKiBQQjEgIHwgVVNBUlQyX0NLIHwgU1BJMV9NT1NJICB8IExQVElNMV9JTjEgfCAgICAgICAgICAgICB8IExQVUFSVDFfUlRTIHwgVElNMl9DSDQgIHwgICAgICAgICAgICB8CisgKiBQQjMgIHwgU1BJMV9TQ0sgIHwgICAgICAgICAgICB8IFRJTTJfQ0gyICAgfCAgICAgICAgICAgICB8IEVWRU5UT1VUICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICB8CisgKiBQQjQgIHwgU1BJMV9NSVNPIHwgICAgICAgICAgICB8IEVWRU5UT1VUICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICB8CisgKiBQQjUgIHwgU1BJMV9NT1NJIHwgICAgICAgICAgICB8IExQVElNMV9JTjEgfCBJMkMxX1NNQkEgICB8ICAgICAgICAgICAgIHwgVElNMjFfQ0gxIHwgICAgICAgICAgICB8CisgKiBQQjYgIHwgVVNBUlQyX1RYIHwgSTJDMV9TQ0wgICB8IExQVElNMV9FVFIgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgVElNMl9DSDMgIHwgTFBVQVJUMV9UWCB8CisgKiBQQjcgIHwgVVNBUlQyX1JYIHwgSTJDMV9TREEgICB8IExQVElNMV9JTjIgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgVElNMl9DSDQgIHwgTFBVQVJUMV9SWCB8CisgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uIEFsdGVybmF0ZSBmdW5jdGlvbiBzZWxlY3Rpb24KKyAqIEB7CisgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjAKKyAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUYwX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfVElNMjEgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBUSU0yMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9TUEkxICAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX01DTyAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAgLyogTUNPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1dESU8gICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiBTV0RJTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGMF9TV0NMSyAgICAgICAgICgodWludDhfdCkweDAwVSkgIC8qIFNXQ0xLIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjEKKyAqLworI2RlZmluZSBHUElPX0FGMV9TUEkxICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIFNQSTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMV9JMkMxICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGMV9MUFRJTTEgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qIExQVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqCisgICoKKyAgKi8KKworLyogIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjIKKyAqCisgKi8KKyNkZWZpbmUgR1BJT19BRjJfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBMUFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyogVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGMl9SVEMgICAgICAgICAgICgodWludDhfdCkweDAyVSkgIC8qIFJUQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjJfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGMworICovCisjZGVmaW5lIEdQSU9fQUYzX0kyQzEgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjNfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGM19MUFVBUlQxICAgICAgICgodWludDhfdCkweDAzVSkgIC8qIExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUYzX1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDNVKSAgLyogVVNBUlQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKy8qKgorICAqCisgICovCisKKy8qCisgKiBBbHRlcm5hdGUgZnVuY3Rpb24gQUY0CisgKi8KKyNkZWZpbmUgR1BJT19BRjRfVVNBUlQyICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNF9USU0yMSAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qIFRJTTIxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisjZGVmaW5lIEdQSU9fQUY0X0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjRfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwNFUpICAvKiBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworLyoqCisgICoKKyAgKi8KKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbiBBRjUKKyAqLworI2RlZmluZSBHUElPX0FGNV9USU0yICAgICAgICAgICgodWludDhfdCkweDA1VSkgIC8qIFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICovCisjZGVmaW5lIEdQSU9fQUY1X1RJTTIxICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyogVElNMjEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiBTUEkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworI2RlZmluZSBHUElPX0FGNV9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDA1VSkgIC8qIEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisvKioKKyAgKgorICAqLworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9uIEFGNgorICovCisjZGVmaW5lIEdQSU9fQUY2X0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDZVKSAgLyogTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKy8qKgorICAqCisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X1ByaXZhdGUgIEdQSU9FeCBQcml2YXRlCisgKiBAeworICovCisvKioKKyAqICBJU19HUElPX0FGIG1hY3JvIGRlZmluaXRpb24KKyAqLworCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgKChBRikgPD0gKHVpbnQ4X3QpMHgwNikKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyTDAxMHg0Ki8KKworI2lmIGRlZmluZWQgKFNUTTMyTDA4M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3MXh4KSB8fCBcCisgICAgZGVmaW5lZCAoU1RNMzJMMDEweEIpCisKKyAvKiogQGFkZHRvZ3JvdXAgR1BJT0V4X0V4cG9ydGVkX0NvbnN0YW50cworICogQHsKKyAqLworIC8qKiBAZGVmZ3JvdXAgR1BJT0V4X1Bpbl9BdmFpbGFibGUgUGluIGF2YWlsYWJsZQorICogQHsKKyAqLworI2RlZmluZSBHUElPQV9QSU5fQVZBSUxBQkxFICBHUElPX1BJTl9BbGwKKyNkZWZpbmUgR1BJT0JfUElOX0FWQUlMQUJMRSAgR1BJT19QSU5fQWxsCisjZGVmaW5lIEdQSU9DX1BJTl9BVkFJTEFCTEUgIEdQSU9fUElOX0FsbAorI2RlZmluZSBHUElPRF9QSU5fQVZBSUxBQkxFICBHUElPX1BJTl9BbGwKKyNkZWZpbmUgR1BJT0VfUElOX0FWQUlMQUJMRSAgR1BJT19QSU5fQWxsCisjZGVmaW5lIEdQSU9IX1BJTl9BVkFJTEFCTEUgIChHUElPX1BJTl8wIHwgR1BJT19QSU5fMSB8IEdQSU9fUElOXzkgfCBHUElPX1BJTl8xMCkKKy8qKgorICAqIEB9CisgICovCisvKioKKyAgKiBAfQorICAqLworCisgLyoqIEBhZGR0b2dyb3VwIEdQSU9FeF9Qcml2YXRlCisgKiBAeworICovCisjZGVmaW5lIEdQSU9fR0VUX0lOREVYKF9fR1BJT3hfXykgICAgKCgoX19HUElPeF9fKSA9PSAoR1BJT0EpKT8gMFUgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPQikpPyAxVSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fR1BJT3hfXykgPT0gKEdQSU9DKSk/IDJVIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0QpKT8gM1UgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPRSkpPyA0VSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fR1BJT3hfXykgPT0gKEdQSU9IKSk/IDVVIDogNlUpCisKKyNkZWZpbmUgSVNfR1BJT19QSU5fQVZBSUxBQkxFKF9fSU5TVEFOQ0VfXyxfX1BJTl9fKSAgXAorICAgICAgICAgICAoKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQSkgJiYgKCgoX19QSU5fXykgJiAoR1BJT0FfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQV9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9BX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQikgJiYgKCgoX19QSU5fXykgJiAoR1BJT0JfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQl9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9CX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQykgJiYgKCgoX19QSU5fXykgJiAoR1BJT0NfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQ19QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9DX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPRCkgJiYgKCgoX19QSU5fXykgJiAoR1BJT0RfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPRF9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9EX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPRSkgJiYgKCgoX19QSU5fXykgJiAoR1BJT0VfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPRV9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9FX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPSCkgJiYgKCgoX19QSU5fXykgJiAoR1BJT0hfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPSF9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9IX1BJTl9BVkFJTEFCTEUpKSkpCisvKioKKyAgKiBAfQorICAqLworI2VsaWYgZGVmaW5lZCAoU1RNMzJMMDMxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA0MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4NikKKworLyoqIEBhZGR0b2dyb3VwIEdQSU9FeF9FeHBvcnRlZF9Db25zdGFudHMKKyAqIEB7CisgKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X1Bpbl9BdmFpbGFibGUgUGluIGF2YWlsYWJsZQorICogQHsKKyAqLworCisjZGVmaW5lIEdQSU9BX1BJTl9BVkFJTEFCTEUgIEdQSU9fUElOX0FsbAorI2RlZmluZSBHUElPQl9QSU5fQVZBSUxBQkxFICBHUElPX1BJTl9BbGwKKyNkZWZpbmUgR1BJT0NfUElOX0FWQUlMQUJMRSAgKEdQSU9fUElOXzAgfCBHUElPX1BJTl8xMyB8IEdQSU9fUElOXzE0IHwgR1BJT19QSU5fMTUpCisjZGVmaW5lIEdQSU9IX1BJTl9BVkFJTEFCTEUgIChHUElPX1BJTl8wIHwgR1BJT19QSU5fMSkKKy8qKgorICAqIEB9CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgR1BJT0V4X1ByaXZhdGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgR1BJT19HRVRfSU5ERVgoX19HUElPeF9fKSAgICAoKChfX0dQSU94X18pID09IChHUElPQSkpPyAwVSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fR1BJT3hfXykgPT0gKEdQSU9CKSk/IDFVIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0MpKT8gMlUgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPSCkpPyA1VSA6IDZVKQorCisKKyNkZWZpbmUgSVNfR1BJT19QSU5fQVZBSUxBQkxFKF9fSU5TVEFOQ0VfXyxfX1BJTl9fKSAgXAorICAgICAgICAgICAoKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQSkgJiYgKCgoX19QSU5fXykgJiAoR1BJT0FfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQV9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9BX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQikgJiYgKCgoX19QSU5fXykgJiAoR1BJT0JfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQl9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9CX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQykgJiYgKCgoX19QSU5fXykgJiAoR1BJT0NfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQ19QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9DX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPSCkgJiYgKCgoX19QSU5fXykgJiAoR1BJT0hfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPSF9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9IX1BJTl9BVkFJTEFCTEUpKSkpCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbGlmIGRlZmluZWQgKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMjF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDEweDQpCisKKy8qKiBAYWRkdG9ncm91cCBHUElPRXhfRXhwb3J0ZWRfQ29uc3RhbnRzCisgKiBAeworICovCisvKiogQGRlZmdyb3VwIEdQSU9FeF9QaW5fQXZhaWxhYmxlIFBpbiBhdmFpbGFibGUKKyAqIEB7CisgKi8KKworI2RlZmluZSBHUElPQV9QSU5fQVZBSUxBQkxFICBHUElPX1BJTl9BbGwKKyNkZWZpbmUgR1BJT0JfUElOX0FWQUlMQUJMRSAgKEdQSU9fUElOXzAgfCBHUElPX1BJTl8xIHwgR1BJT19QSU5fMiB8IEdQSU9fUElOXzMgfCBHUElPX1BJTl80IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19QSU5fNSB8IEdQSU9fUElOXzYgfCBHUElPX1BJTl83IHwgR1BJT19QSU5fOCB8IEdQSU9fUElOXzkgKQorI2RlZmluZSBHUElPQ19QSU5fQVZBSUxBQkxFICAoR1BJT19QSU5fMTQgfCBHUElPX1BJTl8xNSkKKworLyoqCisgICogQH0KKyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPRXhfUHJpdmF0ZQorICogQHsKKyAqLworI2RlZmluZSBHUElPX0dFVF9JTkRFWChfX0dQSU94X18pICAgICgoKF9fR1BJT3hfXykgPT0gKEdQSU9BKSk/IDBVIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0IpKT8gMVUgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPQykpPyAyVSA6IDZVKQorCisKKyNkZWZpbmUgSVNfR1BJT19QSU5fQVZBSUxBQkxFKF9fSU5TVEFOQ0VfXyxfX1BJTl9fKSAgXAorICAgICAgICAgICAoKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQSkgJiYgKCgoX19QSU5fXykgJiAoR1BJT0FfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQV9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9BX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQikgJiYgKCgoX19QSU5fXykgJiAoR1BJT0JfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQl9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9CX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQykgJiYgKCgoX19QSU5fXykgJiAoR1BJT0NfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQ19QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9DX1BJTl9BVkFJTEFCTEUpKSkpCisvKioKKyAgKiBAfQorICAqLworCisjZWxpZiBkZWZpbmVkIChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2MXh4KSB8fCBcCisgICAgICBkZWZpbmVkIChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDUyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA1MXh4KSB8fCBcCisgICAgICBkZWZpbmVkIChTVE0zMkwwMTB4OCkKKworLyoqIEBhZGR0b2dyb3VwIEdQSU9FeF9FeHBvcnRlZF9Db25zdGFudHMKKyAqIEB7CisgKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X1Bpbl9BdmFpbGFibGUgUGluIGF2YWlsYWJsZQorICogQHsKKyAqLworI2RlZmluZSBHUElPQV9QSU5fQVZBSUxBQkxFICBHUElPX1BJTl9BbGwKKyNkZWZpbmUgR1BJT0JfUElOX0FWQUlMQUJMRSAgR1BJT19QSU5fQWxsCisjZGVmaW5lIEdQSU9DX1BJTl9BVkFJTEFCTEUgIEdQSU9fUElOX0FsbAorI2RlZmluZSBHUElPRF9QSU5fQVZBSUxBQkxFICBHUElPX1BJTl8yCisjZGVmaW5lIEdQSU9IX1BJTl9BVkFJTEFCTEUgIEdQSU9fUElOXzAgfCBHUElPX1BJTl8xCisvKioKKyAgKiBAfQorICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEdQSU9FeF9Qcml2YXRlCisgKiBAeworICovCisjZGVmaW5lIEdQSU9fR0VUX0lOREVYKF9fR1BJT3hfXykgICAgKCgoX19HUElPeF9fKSA9PSAoR1BJT0EpKT8gMFUgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPQikpPyAxVSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fR1BJT3hfXykgPT0gKEdQSU9DKSk/IDJVIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0QpKT8gM1UgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPSCkpPyA1VSA6IDZVKQorCisjZGVmaW5lIElTX0dQSU9fUElOX0FWQUlMQUJMRShfX0lOU1RBTkNFX18sX19QSU5fXykgIFwKKyAgICAgICAgICAgICAgICAoKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPQSkgJiYgKCgoX19QSU5fXykgJiAoR1BJT0FfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPQV9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9BX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgICAgICAoKChfX0lOU1RBTkNFX18pID09IEdQSU9CKSAmJiAoKChfX1BJTl9fKSAmIChHUElPQl9QSU5fQVZBSUxBQkxFKSkgIT0gMFUpICYmICgoKF9fUElOX18pIHwgKEdQSU9CX1BJTl9BVkFJTEFCTEUpKSA9PSAoR1BJT0JfUElOX0FWQUlMQUJMRSkpKSB8fCBcCisgICAgICAgICAgICAgICAgICgoKF9fSU5TVEFOQ0VfXykgPT0gR1BJT0MpICYmICgoKF9fUElOX18pICYgKEdQSU9DX1BJTl9BVkFJTEFCTEUpKSAhPSAwVSkgJiYgKCgoX19QSU5fXykgfCAoR1BJT0NfUElOX0FWQUlMQUJMRSkpID09IChHUElPQ19QSU5fQVZBSUxBQkxFKSkpIHx8IFwKKyAgICAgICAgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBHUElPRCkgJiYgKCgoX19QSU5fXykgJiAoR1BJT0RfUElOX0FWQUlMQUJMRSkpICE9IDBVKSAmJiAoKChfX1BJTl9fKSB8IChHUElPRF9QSU5fQVZBSUxBQkxFKSkgPT0gKEdQSU9EX1BJTl9BVkFJTEFCTEUpKSkgfHwgXAorICAgICAgICAgICAgICAgICAoKChfX0lOU1RBTkNFX18pID09IEdQSU9IKSAmJiAoKChfX1BJTl9fKSAmIChHUElPSF9QSU5fQVZBSUxBQkxFKSkgIT0gMFUpICYmICgoKF9fUElOX18pIHwgKEdQSU9IX1BJTl9BVkFJTEFCTEUpKSA9PSAoR1BJT0hfUElOX0FWQUlMQUJMRSkpKSkKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkwwODN4eCB8fCBTVE0zMkwwODJ4eCB8fCBTVE0zMkwwODF4eCB8fCBTVE0zMkwwNzN4eCB8fCBTVE0zMkwwNzJ4eCB8fCBTVE0zMkwwNzF4eCovCisKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0hBTF9HUElPX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfaTJjLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjNlYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfaTJjLmgKQEAgLTAsMCArMSw3ODIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2kyYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBJMkMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkwweHhfSEFMX0kyQ19ICisjZGVmaW5lIFNUTTMyTDB4eF9IQUxfSTJDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfVHlwZXMgSTJDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfQ29uZmlndXJhdGlvbl9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBJMkMgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSTJDIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVGltaW5nOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEkyQ19USU1JTkdSX3JlZ2lzdGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbGN1bGF0ZWQgYnkgcmVmZXJyaW5nIHRvIEkyQyBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIFJlZmVyZW5jZSBtYW51YWwgKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlyc3QgZGV2aWNlIG93biBhZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIDctYml0IG9yIDEwLWJpdCBhZGRyZXNzLiAqLworCisgIHVpbnQzMl90IEFkZHJlc3NpbmdNb2RlOyAgICAgIC8qITwgU3BlY2lmaWVzIGlmIDctYml0IG9yIDEwLWJpdCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfQUREUkVTU0lOR19NT0RFICovCisKKyAgdWludDMyX3QgRHVhbEFkZHJlc3NNb2RlOyAgICAgLyohPCBTcGVjaWZpZXMgaWYgZHVhbCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfRFVBTF9BRERSRVNTSU5HX01PREUgKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMjsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2Vjb25kIGRldmljZSBvd24gYWRkcmVzcyBpZiBkdWFsIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIDctYml0IGFkZHJlc3MuICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczJNYXNrczsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFja25vd2xlZGdlIG1hc2sgYWRkcmVzcyBzZWNvbmQgZGV2aWNlIG93biBhZGRyZXNzIGlmIGR1YWwgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfT1dOX0FERFJFU1MyX01BU0tTICovCisKKyAgdWludDMyX3QgR2VuZXJhbENhbGxNb2RlOyAgICAgLyohPCBTcGVjaWZpZXMgaWYgZ2VuZXJhbCBjYWxsIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfR0VORVJBTF9DQUxMX0FERFJFU1NJTkdfTU9ERSAqLworCisgIHVpbnQzMl90IE5vU3RyZXRjaE1vZGU7ICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIG5vc3RyZXRjaCBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX05PU1RSRVRDSF9NT0RFICovCisKK30gSTJDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9zdGF0ZV9zdHJ1Y3R1cmVfZGVmaW5pdGlvbiBIQUwgc3RhdGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBub3RlICBIQUwgSTJDIFN0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6XG4KKyAgKiAgICAgICAgICBiNy1iNiAgRXJyb3IgaW5mb3JtYXRpb25cbgorICAqICAgICAgICAgICAgIDAwIDogTm8gRXJyb3JcbgorICAqICAgICAgICAgICAgIDAxIDogQWJvcnQgKEFib3J0IHVzZXIgcmVxdWVzdCBvbiBnb2luZylcbgorICAqICAgICAgICAgICAgIDEwIDogVGltZW91dFxuCisgICogICAgICAgICAgICAgMTEgOiBFcnJvclxuCisgICogICAgICAgICAgYjUgICAgIElQIGluaXRpbGlzYXRpb24gc3RhdHVzXG4KKyAgKiAgICAgICAgICAgICAwICA6IFJlc2V0IChJUCBub3QgaW5pdGlhbGl6ZWQpXG4KKyAgKiAgICAgICAgICAgICAxICA6IEluaXQgZG9uZSAoSVAgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IHRvIHVzZS4gSEFMIEkyQyBJbml0IGZ1bmN0aW9uIGNhbGxlZClcbgorICAqICAgICAgICAgIGI0ICAgICAobm90IHVzZWQpXG4KKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMFxuCisgICogICAgICAgICAgYjNcbgorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgb3IgQnVzeSAoTm8gTGlzdGVuIG1vZGUgb25nb2luZylcbgorICAqICAgICAgICAgICAgIDEgIDogTGlzdGVuIChJUCBpbiBBZGRyZXNzIExpc3RlbiBNb2RlKVxuCisgICogICAgICAgICAgYjIgICAgIEludHJpbnNpYyBwcm9jZXNzIHN0YXRlXG4KKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5XG4KKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKElQIGJ1c3kgd2l0aCBzb21lIGNvbmZpZ3VyYXRpb24gb3IgaW50ZXJuYWwgb3BlcmF0aW9ucylcbgorICAqICAgICAgICAgIGIxICAgICBSeCBzdGF0ZVxuCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gUnggb3BlcmF0aW9uIG9uZ29pbmcpXG4KKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFJ4IG9wZXJhdGlvbiBvbmdvaW5nKVxuCisgICogICAgICAgICAgYjAgICAgIFR4IHN0YXRlXG4KKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBUeCBvcGVyYXRpb24gb25nb2luZylcbgorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogQHsKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfSTJDX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCB5ZXQgSW5pdGlhbGl6ZWQgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgyMFUsICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgyNFUsICAgLyohPCBBbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1lfVFggICAgICAgICAgID0gMHgyMVUsICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1lfUlggICAgICAgICAgID0gMHgyMlUsICAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0xJU1RFTiAgICAgICAgICAgID0gMHgyOFUsICAgLyohPCBBZGRyZXNzIExpc3RlbiBNb2RlIGlzIG9uZ29pbmcgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOICAgID0gMHgyOVUsICAgLyohPCBBZGRyZXNzIExpc3RlbiBNb2RlIGFuZCBEYXRhIFRyYW5zbWlzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1lfUlhfTElTVEVOICAgID0gMHgyQVUsICAgLyohPCBBZGRyZXNzIExpc3RlbiBNb2RlIGFuZCBEYXRhIFJlY2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0FCT1JUICAgICAgICAgICAgID0gMHg2MFUsICAgLyohPCBBYm9ydCB1c2VyIHJlcXVlc3Qgb25nb2luZyAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX1RJTUVPVVQgICAgICAgICAgID0gMHhBMFUsICAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0VSUk9SICAgICAgICAgICAgID0gMHhFMFUgICAgLyohPCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IEhBTF9JMkNfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9tb2RlX3N0cnVjdHVyZV9kZWZpbml0aW9uIEhBTCBtb2RlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBIQUwgTW9kZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBub3RlICBIQUwgSTJDIE1vZGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDpcbgorICAqICAgICAgICAgIGI3ICAgICAobm90IHVzZWQpXG4KKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMFxuCisgICogICAgICAgICAgYjZcbgorICAqICAgICAgICAgICAgIDAgIDogTm9uZVxuCisgICogICAgICAgICAgICAgMSAgOiBNZW1vcnkgKEhBTCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBNZW1vcnkgTW9kZSlcbgorICAqICAgICAgICAgIGI1XG4KKyAgKiAgICAgICAgICAgICAwICA6IE5vbmVcbgorICAqICAgICAgICAgICAgIDEgIDogU2xhdmUgKEhBTCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBTbGF2ZSBNb2RlKVxuCisgICogICAgICAgICAgYjRcbgorICAqICAgICAgICAgICAgIDAgIDogTm9uZVxuCisgICogICAgICAgICAgICAgMSAgOiBNYXN0ZXIgKEhBTCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBNYXN0ZXIgTW9kZSlcbgorICAqICAgICAgICAgIGIzLWIyLWIxLWIwICAobm90IHVzZWQpXG4KKyAgKiAgICAgICAgICAgICB4eHh4IDogU2hvdWxkIGJlIHNldCB0byAwMDAwCisgICogQHsKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfSTJDX01PREVfTk9ORSAgICAgICAgICAgICAgID0gMHgwMFUsICAgLyohPCBObyBJMkMgY29tbXVuaWNhdGlvbiBvbiBnb2luZyAgICAgICAgICAgICAqLworICBIQUxfSTJDX01PREVfTUFTVEVSICAgICAgICAgICAgID0gMHgxMFUsICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBNYXN0ZXIgTW9kZSAgICAgICAqLworICBIQUxfSTJDX01PREVfU0xBVkUgICAgICAgICAgICAgID0gMHgyMFUsICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBTbGF2ZSBNb2RlICAgICAgICAqLworICBIQUxfSTJDX01PREVfTUVNICAgICAgICAgICAgICAgID0gMHg0MFUgICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBNZW1vcnkgTW9kZSAgICAgICAqLworCit9IEhBTF9JMkNfTW9kZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0Vycm9yX0NvZGVfZGVmaW5pdGlvbiBJMkMgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBJMkMgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9OT05FICAgICAgKDB4MDAwMDAwMDBVKSAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX0JFUlIgICAgICAoMHgwMDAwMDAwMVUpICAgIC8qITwgQkVSUiBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfQVJMTyAgICAgICgweDAwMDAwMDAyVSkgICAgLyohPCBBUkxPIGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9BRiAgICAgICAgKDB4MDAwMDAwMDRVKSAgICAvKiE8IEFDS0YgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX09WUiAgICAgICAoMHgwMDAwMDAwOFUpICAgIC8qITwgT1ZSIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfRE1BICAgICAgICgweDAwMDAwMDEwVSkgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9USU1FT1VUICAgKDB4MDAwMDAwMjBVKSAgICAvKiE8IFRpbWVvdXQgZXJyb3IgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX1NJWkUgICAgICAoMHgwMDAwMDA0MFUpICAgIC8qITwgU2l6ZSBNYW5hZ2VtZW50IGVycm9yICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfRE1BX1BBUkFNICgweDAwMDAwMDgwVSkgICAgLyohPCBETUEgUGFyYW1ldGVyIEVycm9yICAgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAgKDB4MDAwMDAxMDBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNICAgICAoMHgwMDAwMDIwMFUpICAgIC8qITwgSW52YWxpZCBQYXJhbWV0ZXJzIGVycm9yICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfaGFuZGxlX1N0cnVjdHVyZV9kZWZpbml0aW9uIEkyQyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEkyQyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZgoreworICBJMkNfVHlwZURlZiAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgLyohPCBJMkMgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAqLworCisgIEkyQ19Jbml0VHlwZURlZiAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgKnBCdWZmUHRyOyAgICAgIC8qITwgUG9pbnRlciB0byBJMkMgdHJhbnNmZXIgYnVmZmVyICAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBYZmVyU2l6ZTsgICAgICAgLyohPCBJMkMgdHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgIFhmZXJDb3VudDsgICAgICAvKiE8IEkyQyB0cmFuc2ZlciBjb3VudGVyICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgWGZlck9wdGlvbnM7ICAgIC8qITwgSTJDIHNlcXVhbnRpYWwgdHJhbnNmZXIgb3B0aW9ucywgdGhpcyBwYXJhbWV0ZXIgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBQcmV2aW91c1N0YXRlOyAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBQcmV2aW91cyBzdGF0ZSAgICAgICAgICAqLworCisgIEhBTF9TdGF0dXNUeXBlRGVmKCpYZmVySVNSKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsgIC8qITwgSTJDIHRyYW5zZmVyIElSUSBoYW5kbGVyIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAqaGRtYXR4OyAgICAgICAgLyohPCBJMkMgVHggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hcng7ICAgICAgICAvKiE8IEkyQyBSeCBETUEgaGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgTG9jazsgICAgICAgICAgIC8qITwgSTJDIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9JMkNfU3RhdGVUeXBlRGVmICBTdGF0ZTsgICAgICAgICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX0kyQ19Nb2RlVHlwZURlZiAgIE1vZGU7ICAgICAgICAgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIG1vZGUgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgIC8qITwgSTJDIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBBZGRyRXZlbnRDb3VudDsgLyohPCBJMkMgQWRkcmVzcyBFdmVudCBjb3VudGVyICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIE1hc3RlclR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAvKiE8IEkyQyBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCogTWFzdGVyUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgIC8qITwgSTJDIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBTbGF2ZVR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgLyohPCBJMkMgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICAqLworICB2b2lkICgqIFNsYXZlUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgICAvKiE8IEkyQyBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgICovCisgIHZvaWQgKCogTGlzdGVuQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgIC8qITwgSTJDIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjayAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNZW1UeENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAgICAgICAgICAgICAgLyohPCBJMkMgTWVtb3J5IFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqIE1lbVJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgICAvKiE8IEkyQyBNZW1vcnkgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAgICAgICAgICAgICAgICAgIC8qITwgSTJDIEVycm9yIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBBYm9ydENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAgICAgICAgICAgICAgLyohPCBJMkMgQWJvcnQgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogQWRkckNhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7ICAvKiE8IEkyQyBTbGF2ZSBBZGRyZXNzIE1hdGNoIGNhbGxiYWNrICovCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgICAgICAgLyohPCBJMkMgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgICAvKiE8IEkyQyBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICovCisKKyNlbmRpZiAgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IEkyQ19IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgSTJDIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfSTJDX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCAgICAgID0gMHgwMFUsICAgIC8qITwgSTJDIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICovCisgIEhBTF9JMkNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgPSAweDAxVSwgICAgLyohPCBJMkMgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX0kyQ19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCAgICAgICA9IDB4MDJVLCAgICAvKiE8IEkyQyBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAqLworICBIQUxfSTJDX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgID0gMHgwM1UsICAgIC8qITwgSTJDIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgICovCisgIEhBTF9JMkNfTElTVEVOX0NPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDA0VSwgICAgLyohPCBJMkMgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyQ19NRU1fVFhfQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IEkyQyBNZW1vcnkgVHggVHJhbnNmZXIgY2FsbGJhY2sgSUQgICAgICAgICAgICAqLworICBIQUxfSTJDX01FTV9SWF9DT01QTEVURV9DQl9JRCAgICAgICAgID0gMHgwNlUsICAgIC8qITwgSTJDIE1lbW9yeSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICovCisgIEhBTF9JMkNfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA3VSwgICAgLyohPCBJMkMgRXJyb3IgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyQ19BQk9SVF9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDhVLCAgICAvKiE8IEkyQyBBYm9ydCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEhBTF9JMkNfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDA5VSwgICAgLyohPCBJMkMgTXNwIEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MEFVICAgICAvKiE8IEkyQyBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAqLworCit9IEhBTF9JMkNfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIEkyQyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwSTJDX0NhbGxiYWNrVHlwZURlZikoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAvKiE8IHBvaW50ZXIgdG8gYW4gSTJDIGNhbGxiYWNrIGZ1bmN0aW9uICovCit0eXBlZGVmICB2b2lkICgqcEkyQ19BZGRyQ2FsbGJhY2tUeXBlRGVmKShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7IC8qITwgcG9pbnRlciB0byBhbiBJMkMgQWRkcmVzcyBNYXRjaCBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfQ29uc3RhbnRzIEkyQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19YRkVST1BUSU9OUyAgSTJDIFNlcXVlbnRpYWwgVHJhbnNmZXIgT3B0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19GSVJTVF9GUkFNRSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClJMkNfU09GVEVORF9NT0RFKQorI2RlZmluZSBJMkNfRklSU1RfQU5EX05FWFRfRlJBTUUgICAgICAgICgodWludDMyX3QpKEkyQ19SRUxPQURfTU9ERSB8IEkyQ19TT0ZURU5EX01PREUpKQorI2RlZmluZSBJMkNfTkVYVF9GUkFNRSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKEkyQ19SRUxPQURfTU9ERSB8IEkyQ19TT0ZURU5EX01PREUpKQorI2RlZmluZSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUUgICAgICAgICgodWludDMyX3QpSTJDX0FVVE9FTkRfTU9ERSkKKyNkZWZpbmUgSTJDX0xBU1RfRlJBTUUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUkyQ19BVVRPRU5EX01PREUpCisjZGVmaW5lIEkyQ19MQVNUX0ZSQU1FX05PX1NUT1AgICAgICAgICAgKCh1aW50MzJfdClJMkNfU09GVEVORF9NT0RFKQorCisvKiBMaXN0IG9mIFhmZXJPcHRpb25zIGluIHVzYWdlIG9mIDoKKyAqIDEtIFJlc3RhcnQgY29uZGl0aW9uIGluIGFsbCB1c2UgY2FzZXMgKGRpcmVjdGlvbiBjaGFuZ2Ugb3Igbm90KQorICovCisjZGVmaW5lICBJMkNfT1RIRVJfRlJBTUUgICAgICAgICAgICAgICAgKDB4MDAwMDAwQUFVKQorI2RlZmluZSAgSTJDX09USEVSX0FORF9MQVNUX0ZSQU1FICAgICAgICgweDAwMDBBQTAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0FERFJFU1NJTkdfTU9ERSBJMkMgQWRkcmVzc2luZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0FERFJFU1NJTkdNT0RFXzdCSVQgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCAgICAgICAgKDB4MDAwMDAwMDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRFVBTF9BRERSRVNTSU5HX01PREUgSTJDIER1YWwgQWRkcmVzc2luZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0RJU0FCTEUgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyQ19EVUFMQUREUkVTU19FTkFCTEUgICAgICAgICAgSTJDX09BUjJfT0EyRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX09XTl9BRERSRVNTMl9NQVNLUyBJMkMgT3duIEFkZHJlc3MyIE1hc2tzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX09BMl9OT01BU0sgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzAxICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSBJMkNfT0EyX01BU0swMiAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDMgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzA0ICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKQorI2RlZmluZSBJMkNfT0EyX01BU0swNSAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA1VSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDYgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzA3ICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfR0VORVJBTF9DQUxMX0FERFJFU1NJTkdfTU9ERSBJMkMgR2VuZXJhbCBDYWxsIEFkZHJlc3NpbmcgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9ESVNBQkxFICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBJMkNfR0VORVJBTENBTExfRU5BQkxFICAgICAgICAgIEkyQ19DUjFfR0NFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTk9TVFJFVENIX01PREUgSTJDIE5vLVN0cmV0Y2ggTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19OT1NUUkVUQ0hfRElTQUJMRSAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBJMkNfTk9TVFJFVENIX0VOQUJMRSAgICAgICAgICAgIEkyQ19DUjFfTk9TVFJFVENICisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19NRU1PUllfQUREUkVTU19TSVpFIEkyQyBNZW1vcnkgQWRkcmVzcyBTaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX01FTUFERF9TSVpFXzhCSVQgICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIEkyQ19NRU1BRERfU0laRV8xNkJJVCAgICAgICAgICAgKDB4MDAwMDAwMDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfWEZFUkRJUkVDVElPTiBJMkMgVHJhbnNmZXIgRGlyZWN0aW9uIE1hc3RlciBQb2ludCBvZiBWaWV3CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0RJUkVDVElPTl9UUkFOU01JVCAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyQ19ESVJFQ1RJT05fUkVDRUlWRSAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfUkVMT0FEX0VORF9NT0RFIEkyQyBSZWxvYWQgRW5kIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSAgSTJDX1JFTE9BRF9NT0RFICAgICAgICAgICAgICAgIEkyQ19DUjJfUkVMT0FECisjZGVmaW5lICBJMkNfQVVUT0VORF9NT0RFICAgICAgICAgICAgICAgSTJDX0NSMl9BVVRPRU5ECisjZGVmaW5lICBJMkNfU09GVEVORF9NT0RFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfU1RBUlRfU1RPUF9NT0RFIEkyQyBTdGFydCBvciBTdG9wIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSAgSTJDX05PX1NUQVJUU1RPUCAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgIEkyQ19HRU5FUkFURV9TVE9QICAgICAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVE9QKQorI2RlZmluZSAgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUIHwgSTJDX0NSMl9SRF9XUk4pCisjZGVmaW5lICBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19JbnRlcnJ1cHRfY29uZmlndXJhdGlvbl9kZWZpbml0aW9uIEkyQyBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICogQGJyaWVmIEkyQyBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYWFhYWAorICAqICAgICAgICAgICAtIFhYWFhYWFhYICA6IEludGVycnVwdCBjb250cm9sIG1hc2sKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfSVRfRVJSSSAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfRVJSSUUKKyNkZWZpbmUgSTJDX0lUX1RDSSAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1RDSUUKKyNkZWZpbmUgSTJDX0lUX1NUT1BJICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1NUT1BJRQorI2RlZmluZSBJMkNfSVRfTkFDS0kgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfTkFDS0lFCisjZGVmaW5lIEkyQ19JVF9BRERSSSAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9BRERSSUUKKyNkZWZpbmUgSTJDX0lUX1JYSSAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1JYSUUKKyNkZWZpbmUgSTJDX0lUX1RYSSAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1RYSUUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0ZsYWdfZGVmaW5pdGlvbiBJMkMgRmxhZyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0ZMQUdfVFhFICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RYRQorI2RlZmluZSBJMkNfRkxBR19UWElTICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVFhJUworI2RlZmluZSBJMkNfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfUlhORQorI2RlZmluZSBJMkNfRkxBR19BRERSICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQUREUgorI2RlZmluZSBJMkNfRkxBR19BRiAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfTkFDS0YKKyNkZWZpbmUgSTJDX0ZMQUdfU1RPUEYgICAgICAgICAgICAgICAgICBJMkNfSVNSX1NUT1BGCisjZGVmaW5lIEkyQ19GTEFHX1RDICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQworI2RlZmluZSBJMkNfRkxBR19UQ1IgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVENSCisjZGVmaW5lIEkyQ19GTEFHX0JFUlIgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9CRVJSCisjZGVmaW5lIEkyQ19GTEFHX0FSTE8gICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BUkxPCisjZGVmaW5lIEkyQ19GTEFHX09WUiAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9PVlIKKyNkZWZpbmUgSTJDX0ZMQUdfUEVDRVJSICAgICAgICAgICAgICAgICBJMkNfSVNSX1BFQ0VSUgorI2RlZmluZSBJMkNfRkxBR19USU1FT1VUICAgICAgICAgICAgICAgIEkyQ19JU1JfVElNRU9VVAorI2RlZmluZSBJMkNfRkxBR19BTEVSVCAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQUxFUlQKKyNkZWZpbmUgSTJDX0ZMQUdfQlVTWSAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0JVU1kKKyNkZWZpbmUgSTJDX0ZMQUdfRElSICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0RJUgorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfTWFjcm9zIEkyQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IEkyQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX0kyQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRVNFVDsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfSTJDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVTRVQpCisjZW5kaWYKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9FUlJJICBFcnJvcnMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfTkFDS0kgTkFDSyByZWNlaXZlZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1RYSSAgIFRYIGludGVycnVwdCBlbmFibGUKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9TVE9QSSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfUlhJICAgUlggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICh+KF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSTJDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9TVE9QSSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfUlhJICAgUlggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19UWEUgICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19UWElTICAgIFRyYW5zbWl0IGludGVycnVwdCBzdGF0dXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19SWE5FICAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BRERSICAgIEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BRiAgICAgIEFja25vd2xlZGdlIGZhaWx1cmUgcmVjZWl2ZWQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1NUT1BGICAgU1RPUCBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RDICAgICAgVHJhbnNmZXIgY29tcGxldGUgKG1hc3RlciBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RDUiAgICAgVHJhbnNmZXIgY29tcGxldGUgcmVsb2FkCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQkVSUiAgICBCdXMgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19PVlIgICAgIE92ZXJydW4vVW5kZXJydW4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19QRUNFUlIgIFBFQyBlcnJvciBpbiByZWNlcHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FMRVJUICAgU01CdXMgYWxlcnQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19CVVNZICAgIEJ1cyBidXN5CisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfRElSICAgICBUcmFuc2ZlciBkaXJlY3Rpb24gKHNsYXZlIG1vZGUpCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIEkyQ19GTEFHX01BU0sgICgweDAwMDFGRkZGVSkKKyNkZWZpbmUgX19IQUxfSTJDX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBJMkMgcGVuZGluZyBmbGFncyB3aGljaCBhcmUgY2xlYXJlZCBieSB3cml0aW5nIDEgaW4gYSBzcGVjaWZpYyBiaXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RYRSAgICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FERFIgICAgQWRkcmVzcyBtYXRjaGVkIChzbGF2ZSBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FGICAgICAgQWNrbm93bGVkZ2UgZmFpbHVyZSByZWNlaXZlZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfU1RPUEYgICBTVE9QIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQkVSUiAgICBCdXMgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19PVlIgICAgIE92ZXJydW4vVW5kZXJydW4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19QRUNFUlIgIFBFQyBlcnJvciBpbiByZWNlcHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FMRVJUICAgU01CdXMgYWxlcnQKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19GTEFHX18pID09IEkyQ19GTEFHX1RYRSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSIHw9IChfX0ZMQUdfXykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBJMkMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgIEkyQ19DUjFfUEUpKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSTJDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgSTJDX0NSMV9QRSkpCisKKy8qKiBAYnJpZWYgIEdlbmVyYXRlIGEgTm9uLUFja25vd2xlZGdlIEkyQyBwZXJpcGhlcmFsIGluIFNsYXZlIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0soX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIsIEkyQ19DUjJfTkFDSykpCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIEkyQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9pMmNfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0RlSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfTXNwSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfTXNwRGVJbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1JlZ2lzdGVyQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIEhBTF9JMkNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcEkyQ19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfVW5SZWdpc3RlckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCBIQUxfSTJDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1JlZ2lzdGVyQWRkckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCBwSTJDX0FkZHJDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfVW5SZWdpc3RlckFkZHJDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19Jc0RldmljZVJlYWR5KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MzJfdCBUcmlhbHMsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKioqKioqKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfRW5hYmxlTGlzdGVuX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfRGlzYWJsZUxpc3Rlbl9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcyk7CisKKy8qKioqKioqIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmVfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1JlYWRfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisvKioqKioqKiBJMkMgSVJRSGFuZGxlciBhbmQgQ2FsbGJhY2tzIHVzZWQgaW4gbm9uIGJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHQgYW5kIERNQSkgKi8KK3ZvaWQgSEFMX0kyQ19FVl9JUlFIYW5kbGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19FUl9JUlFIYW5kbGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX0FkZHJDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7Cit2b2lkIEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSwgTW9kZSBhbmQgRXJyb3IgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfSTJDX1N0YXRlVHlwZURlZiBIQUxfSTJDX0dldFN0YXRlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK0hBTF9JMkNfTW9kZVR5cGVEZWYgIEhBTF9JMkNfR2V0TW9kZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfSTJDX0dldEVycm9yKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfQ29uc3RhbnRzIEkyQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX01hY3JvIEkyQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfSTJDX0FERFJFU1NJTkdfTU9ERShNT0RFKSAgICAoKChNT0RFKSA9PSBJMkNfQUREUkVTU0lOR01PREVfN0JJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCkpCisKKyNkZWZpbmUgSVNfSTJDX0RVQUxfQUREUkVTUyhBRERSRVNTKSAgICAoKChBRERSRVNTKSA9PSBJMkNfRFVBTEFERFJFU1NfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MpID09IEkyQ19EVUFMQUREUkVTU19FTkFCTEUpKQorCisjZGVmaW5lIElTX0kyQ19PV05fQUREUkVTUzJfTUFTSyhNQVNLKSAgKCgoTUFTSykgPT0gSTJDX09BMl9OT01BU0spICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEkyQ19PQTJfTUFTSzAzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEkyQ19PQTJfTUFTSzA2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDcpKQorCisjZGVmaW5lIElTX0kyQ19HRU5FUkFMX0NBTEwoQ0FMTCkgICAgICAgKCgoQ0FMTCkgPT0gSTJDX0dFTkVSQUxDQUxMX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDQUxMKSA9PSBJMkNfR0VORVJBTENBTExfRU5BQkxFKSkKKworI2RlZmluZSBJU19JMkNfTk9fU1RSRVRDSChTVFJFVENIKSAgICAgICgoKFNUUkVUQ0gpID09IEkyQ19OT1NUUkVUQ0hfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUUkVUQ0gpID09IEkyQ19OT1NUUkVUQ0hfRU5BQkxFKSkKKworI2RlZmluZSBJU19JMkNfTUVNQUREX1NJWkUoU0laRSkgICAgICAgICgoKFNJWkUpID09IEkyQ19NRU1BRERfU0laRV84QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gSTJDX01FTUFERF9TSVpFXzE2QklUKSkKKworI2RlZmluZSBJU19UUkFOU0ZFUl9NT0RFKE1PREUpICAgICAgICAgICgoKE1PREUpID09IEkyQ19SRUxPQURfTU9ERSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJDX0FVVE9FTkRfTU9ERSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEkyQ19TT0ZURU5EX01PREUpKQorCisjZGVmaW5lIElTX1RSQU5TRkVSX1JFUVVFU1QoUkVRVUVTVCkgICAgKCgoUkVRVUVTVCkgPT0gSTJDX0dFTkVSQVRFX1NUT1ApICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX05PX1NUQVJUU1RPUCkpCisKKyNkZWZpbmUgSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSAgKCgoUkVRVUVTVCkgPT0gSTJDX0ZJUlNUX0ZSQU1FKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfTkVYVF9GUkFNRSkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0ZJUlNUX0FORF9MQVNUX0ZSQU1FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEkyQ19MQVNUX0ZSQU1FKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfTEFTVF9GUkFNRV9OT19TVE9QKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0kyQ19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoUkVRVUVTVCkpCisKKyNkZWZpbmUgSVNfSTJDX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSAoKChSRVFVRVNUKSA9PSBJMkNfT1RIRVJfRlJBTUUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX09USEVSX0FORF9MQVNUX0ZSQU1FKSkKKworI2RlZmluZSBJMkNfUkVTRVRfQ1IyKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdCkoSTJDX0NSMl9TQUREIHwgSTJDX0NSMl9IRUFEMTBSIHwgSTJDX0NSMl9OQllURVMgfCBJMkNfQ1IyX1JFTE9BRCB8IEkyQ19DUjJfUkRfV1JOKSkpCisKKyNkZWZpbmUgSTJDX0dFVF9BRERSX01BVENIKF9fSEFORExFX18pICAgICAgICAgICAgKCh1aW50MTZfdCkoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIEkyQ19JU1JfQUREQ09ERSkgPj4gMTZVKSkKKyNkZWZpbmUgSTJDX0dFVF9ESVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgSTJDX0lTUl9ESVIpID4+IDE2VSkpCisjZGVmaW5lIEkyQ19HRVRfU1RPUF9NT0RFKF9fSEFORExFX18pICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX0FVVE9FTkQpCisjZGVmaW5lIEkyQ19HRVRfT1dOX0FERFJFU1MxKF9fSEFORExFX18pICAgICAgICAgICgodWludDE2X3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPk9BUjEgJiBJMkNfT0FSMV9PQTEpKQorI2RlZmluZSBJMkNfR0VUX09XTl9BRERSRVNTMihfX0hBTkRMRV9fKSAgICAgICAgICAoKHVpbnQxNl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5PQVIyICYgSTJDX09BUjJfT0EyKSkKKworI2RlZmluZSBJU19JMkNfT1dOX0FERFJFU1MxKEFERFJFU1MxKSAgICAgICAgICAgICAoKEFERFJFU1MxKSA8PSAweDAwMDAwM0ZGVSkKKyNkZWZpbmUgSVNfSTJDX09XTl9BRERSRVNTMihBRERSRVNTMikgICAgICAgICAgICAgKChBRERSRVNTMikgPD0gKHVpbnQxNl90KTB4MDBGRlUpCisKKyNkZWZpbmUgSTJDX01FTV9BRERfTVNCKF9fQUREUkVTU19fKSAgICAgICAgICAgICAgKCh1aW50OF90KSgodWludDE2X3QpKCgodWludDE2X3QpKChfX0FERFJFU1NfXykgJiAodWludDE2X3QpKDB4RkYwMFUpKSkgPj4gOFUpKSkKKyNkZWZpbmUgSTJDX01FTV9BRERfTFNCKF9fQUREUkVTU19fKSAgICAgICAgICAgICAgKCh1aW50OF90KSgodWludDE2X3QpKChfX0FERFJFU1NfXykgJiAodWludDE2X3QpKDB4MDBGRlUpKSkpCisKKyNkZWZpbmUgSTJDX0dFTkVSQVRFX1NUQVJUKF9fQURETU9ERV9fLF9fQUREUkVTU19fKSAoKChfX0FERE1PREVfXykgPT0gSTJDX0FERFJFU1NJTkdNT0RFXzdCSVQpID8gKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoX19BRERSRVNTX18pICYgKEkyQ19DUjJfU0FERCkpIHwgKEkyQ19DUjJfU1RBUlQpIHwgKEkyQ19DUjJfQVVUT0VORCkpICYgKH5JMkNfQ1IyX1JEX1dSTikpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKCgodWludDMyX3QpKF9fQUREUkVTU19fKSAmIChJMkNfQ1IyX1NBREQpKSB8IChJMkNfQ1IyX0FERDEwKSB8IChJMkNfQ1IyX1NUQVJUKSkgJiAofkkyQ19DUjJfUkRfV1JOKSkpCisKKyNkZWZpbmUgSTJDX0NIRUNLX0ZMQUcoX19JU1JfXywgX19GTEFHX18pICAgICAgICAgKCgoKF9fSVNSX18pICYgKChfX0ZMQUdfXykgJiBJMkNfRkxBR19NQVNLKSkgPT0gKChfX0ZMQUdfXykgJiBJMkNfRkxBR19NQVNLKSkgPyBTRVQgOiBSRVNFVCkKKyNkZWZpbmUgSTJDX0NIRUNLX0lUX1NPVVJDRShfX0NSMV9fLCBfX0lUX18pICAgICAgKCgoKF9fQ1IxX18pICYgKF9fSVRfXykpID09IChfX0lUX18pKSA/IFNFVCA6IFJFU0VUKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfRnVuY3Rpb25zIEkyQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBzdG0zMmwweHhfaGFsX2kyYy5jIGZpbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfSTJDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2kyY19leC5oIGIvSW5jL3N0bTMybDB4eF9oYWxfaTJjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlMTkyZAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX2kyY19leC5oCkBAIC0wLDAgKzEsMTc5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9pMmNfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSTJDIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0hBTF9JMkNfRVhfSAorI2RlZmluZSBTVE0zMkwweHhfSEFMX0kyQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMkNFeF9FeHBvcnRlZF9Db25zdGFudHMgSTJDIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDRXhfQW5hbG9nX0ZpbHRlciBJMkMgRXh0ZW5kZWQgQW5hbG9nIEZpbHRlcgorICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFICAgICAgICBJMkNfQ1IxX0FORk9GRgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNFeF9GYXN0TW9kZVBsdXMgSTJDIEV4dGVuZGVkIEZhc3QgTW9kZSBQbHVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0ZNUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAweEFBQUEwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZhc3QgTW9kZSBQbHVzIG5vdCBzdXBwb3J0ZWQgICAgICAgKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkNfUEI2X0ZNUCkKKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQjYgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfSTJDX1BCNl9GTVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjYgICAgICAgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQjcgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfSTJDX1BCN19GTVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjcgICAgICAgKi8KKyNlbHNlCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfUEI2ICAgICAgICAgICAgKHVpbnQzMl90KSgweDAwMDAwMDA0VSB8IEkyQ19GTVBfTk9UX1NVUFBPUlRFRCkgLyohPCBGYXN0IE1vZGUgUGx1cyBQQjYgbm90IHN1cHBvcnRlZCAgICovCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfUEI3ICAgICAgICAgICAgKHVpbnQzMl90KSgweDAwMDAwMDA4VSB8IEkyQ19GTVBfTk9UX1NVUFBPUlRFRCkgLyohPCBGYXN0IE1vZGUgUGx1cyBQQjcgbm90IHN1cHBvcnRlZCAgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkNfUEI4X0ZNUCkKKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQjggICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfSTJDX1BCOF9GTVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjggICAgICAgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQjkgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfSTJDX1BCOV9GTVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjkgICAgICAgKi8KKyNlbHNlCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfUEI4ICAgICAgICAgICAgKHVpbnQzMl90KSgweDAwMDAwMDEwVSB8IEkyQ19GTVBfTk9UX1NVUFBPUlRFRCkgLyohPCBGYXN0IE1vZGUgUGx1cyBQQjggbm90IHN1cHBvcnRlZCAgICovCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfUEI5ICAgICAgICAgICAgKHVpbnQzMl90KSgweDAwMDAwMDEyVSB8IEkyQ19GTVBfTk9UX1NVUFBPUlRFRCkgLyohPCBGYXN0IE1vZGUgUGx1cyBQQjkgbm90IHN1cHBvcnRlZCAgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkMxX0ZNUCkKKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19JMkMxICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfSTJDMV9GTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBJMkMxIHBpbnMgKi8KKyNlbHNlCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfSTJDMSAgICAgICAgICAgKHVpbnQzMl90KSgweDAwMDAwMTAwVSB8IEkyQ19GTVBfTk9UX1NVUFBPUlRFRCkgLyohPCBGYXN0IE1vZGUgUGx1cyBJMkMxIG5vdCBzdXBwb3J0ZWQgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkMyX0ZNUCkKKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19JMkMyICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfSTJDMl9GTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBJMkMyIHBpbnMgKi8KKyNlbHNlCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfSTJDMiAgICAgICAgICAgKHVpbnQzMl90KSgweDAwMDAwMjAwVSB8IEkyQ19GTVBfTk9UX1NVUFBPUlRFRCkgLyohPCBGYXN0IE1vZGUgUGx1cyBJMkMyIG5vdCBzdXBwb3J0ZWQgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkMzX0ZNUCkKKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19JMkMzICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfSTJDM19GTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBJMkMzIHBpbnMgKi8KKyNlbHNlCisjZGVmaW5lIEkyQ19GQVNUTU9ERVBMVVNfSTJDMyAgICAgICAgICAgKHVpbnQzMl90KSgweDAwMDAwNDAwVSB8IEkyQ19GTVBfTk9UX1NVUFBPUlRFRCkgLyohPCBGYXN0IE1vZGUgUGx1cyBJMkMzIG5vdCBzdXBwb3J0ZWQgICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgSTJDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIEkyQyBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ0V4X0NvbmZpZ0FuYWxvZ0ZpbHRlcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgQW5hbG9nRmlsdGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9Db25maWdEaWdpdGFsRmlsdGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBEaWdpdGFsRmlsdGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9FbmFibGVXYWtlVXAoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ0V4X0Rpc2FibGVXYWtlVXAoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworI2lmICAoZGVmaW5lZChTWVNDRkdfQ0ZHUjJfSTJDX1BCNl9GTVApIHx8IGRlZmluZWQoU1lTQ0ZHX0NGR1IyX0kyQ19QQjdfRk1QKSkgfHwgKGRlZmluZWQoU1lTQ0ZHX0NGR1IyX0kyQ19QQjhfRk1QKSB8fCBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkNfUEI5X0ZNUCkpIHx8IChkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkMxX0ZNUCkpIHx8IGRlZmluZWQoU1lTQ0ZHX0NGR1IyX0kyQzJfRk1QKSB8fCBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkMzX0ZNUCkKK3ZvaWQgSEFMX0kyQ0V4X0VuYWJsZUZhc3RNb2RlUGx1cyh1aW50MzJfdCBDb25maWdGYXN0TW9kZVBsdXMpOwordm9pZCBIQUxfSTJDRXhfRGlzYWJsZUZhc3RNb2RlUGx1cyh1aW50MzJfdCBDb25maWdGYXN0TW9kZVBsdXMpOworI2VuZGlmCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ0V4X1ByaXZhdGVfQ29uc3RhbnRzIEkyQyBFeHRlbmRlZCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ0V4X1ByaXZhdGVfTWFjcm8gSTJDIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfSTJDX0FOQUxPR19GSUxURVIoRklMVEVSKSAgICAoKChGSUxURVIpID09IEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJTFRFUikgPT0gSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19JMkNfRElHSVRBTF9GSUxURVIoRklMVEVSKSAgICgoRklMVEVSKSA8PSAweDAwMDAwMDBGVSkKKworI2RlZmluZSBJU19JMkNfRkFTVE1PREVQTFVTKF9fQ09ORklHX18pICgoKChfX0NPTkZJR19fKSAmIEkyQ19GTVBfTk9UX1NVUFBPUlRFRCkgIT0gSTJDX0ZNUF9OT1RfU1VQUE9SVEVEKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX1BCNikpICA9PSBJMkNfRkFTVE1PREVQTFVTX1BCNikgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09ORklHX18pICYgKEkyQ19GQVNUTU9ERVBMVVNfUEI3KSkgID09IEkyQ19GQVNUTU9ERVBMVVNfUEI3KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19QQjgpKSAgPT0gSTJDX0ZBU1RNT0RFUExVU19QQjgpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX1BCOSkpICA9PSBJMkNfRkFTVE1PREVQTFVTX1BCOSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09ORklHX18pICYgKEkyQ19GQVNUTU9ERVBMVVNfSTJDMSkpID09IEkyQ19GQVNUTU9ERVBMVVNfSTJDMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19JMkMyKSkgPT0gSTJDX0ZBU1RNT0RFUExVU19JMkMyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX0kyQzMpKSA9PSBJMkNfRkFTVE1PREVQTFVTX0kyQzMpKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ0V4X1ByaXZhdGVfRnVuY3Rpb25zIEkyQyBFeHRlbmRlZCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBzdG0zMmwweHhfaGFsX2kyY19leC5jIGZpbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkwweHhfSEFMX0kyQ19FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9pMnMuaCBiL0luYy9zdG0zMmwweHhfaGFsX2kycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzhkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9pMnMuaApAQCAtMCwwICsxLDUwNyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfaTJzLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEkyUyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0hBTF9JMlNfSAorI2RlZmluZSBTVE0zMkwweHhfSEFMX0kyU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoU1BJX0kyU19TVVBQT1JUKQorLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0V4cG9ydGVkX1R5cGVzIEkyUyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBJMlMgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEkyUyBvcGVyYXRpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19Nb2RlICovCisKKyAgdWludDMyX3QgU3RhbmRhcmQ7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHN0YW5kYXJkIHVzZWQgZm9yIHRoZSBJMlMgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19TdGFuZGFyZCAqLworCisgIHVpbnQzMl90IERhdGFGb3JtYXQ7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBkYXRhIGZvcm1hdCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0RhdGFfRm9ybWF0ICovCisKKyAgdWludDMyX3QgTUNMS091dHB1dDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgSTJTIE1DTEsgb3V0cHV0IGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX01DTEtfT3V0cHV0ICovCisKKyAgdWludDMyX3QgQXVkaW9GcmVxOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZyZXF1ZW5jeSBzZWxlY3RlZCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0F1ZGlvX0ZyZXF1ZW5jeSAqLworCisgIHVpbnQzMl90IENQT0w7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpZGxlIHN0YXRlIG9mIHRoZSBJMlMgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfQ2xvY2tfUG9sYXJpdHkgKi8KK30gSTJTX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfSTJTX1NUQVRFX1JFU0VUICAgICAgPSAweDAwVSwgIC8qITwgSTJTIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyU19TVEFURV9SRUFEWSAgICAgID0gMHgwMVUsICAvKiE8IEkyUyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgICAgICAgICovCisgIEhBTF9JMlNfU1RBVEVfQlVTWSAgICAgICA9IDB4MDJVLCAgLyohPCBJMlMgaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJTX1NUQVRFX0JVU1lfVFggICAgPSAweDAzVSwgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyU19TVEFURV9CVVNZX1JYICAgID0gMHgwNFUsICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICovCisgIEhBTF9JMlNfU1RBVEVfVElNRU9VVCAgICA9IDB4MDZVLCAgLyohPCBJMlMgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJTX1NUQVRFX0VSUk9SICAgICAgPSAweDA3VSAgIC8qITwgSTJTIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gSEFMX0kyU19TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBJMlMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCBfX0kyU19IYW5kbGVUeXBlRGVmCit7CisgIFNQSV9UeXBlRGVmICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgLyohPCBJMlMgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAqLworCisgIEkyU19Jbml0VHlwZURlZiAgICAgICAgICAgIEluaXQ7ICAgICAgICAgLyohPCBJMlMgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgKnBUeEJ1ZmZQdHI7ICAvKiE8IFBvaW50ZXIgdG8gSTJTIFR4IHRyYW5zZmVyIGJ1ZmZlciAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgLyohPCBJMlMgVHggdHJhbnNmZXIgc2l6ZSAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgIFR4WGZlckNvdW50OyAgLyohPCBJMlMgVHggdHJhbnNmZXIgQ291bnRlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgLyohPCBQb2ludGVyIHRvIEkyUyBSeCB0cmFuc2ZlciBidWZmZXIgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgIC8qITwgSTJTIFJ4IHRyYW5zZmVyIHNpemUgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICBSeFhmZXJDb3VudDsgIC8qITwgSTJTIFJ4IHRyYW5zZmVyIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSB2YWx1ZSBhcyB0cmFuc2ZlciBzaXplIGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zZmVyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyZW1lbnRlZCB3aGVuIGEgc2FtcGxlIGlzIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5iU2FtcGxlc1JlY2VpdmVkID0gUnhCdWZmZXJTaXplLVJ4QnVmZmVyQ291bnQpICovCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hdHg7ICAgICAgLyohPCBJMlMgVHggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgKmhkbWFyeDsgICAgICAvKiE8IEkyUyBSeCBETUEgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKworICBfX0lPIEhBTF9Mb2NrVHlwZURlZiAgICAgICBMb2NrOyAgICAgICAgIC8qITwgSTJTIGxvY2tpbmcgb2JqZWN0ICovCisKKyAgX19JTyBIQUxfSTJTX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAgICAvKiE8IEkyUyBjb21tdW5pY2F0aW9uIHN0YXRlICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAvKiE8IEkyUyBFcnJvciBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19FcnJvciAqLworCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgdm9pZCAoKiBUeENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOyAgICAgICAgICAgICAvKiE8IEkyUyBUeCBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAoKiBSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOyAgICAgICAgICAgICAvKiE8IEkyUyBSeCBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAoKiBUeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsgICAgICAgICAvKiE8IEkyUyBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayAgICAgKi8KKyAgdm9pZCAoKiBSeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsgICAgICAgICAvKiE8IEkyUyBSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayAgICAgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19JMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7ICAgICAgICAgICAgICAvKiE8IEkyUyBFcnJvciBjYWxsYmFjayAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0kyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsgICAgICAgICAgICAvKiE8IEkyUyBNc3AgSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOyAgICAgICAgICAvKiE8IEkyUyBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgKi8KKworI2VuZGlmICAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gSTJTX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqCisgICogQGJyaWVmICBIQUwgSTJTIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfSTJTX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgSTJTIFR4IENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAgICAgICovCisgIEhBTF9JMlNfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBJMlMgUnggQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICAgICAgKi8KKyAgSEFMX0kyU19UWF9IQUxGX0NPTVBMRVRFX0NCX0lEICAgICAgICA9IDB4MDNVLCAgICAvKiE8IEkyUyBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAqLworICBIQUxfSTJTX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgICAgICAgID0gMHgwNFUsICAgIC8qITwgSTJTIFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICovCisgIEhBTF9JMlNfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA2VSwgICAgLyohPCBJMlMgRXJyb3IgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyU19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDdVLCAgICAvKiE8IEkyUyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfSTJTX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwOFUgICAgIC8qITwgSTJTIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICovCisKK30gSEFMX0kyU19DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgSTJTIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBJMlNfQ2FsbGJhY2tUeXBlRGVmKShJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7IC8qITwgcG9pbnRlciB0byBhbiBJMlMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0V4cG9ydGVkX0NvbnN0YW50cyBJMlMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0Vycm9yIEkyUyBFcnJvcgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfTk9ORSAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfVElNRU9VVCAgICAgICAgICAgICgweDAwMDAwMDAxVSkgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfT1ZSICAgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgIC8qITwgT1ZSIGVycm9yICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfVURSICAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkgIC8qITwgVURSIGVycm9yICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfRE1BICAgICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfUFJFU0NBTEVSICAgICAgICAgICgweDAwMDAwMDEwVSkgIC8qITwgUHJlc2NhbGVyIENhbGN1bGF0aW9uIGVycm9yICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyNkZWZpbmUgSEFMX0kyU19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAgKDB4MDAwMDAwMjBVKSAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAgICAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX01vZGUgSTJTIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBJMlNfTU9ERV9TTEFWRV9UWCAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyU19NT0RFX1NMQVZFX1JYICAgICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9JMlNDRkdfMCkKKyNkZWZpbmUgSTJTX01PREVfTUFTVEVSX1RYICAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU0NGR18xKQorI2RlZmluZSBJMlNfTU9ERV9NQVNURVJfUlggICAgICAgICAgICAgICAoKFNQSV9JMlNDRkdSX0kyU0NGR18wIHwgU1BJX0kyU0NGR1JfSTJTQ0ZHXzEpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfU3RhbmRhcmQgSTJTIFN0YW5kYXJkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX1NUQU5EQVJEX1BISUxJUFMgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBJMlNfU1RBTkRBUkRfTVNCICAgICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfSTJTU1REXzApCisjZGVmaW5lIEkyU19TVEFOREFSRF9MU0IgICAgICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9JMlNTVERfMSkKKyNkZWZpbmUgSTJTX1NUQU5EQVJEX1BDTV9TSE9SVCAgICAgICAgICAgKChTUElfSTJTQ0ZHUl9JMlNTVERfMCB8IFNQSV9JMlNDRkdSX0kyU1NURF8xKSkKKyNkZWZpbmUgSTJTX1NUQU5EQVJEX1BDTV9MT05HICAgICAgICAgICAgKChTUElfSTJTQ0ZHUl9JMlNTVERfMCB8IFNQSV9JMlNDRkdSX0kyU1NURF8xIHwgU1BJX0kyU0NGR1JfUENNU1lOQykpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19EYXRhX0Zvcm1hdCBJMlMgRGF0YSBGb3JtYXQKKyAgKiBAeworICAqLworI2RlZmluZSBJMlNfREFUQUZPUk1BVF8xNkIgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyU19EQVRBRk9STUFUXzE2Ql9FWFRFTkRFRCAgICAgIChTUElfSTJTQ0ZHUl9DSExFTikKKyNkZWZpbmUgSTJTX0RBVEFGT1JNQVRfMjRCICAgICAgICAgICAgICAgKChTUElfSTJTQ0ZHUl9DSExFTiB8IFNQSV9JMlNDRkdSX0RBVExFTl8wKSkKKyNkZWZpbmUgSTJTX0RBVEFGT1JNQVRfMzJCICAgICAgICAgICAgICAgKChTUElfSTJTQ0ZHUl9DSExFTiB8IFNQSV9JMlNDRkdSX0RBVExFTl8xKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX01DTEtfT3V0cHV0IEkyUyBNQ0xLIE91dHB1dAorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19NQ0xLT1VUUFVUX0VOQUJMRSAgICAgICAgICAgIChTUElfSTJTUFJfTUNLT0UpCisjZGVmaW5lIEkyU19NQ0xLT1VUUFVUX0RJU0FCTEUgICAgICAgICAgICgweDAwMDAwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0F1ZGlvX0ZyZXF1ZW5jeSBJMlMgQXVkaW8gRnJlcXVlbmN5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX0FVRElPRlJFUV8xOTJLICAgICAgICAgICAgICAgKDE5MjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfOTZLICAgICAgICAgICAgICAgICg5NjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfNDhLICAgICAgICAgICAgICAgICg0ODAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfNDRLICAgICAgICAgICAgICAgICg0NDEwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMzJLICAgICAgICAgICAgICAgICgzMjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMjJLICAgICAgICAgICAgICAgICgyMjA1MFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMTZLICAgICAgICAgICAgICAgICgxNjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMTFLICAgICAgICAgICAgICAgICgxMTAyNVUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfOEsgICAgICAgICAgICAgICAgICg4MDAwVSkKKyNkZWZpbmUgSTJTX0FVRElPRlJFUV9ERUZBVUxUICAgICAgICAgICAgKDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfQ2xvY2tfUG9sYXJpdHkgSTJTIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX0NQT0xfTE9XICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBJMlNfQ1BPTF9ISUdIICAgICAgICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfQ0tQT0wpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19JbnRlcnJ1cHRzX0RlZmluaXRpb24gSTJTIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjJfVFhFSUUKKyNkZWZpbmUgSTJTX0lUX1JYTkUgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9SWE5FSUUKKyNkZWZpbmUgSTJTX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9FUlJJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfRmxhZ3NfRGVmaW5pdGlvbiBJMlMgRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9UWEUKKyNkZWZpbmUgSTJTX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICAgU1BJX1NSX1JYTkUKKworI2RlZmluZSBJMlNfRkxBR19VRFIgICAgICAgICAgICAgICAgICAgICBTUElfU1JfVURSCisjZGVmaW5lIEkyU19GTEFHX09WUiAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9PVlIKKyNkZWZpbmUgSTJTX0ZMQUdfRlJFICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX0ZSRQorCisjZGVmaW5lIEkyU19GTEFHX0NIU0lERSAgICAgICAgICAgICAgICAgIFNQSV9TUl9DSFNJREUKKyNkZWZpbmUgSTJTX0ZMQUdfQlNZICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX0JTWQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0V4cG9ydGVkX21hY3JvcyBJMlMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgSTJTIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyNkZWZpbmUgX19IQUxfSTJTX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVTRVQ7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0kyU19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFU0VUKQorI2VuZGlmCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBwZXJpcGhlcmFsIChpbiBJMlMgbW9kZSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNFKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBwZXJpcGhlcmFsIChpbiBJMlMgbW9kZSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0RJU0FCTEUoX19IQU5ETEVfXykgKENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNFKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgSTJTIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZSBvciBkaXNhYmxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1JYTkU6IFJYIGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0kyU19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLChfX0lOVEVSUlVQVF9fKSkpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBJMlMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMlMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlIG9yIGRpc2FibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEkyU19JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIsKF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgSTJTIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMlMgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEkyUyB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgSTJTIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSTJTIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1JYTkU6IFJYIGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0kyU19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyUyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX1JYTkU6IFJlY2VpdmUgYnVmZmVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX1RYRTogVHJhbnNtaXQgYnVmZmVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0ZMQUdfVURSOiBVbmRlcnJ1biBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX09WUjogT3ZlcnJ1biBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX0ZSRTogRnJhbWUgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBJMlNfRkxBR19DSFNJREU6IENoYW5uZWwgU2lkZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX0JTWTogQnVzeSBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmIENsZWFycyB0aGUgSTJTIE9WUiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0NMRUFSX09WUkZMQUcoX19IQU5ETEVfXykgZG97IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWdfb3ZyID0gMHgwMFU7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnX292ciA9IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRSOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZ19vdnIgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnX292cik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisvKiogQGJyaWVmIENsZWFycyB0aGUgSTJTIFVEUiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0NMRUFSX1VEUkZMQUcoX19IQU5ETEVfXykgZG97XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZ191ZHIgPSAweDAwVTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZ191ZHIgPSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZ191ZHIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0luaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19EZUluaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX01zcEluaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX01zcERlSW5pdChJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfUmVnaXN0ZXJDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgSEFMX0kyU19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwSTJTX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19VblJlZ2lzdGVyQ2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIEhBTF9JMlNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfVHJhbnNtaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmUoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfVHJhbnNtaXRfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmVfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7Cit2b2lkIEhBTF9JMlNfSVJRSGFuZGxlcihJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfVHJhbnNtaXRfRE1BKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19SZWNlaXZlX0RNQShJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19ETUFQYXVzZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVJlc3VtZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVN0b3AoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworCisvKiBDYWxsYmFja3MgdXNlZCBpbiBub24gYmxvY2tpbmcgbW9kZXMgKEludGVycnVwdCBhbmQgRE1BKSAqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7Cit2b2lkIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX1J4SGFsZkNwbHRDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7Cit2b2lkIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBhbmQgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfSTJTX1N0YXRlVHlwZURlZiBIQUxfSTJTX0dldFN0YXRlKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK3VpbnQzMl90IEhBTF9JMlNfR2V0RXJyb3IoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMlNfUHJpdmF0ZV9Db25zdGFudHMgSTJTIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX1ByaXZhdGVfTWFjcm9zIEkyUyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX0kyU19NT0RFKE1PREUpICgoKE1PREUpID09IEkyU19NT0RFX1NMQVZFX1RYKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBJMlNfTU9ERV9TTEFWRV9SWCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJTX01PREVfTUFTVEVSX1RYKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEkyU19NT0RFX01BU1RFUl9SWCkpCisKKyNkZWZpbmUgSVNfSTJTX1NUQU5EQVJEKFNUQU5EQVJEKSAoKChTVEFOREFSRCkgPT0gSTJTX1NUQU5EQVJEX1BISUxJUFMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQU5EQVJEKSA9PSBJMlNfU1RBTkRBUkRfTVNCKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBTkRBUkQpID09IEkyU19TVEFOREFSRF9MU0IpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFOREFSRCkgPT0gSTJTX1NUQU5EQVJEX1BDTV9TSE9SVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQU5EQVJEKSA9PSBJMlNfU1RBTkRBUkRfUENNX0xPTkcpKQorCisjZGVmaW5lIElTX0kyU19EQVRBX0ZPUk1BVChGT1JNQVQpICgoKEZPUk1BVCkgPT0gSTJTX0RBVEFGT1JNQVRfMTZCKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZPUk1BVCkgPT0gSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZPUk1BVCkgPT0gSTJTX0RBVEFGT1JNQVRfMjRCKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZPUk1BVCkgPT0gSTJTX0RBVEFGT1JNQVRfMzJCKSkKKworI2RlZmluZSBJU19JMlNfTUNMS19PVVRQVVQoT1VUUFVUKSAoKChPVVRQVVQpID09IEkyU19NQ0xLT1VUUFVUX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IEkyU19NQ0xLT1VUUFVUX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0kyU19BVURJT19GUkVRKEZSRVEpICgoKChGUkVRKSA+PSBJMlNfQVVESU9GUkVRXzhLKSAgICAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA8PSBJMlNfQVVESU9GUkVRXzE5MkspKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBJMlNfQVVESU9GUkVRX0RFRkFVTFQpKQorCisjZGVmaW5lIElTX0kyU19DUE9MKENQT0wpICgoKENQT0wpID09IEkyU19DUE9MX0xPVykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDUE9MKSA9PSBJMlNfQ1BPTF9ISUdIKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTUElfSTJTX1NVUFBPUlQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfSTJTX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2lyZGEuaCBiL0luYy9zdG0zMmwweHhfaGFsX2lyZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjU1NWExCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfaXJkYS5oCkBAIC0wLDAgKzEsODQxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9pcmRhLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIElSREEgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkwweHhfSEFMX0lSREFfSAorI2RlZmluZSBTVE0zMkwweHhfSEFMX0lSREFfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg4KQorLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVJEQQorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfVHlwZXMgSVJEQSBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBJUkRBIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEJhdWRSYXRlOyAgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBtZW1iZXIgY29uZmlndXJlcyB0aGUgSVJEQSBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmF1ZCByYXRlIHJlZ2lzdGVyIGlzIGNvbXB1dGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXIgPSAoKHVzYXJ0X2tlcl9jbGspIC8gKChoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHVzYXJ0X2tlcl9jbGsgaXMgdGhlIElSREEgaW5wdXQgY2xvY2sgKi8KKworICB1aW50MzJfdCBXb3JkTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSVJEQUV4X1dvcmRfTGVuZ3RoICovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSVJEQV9QYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBXaGVuIHBhcml0eSBpcyBlbmFibGVkLCB0aGUgY29tcHV0ZWQgcGFyaXR5IGlzIGluc2VydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIE1TQiBwb3NpdGlvbiBvZiB0aGUgdHJhbnNtaXR0ZWQgZGF0YSAoOXRoIGJpdCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA4IGRhdGEgYml0cykuICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJUkRBX1RyYW5zZmVyX01vZGUgKi8KKworICB1aW50OF90ICBQcmVzY2FsZXI7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIHZhbHVlIGZvciBkaXZpZGluZyB0aGUgVUFSVC9VU0FSVCBzb3VyY2UgY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhY2hpZXZlIGxvdy1wb3dlciBmcmVxdWVuY3kuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgUHJlc2NhbGVyIHZhbHVlIDAgaXMgZm9yYmlkZGVuICovCisKKyAgdWludDE2X3QgUG93ZXJNb2RlOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIElSREEgcG93ZXIgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIElSREFfTG93X1Bvd2VyICovCisKK30gSVJEQV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIEhBTCBJUkRBIFN0YXRlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgSEFMIElSREEgU3RhdGUgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGRpZmZlcmVudCBzdWJzdGF0ZXM6IGdTdGF0ZSBhbmQgUnhTdGF0ZSAoc2VlIEByZWYgSVJEQV9TdGF0ZV9EZWZpbml0aW9uKS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgSVJEQSBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudAorICAqICAgICAgICAgIGFuZCBhbHNvIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBnU3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgRXJyb3IgaW5mb3JtYXRpb24KKyAgKiAgICAgICAgICAgICAwMCA6IE5vIEVycm9yCisgICogICAgICAgICAgICAgMDEgOiAoTm90IFVzZWQpCisgICogICAgICAgICAgICAgMTAgOiBUaW1lb3V0CisgICogICAgICAgICAgICAgMTEgOiBFcnJvcgorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZC4gSEFMIElSREEgSW5pdCBmdW5jdGlvbiBhbHJlYWR5IGNhbGxlZCkKKyAgKiAgICAgICAgICBiNC1iMyAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGIyICAgICBJbnRyaW5zaWMgcHJvY2VzcyBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFBlcmlwaGVyYWwgYnVzeSB3aXRoIHNvbWUgY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBvcGVyYXRpb25zKQorICAqICAgICAgICAgIGIxICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAKKyAgKiAgICAgICAgICBiMCAgICAgVHggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAtIFJ4U3RhdGUgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAqICAgICAgICAgIFJ4U3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICBiNC1iMiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgeHh4IDogU2hvdWxkIGJlIHNldCB0byAwMDAKKyAgKiAgICAgICAgICBiMSAgICAgUnggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgIGIwICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAuCisgICovCit0eXBlZGVmIHVpbnQzMl90IEhBTF9JUkRBX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIElSREEgY2xvY2sgc291cmNlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMSAgICAgID0gMHgwMFUsICAgIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMiAgICAgID0gMHgwMVUsICAgIC8qITwgUENMSzIgY2xvY2sgc291cmNlICAgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9IU0kgICAgICAgID0gMHgwMlUsICAgIC8qITwgSFNJIGNsb2NrIHNvdXJjZSAgICAgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9TWVNDTEsgICAgID0gMHgwNFUsICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9MU0UgICAgICAgID0gMHgxMFUsICAgIC8qITwgTFNFIGNsb2NrIHNvdXJjZSAgICAgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQgID0gMHgyMFUgICAgIC8qITwgVW5kZWZpbmVkIGNsb2NrIHNvdXJjZSAgICAgKi8KK30gSVJEQV9DbG9ja1NvdXJjZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSVJEQSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmICAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit7CisgIFVTQVJUX1R5cGVEZWYgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAvKiE8IFVTQVJUIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgKi8KKworICBJUkRBX0luaXRUeXBlRGVmICAgICAgICAgSW5pdDsgICAgICAgICAgICAgLyohPCBJUkRBIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgICAgIC8qITwgUG9pbnRlciB0byBJUkRBIFR4IHRyYW5zZmVyIEJ1ZmZlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgICAvKiE8IElSREEgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgVHhYZmVyQ291bnQ7ICAgICAgLyohPCBJUkRBIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgICAgIC8qITwgUG9pbnRlciB0byBJUkRBIFJ4IHRyYW5zZmVyIEJ1ZmZlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgICAvKiE8IElSREEgUnggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgUnhYZmVyQ291bnQ7ICAgICAgLyohPCBJUkRBIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIE1hc2s7ICAgICAgICAgICAgIC8qITwgVVNBUlQgUlggUkRSIHJlZ2lzdGVyIG1hc2sgICAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAqaGRtYXR4OyAgICAgICAgICAvKiE8IElSREEgVHggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgKmhkbWFyeDsgICAgICAgICAgLyohPCBJUkRBIFJ4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgIExvY2s7ICAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX0lSREFfU3RhdGVUeXBlRGVmICAgIGdTdGF0ZTsgICAgICAvKiE8IElSREEgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBnbG9iYWwgSGFuZGxlIG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9JUkRBX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gSEFMX0lSREFfU3RhdGVUeXBlRGVmICAgIFJ4U3RhdGU7ICAgICAvKiE8IElSREEgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9JUkRBX1N0YXRlVHlwZURlZiAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAvKiE8IElSREEgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogVHhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgICAgICAgIC8qITwgSVJEQSBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICAgICAgICAqLworCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgICAgIC8qITwgSVJEQSBUeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogUnhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgICAgICAgIC8qITwgSVJEQSBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICAgICAgICAqLworCisgIHZvaWQgKCogUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgICAgIC8qITwgSVJEQSBSeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7ICAgICAgICAgICAgIC8qITwgSVJEQSBFcnJvciBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogQWJvcnRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgIC8qITwgSVJEQSBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAqLworCisgIHZvaWQgKCogQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjaykoc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7IC8qITwgSVJEQSBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworCisgIHZvaWQgKCogQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgIC8qITwgSVJEQSBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICAqLworCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgICAgLyohPCBJUkRBIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7ICAgICAgICAgLyohPCBJUkRBIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisjZW5kaWYgIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworfSBJUkRBX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgSVJEQSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0lSREFfVFhfSEFMRkNPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDAwVSwgICAgLyohPCBJUkRBIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9JUkRBX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgSVJEQSBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfSVJEQV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IElSREEgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgKi8KKyAgSEFMX0lSREFfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBJUkRBIFJ4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9JUkRBX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwNFUsICAgIC8qITwgSVJEQSBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSVJEQV9BQk9SVF9DT01QTEVURV9DQl9JRCAgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IElSREEgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgKi8KKyAgSEFMX0lSREFfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgPSAweDA2VSwgICAgLyohPCBJUkRBIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElEICovCisgIEhBTF9JUkRBX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgID0gMHgwN1UsICAgIC8qITwgSVJEQSBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElEICAqLworCisgIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwOFUsICAgIC8qITwgSVJEQSBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAqLworICBIQUxfSVJEQV9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MDlVICAgICAvKiE8IElSREEgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKworfSBIQUxfSVJEQV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgSVJEQSBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwSVJEQV9DYWxsYmFja1R5cGVEZWYpKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgLyohPCBwb2ludGVyIHRvIGFuIElSREEgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVJEQV9FeHBvcnRlZF9Db25zdGFudHMgSVJEQSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElSREFfU3RhdGVfRGVmaW5pdGlvbiBJUkRBIFN0YXRlIENvZGUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX1JFU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX1JFQURZICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBVICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyNkZWZpbmUgSEFMX0lSREFfU1RBVEVfQlVTWSAgICAgICAgICAgICAgICAgMHgwMDAwMDAyNFUgICAvKiE8IEFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX0lSREFfU1RBVEVfQlVTWV9UWCAgICAgICAgICAgICAgMHgwMDAwMDAyMVUgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX0lSREFfU1RBVEVfQlVTWV9SWCAgICAgICAgICAgICAgMHgwMDAwMDAyMlUgICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgUnhTdGF0ZSBvbmx5ICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX0JVU1lfVFhfUlggICAgICAgICAgIDB4MDAwMDAwMjNVICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHRvIGJlIHVzZWQgZm9yIG5laXRoZXIgZ1N0YXRlIG5vciBSeFN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgcmVzdWx0IG9mIGNvbWJpbmF0aW9uIChPcikgYmV0d2VlbiBnU3RhdGUgYW5kIFJ4U3RhdGUgdmFsdWVzICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX1RJTUVPVVQgICAgICAgICAgICAgIDB4MDAwMDAwQTBVICAgLyohPCBUaW1lb3V0IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfSVJEQV9TVEFURV9FUlJPUiAgICAgICAgICAgICAgICAweDAwMDAwMEUwVSAgIC8qITwgRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfRXJyb3JfRGVmaW5pdGlvbiBJUkRBIEVycm9yIENvZGUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX05PTkUgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfUEUgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgICAgICAgICAgLyohPCBQYXJpdHkgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9ORSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAgICAgICAgICAvKiE8IE5vaXNlIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX0ZFICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpICAgICAgICAgIC8qITwgZnJhbWUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfT1JFICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgICAgICAgICAgLyohPCBPdmVycnVuIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9ETUEgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAgICAgICAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX0JVU1kgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpICAgICAgICAgIC8qITwgQnVzeSBFcnJvciAgICAgICAgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAgICAgICAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICovCisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX1Bhcml0eSBJUkRBIFBhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfUEFSSVRZX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gcGFyaXR5ICAgKi8KKyNkZWZpbmUgSVJEQV9QQVJJVFlfRVZFTiAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BDRSAgICAgICAgICAgICAgICAgICAgLyohPCBFdmVuIHBhcml0eSAqLworI2RlZmluZSBJUkRBX1BBUklUWV9PREQgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAvKiE8IE9kZCBwYXJpdHkgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfVHJhbnNmZXJfTW9kZSBJUkRBIFRyYW5zZmVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX01PREVfUlggICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUkUgICAgICAgICAgICAgICAgICAgLyohPCBSWCBtb2RlICAgICAgICAqLworI2RlZmluZSBJUkRBX01PREVfVFggICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgICAgICAgICAgICAgICAgICAgLyohPCBUWCBtb2RlICAgICAgICAqLworI2RlZmluZSBJUkRBX01PREVfVFhfUlggICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1RFIHxVU0FSVF9DUjFfUkUpICAgLyohPCBSWCBhbmQgVFggbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0xvd19Qb3dlciBJUkRBIExvdyBQb3dlcgorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfUE9XRVJNT0RFX05PUk1BTCAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgIC8qITwgSVJEQSBub3JtYWwgcG93ZXIgbW9kZSAqLworI2RlZmluZSBJUkRBX1BPV0VSTU9ERV9MT1dQT1dFUiAgICAgICAgICAgICBVU0FSVF9DUjNfSVJMUCAgICAvKiE8IElSREEgbG93IHBvd2VyIG1vZGUgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9TdGF0ZSBJUkRBIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9TVEFURV9ESVNBQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgSVJEQSBkaXNhYmxlZCAgKi8KKyNkZWZpbmUgSVJEQV9TVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1VFICAgIC8qITwgSVJEQSBlbmFibGVkICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9Nb2RlIElSREEgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgLyohPCBBc3NvY2lhdGVkIFVBUlQgZGlzYWJsZWQgaW4gSVJEQSBtb2RlICovCisjZGVmaW5lIElSREFfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19JUkVOICAgLyohPCBBc3NvY2lhdGVkIFVBUlQgZW5hYmxlZCBpbiBJUkRBIG1vZGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfT25lX0JpdCBJUkRBIE9uZSBCaXQgU2FtcGxpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX09ORV9CSVRfU0FNUExFX0RJU0FCTEUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IE9uZS1iaXQgc2FtcGxpbmcgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEUgICAgICAgICAgVVNBUlRfQ1IzX09ORUJJVCAgLyohPCBPbmUtYml0IHNhbXBsaW5nIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfRE1BX1R4IElSREEgRE1BIFR4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9ETUFfVFhfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBJUkRBIERNQSBUWCBkaXNhYmxlZCAqLworI2RlZmluZSBJUkRBX0RNQV9UWF9FTkFCTEUgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfRE1BVCAgICAvKiE8IElSREEgRE1BIFRYIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfRE1BX1J4IElSREEgRE1BIFJ4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9ETUFfUlhfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBJUkRBIERNQSBSWCBkaXNhYmxlZCAqLworI2RlZmluZSBJUkRBX0RNQV9SWF9FTkFCTEUgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfRE1BUiAgICAvKiE8IElSREEgRE1BIFJYIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfUmVxdWVzdF9QYXJhbWV0ZXJzIElSREEgUmVxdWVzdCBQYXJhbWV0ZXJzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9BVVRPQkFVRF9SRVFVRVNUICAgICAgICAgICAgVVNBUlRfUlFSX0FCUlJRICAgICAgICAvKiE8IEF1dG8tQmF1ZCBSYXRlIFJlcXVlc3QgICAgICAqLworI2RlZmluZSBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgICBVU0FSVF9SUVJfUlhGUlEgICAgICAgIC8qITwgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QgICovCisjZGVmaW5lIElSREFfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICAgIFVTQVJUX1JRUl9UWEZSUSAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIGZsdXNoIFJlcXVlc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9GbGFncyBJUkRBIEZsYWdzCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFgKKyAgKiAgICAgICAgICAgLSAweFhYWFggIDogRmxhZyBtYXNrIGluIHRoZSBJU1IgcmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0ZMQUdfUkVBQ0sgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUkVBQ0sgICAgICAgICAvKiE8IElSREEgcmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19URUFDSyAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9URUFDSyAgICAgICAgIC8qITwgSVJEQSB0cmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0JVU1kgICAgICAgICAgLyohPCBJUkRBIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0ZMQUdfQUJSRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQUJSRiAgICAgICAgICAvKiE8IElSREEgYXV0byBCYXVkIHJhdGUgZmxhZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19BQlJFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9BQlJFICAgICAgICAgIC8qITwgSVJEQSBhdXRvIEJhdWQgcmF0ZSBlcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRSAgICAgICAgICAgLyohPCBJUkRBIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBJUkRBX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEMgICAgICAgICAgICAvKiE8IElSREEgdHJhbnNtaXNzaW9uIGNvbXBsZXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FICAgICAgICAgIC8qITwgSVJEQSByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX09SRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX09SRSAgICAgICAgICAgLyohPCBJUkRBIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0ZMQUdfTkUgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTkUgICAgICAgICAgICAvKiE8IElSREEgbm9pc2UgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19GRSAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgICAgIC8qITwgSVJEQSBmcmFtZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX1BFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1BFICAgICAgICAgICAgLyohPCBJUkRBIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0ludGVycnVwdF9kZWZpbml0aW9uIElSREEgSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwWlpaWjBYWFlZWVlZYgorICAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig0Yml0cykKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDAwMDAwMFhYWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IHNvdXJjZSBwb3NpdGlvbiBpbiB0aGUgWFggcmVnaXN0ZXIgKDViaXRzKQorICAqICAgICAgICAgICAtIFhYICA6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKDJiaXRzKQorICAqICAgICAgICAgICAgICAgICAtIDAxOiBDUjEgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMDogQ1IyIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTE6IENSMyByZWdpc3RlcgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwMFpaWlowMDAwMDAwMGIKKyAgKiAgICAgICAgICAgLSBaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig0Yml0cykKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0lUX1BFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjhVICAgICAvKiE8IElSREEgUGFyaXR5IGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzI3VSAgICAgLyohPCBJUkRBIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIElSREFfSVRfVEMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNlUgICAgIC8qITwgSVJEQSBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0aW9uICAgICAgICAqLworI2RlZmluZSBJUkRBX0lUX1JYTkUgICAgICAgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAvKiE8IElSREEgUmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgSVJEQV9JVF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI0VSAgICAgLyohPCBJUkRBIElkbGUgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgSVJEQV9JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwVSAgICAgLyohPCBJUkRBIEVycm9yIGludGVycnVwdGlvbiAgICAgICAgKi8KKworI2RlZmluZSBJUkRBX0lUX09SRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMDBVICAgICAvKiE8IElSREEgT3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgSVJEQV9JVF9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwVSAgICAgLyohPCBJUkRBIE5vaXNlIGVycm9yIGludGVycnVwdGlvbiAgICovCisjZGVmaW5lIElSREFfSVRfRkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMFUgICAgIC8qITwgSVJEQSBGcmFtZSBlcnJvciBpbnRlcnJ1cHRpb24gICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0lUX0NMRUFSX0ZsYWdzIElSREEgSW50ZXJydXB0aW9uIENsZWFyIEZsYWdzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9DTEVBUl9QRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgLyohPCBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0NMRUFSX0ZFRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0ZFQ0YgICAgICAgICAgICAvKiE8IEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICovCisjZGVmaW5lIElSREFfQ0xFQVJfTkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkNGICAgICAgICAgICAgIC8qITwgTm9pc2UgRXJyb3IgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgKi8KKyNkZWZpbmUgSVJEQV9DTEVBUl9PUkVGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgLyohPCBPdmVyUnVuIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAqLworI2RlZmluZSBJUkRBX0NMRUFSX0lETEVGICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0lETEVDRiAgICAgICAgICAvKiE8IElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnICAgICovCisjZGVmaW5lIElSREFfQ0xFQVJfVENGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9JbnRlcnJ1cHRpb25fTWFzayBJUkRBIGludGVycnVwdGlvbnMgZmxhZ3MgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIElSREFfSVRfTUFTSyAgMHgwMDFGVSAgLyohPCBJUkRBIEludGVycnVwdGlvbnMgZmxhZ3MgbWFzayAgKi8KKyNkZWZpbmUgSVJEQV9DUl9NQVNLICAweDAwRTBVICAvKiE8IElSREEgY29udHJvbCByZWdpc3RlciBtYXNrICAgICAqLworI2RlZmluZSBJUkRBX0NSX1BPUyAgIDVVICAgICAgIC8qITwgSVJEQSBjb250cm9sIHJlZ2lzdGVyIHBvc2l0aW9uICovCisjZGVmaW5lIElSREFfSVNSX01BU0sgMHgxRjAwVSAgLyohPCBJUkRBIElTUiByZWdpc3RlciBtYXNrICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9JU1JfUE9TICA4VSAgICAgICAvKiE8IElSREEgSVNSIHJlZ2lzdGVyIHBvc2l0aW9uICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfTWFjcm9zIElSREEgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgSVJEQSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIElSREEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQorI2RlZmluZSBfX0hBTF9JUkRBX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVTRVQ7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFU0VUOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfSVJEQV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNlbmRpZiAvKlVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgICovCisKKy8qKiBAYnJpZWYgIEZsdXNoIHRoZSBJUkRBIERSIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0ZMVVNIX0RSUkVHSVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIElSREFfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgSVJEQV9UWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgICAgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgSVJEQSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX1BFRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfRkVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9ORUYKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX09SRUYKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX1RDRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfSURMRUYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIElSREEgUEUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX1BFRkxBRyhfX0hBTkRMRV9fKSAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBJUkRBX0NMRUFSX1BFRikKKworCisvKiogQGJyaWVmICBDbGVhciB0aGUgSVJEQSBGRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfRkVGTEFHKF9fSEFORExFX18pICAgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIElSREFfQ0xFQVJfRkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgSVJEQSBORSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfTkVGTEFHKF9fSEFORExFX18pICAgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIElSREFfQ0xFQVJfTkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgSVJEQSBPUkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX09SRUZMQUcoX19IQU5ETEVfXykgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgSVJEQV9DTEVBUl9PUkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgSVJEQSBJRExFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9DTEVBUl9JRExFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIElSREFfQ0xFQVJfSURMRUYpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBJUkRBIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfUkVBQ0sgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19URUFDSyBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19CVVNZICBCdXN5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfQUJSRiAgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfQUJSRSAgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX1RDICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX1JYTkUgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19PUkUgICBPdmVyUnVuIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfTkUgICAgTm9pc2UgRXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19GRSAgICBGcmFtaW5nIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfUEUgICAgUGFyaXR5IEVycm9yIGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgSVJEQSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSVJEQSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfVFhFICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfVEMgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9SWE5FIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9JRExFIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9QRSAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0VSUiAgRXJyb3IgaW50ZXJydXB0KEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMVUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0NSX01BU0spID4+IElSREFfQ1JfUE9TKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgSVJEQV9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgSVJEQV9JVF9NQVNLKSkpKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSVJEQSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSVJEQSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RYRSAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RDICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUlhORSBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfSURMRSBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUEUgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9FUlIgIEVycm9yIGludGVycnVwdChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKCgoKChfX0lOVEVSUlVQVF9fKSAmIElSREFfQ1JfTUFTSykgPj4gSVJEQV9DUl9QT1MpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0NSX01BU0spID4+IElSREFfQ1JfUE9TKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJj0gfiAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVRfTUFTSykpKSkKKworCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSVJEQSBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBJUkRBIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RYRSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfVEMgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1JYTkUgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX09SRSBPdmVyUnVuIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfTkUgTm9pc2UgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9GRSBGcmFtaW5nIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUEUgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgweDAxVSA8PCAoKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVNSX01BU0spPj4gSVJEQV9JU1JfUE9TKSkpICE9IDBVKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSVJEQSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIElSREEgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfVFhFIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UQyAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUlhORSBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfSURMRSBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfRVJSIEZyYW1pbmcsIG92ZXJydW4gb3Igbm9pc2UgZXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9QRSBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKCgoKCgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0NSX01BU0spID4+IElSREFfQ1JfUE9TKSA9PSAweDAxVSk/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0NSX01BU0spID4+IElSREFfQ1JfUE9TKSA9PSAweDAyVSk/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMykpICYgKCh1aW50MzJfdCkweDAxVSA8PCAoKCh1aW50MTZfdCkoX19JTlRFUlJVUFRfXykpICYgSVJEQV9JVF9NQVNLKSkpICE9IDBVKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIElSREEgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSVRfQ0xFQVJfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBjbGVhciByZWdpc3RlciBmbGFnIHRoYXQgbmVlZHMgdG8gYmUgc2V0CisgICogICAgICAgICAgICAgICAgICAgICAgIHRvIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9QRUYgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX0ZFRiBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX05FRiBOb2lzZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9PUkVGIE92ZXJSdW4gRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfVENGIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisKKy8qKiBAYnJpZWYgIFNldCBhIHNwZWNpZmljIElSREEgcmVxdWVzdCBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19SRVFfXyBzcGVjaWZpZXMgdGhlIHJlcXVlc3QgZmxhZyB0byBzZXQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQVVUT0JBVURfUkVRVUVTVCBBdXRvLUJhdWQgUmF0ZSBSZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9SWERBVEFfRkxVU0hfUkVRVUVTVCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfU0VORF9SRVEoX19IQU5ETEVfXywgX19SRVFfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiB8PSAodWludDE2X3QpKF9fUkVRX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIElSREEgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX09ORV9CSVRfU0FNUExFX0VOQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzfD0gVVNBUlRfQ1IzX09ORUJJVCkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgSVJEQSBvbmUgYml0IHNhbXBsZSBtZXRob2QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClVU0FSVF9DUjNfT05FQklUKSkKKworLyoqIEBicmllZiAgRW5hYmxlIFVBUlQvVVNBUlQgYXNzb2NpYXRlZCB0byBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAgVVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIFVBUlQvVVNBUlQgYXNzb2NpYXRlZCB0byBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSAgflVTQVJUX0NSMV9VRSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIElSREFfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBFbnN1cmUgdGhhdCBJUkRBIEJhdWQgcmF0ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIG1heGltdW0gdmFsdWUuCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEJhdWRyYXRlIHNldCBieSB0aGUgdXNlci4KKyAgKiBAcmV0dmFsIFRydWUgb3IgRmFsc2UKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9CQVVEUkFURShfX0JBVURSQVRFX18pICgoX19CQVVEUkFURV9fKSA8IDExNTIwMVUpCisKKy8qKiBAYnJpZWYgIEVuc3VyZSB0aGF0IElSREEgcHJlc2NhbGVyIHZhbHVlIGlzIHN0cmljdGx5IGxhcmdlciB0aGFuIDAuCisgICogQHBhcmFtICBfX1BSRVNDQUxFUl9fIHNwZWNpZmllcyB0aGUgSVJEQSBwcmVzY2FsZXIgdmFsdWUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEByZXR2YWwgVHJ1ZSBvciBGYWxzZQorICAqLworI2RlZmluZSBJU19JUkRBX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAoKF9fUFJFU0NBTEVSX18pID4gMFUpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBmcmFtZSBwYXJpdHkgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUEFSSVRZX18gSVJEQSBmcmFtZSBwYXJpdHkuCisgICogQHJldHZhbCBTRVQgKF9fUEFSSVRZX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUklUWV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfUEFSSVRZKF9fUEFSSVRZX18pICgoKF9fUEFSSVRZX18pID09IElSREFfUEFSSVRZX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gSVJEQV9QQVJJVFlfRVZFTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBJUkRBX1BBUklUWV9PREQpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgY29tbXVuaWNhdGlvbiBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBJUkRBIGNvbW11bmljYXRpb24gbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19JUkRBX1RYX1JYX01PREUoX19NT0RFX18pICgoKChfX01PREVfXykgJiAofigodWludDMyX3QpKElSREFfTU9ERV9UWF9SWCkpKSkgPT0gMHgwMFUpICYmICgoX19NT0RFX18pICE9IDB4MDBVKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIHBvd2VyIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIElSREEgcG93ZXIgbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19JUkRBX1BPV0VSTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IElSREFfUE9XRVJNT0RFX0xPV1BPV0VSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gSVJEQV9QT1dFUk1PREVfTk9STUFMKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NUQVRFX18gSVJEQSBzdGF0ZSBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX1NUQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUQVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9TVEFURShfX1NUQVRFX18pICgoKF9fU1RBVEVfXykgPT0gSVJEQV9TVEFURV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IElSREFfU1RBVEVfRU5BQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIGFzc29jaWF0ZWQgVUFSVC9VU0FSVCBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBJUkRBIGFzc29jaWF0ZWQgVUFSVC9VU0FSVCBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfTU9ERShfX01PREVfXykgICgoKF9fTU9ERV9fKSA9PSBJUkRBX01PREVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gSVJEQV9NT0RFX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBzYW1wbGluZyByYXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX09ORUJJVF9fIElSREEgc2FtcGxpbmcgcmF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19PTkVCSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fT05FQklUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9PTkVfQklUX1NBTVBMRShfX09ORUJJVF9fKSAgICAgICgoKF9fT05FQklUX18pID09IElSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PTkVCSVRfXykgPT0gSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEUpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgRE1BIFRYIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fRE1BVFhfXyBJUkRBIERNQSBUWCBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX0RNQVRYX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQVRYX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9ETUFfVFgoX19ETUFUWF9fKSAgICAgKCgoX19ETUFUWF9fKSA9PSBJUkRBX0RNQV9UWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRE1BVFhfXykgPT0gSVJEQV9ETUFfVFhfRU5BQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIERNQSBSWCBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQVJYX18gSVJEQSBETUEgUlggbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19ETUFSWF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19ETUFSWF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfRE1BX1JYKF9fRE1BUlhfXykgKCgoX19ETUFSWF9fKSA9PSBJUkRBX0RNQV9SWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ETUFSWF9fKSA9PSBJUkRBX0RNQV9SWF9FTkFCTEUpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgcmVxdWVzdCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJBTV9fIElSREEgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJBTV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJBTV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfUkVRVUVTVF9QQVJBTUVURVIoX19QQVJBTV9fKSAoKChfX1BBUkFNX18pID09IElSREFfQVVUT0JBVURfUkVRVUVTVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUkFNX18pID09IElSREFfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpKQorLyoqCisgKiBAfQorICovCisKKy8qIEluY2x1ZGUgSVJEQSBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9pcmRhX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgSVJEQV9FeHBvcnRlZF9GdW5jdGlvbnMgSVJEQSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVJEQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RlSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfTXNwSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfTXNwRGVJbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWdpc3RlckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIEhBTF9JUkRBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBJUkRBX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVW5SZWdpc3RlckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIEhBTF9JUkRBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1RyYW5zbWl0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVjZWl2ZV9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdF9ETUEoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVjZWl2ZV9ETUEoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BUGF1c2UoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9ETUFSZXN1bWUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9ETUFTdG9wKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworLyogVHJhbnNmZXIgQWJvcnQgZnVuY3Rpb25zICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFJlY2VpdmUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFJlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisKK3ZvaWQgSEFMX0lSREFfSVJRSGFuZGxlcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX1J4SGFsZkNwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfRXJyb3JDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQGFkZHRvZ3JvdXAgSVJEQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfSVJEQV9TdGF0ZVR5cGVEZWYgSEFMX0lSREFfR2V0U3RhdGUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit1aW50MzJfdCAgICAgICAgICAgICAgSEFMX0lSREFfR2V0RXJyb3IoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfSVJEQV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9pcmRhX2V4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF9pcmRhX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNTUyYQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX2lyZGFfZXguaApAQCAtMCwwICsxLDI3MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfaXJkYV9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBJUkRBIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0hBTF9JUkRBX0VYX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9JUkRBX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVJEQUV4X0V4dGVuZGVkX0V4cG9ydGVkX0NvbnN0YW50cyBJUkRBRXggRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBRXhfV29yZF9MZW5ndGggSVJEQUV4IFdvcmQgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9XT1JETEVOR1RIXzdCICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX00xICAgLyohPCA3LWJpdCBsb25nIGZyYW1lICovCisjZGVmaW5lIElSREFfV09SRExFTkdUSF84QiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgIC8qITwgOC1iaXQgbG9uZyBmcmFtZSAqLworI2RlZmluZSBJUkRBX1dPUkRMRU5HVEhfOUIgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTAgICAvKiE8IDktYml0IGxvbmcgZnJhbWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQUV4X1ByaXZhdGVfTWFjcm9zIElSREFFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgSVJEQSBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0NMT0NLU09VUkNFX18gb3V0cHV0IHZhcmlhYmxlLgorICAqIEByZXR2YWwgSVJEQSBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICAqLworI2lmIGRlZmluZWQgKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4QikgfHwgZGVmaW5lZCAoU1RNMzJMMDEweDgpCisjZGVmaW5lIElSREFfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBMUFVBUlQxKSAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKyNlbHNlIC8qIChTVE0zMkwwMzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDQxeHgpIHx8IChTVE0zMkwwMTF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDIxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAxMHhCKSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4OCkqLworCisjZGVmaW5lIElSREFfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBMUFVBUlQxKSAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZW5kaWYgLyogKFNUTTMyTDAzMXh4KSB8fCAoU1RNMzJMMDQxeHgpIHx8IChTVE0zMkwwMTF4eCkgfHwgKFNUTTMyTDAyMXh4KSB8fCAoU1RNMzJMMDEweEIpIHx8IChTVE0zMkwwMTB4OCkqLworCisKKy8qKiBAYnJpZWYgIENvbXB1dGUgdGhlIG1hc2sgdG8gYXBwbHkgdG8gcmV0cmlldmUgdGhlIHJlY2VpdmVkIGRhdGEKKyAgKiAgICAgICAgIGFjY29yZGluZyB0byB0aGUgd29yZCBsZW5ndGggYW5kIHRvIHRoZSBwYXJpdHkgYml0cyBhY3RpdmF0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZSwgdGhlIG1hc2sgdG8gYXBwbHkgdG8gdGhlIGFzc29jaWF0ZWQgVUFSVCBSRFIgcmVnaXN0ZXIgaXMgc3RvcmVkIGluIChfX0hBTkRMRV9fKS0+TWFzayBmaWVsZC4KKyAgKi8KKyNkZWZpbmUgSVJEQV9NQVNLX0NPTVBVVEFUSU9OKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzlCKSAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMUZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF84QikgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzdCKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwM0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDAwVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBmcmFtZSBsZW5ndGggaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTEVOR1RIX18gSVJEQSBmcmFtZSBsZW5ndGguCisgICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xFTkdUSF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfV09SRF9MRU5HVEgoX19MRU5HVEhfXykgKCgoX19MRU5HVEhfXykgPT0gSVJEQV9XT1JETEVOR1RIXzdCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gSVJEQV9XT1JETEVOR1RIXzhCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gSVJEQV9XT1JETEVOR1RIXzlCKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfSVJEQV9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9pd2RnLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9pd2RnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhNWZlMAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX2l3ZGcuaApAQCAtMCwwICsxLDIzOSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfaXdkZy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBJV0RHIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfSVdER19ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9JV0RHX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElXREcgSVdERworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfVHlwZXMgSVdERyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIElXREcgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUHJlc2NhbGVyOyAgLyohPCBTZWxlY3QgdGhlIHByZXNjYWxlciBvZiB0aGUgSVdERy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIElXREdfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgUmVsb2FkOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIElXREcgZG93bi1jb3VudGVyIHJlbG9hZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4MEZGRiAqLworCisgIHVpbnQzMl90IFdpbmRvdzsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB3aW5kb3cgdmFsdWUgdG8gYmUgY29tcGFyZWQgdG8gdGhlIGRvd24tY291bnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4MEZGRiAqLworCit9IElXREdfSW5pdFR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIElXREcgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIElXREdfVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgKi8KKworICBJV0RHX0luaXRUeXBlRGVmICAgICAgICAgICAgIEluaXQ7ICAgICAgIC8qITwgSVdERyByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisKK31JV0RHX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfQ29uc3RhbnRzIElXREcgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX1ByZXNjYWxlciBJV0RHIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gNCAgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzggICAgICAgICAgICAgICAgSVdER19QUl9QUl8wICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gOCAgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzE2ICAgICAgICAgICAgICAgSVdER19QUl9QUl8xICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gMTYgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzMyICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMSB8IElXREdfUFJfUFJfMCkgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gMzIgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzY0ICAgICAgICAgICAgICAgSVdER19QUl9QUl8yICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gNjQgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzEyOCAgICAgICAgICAgICAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMCkgICAvKiE8IElXREcgcHJlc2NhbGVyIHNldCB0byAxMjggKi8KKyNkZWZpbmUgSVdER19QUkVTQ0FMRVJfMjU2ICAgICAgICAgICAgICAoSVdER19QUl9QUl8yIHwgSVdER19QUl9QUl8xKSAgIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX1dpbmRvd19vcHRpb24gSVdERyBXaW5kb3cgb3B0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVdER19XSU5ET1dfRElTQUJMRSAgICAgICAgICAgICBJV0RHX1dJTlJfV0lOCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX01hY3JvcyBJV0RHIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBJV0RHIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBJV0RHIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JV0RHX1NUQVJUKF9fSEFORExFX18pICAgICAgICAgICAgICAgIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5LUiwgSVdER19LRVlfRU5BQkxFKQorCisvKioKKyAgKiBAYnJpZWYgIFJlbG9hZCBJV0RHIGNvdW50ZXIgd2l0aCB2YWx1ZSBkZWZpbmVkIGluIHRoZSByZWxvYWQgcmVnaXN0ZXIKKyAgKiAgICAgICAgICh3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgJiBJV0RHX1dJTlIgcmVnaXN0ZXJzIGRpc2FibGVkKS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIElXREcgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lXREdfUkVMT0FEX0NPVU5URVIoX19IQU5ETEVfXykgICAgICAgV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPktSLCBJV0RHX0tFWV9SRUxPQUQpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfRnVuY3Rpb25zICBJV0RHIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24vU3RhcnQgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JV0RHX0luaXQoSVdER19IYW5kbGVUeXBlRGVmICpoaXdkZyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVdER19SZWZyZXNoKElXREdfSGFuZGxlVHlwZURlZiAqaGl3ZGcpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19Qcml2YXRlX0NvbnN0YW50cyBJV0RHIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJV0RHIEtleSBSZWdpc3RlciBCaXRNYXNrCisgICovCisjZGVmaW5lIElXREdfS0VZX1JFTE9BRCAgICAgICAgICAgICAgICAgMHgwMDAwQUFBQVUgIC8qITwgSVdERyBSZWxvYWQgQ291bnRlciBFbmFibGUgICAqLworI2RlZmluZSBJV0RHX0tFWV9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MDAwMENDQ0NVICAvKiE8IElXREcgUGVyaXBoZXJhbCBFbmFibGUgICAgICAgKi8KKyNkZWZpbmUgSVdER19LRVlfV1JJVEVfQUNDRVNTX0VOQUJMRSAgICAweDAwMDA1NTU1VSAgLyohPCBJV0RHIEtSIFdyaXRlIEFjY2VzcyBFbmFibGUgICovCisjZGVmaW5lIElXREdfS0VZX1dSSVRFX0FDQ0VTU19ESVNBQkxFICAgMHgwMDAwMDAwMFUgIC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRGlzYWJsZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfTWFjcm9zIElXREcgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBJV0RHIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJV0RHX0VOQUJMRV9XUklURV9BQ0NFU1MoX19IQU5ETEVfXykgIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5LUiwgSVdER19LRVlfV1JJVEVfQUNDRVNTX0VOQUJMRSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHdyaXRlIGFjY2VzcyB0byBJV0RHX1BSLCBJV0RHX1JMUiBhbmQgSVdER19XSU5SIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIElXREcgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElXREdfRElTQUJMRV9XUklURV9BQ0NFU1MoX19IQU5ETEVfXykgV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPktSLCBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRElTQUJMRSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayBJV0RHIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gIElXREcgcHJlc2NhbGVyIHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX0lXREdfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICAgICAgKCgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl84KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzE2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfMzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl82NCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzEyOCl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfMjU2KSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayBJV0RHIHJlbG9hZCB2YWx1ZS4KKyAgKiBAcGFyYW0gIF9fUkVMT0FEX18gIElXREcgcmVsb2FkIHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX0lXREdfUkVMT0FEKF9fUkVMT0FEX18pICAgICAgICAgICAgKChfX1JFTE9BRF9fKSA8PSBJV0RHX1JMUl9STCkKKworLyoqCisgICogQGJyaWVmICBDaGVjayBJV0RHIHdpbmRvdyB2YWx1ZS4KKyAgKiBAcGFyYW0gIF9fV0lORE9XX18gIElXREcgd2luZG93IHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX0lXREdfV0lORE9XKF9fV0lORE9XX18pICAgICAgICAgICAgKChfX1dJTkRPV19fKSA8PSBJV0RHX1dJTlJfV0lOKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfSVdER19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9sY2QuaCBiL0luYy9zdG0zMmwweHhfaGFsX2xjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjZkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9sY2QuaApAQCAtMCwwICsxLDc4OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfbGNkLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIExDRCBDb250cm9sbGVyIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9MQ0RfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfTENEX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKFNUTTMyTDA1M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KQorICAgCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEIExDRAorICAqIEB7CisgICovIAorCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMQ0RfRXhwb3J0ZWRfVHlwZXMgTENEIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIAorICAqIEBicmllZiBMQ0QgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgTENEIFByZXNjYWxlci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIG9mIEByZWYgTENEX1ByZXNjYWxlciAqLworICB1aW50MzJfdCBEaXZpZGVyOyAgICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgTENEIERpdmlkZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIG9mIEByZWYgTENEX0RpdmlkZXIgKi8KKyAgdWludDMyX3QgRHV0eTsgICAgICAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIExDRCBEdXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBvZiBAcmVmIExDRF9EdXR5ICovCisgIHVpbnQzMl90IEJpYXM7ICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBMQ0QgQmlhcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgb2YgQHJlZiBMQ0RfQmlhcyAqLyAKKyAgdWludDMyX3QgVm9sdGFnZVNvdXJjZTsgICAvKiE8IFNlbGVjdHMgdGhlIExDRCBWb2x0YWdlIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgb2YgQHJlZiBMQ0RfVm9sdGFnZV9Tb3VyY2UgKi8gIAorICB1aW50MzJfdCBDb250cmFzdDsgICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgTENEIENvbnRyYXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBvZiBAcmVmIExDRF9Db250cmFzdCAqLworICB1aW50MzJfdCBEZWFkVGltZTsgICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgTENEIERlYWQgVGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgb2YgQHJlZiBMQ0RfRGVhZFRpbWUgKi8KKyAgdWludDMyX3QgUHVsc2VPbkR1cmF0aW9uOyAvKiE8IENvbmZpZ3VyZXMgdGhlIExDRCBQdWxzZSBPbiBEdXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgb2YgQHJlZiBMQ0RfUHVsc2VPbkR1cmF0aW9uICovCisgIHVpbnQzMl90IEhpZ2hEcml2ZTsgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIExDRCBIaWdoIERyaXZlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBvZiBAcmVmIExDRF9IaWdoRHJpdmUgKi8KKyAgdWludDMyX3QgQmxpbmtNb2RlOyAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIExDRCBCbGluayBNb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBvZiBAcmVmIExDRF9CbGlua01vZGUgKi8KKyAgdWludDMyX3QgQmxpbmtGcmVxdWVuY3k7ICAvKiE8IENvbmZpZ3VyZXMgdGhlIExDRCBCbGluayBmcmVxdWVuY3kuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIG9mIEByZWYgTENEX0JsaW5rRnJlcXVlbmN5ICovCisgIHVpbnQzMl90IE11eFNlZ21lbnQ7ICAgICAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSBtdXggc2VnbWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgb2YgQHJlZiBMQ0RfTXV4U2VnbWVudCAqLworfUxDRF9Jbml0VHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiBIQUwgTENEIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLyAKK3R5cGVkZWYgZW51bQoreworICBIQUxfTENEX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgUGVyaXBoZXJhbCBpcyBub3QgeWV0IEluaXRpYWxpemVkICovCisgIEhBTF9MQ0RfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICovCisgIEhBTF9MQ0RfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBhbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgSEFMX0xDRF9TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFRpbWVvdXQgc3RhdGUgKi8KKyAgSEFMX0xDRF9TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDRVICAgICAvKiE8IEVycm9yICovCit9SEFMX0xDRF9TdGF0ZVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIFVBUlQgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovICAKK3R5cGVkZWYgc3RydWN0Cit7CisgIExDRF9UeXBlRGVmICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgIC8qIExDRCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICovCisgIAorICBMQ0RfSW5pdFR5cGVEZWYgICAgICAgICAgICAgICBJbml0OyAgICAgICAvKiBMQ0QgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICAgTG9jazsgICAgICAgLyogTG9ja2luZyBvYmplY3QgKi8KKworICBfX0lPIEhBTF9MQ0RfU3RhdGVUeXBlRGVmICAgICBTdGF0ZTsgICAgICAvKiBMQ0QgY29tbXVuaWNhdGlvbiBzdGF0ZSAqLworICAKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgLyogTENEIEVycm9yIGNvZGUgKi8KKyAgCit9TENEX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0V4cG9ydGVkX0NvbnN0YW50cyBMQ0QgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCAgTENEX0Vycm9yQ29kZSBMQ0QgRXJyb3IgQ29kZQorICAqIEB7CisgICovIAorI2RlZmluZSBIQUxfTENEX0VSUk9SX05PTkUgICAgICAgKCh1aW50MzJfdCkweDAwVSkgICAgLyohPCBObyBlcnJvciAqLworI2RlZmluZSBIQUxfTENEX0VSUk9SX0ZDUlNGICAgICAgKCh1aW50MzJfdCkweDAxVSkgICAgLyohPCBTeW5jaHJvIGZsYWcgdGltZW91dCBlcnJvciAqLworI2RlZmluZSBIQUxfTENEX0VSUk9SX1VEUiAgICAgICAgKCh1aW50MzJfdCkweDAyVSkgICAgLyohPCBVcGRhdGUgZGlzcGxheSByZXF1ZXN0IGZsYWcgdGltZW91dCBlcnJvciAqLworI2RlZmluZSBIQUxfTENEX0VSUk9SX1VERCAgICAgICAgKCh1aW50MzJfdCkweDA0VSkgICAgLyohPCBVcGRhdGUgZGlzcGxheSBkb25lIGZsYWcgdGltZW91dCBlcnJvciAqLworI2RlZmluZSBIQUxfTENEX0VSUk9SX0VOUyAgICAgICAgKCh1aW50MzJfdCkweDA4VSkgICAgLyohPCBMQ0QgZW5hYmxlZCBzdGF0dXMgZmxhZyB0aW1lb3V0IGVycm9yICovCisjZGVmaW5lIEhBTF9MQ0RfRVJST1JfUkRZICAgICAgICAoKHVpbnQzMl90KTB4MTBVKSAgICAvKiE8IExDRCBCb29zdGVyIHJlYWR5IHRpbWVvdXQgZXJyb3IgKi8KKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBMQ0RfUHJlc2NhbGVyIExDRCBQcmVzY2FsZXIKKyAgKiBAeworICAqLworCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMSAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsgICAgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMiAgICAgICAgKCh1aW50MzJfdCkweDAwNDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvMiAgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfNCAgICAgICAgKCh1aW50MzJfdCkweDAwODAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvNCAgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfOCAgICAgICAgKCh1aW50MzJfdCkweDAwQzAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvOCAgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMTYgICAgICAgKCh1aW50MzJfdCkweDAxMDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvMTYgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMzIgICAgICAgKCh1aW50MzJfdCkweDAxNDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvMzIgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfNjQgICAgICAgKCh1aW50MzJfdCkweDAxODAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvNjQgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMTI4ICAgICAgKCh1aW50MzJfdCkweDAxQzAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvMTI4ICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMjU2ICAgICAgKCh1aW50MzJfdCkweDAyMDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvMjU2ICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfNTEyICAgICAgKCh1aW50MzJfdCkweDAyNDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvNTEyICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMTAyNCAgICAgKCh1aW50MzJfdCkweDAyODAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvMTAyNCAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMjA0OCAgICAgKCh1aW50MzJfdCkweDAyQzAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvMjA0OCAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfNDA5NiAgICAgKCh1aW50MzJfdCkweDAzMDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvNDA5NiAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfODE5MiAgICAgKCh1aW50MzJfdCkweDAzNDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvODE5MiAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMTYzODQgICAgKCh1aW50MzJfdCkweDAzODAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvMTYzODQgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMzI3NjggICAgKCh1aW50MzJfdClMQ0RfRkNSX1BTKSAgLyohPCBDTEtQUyA9IExDRENMSy8zMjc2OCAgKi8KKworI2RlZmluZSBJU19MQ0RfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICgoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfMSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzIpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl80KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfOCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzE2KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl8zMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfNjQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzEyOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl8yNTYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfNTEyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzEwMjQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl8yMDQ4KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfNDA5NikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzgxOTIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl8xNjM4NCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfMzI3NjgpKQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgTENEX0RpdmlkZXIgTENEIERpdmlkZXIKKyAgKiBAeworICAqLworCisjZGVmaW5lIExDRF9ESVZJREVSXzE2ICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IExDRCBmcmVxdWVuY3kgPSBDTEtQUy8xNiAqLworI2RlZmluZSBMQ0RfRElWSURFUl8xNyAgICAoKHVpbnQzMl90KTB4MDAwNDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMTcgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMTggICAgKCh1aW50MzJfdCkweDAwMDgwMDAwVSkgIC8qITwgTENEIGZyZXF1ZW5jeSA9IENMS1BTLzE4ICovCisjZGVmaW5lIExDRF9ESVZJREVSXzE5ICAgICgodWludDMyX3QpMHgwMDBDMDAwMFUpICAvKiE8IExDRCBmcmVxdWVuY3kgPSBDTEtQUy8xOSAqLworI2RlZmluZSBMQ0RfRElWSURFUl8yMCAgICAoKHVpbnQzMl90KTB4MDAxMDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjAgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjEgICAgKCh1aW50MzJfdCkweDAwMTQwMDAwVSkgIC8qITwgTENEIGZyZXF1ZW5jeSA9IENMS1BTLzIxICovCisjZGVmaW5lIExDRF9ESVZJREVSXzIyICAgICgodWludDMyX3QpMHgwMDE4MDAwMFUpICAvKiE8IExDRCBmcmVxdWVuY3kgPSBDTEtQUy8yMiAqLworI2RlZmluZSBMQ0RfRElWSURFUl8yMyAgICAoKHVpbnQzMl90KTB4MDAxQzAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjMgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjQgICAgKCh1aW50MzJfdCkweDAwMjAwMDAwVSkgIC8qITwgTENEIGZyZXF1ZW5jeSA9IENMS1BTLzI0ICovCisjZGVmaW5lIExDRF9ESVZJREVSXzI1ICAgICgodWludDMyX3QpMHgwMDI0MDAwMFUpICAvKiE8IExDRCBmcmVxdWVuY3kgPSBDTEtQUy8yNSAqLworI2RlZmluZSBMQ0RfRElWSURFUl8yNiAgICAoKHVpbnQzMl90KTB4MDAyODAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjYgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjcgICAgKCh1aW50MzJfdCkweDAwMkMwMDAwVSkgIC8qITwgTENEIGZyZXF1ZW5jeSA9IENMS1BTLzI3ICovCisjZGVmaW5lIExDRF9ESVZJREVSXzI4ICAgICgodWludDMyX3QpMHgwMDMwMDAwMFUpICAvKiE8IExDRCBmcmVxdWVuY3kgPSBDTEtQUy8yOCAqLworI2RlZmluZSBMQ0RfRElWSURFUl8yOSAgICAoKHVpbnQzMl90KTB4MDAzNDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjkgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMzAgICAgKCh1aW50MzJfdCkweDAwMzgwMDAwVSkgIC8qITwgTENEIGZyZXF1ZW5jeSA9IENMS1BTLzMwICovCisjZGVmaW5lIExDRF9ESVZJREVSXzMxICAgICgodWludDMyX3QpTENEX0ZDUl9ESVYpIC8qITwgTENEIGZyZXF1ZW5jeSA9IENMS1BTLzMxICovCisKKyNkZWZpbmUgSVNfTENEX0RJVklERVIoX19ESVZJREVSX18pICgoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8xNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzE3KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMTgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8xOSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzIwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8yMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzIzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8yNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzI2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMjcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8yOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzI5KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8zMSkpCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBMQ0RfRHV0eSBMQ0QgRHV0eQorICAqIEB7CisgICovCisgIAorI2RlZmluZSBMQ0RfRFVUWV9TVEFUSUMgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAvKiE8IFN0YXRpYyBkdXR5ICovCisjZGVmaW5lIExDRF9EVVRZXzFfMiAgICAgICAgICAgICAgICAgICAgKExDRF9DUl9EVVRZXzApICAgICAgICAgICAgICAgICAgIC8qITwgMS8yIGR1dHkgICAgKi8KKyNkZWZpbmUgTENEX0RVVFlfMV8zICAgICAgICAgICAgICAgICAgICAoTENEX0NSX0RVVFlfMSkgICAgICAgICAgICAgICAgICAgLyohPCAxLzMgZHV0eSAgICAqLworI2RlZmluZSBMQ0RfRFVUWV8xXzQgICAgICAgICAgICAgICAgICAgICgoTENEX0NSX0RVVFlfMSB8IExDRF9DUl9EVVRZXzApKSAvKiE8IDEvNCBkdXR5ICAgICovCisjZGVmaW5lIExDRF9EVVRZXzFfOCAgICAgICAgICAgICAgICAgICAgKExDRF9DUl9EVVRZXzIpICAgICAgICAgICAgICAgICAgIC8qITwgMS84IGR1dHkgICAgKi8KKworI2RlZmluZSBJU19MQ0RfRFVUWShfX0RVVFlfXykgKCgoX19EVVRZX18pID09IExDRF9EVVRZX1NUQVRJQykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVUWV9fKSA9PSBMQ0RfRFVUWV8xXzIpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RVVFlfXykgPT0gTENEX0RVVFlfMV8zKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVRZX18pID09IExDRF9EVVRZXzFfNCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVUWV9fKSA9PSBMQ0RfRFVUWV8xXzgpKQorCisvKioKKyAgKiBAfQorICAqLyAKKyAgCisKKy8qKiBAZGVmZ3JvdXAgTENEX0JpYXMgTENEIEJpYXMKKyAgKiBAeworICAqLworICAKKyNkZWZpbmUgTENEX0JJQVNfMV80ICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IDEvNCBCaWFzICovCisjZGVmaW5lIExDRF9CSUFTXzFfMiAgICAgICAgICAgICAgICAgICAgTENEX0NSX0JJQVNfMCAgICAgICAgICAgLyohPCAxLzIgQmlhcyAqLworI2RlZmluZSBMQ0RfQklBU18xXzMgICAgICAgICAgICAgICAgICAgIExDRF9DUl9CSUFTXzEgICAgICAgICAgIC8qITwgMS8zIEJpYXMgKi8KKworI2RlZmluZSBJU19MQ0RfQklBUyhfX0JJQVNfXykgKCgoX19CSUFTX18pID09IExDRF9CSUFTXzFfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CSUFTX18pID09IExDRF9CSUFTXzFfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CSUFTX18pID09IExDRF9CSUFTXzFfMykpCisvKioKKyAgKiBAfQorICAqLyAKKyAgICAKKy8qKiBAZGVmZ3JvdXAgTENEX1ZvbHRhZ2VfU291cmNlIExDRCBWb2x0YWdlIFNvdXJjZQorICAqIEB7CisgICovCisgIAorI2RlZmluZSBMQ0RfVk9MVEFHRVNPVVJDRV9JTlRFUk5BTCAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgSW50ZXJuYWwgdm9sdGFnZSBzb3VyY2UgZm9yIHRoZSBMQ0QgKi8KKyNkZWZpbmUgTENEX1ZPTFRBR0VTT1VSQ0VfRVhURVJOQUwgICAgICBMQ0RfQ1JfVlNFTCAgICAgICAgICAgICAvKiE8IEV4dGVybmFsIHZvbHRhZ2Ugc291cmNlIGZvciB0aGUgTENEICovCisKKyNkZWZpbmUgSVNfTENEX1ZPTFRBR0VfU09VUkNFKFNPVVJDRSkgKCgoU09VUkNFKSA9PSBMQ0RfVk9MVEFHRVNPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IExDRF9WT0xUQUdFU09VUkNFX0VYVEVSTkFMKSkKKworLyoqCisgICogQH0KKyAgKi8gIAorCisvKiogQGRlZmdyb3VwIExDRF9JbnRlcnJ1cHRzIExDRCBJbnRlcnJ1cHRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTENEX0lUX1NPRiAgICAgICAgICAgICAgICAgICAgICBMQ0RfRkNSX1NPRklFCisjZGVmaW5lIExDRF9JVF9VREQgICAgICAgICAgICAgICAgICAgICAgTENEX0ZDUl9VRERJRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExDRF9QdWxzZU9uRHVyYXRpb24gTENEIFB1bHNlIE9uIER1cmF0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgLyohPCBQdWxzZSBPTiBkdXJhdGlvbiA9IDAgcHVsc2UgICAqLworI2RlZmluZSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzEgICAgICAgICAgIChMQ0RfRkNSX1BPTl8wKSAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBPTiBkdXJhdGlvbiA9IDEvQ0tfUFMgICovCisjZGVmaW5lIExDRF9QVUxTRU9ORFVSQVRJT05fMiAgICAgICAgICAgKExDRF9GQ1JfUE9OXzEpICAgICAgICAgICAgICAgICAvKiE8IFB1bHNlIE9OIGR1cmF0aW9uID0gMi9DS19QUyAgKi8KKyNkZWZpbmUgTENEX1BVTFNFT05EVVJBVElPTl8zICAgICAgICAgICAoTENEX0ZDUl9QT05fMSB8IExDRF9GQ1JfUE9OXzApIC8qITwgUHVsc2UgT04gZHVyYXRpb24gPSAzL0NLX1BTICAqLworI2RlZmluZSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzQgICAgICAgICAgIChMQ0RfRkNSX1BPTl8yKSAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBPTiBkdXJhdGlvbiA9IDQvQ0tfUFMgICovCisjZGVmaW5lIExDRF9QVUxTRU9ORFVSQVRJT05fNSAgICAgICAgICAgKExDRF9GQ1JfUE9OXzIgfCBMQ0RfRkNSX1BPTl8wKSAvKiE8IFB1bHNlIE9OIGR1cmF0aW9uID0gNS9DS19QUyAgKi8KKyNkZWZpbmUgTENEX1BVTFNFT05EVVJBVElPTl82ICAgICAgICAgICAoTENEX0ZDUl9QT05fMiB8IExDRF9GQ1JfUE9OXzEpIC8qITwgUHVsc2UgT04gZHVyYXRpb24gPSA2L0NLX1BTICAqLworI2RlZmluZSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzcgICAgICAgICAgIChMQ0RfRkNSX1BPTikgICAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBPTiBkdXJhdGlvbiA9IDcvQ0tfUFMgICovCisKKyNkZWZpbmUgSVNfTENEX1BVTFNFX09OX0RVUkFUSU9OKF9fRFVSQVRJT05fXykgKCgoX19EVVJBVElPTl9fKSA9PSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVJBVElPTl9fKSA9PSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVJBVElPTl9fKSA9PSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVJBVElPTl9fKSA9PSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVJBVElPTl9fKSA9PSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVJBVElPTl9fKSA9PSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVJBVElPTl9fKSA9PSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVJBVElPTl9fKSA9PSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzcpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMQ0RfSGlnaERyaXZlIExDRCBIaWdoRHJpdmUKKyAgKiBAeworICAqLworCisjZGVmaW5lIExDRF9ISUdIRFJJVkVfMCAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAvKiE8IExvdyByZXNpc3RhbmNlIERyaXZlICAgKi8KKyNkZWZpbmUgTENEX0hJR0hEUklWRV8xICAgICAgICAgICAoTENEX0ZDUl9IRCkgICAgICAgICAgICAgICAgICAgIC8qITwgSGlnaCByZXNpc3RhbmNlIERyaXZlICAqLworCisjZGVmaW5lIElTX0xDRF9ISUdIRFJJVkUoX19ISUdIRFJJVkVfXykgKCgoX19ISUdIRFJJVkVfXykgPT0gTENEX0hJR0hEUklWRV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ISUdIRFJJVkVfXykgPT0gTENEX0hJR0hEUklWRV8xKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0RlYWRUaW1lIExDRCBEZWFkIFRpbWUKKyAgKiBAeworICAqLworCisjZGVmaW5lIExDRF9ERUFEVElNRV8wICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgIC8qITwgTm8gZGVhZCBUaW1lICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfMSAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMCkgICAgICAgICAgICAgICAgICAvKiE8IE9uZSBQaGFzZSBiZXR3ZWVuIGRpZmZlcmVudCBjb3VwbGUgb2YgRnJhbWUgICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfMiAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMSkgICAgICAgICAgICAgICAgICAvKiE8IFR3byBQaGFzZSBiZXR3ZWVuIGRpZmZlcmVudCBjb3VwbGUgb2YgRnJhbWUgICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfMyAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMSB8IExDRF9GQ1JfREVBRF8wKSAvKiE8IFRocmVlIFBoYXNlIGJldHdlZW4gZGlmZmVyZW50IGNvdXBsZSBvZiBGcmFtZSAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfNCAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMikgICAgICAgICAgICAgICAgICAvKiE8IEZvdXIgUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfNSAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMiB8IExDRF9GQ1JfREVBRF8wKSAvKiE8IEZpdmUgUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfNiAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMiB8IExDRF9GQ1JfREVBRF8xKSAvKiE8IFNpeCBQaGFzZSBiZXR3ZWVuIGRpZmZlcmVudCBjb3VwbGUgb2YgRnJhbWUgICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfNyAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQUQpICAgICAgICAgICAgICAgICAgICAvKiE8IFNldmVuIFBoYXNlIGJldHdlZW4gZGlmZmVyZW50IGNvdXBsZSBvZiBGcmFtZSAqLworCisjZGVmaW5lIElTX0xDRF9ERUFEX1RJTUUoX19USU1FX18pICgoKF9fVElNRV9fKSA9PSBMQ0RfREVBRFRJTUVfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVfXykgPT0gTENEX0RFQURUSU1FXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IExDRF9ERUFEVElNRV8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVElNRV9fKSA9PSBMQ0RfREVBRFRJTUVfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVfXykgPT0gTENEX0RFQURUSU1FXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IExDRF9ERUFEVElNRV81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVElNRV9fKSA9PSBMQ0RfREVBRFRJTUVfNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVfXykgPT0gTENEX0RFQURUSU1FXzcpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMQ0RfQmxpbmtNb2RlIExDRCBCbGluayBNb2RlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMQ0RfQkxJTktNT0RFX09GRiAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgQmxpbmsgZGlzYWJsZWQgICAgICAgICAgICAqLworI2RlZmluZSBMQ0RfQkxJTktNT0RFX1NFRzBfQ09NMCAgICAgICAgIChMQ0RfRkNSX0JMSU5LXzApICAgICAgIC8qITwgQmxpbmsgZW5hYmxlZCBvbiBTRUdbMF0sIENPTVswXSAoMSBwaXhlbCkgICAqLworI2RlZmluZSBMQ0RfQkxJTktNT0RFX1NFRzBfQUxMQ09NICAgICAgIChMQ0RfRkNSX0JMSU5LXzEpICAgICAgIC8qITwgQmxpbmsgZW5hYmxlZCBvbiBTRUdbMF0sIGFsbCBDT00gKHVwIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IHBpeGVscyBhY2NvcmRpbmcgdG8gdGhlIHByb2dyYW1tZWQgZHV0eSkgICovCisjZGVmaW5lIExDRF9CTElOS01PREVfQUxMU0VHX0FMTENPTSAgICAgKExDRF9GQ1JfQkxJTkspICAgICAgICAgLyohPCBCbGluayBlbmFibGVkIG9uIGFsbCBTRUcgYW5kIGFsbCBDT00gKGFsbCBwaXhlbHMpICAqLworCisjZGVmaW5lIElTX0xDRF9CTElOS19NT0RFKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gTENEX0JMSU5LTU9ERV9PRkYpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IExDRF9CTElOS01PREVfU0VHMF9DT00wKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBMQ0RfQkxJTktNT0RFX1NFRzBfQUxMQ09NKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gTENEX0JMSU5LTU9ERV9BTExTRUdfQUxMQ09NKSkKKy8qKgorICAqIEB9CisgICovICAgIAorCisvKiogQGRlZmdyb3VwIExDRF9CbGlua0ZyZXF1ZW5jeSBMQ0QgQmxpbmsgRnJlcXVlbmN5CisgICogQHsKKyAgKi8KKworI2RlZmluZSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWOCAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgLyohPCBUaGUgQmxpbmsgZnJlcXVlbmN5ID0gZkxDRC84ICAgICovCisjZGVmaW5lIExDRF9CTElOS0ZSRVFVRU5DWV9ESVYxNiAgICAgICAgKExDRF9GQ1JfQkxJTktGXzApICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTENELzE2ICAgKi8KKyNkZWZpbmUgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjMyICAgICAgICAoTENEX0ZDUl9CTElOS0ZfMSkgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIEJsaW5rIGZyZXF1ZW5jeSA9IGZMQ0QvMzIgICAqLworI2RlZmluZSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWNjQgICAgICAgIChMQ0RfRkNSX0JMSU5LRl8xIHwgTENEX0ZDUl9CTElOS0ZfMCkgLyohPCBUaGUgQmxpbmsgZnJlcXVlbmN5ID0gZkxDRC82NCAgICovCisjZGVmaW5lIExDRF9CTElOS0ZSRVFVRU5DWV9ESVYxMjggICAgICAgKExDRF9GQ1JfQkxJTktGXzIpICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTENELzEyOCAgKi8KKyNkZWZpbmUgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjI1NiAgICAgICAoTENEX0ZDUl9CTElOS0ZfMiB8TENEX0ZDUl9CTElOS0ZfMCkgIC8qITwgVGhlIEJsaW5rIGZyZXF1ZW5jeSA9IGZMQ0QvMjU2ICAqLworI2RlZmluZSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWNTEyICAgICAgIChMQ0RfRkNSX0JMSU5LRl8yIHxMQ0RfRkNSX0JMSU5LRl8xKSAgLyohPCBUaGUgQmxpbmsgZnJlcXVlbmN5ID0gZkxDRC81MTIgICovCisjZGVmaW5lIExDRF9CTElOS0ZSRVFVRU5DWV9ESVYxMDI0ICAgICAgKExDRF9GQ1JfQkxJTktGKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTENELzEwMjQgKi8KKworI2RlZmluZSBJU19MQ0RfQkxJTktfRlJFUVVFTkNZKF9fRlJFUVVFTkNZX18pICgoKF9fRlJFUVVFTkNZX18pID09IExDRF9CTElOS0ZSRVFVRU5DWV9ESVY4KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFVRU5DWV9fKSA9PSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWMTYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GUkVRVUVOQ1lfXykgPT0gTENEX0JMSU5LRlJFUVVFTkNZX0RJVjMyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRlJFUVVFTkNZX18pID09IExDRF9CTElOS0ZSRVFVRU5DWV9ESVY2NCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFVRU5DWV9fKSA9PSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GUkVRVUVOQ1lfXykgPT0gTENEX0JMSU5LRlJFUVVFTkNZX0RJVjI1NikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRlJFUVVFTkNZX18pID09IExDRF9CTElOS0ZSRVFVRU5DWV9ESVY1MTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFVRU5DWV9fKSA9PSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWMTAyNCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExDRF9Db250cmFzdCBMQ0QgQ29udHJhc3QKKyAgKiBAeworICAqLworCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDIuNjBWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzEgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18wKSAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDIuNzNWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzIgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18xKSAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDIuODZWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzMgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18xIHwgTENEX0ZDUl9DQ18wKSAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDIuOTlWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzQgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18yKSAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDMuMTJWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzUgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18yIHwgTENEX0ZDUl9DQ18wKSAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDMuMjVWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzYgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18yIHwgTENEX0ZDUl9DQ18xKSAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDMuMzhWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzcgICAgICAgICAgICAgICAoTENEX0ZDUl9DQykgICAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDMuNTFWICAgICovCisKKyNkZWZpbmUgSVNfTENEX0NPTlRSQVNUKF9fQ09OVFJBU1RfXykgKCgoX19DT05UUkFTVF9fKSA9PSBMQ0RfQ09OVFJBU1RMRVZFTF8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJBU1RfXykgPT0gTENEX0NPTlRSQVNUTEVWRUxfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlRSQVNUX18pID09IExDRF9DT05UUkFTVExFVkVMXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05UUkFTVF9fKSA9PSBMQ0RfQ09OVFJBU1RMRVZFTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJBU1RfXykgPT0gTENEX0NPTlRSQVNUTEVWRUxfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlRSQVNUX18pID09IExDRF9DT05UUkFTVExFVkVMXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05UUkFTVF9fKSA9PSBMQ0RfQ09OVFJBU1RMRVZFTF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJBU1RfXykgPT0gTENEX0NPTlRSQVNUTEVWRUxfNykpCisvKioKKyAgKiBAfQorICAqLworICAgICAgCisvKiogQGRlZmdyb3VwIExDRF9NdXhTZWdtZW50IExDRCBNdXggU2VnbWVudAorICAqIEB7CisgICovCisKKyNkZWZpbmUgTENEX01VWFNFR01FTlRfRElTQUJMRSAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgIC8qITwgU0VHIHBpbiBtdWx0aXBsZXhpbmcgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTENEX01VWFNFR01FTlRfRU5BQkxFICAgICAgICAgICAgIChMQ0RfQ1JfTVVYX1NFRykgICAgICAgICAgICAgIC8qITwgU0VHWzMxOjI4XSBhcmUgbXVsdGlwbGV4ZWQgd2l0aCBTRUdbNDM6NDBdICAgICovCisKKyNkZWZpbmUgSVNfTENEX01VWFNFR01FTlQoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExDRF9NVVhTRUdNRU5UX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTENEX01VWFNFR01FTlRfRElTQUJMRSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExDRF9CVUZFTiBMQ0QgVm9sdGFnZSBvdXRwdXQgYnVmZmVyIGVuYWJsZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgTENEX1ZPTFRCVUZPVVRfRElTQUJMRSAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgIC8qITwgVm9sdGFnZSBvdXRwdXQgYnVmZmVyIGRpc2FibGVkICovCisjZGVmaW5lIExDRF9WT0xUQlVGT1VUX0VOQUJMRSAgICAgICAgICAgICAoTENEX0NSX0JVRkVOKSAgICAgICAgICAgICAgICAvKiE8IEJVRkVOWzFdIFZvbHRhZ2Ugb3V0cHV0IGJ1ZmZlciBlbmFibGVkICAgICovCisKKyNkZWZpbmUgSVNfTENEX1ZPTFRCVUZPVVQoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExDRF9WT0xUQlVGT1VUX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTENEX1ZPTFRCVUZPVVRfRElTQUJMRSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExDRF9GbGFnIExDRCBGbGFnCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMQ0RfRkxBR19FTlMgICAgICAgICAgICAgICAgICAgIExDRF9TUl9FTlMKKyNkZWZpbmUgTENEX0ZMQUdfU09GICAgICAgICAgICAgICAgICAgICBMQ0RfU1JfU09GCisjZGVmaW5lIExDRF9GTEFHX1VEUiAgICAgICAgICAgICAgICAgICAgTENEX1NSX1VEUgorI2RlZmluZSBMQ0RfRkxBR19VREQgICAgICAgICAgICAgICAgICAgIExDRF9TUl9VREQKKyNkZWZpbmUgTENEX0ZMQUdfUkRZICAgICAgICAgICAgICAgICAgICBMQ0RfU1JfUkRZCisjZGVmaW5lIExDRF9GTEFHX0ZDUlNGICAgICAgICAgICAgICAgICAgTENEX1NSX0ZDUlNSCisKKy8qKgorICAqIEB9CisgICovICAgCisKKy8qKiBAZGVmZ3JvdXAgTENEX1JBTVJlZ2lzdGVyIExDRCBSQU1SZWdpc3RlcgorICAqIEB7CisgICovCisKKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMCAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjEgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMSAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMiAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjMgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMyAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjQgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgNCAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgNSAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjYgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgNiAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjcgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDdVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgNyAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjggICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgOCAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjkgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDlVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgOSAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjEwICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEFVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMTAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjExICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEJVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMTEgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjEyICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMENVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMTIgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjEzICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMERVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMTMgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjE0ICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEVVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMTQgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjE1ICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEZVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMTUgKi8KKworI2RlZmluZSBJU19MQ0RfUkFNX1JFR0lTVEVSKF9fUkVHSVNURVJfXykgKCgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSMCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVIyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVI1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSNikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVI4KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSOSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjEwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVIxMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSMTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjEzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVIxNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSMTUpKQorCisvKioKKyAgKiBAfQorICAqLyAgCisgICAKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0V4cG9ydGVkX01hY3JvcyBMQ0QgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBMQ0QgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfTENEX1NUQVRFX1JFU0VUKQorCisvKiogQGJyaWVmICBtYWNyb3MgdG8gZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgTENECisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4gIAorICAqIEByZXR2YWwgTm9uZQorICAqLyAgICAgCisjZGVmaW5lIF9fSEFMX0xDRF9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBMQ0RfQ1JfTENERU4pKQorI2RlZmluZSBfX0hBTF9MQ0RfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAoQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBMQ0RfQ1JfTENERU4pKQorCisvKiogQGJyaWVmICBtYWNyb3MgdG8gZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVm9sdGFnZSBvdXRwdXQgYnVmZmVyCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX1ZPTFRPVVRCVUZGRVJfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgTENEX0NSX0JVRkVOKSkKKyNkZWZpbmUgX19IQUxfTENEX1ZPTFRPVVRCVUZGRVJfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAoQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBMQ0RfQ1JfQlVGRU4pKQorCisvKiogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGxvdyByZXNpc3RhbmNlIGRpdmlkZXIuIERpc3BsYXlzIHdpdGggaGlnaCAKKyAgKiAgICAgICAgIGludGVybmFsIHJlc2lzdGFuY2UgbWF5IG5lZWQgYSBsb25nZXIgZHJpdmUgdGltZSB0byBhY2hpZXZlIAorICAqICAgICAgICAgc2F0aXNmYWN0b3J5IGNvbnRyYXN0LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBpbiB0aGlzIGNhc2UgaWYgc29tZSAKKyAgKiAgICAgICAgIGFkZGl0aW9uYWwgcG93ZXIgY29uc3VtcHRpb24gY2FuIGJlIHRvbGVyYXRlZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEBub3RlICAgV2hlbiB0aGlzIG1vZGUgaXMgZW5hYmxlZCwgdGhlIFB1bHNlT24gRHVyYXRpb24gKFBPTikgaGF2ZSB0byBiZSAKKyAgKiAgICAgICAgIHByb2dyYW1tZWQgdG8gMS9DS19QUyAoTENEX1BVTFNFT05EVVJBVElPTl8xKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0hJR0hEUklWRVJfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RkNSLCBMQ0RfRkNSX0hEKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDRF9XYWl0Rm9yU3luY2hybyhfX0hBTkRMRV9fKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQorCisjZGVmaW5lIF9fSEFMX0xDRF9ISUdIRFJJVkVSX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RkNSLCBMQ0RfRkNSX0hEKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDRF9XYWl0Rm9yU3luY2hybyhfX0hBTkRMRV9fKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTENEIHB1bHNlcyBvbiBkdXJhdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEBwYXJhbSAgX19EVVJBVElPTl9fIHNwZWNpZmllcyB0aGUgTENEIHB1bHNlIG9uIGR1cmF0aW9uIGluIHRlcm1zIG9mIAorICAqICAgICAgICAgQ0tfUFMgKHByZXNjYWxlZCBMQ0QgY2xvY2sgcGVyaW9kKSBwdWxzZXMuCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIExDRF9QVUxTRU9ORFVSQVRJT05fMDogMCBwdWxzZQorICAqICAgICBAYXJnIExDRF9QVUxTRU9ORFVSQVRJT05fMTogUHVsc2UgT04gZHVyYXRpb24gPSAxL0NLX1BTCisgICogICAgIEBhcmcgTENEX1BVTFNFT05EVVJBVElPTl8yOiBQdWxzZSBPTiBkdXJhdGlvbiA9IDIvQ0tfUFMKKyAgKiAgICAgQGFyZyBMQ0RfUFVMU0VPTkRVUkFUSU9OXzM6IFB1bHNlIE9OIGR1cmF0aW9uID0gMy9DS19QUworICAqICAgICBAYXJnIExDRF9QVUxTRU9ORFVSQVRJT05fNDogUHVsc2UgT04gZHVyYXRpb24gPSA0L0NLX1BTCisgICogICAgIEBhcmcgTENEX1BVTFNFT05EVVJBVElPTl81OiBQdWxzZSBPTiBkdXJhdGlvbiA9IDUvQ0tfUFMKKyAgKiAgICAgQGFyZyBMQ0RfUFVMU0VPTkRVUkFUSU9OXzY6IFB1bHNlIE9OIGR1cmF0aW9uID0gNi9DS19QUworICAqICAgICBAYXJnIExDRF9QVUxTRU9ORFVSQVRJT05fNzogUHVsc2UgT04gZHVyYXRpb24gPSA3L0NLX1BTCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9QVUxTRU9ORFVSQVRJT05fQ09ORklHKF9fSEFORExFX18sIF9fRFVSQVRJT05fXykgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1PRElGWV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RkNSLCBMQ0RfRkNSX1BPTiwgKF9fRFVSQVRJT05fXykpOyBcCisgICAgICAgICAgICBMQ0RfV2FpdEZvclN5bmNocm8oX19IQU5ETEVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9d2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIExDRCBkZWFkIHRpbWUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fREVBRFRJTUVfXyBzcGVjaWZpZXMgdGhlIExDRCBkZWFkIHRpbWUuCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIExDRF9ERUFEVElNRV8wOiBObyBkZWFkIFRpbWUKKyAgKiAgICAgQGFyZyBMQ0RfREVBRFRJTUVfMTogT25lIFBoYXNlIGJldHdlZW4gZGlmZmVyZW50IGNvdXBsZSBvZiBGcmFtZQorICAqICAgICBAYXJnIExDRF9ERUFEVElNRV8yOiBUd28gUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lCisgICogICAgIEBhcmcgTENEX0RFQURUSU1FXzM6IFRocmVlIFBoYXNlIGJldHdlZW4gZGlmZmVyZW50IGNvdXBsZSBvZiBGcmFtZQorICAqICAgICBAYXJnIExDRF9ERUFEVElNRV80OiBGb3VyIFBoYXNlIGJldHdlZW4gZGlmZmVyZW50IGNvdXBsZSBvZiBGcmFtZQorICAqICAgICBAYXJnIExDRF9ERUFEVElNRV81OiBGaXZlIFBoYXNlIGJldHdlZW4gZGlmZmVyZW50IGNvdXBsZSBvZiBGcmFtZQorICAqICAgICBAYXJnIExDRF9ERUFEVElNRV82OiBTaXggUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lIAorICAqICAgICBAYXJnIExDRF9ERUFEVElNRV83OiBTZXZlbiBQaGFzZSBiZXR3ZWVuIGRpZmZlcmVudCBjb3VwbGUgb2YgRnJhbWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0RFQURUSU1FX0NPTkZJRyhfX0hBTkRMRV9fLCBfX0RFQURUSU1FX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNT0RJRllfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkZDUiwgTENEX0ZDUl9ERUFELCAoX19ERUFEVElNRV9fKSk7IFwKKyAgICAgICAgICAgIExDRF9XYWl0Rm9yU3luY2hybyhfX0hBTkRMRV9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9d2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIExDRCBDb250cmFzdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEBwYXJhbSAgX19DT05UUkFTVF9fIHNwZWNpZmllcyB0aGUgTENEIENvbnRyYXN0LgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBMQ0RfQ09OVFJBU1RMRVZFTF8wOiBNYXhpbXVtIFZvbHRhZ2UgPSAyLjYwVgorICAqICAgICBAYXJnIExDRF9DT05UUkFTVExFVkVMXzE6IE1heGltdW0gVm9sdGFnZSA9IDIuNzNWCisgICogICAgIEBhcmcgTENEX0NPTlRSQVNUTEVWRUxfMjogTWF4aW11bSBWb2x0YWdlID0gMi44NlYKKyAgKiAgICAgQGFyZyBMQ0RfQ09OVFJBU1RMRVZFTF8zOiBNYXhpbXVtIFZvbHRhZ2UgPSAyLjk5VgorICAqICAgICBAYXJnIExDRF9DT05UUkFTVExFVkVMXzQ6IE1heGltdW0gVm9sdGFnZSA9IDMuMTJWCisgICogICAgIEBhcmcgTENEX0NPTlRSQVNUTEVWRUxfNTogTWF4aW11bSBWb2x0YWdlID0gMy4yNVYKKyAgKiAgICAgQGFyZyBMQ0RfQ09OVFJBU1RMRVZFTF82OiBNYXhpbXVtIFZvbHRhZ2UgPSAzLjM4VgorICAqICAgICBAYXJnIExDRF9DT05UUkFTVExFVkVMXzc6IE1heGltdW0gVm9sdGFnZSA9IDMuNTFWCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9DT05UUkFTVF9DT05GSUcoX19IQU5ETEVfXywgX19DT05UUkFTVF9fKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1PRElGWV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RkNSLCBMQ0RfRkNSX0NDLCAoX19DT05UUkFTVF9fKSk7ICBcCisgICAgICAgICAgICBMQ0RfV2FpdEZvclN5bmNocm8oX19IQU5ETEVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9IHdoaWxlKDApIAorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTENEIEJsaW5rIG1vZGUgYW5kIEJsaW5rIGZyZXF1ZW5jeS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEBwYXJhbSAgX19CTElOS01PREVfXyBzcGVjaWZpZXMgdGhlIExDRCBibGluayBtb2RlLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBMQ0RfQkxJTktNT0RFX09GRjogICAgICAgICAgIEJsaW5rIGRpc2FibGVkCisgICogICAgIEBhcmcgTENEX0JMSU5LTU9ERV9TRUcwX0NPTTA6ICAgICBCbGluayBlbmFibGVkIG9uIFNFR1swXSwgQ09NWzBdICgxIHBpeGVsKQorICAqICAgICBAYXJnIExDRF9CTElOS01PREVfU0VHMF9BTExDT006ICAgQmxpbmsgZW5hYmxlZCBvbiBTRUdbMF0sIGFsbCBDT00gKHVwIHRvIDggCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMgYWNjb3JkaW5nIHRvIHRoZSBwcm9ncmFtbWVkIGR1dHkpCisgICogICAgIEBhcmcgTENEX0JMSU5LTU9ERV9BTExTRUdfQUxMQ09NOiBCbGluayBlbmFibGVkIG9uIGFsbCBTRUcgYW5kIGFsbCBDT00gCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsIHBpeGVscykKKyAgKiBAcGFyYW0gIF9fQkxJTktGUkVRVUVOQ1lfXyBzcGVjaWZpZXMgdGhlIExDRCBibGluayBmcmVxdWVuY3kuCisgICogICAgIEBhcmcgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjg6ICAgIFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTGNkLzgKKyAgKiAgICAgQGFyZyBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWMTY6ICAgVGhlIEJsaW5rIGZyZXF1ZW5jeSA9IGZMY2QvMTYKKyAgKiAgICAgQGFyZyBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWMzI6ICAgVGhlIEJsaW5rIGZyZXF1ZW5jeSA9IGZMY2QvMzIKKyAgKiAgICAgQGFyZyBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWNjQ6ICAgVGhlIEJsaW5rIGZyZXF1ZW5jeSA9IGZMY2QvNjQgCisgICogICAgIEBhcmcgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjEyODogIFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTGNkLzEyOAorICAqICAgICBAYXJnIExDRF9CTElOS0ZSRVFVRU5DWV9ESVYyNTY6ICBUaGUgQmxpbmsgZnJlcXVlbmN5ID0gZkxjZC8yNTYKKyAgKiAgICAgQGFyZyBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWNTEyOiAgVGhlIEJsaW5rIGZyZXF1ZW5jeSA9IGZMY2QvNTEyCisgICogICAgIEBhcmcgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjEwMjQ6IFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTGNkLzEwMjQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0JMSU5LX0NPTkZJRyhfX0hBTkRMRV9fLCBfX0JMSU5LTU9ERV9fLCBfX0JMSU5LRlJFUVVFTkNZX18pICBcCisgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTU9ESUZZX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5GQ1IsIChMQ0RfRkNSX0JMSU5LRiB8IExDRF9GQ1JfQkxJTkspLCAoKF9fQkxJTktNT0RFX18pIHwgKF9fQkxJTktGUkVRVUVOQ1lfXykpKTsgXAorICAgICAgICAgICAgTENEX1dhaXRGb3JTeW5jaHJvKF9fSEFORExFX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9d2hpbGUoMCkKKworLyoqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIExDRCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBMQ0QgaW50ZXJydXB0IHNvdXJjZSB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgTENEX0lUX1NPRjogU3RhcnQgb2YgRnJhbWUgSW50ZXJydXB0CisgICogICAgIEBhcmcgTENEX0lUX1VERDogVXBkYXRlIERpc3BsYXkgRG9uZSBJbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RkNSLCAoX19JTlRFUlJVUFRfXykpOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENEX1dhaXRGb3JTeW5jaHJvKF9fSEFORExFX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKSAgICAgICAgIAorI2RlZmluZSBfX0hBTF9MQ0RfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkZDUiwgKF9fSU5URVJSVVBUX18pKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ0RfV2FpdEZvclN5bmNocm8oX19IQU5ETEVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDApCisKKy8qKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgTENEIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JVF9fIHNwZWNpZmllcyB0aGUgTENEIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgIEBhcmcgTENEX0lUX1NPRjogU3RhcnQgb2YgRnJhbWUgSW50ZXJydXB0CisgICogICAgICAgIEBhcmcgTENEX0lUX1VERDogVXBkYXRlIERpc3BsYXkgRG9uZSBJbnRlcnJ1cHQuCisgICogQG5vdGUgSWYgdGhlIGRldmljZSBpcyBpbiBTVE9QIG1vZGUgKFBDTEsgbm90IHByb3ZpZGVkKSBVREQgd2lsbCBub3QgCisgICogICAgICAgICAgZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGV2ZW4gaWYgVURESUUgPSAxLiAKKyAgKiAgICAgICAgICBJZiB0aGUgZGlzcGxheSBpcyBub3QgZW5hYmxlZCB0aGUgVUREIGludGVycnVwdCB3aWxsIG5ldmVyIG9jY3VyLgorICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSVRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5GQ1IpICYgKF9fSVRfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgTENEIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICBAYXJnIExDRF9GTEFHX0VOUzogTENEIEVuYWJsZWQgZmxhZy4gSXQgaW5kaWNhdGVzIHRoZSBMQ0QgY29udHJvbGxlciBzdGF0dXMuCisgICogQG5vdGUgIFRoZSBFTlMgYml0IGlzIHNldCBpbW1lZGlhdGVseSB3aGVuIHRoZSBMQ0RFTiBiaXQgaW4gdGhlIExDRF9DUiAKKyAgKiAgICAgICAgICAgICBnb2VzIGZyb20gMCB0byAxLiBPbiBkZWFjdGl2YXRpb24gaXQgcmVmbGVjdHMgdGhlIHJlYWwgc3RhdHVzIG9mIAorICAqICAgICAgICAgICAgIExDRCBzbyBpdCBiZWNvbWVzIDAgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBkaXNwbGF5ZWQgZnJhbWUuICAKKyAgKiAgICAgICAgQGFyZyBMQ0RfRkxBR19TT0Y6IFN0YXJ0IG9mIEZyYW1lIGZsYWcuIFRoaXMgZmxhZyBpcyBzZXQgYnkgaGFyZHdhcmUgYXQgCisgICogICAgICAgICAgICAgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBmcmFtZSwgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgZGlzcGxheSBkYXRhIGlzIAorICAqICAgICAgICAgICAgIHVwZGF0ZWQuCisgICogICAgICAgIEBhcmcgTENEX0ZMQUdfVURSOiBVcGRhdGUgRGlzcGxheSBSZXF1ZXN0IGZsYWcuCisgICogICAgICAgIEBhcmcgTENEX0ZMQUdfVUREOiBVcGRhdGUgRGlzcGxheSBEb25lIGZsYWcuIAorICAqICAgICAgICBAYXJnIExDRF9GTEFHX1JEWTogU3RlcF91cCBjb252ZXJ0ZXIgUmVhZHkgZmxhZy4gSXQgaW5kaWNhdGVzIHRoZSBzdGF0dXMgCisgICogICAgICAgICAgICAgb2YgdGhlIHN0ZXAtdXAgY29udmVydGVyLgorICAqICAgICAgICBAYXJnIExDRF9GTEFHX0ZDUlNGOiBMQ0QgRnJhbWUgQ29udHJvbCBSZWdpc3RlciBTeW5jaHJvbml6YXRpb24gRmxhZy4gCisgICogICAgICAgICAgICAgVGhpcyBmbGFnIGlzIHNldCBieSBoYXJkd2FyZSBlYWNoIHRpbWUgdGhlIExDRF9GQ1IgcmVnaXN0ZXIgaXMgdXBkYXRlZCAKKyAgKiAgICAgICAgICAgICBpbiB0aGUgTENEQ0xLIGRvbWFpbi4gCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkgICAKKworLyoqIEBicmllZiAgQ2xlYXJzIHRoZSBzcGVjaWZpZWQgTENEIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICBAYXJnIExDRF9GTEFHX1NPRjogU3RhcnQgb2YgRnJhbWUgSW50ZXJydXB0CisgICogICAgICAgIEBhcmcgTENEX0ZMQUdfVUREOiBVcGRhdGUgRGlzcGxheSBEb25lIEludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MQ0RfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DTFIgPSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0V4cG9ydGVkX0Z1bmN0aW9ucyBMQ0QgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gbWV0aG9kcworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIG1ldGhvZHMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0xDRF9EZUluaXQoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9MQ0RfSW5pdChMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX0xDRF9Nc3BJbml0KExDRF9IYW5kbGVUeXBlRGVmICpobGNkKTsKK3ZvaWQgICAgICAgICAgICAgICAgICBIQUxfTENEX01zcERlSW5pdChMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIG1ldGhvZHMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9MQ0RfV3JpdGUoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QsIHVpbnQzMl90IFJBTVJlZ2lzdGVySW5kZXgsIHVpbnQzMl90IFJBTVJlZ2lzdGVyTWFzaywgdWludDMyX3QgRGF0YSk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0xDRF9DbGVhcihMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0xDRF9VcGRhdGVEaXNwbGF5UmVxdWVzdChMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBtZXRob2RzCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBtZXRob2RzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9MQ0RfU3RhdGVUeXBlRGVmICBIQUxfTENEX0dldFN0YXRlKExDRF9IYW5kbGVUeXBlRGVmICpobGNkKTsKK3VpbnQzMl90ICAgICAgICAgICAgICBIQUxfTENEX0dldEVycm9yKExDRF9IYW5kbGVUeXBlRGVmICpobGNkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIExDRF9Qcml2YXRlCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICBMQ0RfV2FpdEZvclN5bmNocm8oTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBEZWZpbmUgdGhlIHByaXZhdGUgZ3JvdXAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIExDRF9Qcml2YXRlIExDRCBQcml2YXRlCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBTVE0zMkwwNTN4eCB8fCBTVE0zMkwwNjN4eCB8fCBTVE0zMkwwNzN4eCB8fCBTVE0zMkwwODN4eCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfSEFMX0xDRF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2xwdGltLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9scHRpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTE2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9scHRpbS5oCkBAIC0wLDAgKzEsNzI1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9scHRpbS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBMUFRJTSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9IQUxfTFBUSU1fSAorI2RlZmluZSBTVE0zMkwweHhfSEFMX0xQVElNX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChMUFRJTTEpCisKKy8qKiBAYWRkdG9ncm91cCBMUFRJTQorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX1R5cGVzIExQVElNIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTFBUSU1fRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UICBFWFRJX0lNUl9JTTI5ICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDI5IENvbm5lY3RlZCB0byB0aGUgTFBUSU0gRVhUSSBMaW5lICovCisKKy8qKgorICAqIEBicmllZiAgTFBUSU0gQ2xvY2sgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTb3VyY2U7ICAgICAgICAgLyohPCBTZWxlY3RzIHRoZSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0Nsb2NrX1NvdXJjZSAgICovCisKKyAgdWludDMyX3QgUHJlc2NhbGVyOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb3VudGVyIGNsb2NrIFByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fQ2xvY2tfUHJlc2NhbGVyICovCisKK30gTFBUSU1fQ2xvY2tDb25maWdUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIExQVElNIENsb2NrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUG9sYXJpdHk7ICAgICAgLyohPCBTZWxlY3RzIHRoZSBwb2xhcml0eSBvZiB0aGUgYWN0aXZlIGVkZ2UgZm9yIHRoZSBjb3VudGVyIHVuaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBVTFBUSU0gaW5wdXQgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIG9ubHkgd2hlbiBVbHRyYSBsb3cgcG93ZXIgY2xvY2sgc291cmNlIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJZiB0aGUgcG9sYXJpdHkgaXMgY29uZmlndXJlZCBvbiAnYm90aCBlZGdlcycsIGFuIGF1eGlsaWFyeSBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uZSBvZiB0aGUgTG93IHBvd2VyIG9zY2lsbGF0b3IpIG11c3QgYmUgYWN0aXZlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9DbG9ja19Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IFNhbXBsZVRpbWU7ICAgICAvKiE8IFNlbGVjdHMgdGhlIGNsb2NrIHNhbXBsaW5nIHRpbWUgdG8gY29uZmlndXJlIHRoZSBjbG9jayBnbGl0Y2ggZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IHdoZW4gVWx0cmEgbG93IHBvd2VyIGNsb2NrIHNvdXJjZSBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9DbG9ja19TYW1wbGVfVGltZSAqLworCit9IExQVElNX1VMUENsb2NrQ29uZmlnVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBMUFRJTSBUcmlnZ2VyIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgU291cmNlOyAgICAgICAgLyohPCBTZWxlY3RzIHRoZSBUcmlnZ2VyIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9UcmlnZ2VyX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEFjdGl2ZUVkZ2U7ICAgIC8qITwgU2VsZWN0cyB0aGUgVHJpZ2dlciBhY3RpdmUgZWRnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IHdoZW4gYW4gZXh0ZXJuYWwgdHJpZ2dlciBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0V4dGVybmFsX1RyaWdnZXJfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBTYW1wbGVUaW1lOyAgICAvKiE8IFNlbGVjdHMgdGhlIHRyaWdnZXIgc2FtcGxpbmcgdGltZSB0byBjb25maWd1cmUgdGhlIGNsb2NrIGdsaXRjaCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgb25seSB3aGVuIGFuIGV4dGVybmFsIHRyaWdnZXIgaXMgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9UcmlnZ2VyX1NhbXBsZV9UaW1lICAqLworfSBMUFRJTV9UcmlnZ2VyQ29uZmlnVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBMUFRJTSBJbml0aWFsaXphdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgTFBUSU1fQ2xvY2tDb25maWdUeXBlRGVmICAgICBDbG9jazsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgcGFyYW1ldGVycyAqLworCisgIExQVElNX1VMUENsb2NrQ29uZmlnVHlwZURlZiAgVWx0cmFMb3dQb3dlckNsb2NrOyAgLyohPCBTcGVjaWZpZXMgdGhlIFVsdHJhIExvdyBQb3dlciBjbG9jayBwYXJhbWV0ZXJzICovCisKKyAgTFBUSU1fVHJpZ2dlckNvbmZpZ1R5cGVEZWYgICBUcmlnZ2VyOyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVHJpZ2dlciBwYXJhbWV0ZXJzICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBPdXRwdXRQb2xhcml0eTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgT3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fT3V0cHV0X1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBVcGRhdGVNb2RlOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cGRhdGUgb2YgdGhlIGF1dG9yZWxvYWQgYW5kIHRoZSBjb21wYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGlzIGRvbmUgaW1tZWRpYXRlbHkgb3IgYWZ0ZXIgdGhlIGVuZCBvZiBjdXJyZW50IHBlcmlvZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX1VwZGF0aW5nX01vZGUgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIENvdW50ZXJTb3VyY2U7ICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZWFjaCBpbnRlcm5hbCBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGVhY2ggZXh0ZXJuYWwgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9Db3VudGVyX1NvdXJjZSAqLworfSBMUFRJTV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgTFBUSU0gU3RhdGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfTFBUSU1fU1RBVEVfUkVTRVQgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFBlcmlwaGVyYWwgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8KKyAgSEFMX0xQVElNX1NUQVRFX1JFQURZICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9MUFRJTV9TVEFURV9CVVNZICAgICAgICAgICAgID0gMHgwMlUsICAgIC8qITwgQW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAqLworICBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX1NUQVRFX0VSUk9SICAgICAgICAgICAgPSAweDA0VSAgICAgLyohPCBJbnRlcm5hbCBQcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICovCit9IEhBTF9MUFRJTV9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgTFBUSU0gaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit0eXBlZGVmIHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit7CisgIExQVElNX1R5cGVEZWYgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgKi8KKworICBMUFRJTV9Jbml0VHlwZURlZiAgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgLyohPCBMUFRJTSByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisKKyAgSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgICAgICAgIFN0YXR1czsgICAgICAgICAgIC8qITwgTFBUSU0gcGVyaXBoZXJhbCBzdGF0dXMgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiE8IExQVElNIGxvY2tpbmcgb2JqZWN0ICAgICAgKi8KKworICBfX0lPICBIQUxfTFBUSU1fU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgICAgICAgLyohPCBMUFRJTSBwZXJpcGhlcmFsIHN0YXRlICAgICovCisKKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAgICAgICAgICAgLyohPCBMUFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgICAgICAgICAvKiE8IExQVElNIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogQ29tcGFyZU1hdGNoQ2FsbGJhY2spKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAgICAgIC8qITwgQ29tcGFyZSBtYXRjaCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBBdXRvUmVsb2FkTWF0Y2hDYWxsYmFjaykoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgICAgLyohPCBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIFRyaWdnZXJDYWxsYmFjaykoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgICAgICAgICAgICAvKiE8IEV4dGVybmFsIHRyaWdnZXIgZXZlbnQgZGV0ZWN0aW9uIENhbGxiYWNrICAgICovCisgIHZvaWQgKCogQ29tcGFyZVdyaXRlQ2FsbGJhY2spKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAgICAgIC8qITwgQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayAgICAgKi8KKyAgdm9pZCAoKiBBdXRvUmVsb2FkV3JpdGVDYWxsYmFjaykoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgICAgLyohPCBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayAqLworICB2b2lkICgqIERpcmVjdGlvblVwQ2FsbGJhY2spKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAgICAgICAvKiE8IFVwLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgICAgICAgICovCisgIHZvaWQgKCogRGlyZWN0aW9uRG93bkNhbGxiYWNrKShzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgICAgIC8qITwgRG93bi1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrICAgICAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfSBMUFRJTV9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBMUFRJTSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBMUFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCAgICAgICAgPSAweDAxVSwgICAgLyohPCBMUFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX0NPTVBBUkVfTUFUQ0hfQ0JfSUQgICAgPSAweDAyVSwgICAgLyohPCBDb21wYXJlIG1hdGNoIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX0FVVE9SRUxPQURfTUFUQ0hfQ0JfSUQgPSAweDAzVSwgICAgLyohPCBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayBJRCAgICAgKi8KKyAgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgICAgPSAweDA1VSwgICAgLyohPCBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX0xQVElNX0FVVE9SRUxPQURfV1JJVEVfQ0JfSUQgPSAweDA2VSwgICAgLyohPCBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRCAgKi8KKyAgSEFMX0xQVElNX0RJUkVDVElPTl9VUF9DQl9JRCAgICAgPSAweDA3VSwgICAgLyohPCBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElEICAgICAgICAgKi8KKyAgSEFMX0xQVElNX0RJUkVDVElPTl9ET1dOX0NCX0lEICAgPSAweDA4VSwgICAgLyohPCBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgSUQgICAgICAgKi8KK30gSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBUSU0gQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcExQVElNX0NhbGxiYWNrVHlwZURlZikoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgIC8qITwgcG9pbnRlciB0byB0aGUgTFBUSU0gY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFRJTV9FeHBvcnRlZF9Db25zdGFudHMgTFBUSU0gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9DbG9ja19Tb3VyY2UgTFBUSU0gQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTT1VSQ0VfQVBCQ0xPQ0tfTFBPU0MgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX0NLU0VMCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0Nsb2NrX1ByZXNjYWxlciBMUFRJTSBDbG9jayBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFU0NfMAorI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQ18xCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9QUkVTQ18wIHwgTFBUSU1fQ0ZHUl9QUkVTQ18xKQorI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWMTYgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQ18yCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVYzMiAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9QUkVTQ18wIHwgTFBUSU1fQ0ZHUl9QUkVTQ18yKQorI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWNjQgICAgICAgICAgICAgICAgICAgKExQVElNX0NGR1JfUFJFU0NfMSB8IExQVElNX0NGR1JfUFJFU0NfMikKKyNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjEyOCAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFU0MKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fT3V0cHV0X1BvbGFyaXR5IExQVElNIE91dHB1dCBQb2xhcml0eQorICAqIEB7CisgICovCisKKyNkZWZpbmUgTFBUSU1fT1VUUFVUUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX09VVFBVVFBPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1dBVlBPTAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9DbG9ja19TYW1wbGVfVGltZSBMUFRJTSBDbG9jayBTYW1wbGUgVGltZQorICAqIEB7CisgICovCisjZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8wCisjZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV80VFJBTlNJVElPTlMgICAgICBMUFRJTV9DRkdSX0NLRkxUXzEKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUyAgICAgIExQVElNX0NGR1JfQ0tGTFQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fQ2xvY2tfUG9sYXJpdHkgTFBUSU0gQ2xvY2sgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORyAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tQT0xfMAorI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HICAgICAgTFBUSU1fQ0ZHUl9DS1BPTF8xCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX1RyaWdnZXJfU291cmNlIExQVElNIFRyaWdnZXIgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSAgICAgICAgICAgICAgIDB4MDAwMEZGRkZVCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzEgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMXzAKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV8yICAgICAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8xCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfMyAgICAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzAgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMSkKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV80ICAgICAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8yCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfNSAgICAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzAgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMikKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV82ICAgICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMSB8IExQVElNX0NGR1JfVFJJR1NFTF8yKQorI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzcgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0V4dGVybmFsX1RyaWdnZXJfUG9sYXJpdHkgTFBUSU0gRXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExQVElNX0FDVElWRUVER0VfUklTSU5HICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR0VOXzAKKyNkZWZpbmUgTFBUSU1fQUNUSVZFRURHRV9GQUxMSU5HICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHRU5fMQorI2RlZmluZSBMUFRJTV9BQ1RJVkVFREdFX1JJU0lOR19GQUxMSU5HICAgICAgICBMUFRJTV9DRkdSX1RSSUdFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9UcmlnZ2VyX1NhbXBsZV9UaW1lIExQVElNIFRyaWdnZXIgU2FtcGxlIFRpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTlMgICAgICBMUFRJTV9DRkdSX1RSR0ZMVF8wCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUyAgICAgIExQVElNX0NGR1JfVFJHRkxUXzEKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fVXBkYXRpbmdfTW9kZSBMUFRJTSBVcGRhdGluZyBNb2RlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9VUERBVEVfSU1NRURJQVRFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fVVBEQVRFX0VORE9GUEVSSU9EICAgICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFTE9BRAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9Db3VudGVyX1NvdXJjZSBMUFRJTSBDb3VudGVyIFNvdXJjZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgTFBUSU1fQ09VTlRFUlNPVVJDRV9JTlRFUk5BTCAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX0NPVU5URVJTT1VSQ0VfRVhURVJOQUwgICAgICAgICAgICBMUFRJTV9DRkdSX0NPVU5UTU9ERQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9GbGFnX0RlZmluaXRpb24gTFBUSU0gRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisKKyNkZWZpbmUgTFBUSU1fRkxBR19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfRE9XTgorI2RlZmluZSBMUFRJTV9GTEFHX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9VUAorI2RlZmluZSBMUFRJTV9GTEFHX0FSUk9LICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9BUlJPSworI2RlZmluZSBMUFRJTV9GTEFHX0NNUE9LICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9DTVBPSworI2RlZmluZSBMUFRJTV9GTEFHX0VYVFRSSUcgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9FWFRUUklHCisjZGVmaW5lIExQVElNX0ZMQUdfQVJSTSAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX0FSUk0KKyNkZWZpbmUgTFBUSU1fRkxBR19DTVBNICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfQ01QTQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9JbnRlcnJ1cHRzX0RlZmluaXRpb24gTFBUSU0gSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9JVF9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9ET1dOSUUKKyNkZWZpbmUgTFBUSU1fSVRfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfVVBJRQorI2RlZmluZSBMUFRJTV9JVF9BUlJPSyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9BUlJPS0lFCisjZGVmaW5lIExQVElNX0lUX0NNUE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0NNUE9LSUUKKyNkZWZpbmUgTFBUSU1fSVRfRVhUVFJJRyAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfRVhUVFJJR0lFCisjZGVmaW5lIExQVElNX0lUX0FSUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0FSUk1JRQorI2RlZmluZSBMUFRJTV9JVF9DTVBNICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9DTVBNSUUKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX01hY3JvcyBMUFRJTSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IExQVElNIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX0xQVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlICAgICAgICAgICAgID0gSEFMX0xQVElNX1NUQVRFX1JFU0VUOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayAgID0gTlVMTDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0xQVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0VOQUJMRShfX0hBTkRMRV9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoTFBUSU1fQ1JfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBMUFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKKyAgKiBAbm90ZSAgIFRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgcmVxdWlyZWQgdG8gc29sdmUgTFBUSU0gZGlzYWJsZSBIVyBsaW1pdGF0aW9uLgorICAqICAgICAgICAgUGxlYXNlIGNoZWNrIEVycmF0YSBTaGVldCBFUzAzMzUgZm9yIG1vcmUgZGV0YWlscyB1bmRlciAiTUNVIG1heSByZW1haW4KKyAgKiAgICAgICAgIHN0dWNrIGluIExQVElNIGludGVycnVwdCB3aGVuIGVudGVyaW5nIFN0b3AgbW9kZSIgc2VjdGlvbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fRElTQUJMRShfX0hBTkRMRV9fKSAgIExQVElNX0Rpc2FibGUoX19IQU5ETEVfXykKKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gcGVyaXBoZXJhbCBpbiBDb250aW51b3VzIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIExQVElNX0NSX0NOVFNUUlQpCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBwZXJpcGhlcmFsIGluIHNpbmdsZSBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fU1RBUlRfU0lOR0xFKF9fSEFORExFX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBMUFRJTV9DUl9TTkdTVFJUKQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGluIHRoZSBBdXRvcmVsb2FkIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBBdXRvcmVsb2FkIHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKF9fSEFORExFX18gLCBfX1ZBTFVFX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QVJSID0gIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGluIHRoZSBDb21wYXJlIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBDb21wYXJlIHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKF9fSEFORExFX18gLCBfX1ZBTFVFX18pICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q01QID0gIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBMUFRJTSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gTFBUSU0gZmxhZyB0byBjaGVjaworICAqICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2Y6CisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfRE9XTiAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSB1cCBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX1VQICAgICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgZG93biB0byB1cCBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0FSUk9LICAgOiBBdXRvcmVsb2FkIHJlZ2lzdGVyIHVwZGF0ZSBPSyBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0NNUE9LICAgOiBDb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBPSyBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0VYVFRSSUcgOiBFeHRlcm5hbCB0cmlnZ2VyIGVkZ2UgZXZlbnQgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19BUlJNICAgIDogQXV0b3JlbG9hZCBtYXRjaCBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0NNUE0gICAgOiBDb21wYXJlIG1hdGNoIEZsYWcuCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBmbGFnIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJihfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBMUFRJTSBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBMUFRJTSBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2Y6CisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfRE9XTiAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSB1cCBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX1VQICAgICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgZG93biB0byB1cCBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0FSUk9LICAgOiBBdXRvcmVsb2FkIHJlZ2lzdGVyIHVwZGF0ZSBPSyBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0NNUE9LICAgOiBDb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBPSyBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0VYVFRSSUcgOiBFeHRlcm5hbCB0cmlnZ2VyIGVkZ2UgZXZlbnQgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19BUlJNICAgIDogQXV0b3JlbG9hZCBtYXRjaCBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0NNUE0gICAgOiBDb21wYXJlIG1hdGNoIEZsYWcuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiAgPSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIExQVElNIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBMUFRJTSBpbnRlcnJ1cHQgdG8gc2V0LgorICAqICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2Y6CisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0RPV04gICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9VUCAgICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9BUlJPSyAgIDogQXV0b3JlbG9hZCByZWdpc3RlciB1cGRhdGUgT0sgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9DTVBPSyAgIDogQ29tcGFyZSByZWdpc3RlciB1cGRhdGUgT0sgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9FWFRUUklHIDogRXh0ZXJuYWwgdHJpZ2dlciBlZGdlIGV2ZW50IEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQVJSTSAgICA6IEF1dG9yZWxvYWQgbWF0Y2ggSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9DTVBNICAgIDogQ29tcGFyZSBtYXRjaCBJbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiAgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBMUFRJTSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gTFBUSU0gaW50ZXJydXB0IHRvIHNldC4KKyAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mOgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9ET1dOICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIHVwIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfVVAgICAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSBkb3duIHRvIHVwIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQVJST0sgICA6IEF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIE9LIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQ01QT0sgICA6IENvbXBhcmUgcmVnaXN0ZXIgdXBkYXRlIE9LIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfRVhUVFJJRyA6IEV4dGVybmFsIHRyaWdnZXIgZWRnZSBldmVudCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0FSUk0gICAgOiBBdXRvcmVsb2FkIG1hdGNoIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQ01QTSAgICA6IENvbXBhcmUgbWF0Y2ggSW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgICY9ICh+KF9fSU5URVJSVVBUX18pKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgTFBUSU0gaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBMUFRJTSBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZjoKKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfRE9XTiAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSB1cCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX1VQICAgICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgZG93biB0byB1cCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0FSUk9LICAgOiBBdXRvcmVsb2FkIHJlZ2lzdGVyIHVwZGF0ZSBPSyBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0NNUE9LICAgOiBDb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBPSyBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0VYVFRSSUcgOiBFeHRlcm5hbCB0cmlnZ2VyIGVkZ2UgZXZlbnQgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9BUlJNICAgIDogQXV0b3JlbG9hZCBtYXRjaCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0NNUE0gICAgOiBDb21wYXJlIG1hdGNoIEludGVycnVwdC4KKyAgKiBAcmV0dmFsIEludGVycnVwdCBzdGF0dXMuCisgICovCisKKyNkZWZpbmUgX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0IG9uIHRoZSBMUFRJTSBXYWtlLXVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpICAgICAgIChFWFRJLT5JTVIgfD0gTFBUSU1fRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0IG9uIHRoZSBMUFRJTSBXYWtlLXVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIChFWFRJLT5JTVIgJj0gfihMUFRJTV9FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBldmVudCBvbiB0aGUgTFBUSU0gV2FrZS11cCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0VWRU5UKCkgICAgKEVYVEktPkVNUiB8PSBMUFRJTV9FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBldmVudCBvbiB0aGUgTFBUSU0gV2FrZS11cCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9FVkVOVCgpICAgKEVYVEktPkVNUiAmPSB+KExQVElNX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX0Z1bmN0aW9ucyBMUFRJTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0luaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9EZUluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKworLyogTVNQIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0xQVElNX01zcEluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3ZvaWQgSEFMX0xQVElNX01zcERlSW5pdChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiBTdGFydC9TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBQV00gTW9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0YXJ0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9QV01fU3RhcnRfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9QV01fU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBPbmUgUHVsc2UgTW9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX09uZVB1bHNlX1N0YXJ0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fT25lUHVsc2VfU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX09uZVB1bHNlX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fT25lUHVsc2VfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU2V0IG9uY2UgTW9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1NldE9uY2VfU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9TZXRPbmNlX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9TZXRPbmNlX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fU2V0T25jZV9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRW5jb2RlciBNb2RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFRpbWUgb3V0ICBNb2RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDb3VudGVyIE1vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qIFJlYWRpbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBIQUxfTFBUSU1fUmVhZENvdW50ZXIoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3VpbnQzMl90IEhBTF9MUFRJTV9SZWFkQXV0b1JlbG9hZChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOwordWludDMyX3QgSEFMX0xQVElNX1JlYWRDb21wYXJlKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qIExQVElNIElSUSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9MUFRJTV9JUlFIYW5kbGVyKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qIENhbGxCYWNrIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOwordm9pZCBIQUxfTFBUSU1fQXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3ZvaWQgSEFMX0xQVElNX1RyaWdnZXJDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOwordm9pZCBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3ZvaWQgSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7Cit2b2lkIEhBTF9MUFRJTV9EaXJlY3Rpb25VcENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7Cit2b2lkIEhBTF9MUFRJTV9EaXJlY3Rpb25Eb3duQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9SZWdpc3RlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmxwaHRpbSwgSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBMUFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9VblJlZ2lzdGVyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqbHBodGltLCBIQUxfTFBUSU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9MUFRJTV9TdGF0ZVR5cGVEZWYgSEFMX0xQVElNX0dldFN0YXRlKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfVHlwZXMgTFBUSU0gUHJpdmF0ZSBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfVmFyaWFibGVzIExQVElNIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fUHJpdmF0ZV9Db25zdGFudHMgTFBUSU0gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFRJTV9Qcml2YXRlX01hY3JvcyBMUFRJTSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfU09VUkNFKF9fU09VUkNFX18pICAgICAgICgoKF9fU09VUkNFX18pID09IExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfQVBCQ0xPQ0tfTFBPU0MpKQorCisKKyNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICgoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMSAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjIgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVY0ICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWOCAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjE2ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVYzMiApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWNjQgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjEyOCkpCisKKyNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSRElWMShfX1BSRVNDQUxFUl9fKSAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMSkKKworI2RlZmluZSBJU19MUFRJTV9PVVRQVVRfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgKCgoX19QT0xBUklUWV9fKSA9PSBMUFRJTV9PVVRQVVRQT0xBUklUWV9MT1cgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX09VVFBVVFBPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX0xQVElNX0NMT0NLX1NBTVBMRV9USU1FKF9fU0FNUExFVElNRV9fKSAoKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TQU1QTEVUSU1FX18pID09IExQVElNX0NMT0NLU0FNUExFVElNRV80VFJBTlNJVElPTlMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUykpCisKKyNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICgoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0NMT0NLUE9MQVJJVFlfRkFMTElORykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HKSkKKworI2RlZmluZSBJU19MUFRJTV9UUkdfU09VUkNFKF9fVFJJR19fKSAgICAgICAgICAgKCgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzcpKQorCisjZGVmaW5lIElTX0xQVElNX0VYVF9UUkdfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAoKChfX1BPTEFSSVRZX18pID09IExQVElNX0FDVElWRUVER0VfUklTSU5HICAgICAgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0FDVElWRUVER0VfRkFMTElORyAgICAgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0FDVElWRUVER0VfUklTSU5HX0ZBTExJTkcgKSkKKworI2RlZmluZSBJU19MUFRJTV9UUklHX1NBTVBMRV9USU1FKF9fU0FNUExFVElNRV9fKSAoKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TICAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TICAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TICAgICkpCisKKyNkZWZpbmUgSVNfTFBUSU1fVVBEQVRFX01PREUoX19NT0RFX18pICAgICAgICAgICgoKF9fTU9ERV9fKSA9PSBMUFRJTV9VUERBVEVfSU1NRURJQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gTFBUSU1fVVBEQVRFX0VORE9GUEVSSU9EKSkKKworI2RlZmluZSBJU19MUFRJTV9DT1VOVEVSX1NPVVJDRShfX1NPVVJDRV9fKSAgICAgKCgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCkpCisKKyNkZWZpbmUgSVNfTFBUSU1fQVVUT1JFTE9BRChfX0FVVE9SRUxPQURfXykgICAgICgoX19BVVRPUkVMT0FEX18pIDw9IDB4MDAwMEZGRkZVTCkKKworI2RlZmluZSBJU19MUFRJTV9DT01QQVJFKF9fQ09NUEFSRV9fKSAgICAgICAgICAgKChfX0NPTVBBUkVfXykgPD0gMHgwMDAwRkZGRlVMKQorCisjZGVmaW5lIElTX0xQVElNX1BFUklPRChfX1BFUklPRF9fKSAgICAgICAgICAgICAoKF9fUEVSSU9EX18pIDw9IDB4MDAwMEZGRkZVTCkKKworI2RlZmluZSBJU19MUFRJTV9QVUxTRShfX1BVTFNFX18pICAgICAgICAgICAgICAgKChfX1BVTFNFX18pIDw9IDB4MDAwMEZGRkZVTCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgTFBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLwordm9pZCBMUFRJTV9EaXNhYmxlKExQVElNX0hhbmRsZVR5cGVEZWYgKmxwdGltKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBMUFRJTTEgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkwweHhfSEFMX0xQVElNX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX2xwdGltX2V4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF9scHRpbV9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjQ2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9scHRpbV9leC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9scHRpbV9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBMUFRJTSBFeHRlbmRlZCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9MUFRJTV9FWF9ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9MUFRJTV9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTUV4IExQVElNRXgKKyAgKiBAeworICAqLyAKKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBMUFRJTUV4X0V4cG9ydGVkX0NvbnN0YW50cyBMUFRJTUV4IEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKworLyoqIEBkZWZncm91cCBMUFRJTUV4X1RyaWdnZXJfU291cmNlIExQVElNRXggVHJpZ2dlciBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFICAgICAgICAgICAgICAgMHgwMDAwRkZGRlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IExQVElNIGNvdW50ZXIgdHJpZ2dlcmVkIGJ5IHNvZnR3YXJlKi8KKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV8wICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMUFRJTSBjb3VudGVyIHRyaWdnZXJlZCBieSBHUElPIChhbHRlcm5hdGUgZnVuY3Rpb24gTFBUSU1fRVRSKSAqLworI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzEgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IExQVElNIGNvdW50ZXIgdHJpZ2dlcmVkIGJ5IFJUQyBhbGFybSBBICovCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfMiAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTFBUSU0gY291bnRlciB0cmlnZ2VyZWQgYnkgUlRDIGFsYXJtIEIgKi8KKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV8zICAgICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMCB8IExQVElNX0NGR1JfVFJJR1NFTF8xKSAgLyohPCBMUFRJTSBjb3VudGVyIHRyaWdnZXJlZCBieSBSVENfVEFNUDEgaW5wdXQgZGV0ZWN0aW9uICovCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfNCAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTFBUSU0gY291bnRlciB0cmlnZ2VyZWQgYnkgUlRDX1RBTVAyIGlucHV0IGRldGVjdGlvbiAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV81ICAgICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMCB8IExQVElNX0NGR1JfVFJJR1NFTF8yKSAgLyohPCBMUFRJTSBjb3VudGVyIHRyaWdnZXJlZCBieSBSVENfVEFNUDMgaW5wdXQgZGV0ZWN0aW9uICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfNiAgICAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzEgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMikgIC8qITwgTFBUSU0gY291bnRlciB0cmlnZ2VyZWQgYnkgQ09NUDFfT1VUICovCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfNyAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTFBUSU0gY291bnRlciB0cmlnZ2VyZWQgYnkgQ09NUDJfT1VUICovCisjZW5kaWYgLyogQ09NUDEgJiYgQ09NUDIgKi8KKy8qKgorICAqIEB9CisgICovCisKKyAvKioKKyAgKiBAfQorICAqLworCisgICAvKiogQGFkZHRvZ3JvdXAgTFBUSU1FeF9Qcml2YXRlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpICYmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIElTX0xQVElNX1RSR19TT1VSQ0UoX19UUklHX18pICAgICAgICAgICAoKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNykpCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIElTX0xQVElNX1RSR19TT1VSQ0UoX19UUklHX18pICAgICAgICAgICAoKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNSkpCisjZWxzZQorI2RlZmluZSBJU19MUFRJTV9UUkdfU09VUkNFKF9fVFJJR19fKSAgICAgICAgICAgKCgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzcpKQorI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgJiYgQ09NUDEgJiYgQ09NUDIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfTFBUSU1fRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9wY2QuaCBiL0luYy9zdG0zMmwweHhfaGFsX3BjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OGFlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9wY2QuaApAQCAtMCwwICsxLDk4NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfcGNkLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFBDRCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9IQUxfUENEX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9QQ0RfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3VzYi5oIgorCisjaWYgZGVmaW5lZCAoVVNCKQorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUENECisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX1R5cGVzIFBDRCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUENEIFN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1BDRF9TVEFURV9SRVNFVCAgID0gMHgwMCwKKyAgSEFMX1BDRF9TVEFURV9SRUFEWSAgID0gMHgwMSwKKyAgSEFMX1BDRF9TVEFURV9FUlJPUiAgID0gMHgwMiwKKyAgSEFMX1BDRF9TVEFURV9CVVNZICAgID0gMHgwMywKKyAgSEFMX1BDRF9TVEFURV9USU1FT1VUID0gMHgwNAorfSBQQ0RfU3RhdGVUeXBlRGVmOworCisvKiBEZXZpY2UgTFBNIHN1c3BlbmQgc3RhdGUgKi8KK3R5cGVkZWYgZW51bQoreworICBMUE1fTDAgPSAweDAwLCAvKiBvbiAqLworICBMUE1fTDEgPSAweDAxLCAvKiBMUE0gTDEgc2xlZXAgKi8KKyAgTFBNX0wyID0gMHgwMiwgLyogc3VzcGVuZCAqLworICBMUE1fTDMgPSAweDAzLCAvKiBvZmYgKi8KK30gUENEX0xQTV9TdGF0ZVR5cGVEZWY7CisKK3R5cGVkZWYgZW51bQoreworICBQQ0RfTFBNX0wwX0FDVElWRSA9IDB4MDAsIC8qIG9uICovCisgIFBDRF9MUE1fTDFfQUNUSVZFID0gMHgwMSwgLyogTFBNIEwxIHNsZWVwICovCit9IFBDRF9MUE1fTXNnVHlwZURlZjsKKwordHlwZWRlZiBlbnVtCit7CisgIFBDRF9CQ0RfRVJST1IgICAgICAgICAgICAgICAgICAgICA9IDB4RkYsCisgIFBDRF9CQ0RfQ09OVEFDVF9ERVRFQ1RJT04gICAgICAgICA9IDB4RkUsCisgIFBDRF9CQ0RfU1REX0RPV05TVFJFQU1fUE9SVCAgICAgICA9IDB4RkQsCisgIFBDRF9CQ0RfQ0hBUkdJTkdfRE9XTlNUUkVBTV9QT1JUICA9IDB4RkMsCisgIFBDRF9CQ0RfREVESUNBVEVEX0NIQVJHSU5HX1BPUlQgICA9IDB4RkIsCisgIFBDRF9CQ0RfRElTQ09WRVJZX0NPTVBMRVRFRCAgICAgICA9IDB4MDAsCisKK30gUENEX0JDRF9Nc2dUeXBlRGVmOworCisKKworCisKK3R5cGVkZWYgVVNCX1R5cGVEZWYgICAgICAgIFBDRF9UeXBlRGVmOwordHlwZWRlZiBVU0JfQ2ZnVHlwZURlZiAgICAgUENEX0luaXRUeXBlRGVmOwordHlwZWRlZiBVU0JfRVBUeXBlRGVmICAgICAgUENEX0VQVHlwZURlZjsKKworCisvKioKKyAgKiBAYnJpZWYgIFBDRCBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQordHlwZWRlZiBzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit7CisgIFBDRF9UeXBlRGVmICAgICAgICAgICAgICpJbnN0YW5jZTsgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgKi8KKyAgUENEX0luaXRUeXBlRGVmICAgICAgICAgSW5pdDsgICAgICAgIC8qITwgUENEIHJlcXVpcmVkIHBhcmFtZXRlcnMgICAgICAgICAgICAqLworICBfX0lPIHVpbnQ4X3QgICAgICAgICAgICBVU0JfQWRkcmVzczsgLyohPCBVU0IgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFBDRF9FUFR5cGVEZWYgICAgICAgICAgIElOX2VwWzhdOyAgIC8qITwgSU4gZW5kcG9pbnQgcGFyYW1ldGVycyAgICAgICAgICAgICAqLworICBQQ0RfRVBUeXBlRGVmICAgICAgICAgICBPVVRfZXBbOF07ICAvKiE8IE9VVCBlbmRwb2ludCBwYXJhbWV0ZXJzICAgICAgICAgICAgKi8KKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgTG9jazsgICAgICAgIC8qITwgUENEIHBlcmlwaGVyYWwgc3RhdHVzICAgICAgICAgICAgICAqLworICBfX0lPIFBDRF9TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgLyohPCBQQ0QgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgICAgICovCisgIF9fSU8gIHVpbnQzMl90ICAgICAgICAgIEVycm9yQ29kZTsgICAvKiE8IFBDRCBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdWludDMyX3QgICAgICAgICAgICAgICAgU2V0dXBbMTJdOyAgIC8qITwgU2V0dXAgcGFja2V0IGJ1ZmZlciAgICAgICAgICAgICAgICAqLworICBQQ0RfTFBNX1N0YXRlVHlwZURlZiAgICBMUE1fU3RhdGU7ICAgLyohPCBMUE0gU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgIEJFU0w7CisKKworICB1aW50MzJfdCBscG1fYWN0aXZlOyAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgTGluayBQb3dlciBNYW5hZ2VtZW50IC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUgICAgICAgICovCisKKyAgdWludDMyX3QgYmF0dGVyeV9jaGFyZ2luZ19hY3RpdmU7ICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgQmF0dGVyeSBjaGFyZ2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUgICAgICAgICovCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwRGF0YTsgICAgICAvKiE8IFBvaW50ZXIgdG8gdXBwZXIgc3RhY2sgSGFuZGxlciAqLworCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgdm9pZCAoKiBTT0ZDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNCIE9URyBQQ0QgU09GIGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogU2V0dXBTdGFnZUNhbGxiYWNrKShzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQiBPVEcgUENEIFNldHVwIFN0YWdlIGNhbGxiYWNrICAgICAgICAqLworICB2b2lkICgqIFJlc2V0Q2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0IgT1RHIFBDRCBSZXNldCBjYWxsYmFjayAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBTdXNwZW5kQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNCIE9URyBQQ0QgU3VzcGVuZCBjYWxsYmFjayAgICAgICAgICAgICovCisgIHZvaWQgKCogUmVzdW1lQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQiBPVEcgUENEIFJlc3VtZSBjYWxsYmFjayAgICAgICAgICAgICAqLworICB2b2lkICgqIENvbm5lY3RDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0IgT1RHIFBDRCBDb25uZWN0IGNhbGxiYWNrICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBEaXNjb25uZWN0Q2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNCIE9URyBQQ0QgRGlzY29ubmVjdCBjYWxsYmFjayAgICAgICAgICovCisKKyAgdm9pZCAoKiBEYXRhT3V0U3RhZ2VDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOyAgICAgIC8qITwgVVNCIE9URyBQQ0QgRGF0YSBPVVQgU3RhZ2UgY2FsbGJhY2sgICAgICovCisgIHZvaWQgKCogRGF0YUluU3RhZ2VDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOyAgICAgICAvKiE8IFVTQiBPVEcgUENEIERhdGEgSU4gU3RhZ2UgY2FsbGJhY2sgICAgICAqLworICB2b2lkICgqIElTT09VVEluY29tcGxldGVDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOyAgLyohPCBVU0IgT1RHIFBDRCBJU08gT1VUIEluY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBJU09JTkluY29tcGxldGVDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOyAgIC8qITwgVVNCIE9URyBQQ0QgSVNPIElOIEluY29tcGxldGUgY2FsbGJhY2sgICovCisgIHZvaWQgKCogQkNEQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBQQ0RfQkNEX01zZ1R5cGVEZWYgbXNnKTsgICAgICAvKiE8IFVTQiBPVEcgUENEIEJDRCBjYWxsYmFjayAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIExQTUNhbGxiYWNrKShzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgUENEX0xQTV9Nc2dUeXBlRGVmIG1zZyk7ICAgICAgLyohPCBVU0IgT1RHIFBDRCBMUE0gY2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0IgT1RHIFBDRCBNc3AgSW5pdCBjYWxsYmFjayAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNCIE9URyBQQ0QgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICovCisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IFBDRF9IYW5kbGVUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFBDRCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9wY2RfZXguaCIKKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0NvbnN0YW50cyBQQ0QgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfU3BlZWQgUENEIFNwZWVkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUENEX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICAyVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfUEhZX01vZHVsZSBQQ0QgUEhZIE1vZHVsZQorICAqIEB7CisgICovCisjZGVmaW5lIFBDRF9QSFlfVUxQSSAgICAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgUENEX1BIWV9FTUJFRERFRCAgICAgICAgICAgICAyVQorI2RlZmluZSBQQ0RfUEhZX1VUTUkgICAgICAgICAgICAgICAgIDNVCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBDRF9UdXJuYXJvdW5kX1RpbWVvdXQgVHVybmFyb3VuZCBUaW1lb3V0IFZhbHVlCisgICogQHsKKyAgKi8KKyNpZm5kZWYgVVNCRF9GU19UUkRUX1ZBTFVFCisjZGVmaW5lIFVTQkRfRlNfVFJEVF9WQUxVRSAgICAgICAgICAgNVUKKyNlbmRpZiAvKiBVU0JEX0hTX1RSRFRfVkFMVUUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0Vycm9yX0NvZGVfZGVmaW5pdGlvbiBQQ0QgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBQQ0QgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorI2RlZmluZSAgSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICovCisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9NYWNyb3MgUENEIEV4cG9ydGVkIE1hY3JvcworICogIEBicmllZiBtYWNyb3MgdG8gaGFuZGxlIGludGVycnVwdHMgYW5kIHNwZWNpZmljIGNsb2NrIGNvbmZpZ3VyYXRpb25zCisgKiBAeworICovCisKKworI2RlZmluZSBfX0hBTF9QQ0RfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKVVTQl9FbmFibGVHbG9iYWxJbnQgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpCisjZGVmaW5lIF9fSEFMX1BDRF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpVVNCX0Rpc2FibGVHbG9iYWxJbnQgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpCisjZGVmaW5lIF9fSEFMX1BDRF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgKChVU0JfUmVhZEludGVycnVwdHMoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKKyNkZWZpbmUgX19IQUxfUENEX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTVFIpICY9IH4oX19JTlRFUlJVUFRfXykpCisKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJLT5JTVIgfD0gVVNCX1dBS0VVUF9FWFRJX0xJTkUKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJLT5JTVIgJj0gfihVU0JfV0FLRVVQX0VYVElfTElORSkKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0dFVF9GTEFHKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJLT5QUiAmIChVU0JfV0FLRVVQX0VYVElfTElORSkKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJLT5QUiA9IFVTQl9XQUtFVVBfRVhUSV9MSU5FCisKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSS0+RlRTUiAmPSB+KFVTQl9XQUtFVVBfRVhUSV9MSU5FKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJLT5SVFNSIHw9IFVTQl9XQUtFVVBfRVhUSV9MSU5FOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zIFBDRCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9Jbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGVJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9Nc3BJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9Nc3BEZUluaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKy8qKiBAZGVmZ3JvdXAgSEFMX1BDRF9DYWxsYmFja19JRF9lbnVtZXJhdGlvbl9kZWZpbml0aW9uIEhBTCBVU0IgT1RHIFBDRCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICogQGJyaWVmICBIQUwgVVNCIE9URyBQQ0QgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1BDRF9TT0ZfQ0JfSUQgICAgICAgICAgPSAweDAxLCAgICAgIC8qITwgVVNCIFBDRCBTT0YgY2FsbGJhY2sgSUQgICAgICAgICAgKi8KKyAgSEFMX1BDRF9TRVRVUFNUQUdFX0NCX0lEICAgPSAweDAyLCAgICAgIC8qITwgVVNCIFBDRCBTZXR1cCBTdGFnZSBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX1BDRF9SRVNFVF9DQl9JRCAgICAgICAgPSAweDAzLCAgICAgIC8qITwgVVNCIFBDRCBSZXNldCBjYWxsYmFjayBJRCAgICAgICAgKi8KKyAgSEFMX1BDRF9TVVNQRU5EX0NCX0lEICAgICAgPSAweDA0LCAgICAgIC8qITwgVVNCIFBDRCBTdXNwZW5kIGNhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX1BDRF9SRVNVTUVfQ0JfSUQgICAgICAgPSAweDA1LCAgICAgIC8qITwgVVNCIFBDRCBSZXN1bWUgY2FsbGJhY2sgSUQgICAgICAgKi8KKyAgSEFMX1BDRF9DT05ORUNUX0NCX0lEICAgICAgPSAweDA2LCAgICAgIC8qITwgVVNCIFBDRCBDb25uZWN0IGNhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEICA9IDB4MDcsICAgICAgLyohPCBVU0IgUENEIERpc2Nvbm5lY3QgY2FsbGJhY2sgSUQgICAqLworCisgIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRCAgICAgID0gMHgwOCwgICAgICAvKiE8IFVTQiBQQ0QgTXNwSW5pdCBjYWxsYmFjayBJRCAgICAgICovCisgIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEICAgID0gMHgwOSAgICAgICAvKiE8IFVTQiBQQ0QgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICovCisKK30gSEFMX1BDRF9DYWxsYmFja0lEVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BDRF9DYWxsYmFja19wb2ludGVyX2RlZmluaXRpb24gSEFMIFVTQiBPVEcgUENEIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSEFMIFVTQiBPVEcgUENEIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisKK3R5cGVkZWYgdm9pZCAoKnBQQ0RfQ2FsbGJhY2tUeXBlRGVmKShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYSBjb21tb24gVVNCIE9URyBQQ0QgY2FsbGJhY2sgZnVuY3Rpb24gICovCit0eXBlZGVmIHZvaWQgKCpwUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrVHlwZURlZikoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOyAgICAgICAgLyohPCBwb2ludGVyIHRvIFVTQiBPVEcgUENEIERhdGEgT1VUIFN0YWdlIGNhbGxiYWNrICAgICAqLwordHlwZWRlZiB2b2lkICgqcFBDRF9EYXRhSW5TdGFnZUNhbGxiYWNrVHlwZURlZikoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOyAgICAgICAgIC8qITwgcG9pbnRlciB0byBVU0IgT1RHIFBDRCBEYXRhIElOIFN0YWdlIGNhbGxiYWNrICAgICAgKi8KK3R5cGVkZWYgdm9pZCAoKnBQQ0RfSXNvT3V0SW5jcGx0Q2FsbGJhY2tUeXBlRGVmKShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7ICAgICAgICAvKiE8IHBvaW50ZXIgdG8gVVNCIE9URyBQQ0QgSVNPIE9VVCBJbmNvbXBsZXRlIGNhbGxiYWNrICovCit0eXBlZGVmIHZvaWQgKCpwUENEX0lzb0luSW5jcGx0Q2FsbGJhY2tUeXBlRGVmKShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7ICAgICAgICAgLyohPCBwb2ludGVyIHRvIFVTQiBPVEcgUENEIElTTyBJTiBJbmNvbXBsZXRlIGNhbGxiYWNrICAqLwordHlwZWRlZiB2b2lkICgqcFBDRF9McG1DYWxsYmFja1R5cGVEZWYpKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBQQ0RfTFBNX01zZ1R5cGVEZWYgbXNnKTsgICAgICAgIC8qITwgcG9pbnRlciB0byBVU0IgT1RHIFBDRCBMUE0gY2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgdm9pZCAoKnBQQ0RfQmNkQ2FsbGJhY2tUeXBlRGVmKShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgUENEX0JDRF9Nc2dUeXBlRGVmIG1zZyk7ICAgICAgICAvKiE8IHBvaW50ZXIgdG8gVVNCIE9URyBQQ0QgQkNEIGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgSEFMX1BDRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwUENEX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVyQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIEhBTF9QQ0RfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJEYXRhT3V0U3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9EYXRhT3V0U3RhZ2VDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfRGF0YUluU3RhZ2VDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVySXNvT3V0SW5jcGx0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfSXNvT3V0SW5jcGx0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJJc29PdXRJbmNwbHRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJJc29JbkluY3BsdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0lzb0luSW5jcGx0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJJc29JbkluY3BsdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckJjZENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0JjZENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVyQmNkQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyTHBtQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfTHBtQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJMcG1DYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0YXJ0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfU3RvcChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit2b2lkIEhBTF9QQ0RfSVJRSGFuZGxlcihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK3ZvaWQgSEFMX1BDRF9TT0ZDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit2b2lkIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9SZXNldENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9Db25uZWN0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX0Rpc2Nvbm5lY3RDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK3ZvaWQgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7Cit2b2lkIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7Cit2b2lkIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsKK3ZvaWQgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZDb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGV2RGlzY29ubmVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1NldEFkZHJlc3MoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgYWRkcmVzcyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX09wZW4oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwgdWludDE2X3QgZXBfbXBzLCB1aW50OF90IGVwX3R5cGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9DbG9zZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfUmVjZWl2ZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pOwordWludDMyX3QgICAgICAgICAgSEFMX1BDRF9FUF9HZXRSeENvdW50KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9TZXRTdGFsbChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xyU3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX0ZsdXNoKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9BY3RpdmF0ZVJlbW90ZVdha2V1cChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCitQQ0RfU3RhdGVUeXBlRGVmIEhBTF9QQ0RfR2V0U3RhdGUoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfQ29uc3RhbnRzIFBDRCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIFVTQl9FWFRJX0xpbmVfSW50ZXJydXB0IFVTQiBFWFRJIGxpbmUgaW50ZXJydXB0CisgICogQHsKKyAgKi8KKworCisjZGVmaW5lICBVU0JfV0FLRVVQX0VYVElfTElORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MVUgPDwgMTgpICAvKiE8IFVTQiBGUyBFWFRJIExpbmUgV2FrZVVwIEludGVycnVwdCAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKyNkZWZpbmUgRVBfQUREUl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3VQorCisKKy8qKiBAZGVmZ3JvdXAgUENEX0VQMF9NUFMgUENEIEVQMCBNUFMKKyAgKiBAeworICAqLworI2RlZmluZSBQQ0RfRVAwTVBTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFUDBDVExfTVBTXzY0CisjZGVmaW5lIFBDRF9FUDBNUFNfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVQMENUTF9NUFNfMzIKKyNkZWZpbmUgUENEX0VQME1QU18xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVAwQ1RMX01QU18xNgorI2RlZmluZSBQQ0RfRVAwTVBTXzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFUDBDVExfTVBTXzgKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0VORFAgUENEIEVORFAKKyAgKiBAeworICAqLworI2RlZmluZSBQQ0RfRU5EUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBVCisjZGVmaW5lIFBDRF9FTkRQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgUENEX0VORFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyVQorI2RlZmluZSBQQ0RfRU5EUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNVCisjZGVmaW5lIFBDRF9FTkRQNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNFUKKyNkZWZpbmUgUENEX0VORFA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1VQorI2RlZmluZSBQQ0RfRU5EUDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDZVCisjZGVmaW5lIFBDRF9FTkRQNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgN1UKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0VORFBfS2luZCBQQ0QgRW5kcG9pbnQgS2luZAorICAqIEB7CisgICovCisjZGVmaW5lIFBDRF9TTkdfQlVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFUKKyNkZWZpbmUgUENEX0RCTF9CVUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfTWFjcm9zIFBDRCBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworCisvKioqKioqKioqKioqKioqKioqKiogIEJpdCBkZWZpbml0aW9uIGZvciBVU0JfQ09VTlRuX1JYIHJlZ2lzdGVyICAqKioqKioqKioqKioqLworI2RlZmluZSBVU0JfQ05UUlhfTkJMS19NU0sgICAgICAgICAgICAgICAgICAgICgweDFGVSA8PCAxMCkKKyNkZWZpbmUgVVNCX0NOVFJYX0JMU0laRSAgICAgICAgICAgICAgICAgICAgICAoMHgxVSA8PCAxNSkKKworLyogU2V0RU5EUE9JTlQgKi8KKyNkZWZpbmUgUENEX1NFVF9FTkRQT0lOVChVU0J4LCBiRXBOdW0sIHdSZWdWYWx1ZSkgICgqKF9fSU8gdWludDE2X3QgKikoJihVU0J4KS0+RVAwUiArICgoYkVwTnVtKSAqIDJVKSkgPSAodWludDE2X3QpKHdSZWdWYWx1ZSkpCisKKy8qIEdldEVORFBPSU5UICovCisjZGVmaW5lIFBDRF9HRVRfRU5EUE9JTlQoVVNCeCwgYkVwTnVtKSAgICAgICAgICAgICgqKF9fSU8gdWludDE2X3QgKikoJihVU0J4KS0+RVAwUiArICgoYkVwTnVtKSAqIDJVKSkpCisKKy8qIEVORFBPSU5UIHRyYW5zZmVyICovCisjZGVmaW5lIFVTQl9FUDBTdGFydFhmZXIgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9FUFN0YXJ0WGZlcgorCisvKioKKyAgKiBAYnJpZWYgIHNldHMgdGhlIHR5cGUgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyKGJpdHMgRVBfVFlQRVsxOjBdKQorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIHdUeXBlIEVuZHBvaW50IFR5cGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBUWVBFKFVTQngsIGJFcE51bSwgd1R5cGUpIChQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUF9UX01BU0spIHwgKHdUeXBlKSB8IFVTQl9FUF9DVFJfVFggfCBVU0JfRVBfQ1RSX1JYKSkpCisKKy8qKgorICAqIEBicmllZiAgZ2V0cyB0aGUgdHlwZSBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIoYml0cyBFUF9UWVBFWzE6MF0pCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgRW5kcG9pbnQgVHlwZQorICAqLworI2RlZmluZSBQQ0RfR0VUX0VQVFlQRShVU0J4LCBiRXBOdW0pIChQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQX1RfRklFTEQpCisKKy8qKgorICAqIEBicmllZiBmcmVlIGJ1ZmZlciB1c2VkIGZyb20gdGhlIGFwcGxpY2F0aW9uIHJlYWxpemluZyBpdCB0byB0aGUgbGluZQorICAqICAgICAgICAgdG9nZ2xlcyBiaXQgU1dfQlVGIGluIHRoZSBkb3VibGUgYnVmZmVyZWQgZW5kcG9pbnQgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gVVNCeCBVU0IgZGV2aWNlLgorICAqIEBwYXJhbSAgIGJFcE51bSwgYkRpcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfRnJlZVVzZXJCdWZmZXIoVVNCeCwgYkVwTnVtLCBiRGlyKSBkbyB7IFwKKyAgaWYgKChiRGlyKSA9PSAwVSkgXAorICB7IFwKKyAgICAvKiBPVVQgZG91YmxlIGJ1ZmZlcmVkIGVuZHBvaW50ICovIFwKKyAgICBQQ0RfVFhfRFRPRygoVVNCeCksIChiRXBOdW0pKTsgXAorICB9IFwKKyAgZWxzZSBpZiAoKGJEaXIpID09IDFVKSBcCisgIHsgXAorICAgIC8qIElOIGRvdWJsZSBidWZmZXJlZCBlbmRwb2ludCAqLyBcCisgICAgUENEX1JYX0RUT0coKFVTQngpLCAoYkVwTnVtKSk7IFwKKyAgfSBcCit9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiBnZXRzIGRpcmVjdGlvbiBvZiB0aGUgZG91YmxlIGJ1ZmZlcmVkIGVuZHBvaW50CisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgRVBfREJVRl9PVVQsIEVQX0RCVUZfSU4sCisgICogICAgICAgICBFUF9EQlVGX0VSUiBpZiB0aGUgZW5kcG9pbnQgY291bnRlciBub3QgeWV0IHByb2dyYW1tZWQuCisgICovCisjZGVmaW5lIFBDRF9HRVRfREJfRElSKFVTQngsIGJFcE51bSkgZG8geyBcCisgIGlmICgodWludDE2X3QpKCpQQ0RfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSkpICYgMHhGQzAwVSkgIT0gMFUpIFwKKyAgeyBcCisgICAgcmV0dXJuIDBVOyBcCisgIH0gXAorICBlbHNlIGlmICgoKHVpbnQxNl90KSgqUENEX0VQX1RYX0NOVCgoVVNCeCksIChiRXBOdW0pKSkgJiAweDAzRkZVKSAhPSAwVSkgXAorICB7IFwKKyAgICByZXR1cm4gMVU7IFwKKyAgfSBcCisgIGVsc2UgXAorICB7IFwKKyAgICAvKiAuLiovIFwKKyAgfSBcCit9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgc2V0cyB0aGUgc3RhdHVzIGZvciB0eCB0cmFuc2ZlciAoYml0cyBTVEFUX1RYWzE6MF0pLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIHdTdGF0ZSBuZXcgc3RhdGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgYkVwTnVtLCB3U3RhdGUpIGRvIHsgXAorICAgcmVnaXN0ZXIgdWludDE2X3QgX3dSZWdWYWw7IFwKKyAgIFwKKyAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBUWF9EVE9HTUFTSzsgXAorICAgLyogdG9nZ2xlIGZpcnN0IGJpdCA/ICovIFwKKyAgIGlmICgoVVNCX0VQVFhfRFRPRzEgJiAod1N0YXRlKSkhPSAwVSkgXAorICAgeyBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBUWF9EVE9HMTsgXAorICAgfSBcCisgICAvKiB0b2dnbGUgc2Vjb25kIGJpdCA/ICAqLyBcCisgICBpZiAoKFVTQl9FUFRYX0RUT0cyICYgKHdTdGF0ZSkpIT0gMFUpIFwKKyAgIHsgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQVFhfRFRPRzI7IFwKKyAgIH0gXAorICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9UWF9TVEFUVVMgKi8KKworLyoqCisgICogQGJyaWVmICBzZXRzIHRoZSBzdGF0dXMgZm9yIHJ4IHRyYW5zZmVyIChiaXRzIFNUQVRfVFhbMTowXSkKKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHBhcmFtICB3U3RhdGUgbmV3IHN0YXRlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGJFcE51bSx3U3RhdGUpIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFJYX0RUT0dNQVNLOyBcCisgICAgLyogdG9nZ2xlIGZpcnN0IGJpdCA/ICovIFwKKyAgICBpZiAoKFVTQl9FUFJYX0RUT0cxICYgKHdTdGF0ZSkpIT0gMFUpIFwKKyAgICB7IFwKKyAgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBSWF9EVE9HMTsgXAorICAgIH0gXAorICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gKi8gXAorICAgIGlmICgoVVNCX0VQUlhfRFRPRzIgJiAod1N0YXRlKSkhPSAwVSkgXAorICAgIHsgXAorICAgICAgIF93UmVnVmFsIF49IFVTQl9FUFJYX0RUT0cyOyBcCisgICAgfSBcCisgICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9SWF9TVEFUVVMgKi8KKworLyoqCisgICogQGJyaWVmICBzZXRzIHRoZSBzdGF0dXMgZm9yIHJ4ICYgdHggKGJpdHMgU1RBVF9UWFsxOjBdICYgU1RBVF9SWFsxOjBdKQorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIHdTdGF0ZXJ4IG5ldyBzdGF0ZS4KKyAgKiBAcGFyYW0gIHdTdGF0ZXR4IG5ldyBzdGF0ZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9UWFJYX1NUQVRVUyhVU0J4LCBiRXBOdW0sIHdTdGF0ZXJ4LCB3U3RhdGV0eCkgZG8geyBcCisgICAgcmVnaXN0ZXIgdWludDE2X3QgX3dSZWdWYWw7IFwKKyAgICBcCisgICAgX3dSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgKFVTQl9FUFJYX0RUT0dNQVNLIHwgVVNCX0VQVFhfU1RBVCk7IFwKKyAgICAvKiB0b2dnbGUgZmlyc3QgYml0ID8gKi8gXAorICAgIGlmICgoVVNCX0VQUlhfRFRPRzEgJiAod1N0YXRlcngpKSE9IDBVKSBcCisgICAgeyBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBSWF9EVE9HMTsgXAorICAgIH0gXAorICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gKi8gXAorICAgIGlmICgoVVNCX0VQUlhfRFRPRzIgJiAod1N0YXRlcngpKSE9IDBVKSBcCisgICAgeyBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBSWF9EVE9HMjsgXAorICAgIH0gXAorICAgIC8qIHRvZ2dsZSBmaXJzdCBiaXQgPyAqLyBcCisgICAgaWYgKChVU0JfRVBUWF9EVE9HMSAmICh3U3RhdGV0eCkpIT0gMFUpIFwKKyAgICB7IFwKKyAgICAgIF93UmVnVmFsIF49IFVTQl9FUFRYX0RUT0cxOyBcCisgICAgfSBcCisgICAgLyogdG9nZ2xlIHNlY29uZCBiaXQgPyAgKi8gXAorICAgIGlmICgoVVNCX0VQVFhfRFRPRzIgJiAod1N0YXRldHgpKSE9IDBVKSBcCisgICAgeyBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBUWF9EVE9HMjsgXAorICAgIH0gXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlggfCBVU0JfRVBfQ1RSX1RYKSk7IFwKKyAgfSB3aGlsZSgwKSAvKiBQQ0RfU0VUX0VQX1RYUlhfU1RBVFVTICovCisKKy8qKgorICAqIEBicmllZiAgZ2V0cyB0aGUgc3RhdHVzIGZvciB0eC9yeCB0cmFuc2ZlciAoYml0cyBTVEFUX1RYWzE6MF0KKyAgKiAgICAgICAgIC9TVEFUX1JYWzE6MF0pCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgc3RhdHVzCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfVFhfU1RBVFVTKFVTQngsIGJFcE51bSkgICAgICgodWludDE2X3QpUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFRYX1NUQVQpCisjZGVmaW5lIFBDRF9HRVRfRVBfUlhfU1RBVFVTKFVTQngsIGJFcE51bSkgICAgICgodWludDE2X3QpUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFJYX1NUQVQpCisKKy8qKgorICAqIEBicmllZiAgc2V0cyBkaXJlY3RseSB0aGUgVkFMSUQgdHgvcngtc3RhdHVzIGludG8gdGhlIGVuZHBvaW50IHJlZ2lzdGVyCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfU0VUX0VQX1RYX1ZBTElEKFVTQngsIGJFcE51bSkgICAgICAoUENEX1NFVF9FUF9UWF9TVEFUVVMoKFVTQngpLCAoYkVwTnVtKSwgVVNCX0VQX1RYX1ZBTElEKSkKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9WQUxJRChVU0J4LCBiRXBOdW0pICAgICAgKFBDRF9TRVRfRVBfUlhfU1RBVFVTKChVU0J4KSwgKGJFcE51bSksIFVTQl9FUF9SWF9WQUxJRCkpCisKKy8qKgorICAqIEBicmllZiAgY2hlY2tzIHN0YWxsIGNvbmRpdGlvbiBpbiBhbiBlbmRwb2ludC4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBUUlVFID0gZW5kcG9pbnQgaW4gc3RhbGwgY29uZGl0aW9uLgorICAqLworI2RlZmluZSBQQ0RfR0VUX0VQX1RYX1NUQUxMX1NUQVRVUyhVU0J4LCBiRXBOdW0pIChQQ0RfR0VUX0VQX1RYX1NUQVRVUygoVVNCeCksIChiRXBOdW0pKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFVTQl9FUF9UWF9TVEFMTCkKKyNkZWZpbmUgUENEX0dFVF9FUF9SWF9TVEFMTF9TVEFUVVMoVVNCeCwgYkVwTnVtKSAoUENEX0dFVF9FUF9SWF9TVEFUVVMoKFVTQngpLCAoYkVwTnVtKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBVU0JfRVBfUlhfU1RBTEwpCisKKy8qKgorICAqIEBicmllZiAgc2V0ICYgY2xlYXIgRVBfS0lORCBiaXQuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfU0VUX0VQX0tJTkQoVVNCeCwgYkVwTnVtKSBkbyB7IFwKKyAgICByZWdpc3RlciB1aW50MTZfdCBfd1JlZ1ZhbDsgXAorICAgIFwKKyAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSzsgXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlggfCBVU0JfRVBfQ1RSX1RYIHwgVVNCX0VQX0tJTkQpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfS0lORCAqLworCisjZGVmaW5lIFBDRF9DTEVBUl9FUF9LSU5EKFVTQngsIGJFcE51bSkgZG8geyBcCisgICAgcmVnaXN0ZXIgdWludDE2X3QgX3dSZWdWYWw7IFwKKyAgICBcCisgICAgX3dSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQS0lORF9NQVNLOyBcCisgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9DTEVBUl9FUF9LSU5EICovCisKKy8qKgorICAqIEBicmllZiAgU2V0cy9jbGVhcnMgZGlyZWN0bHkgU1RBVFVTX09VVCBiaXQgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9PVVRfU1RBVFVTKFVTQngsIGJFcE51bSkgICAgICAgUENEX1NFVF9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisjZGVmaW5lIFBDRF9DTEVBUl9PVVRfU1RBVFVTKFVTQngsIGJFcE51bSkgICAgIFBDRF9DTEVBUl9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisKKy8qKgorICAqIEBicmllZiAgU2V0cy9jbGVhcnMgZGlyZWN0bHkgRVBfS0lORCBiaXQgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGKFVTQngsIGJFcE51bSkgICAgICAgICAgUENEX1NFVF9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisjZGVmaW5lIFBDRF9DTEVBUl9FUF9EQlVGKFVTQngsIGJFcE51bSkgICAgICAgIFBDRF9DTEVBUl9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIGJpdCBDVFJfUlggLyBDVFJfVFggaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX0NMRUFSX1JYX0VQX0NUUihVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmICgweDdGRkZVICYgVVNCX0VQUkVHX01BU0spOyBcCisgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9UWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX0NMRUFSX1JYX0VQX0NUUiAqLworCisjZGVmaW5lIFBDRF9DTEVBUl9UWF9FUF9DVFIoVVNCeCwgYkVwTnVtKSBkbyB7IFwKKyAgICByZWdpc3RlciB1aW50MTZfdCBfd1JlZ1ZhbDsgXAorICAgIFwKKyAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiAoMHhGRjdGVSAmIFVTQl9FUFJFR19NQVNLKTsgXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlgpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9DTEVBUl9UWF9FUF9DVFIgKi8KKworLyoqCisgICogQGJyaWVmICBUb2dnbGVzIERUT0dfUlggLyBEVE9HX1RYIGJpdCBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfUlhfRFRPRyhVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93RVBWYWw7IFwKKyAgICBcCisgICAgX3dFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSzsgXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd0VQVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFggfCBVU0JfRVBfRFRPR19SWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1JYX0RUT0cgKi8KKworI2RlZmluZSBQQ0RfVFhfRFRPRyhVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93RVBWYWw7IFwKKyAgICBcCisgICAgX3dFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSzsgXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd0VQVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFggfCBVU0JfRVBfRFRPR19UWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1RYX0RUT0cgKi8KKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIERUT0dfUlggLyBEVE9HX1RYIGJpdCBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKTsgXAorICAgIFwKKyAgICBpZiAoKF93UmVnVmFsICYgVVNCX0VQX0RUT0dfUlgpICE9IDBVKVwKKyAgICB7IFwKKyAgICAgIFBDRF9SWF9EVE9HKChVU0J4KSwgKGJFcE51bSkpOyBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogUENEX0NMRUFSX1JYX0RUT0cgKi8KKworI2RlZmluZSBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKTsgXAorICAgIFwKKyAgICBpZiAoKF93UmVnVmFsICYgVVNCX0VQX0RUT0dfVFgpICE9IDBVKVwKKyAgICB7IFwKKyAgICAgIFBDRF9UWF9EVE9HKChVU0J4KSwgKGJFcE51bSkpOyBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogUENEX0NMRUFSX1RYX0RUT0cgKi8KKworLyoqCisgICogQGJyaWVmICBTZXRzIGFkZHJlc3MgaW4gYW4gZW5kcG9pbnQgcmVnaXN0ZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgYkFkZHIgQWRkcmVzcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9BRERSRVNTKFVTQngsIGJFcE51bSwgYkFkZHIpIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gKFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSykgfCAoYkFkZHIpOyBcCisgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfQUREUkVTUyAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldHMgYWRkcmVzcyBpbiBhbiBlbmRwb2ludCByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfQUREUkVTUyhVU0J4LCBiRXBOdW0pICgodWludDhfdCkoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUEFERFJfRklFTEQpKQorCisjZGVmaW5lIFBDRF9FUF9UWF9DTlQoVVNCeCwgYkVwTnVtKSAoKHVpbnQxNl90ICopKCgoKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFICsgKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSArIDJVKSAqIFBNQV9BQ0NFU1MpICsgKCh1aW50MzJfdCkoVVNCeCkgKyAweDQwMFUpKSkKKyNkZWZpbmUgUENEX0VQX1JYX0NOVChVU0J4LCBiRXBOdW0pICgodWludDE2X3QgKikoKCgodWludDMyX3QpKFVTQngpLT5CVEFCTEUgKyAoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgNlUpICogUE1BX0FDQ0VTUykgKyAoKHVpbnQzMl90KShVU0J4KSArIDB4NDAwVSkpKQorCisvKioKKyAgKiBAYnJpZWYgIHNldHMgYWRkcmVzcyBvZiB0aGUgdHgvcnggYnVmZmVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIHdBZGRyIGFkZHJlc3MgdG8gYmUgc2V0IChtdXN0IGJlIHdvcmQgYWxpZ25lZCkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfVFhfQUREUkVTUyhVU0J4LCBiRXBOdW0sIHdBZGRyKSBkbyB7IFwKKyAgcmVnaXN0ZXIgdWludDE2X3QgKl93UmVnVmFsOyBcCisgIHJlZ2lzdGVyIHVpbnQzMl90IF93UmVnQmFzZSA9ICh1aW50MzJfdClVU0J4OyBcCisgIFwKKyAgX3dSZWdCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgXAorICBfd1JlZ1ZhbCA9ICh1aW50MTZfdCAqKShfd1JlZ0Jhc2UgKyAweDQwMFUgKyAoKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSAqIFBNQV9BQ0NFU1MpKTsgXAorICAqX3dSZWdWYWwgPSAoKHdBZGRyKSA+PiAxKSA8PCAxOyBcCit9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfVFhfQUREUkVTUyAqLworCisjZGVmaW5lIFBDRF9TRVRfRVBfUlhfQUREUkVTUyhVU0J4LCBiRXBOdW0sIHdBZGRyKSBkbyB7IFwKKyAgcmVnaXN0ZXIgdWludDE2X3QgKl93UmVnVmFsOyBcCisgIHJlZ2lzdGVyIHVpbnQzMl90IF93UmVnQmFzZSA9ICh1aW50MzJfdClVU0J4OyBcCisgIFwKKyAgX3dSZWdCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgXAorICBfd1JlZ1ZhbCA9ICh1aW50MTZfdCAqKShfd1JlZ0Jhc2UgKyAweDQwMFUgKyAoKCgodWludDMyX3QpKGJFcE51bSkgKiA4VSkgKyA0VSkgKiBQTUFfQUNDRVNTKSk7IFwKKyAgKl93UmVnVmFsID0gKCh3QWRkcikgPj4gMSkgPDwgMTsgXAorfSB3aGlsZSgwKSAvKiBQQ0RfU0VUX0VQX1JYX0FERFJFU1MgKi8KKworLyoqCisgICogQGJyaWVmICBHZXRzIGFkZHJlc3Mgb2YgdGhlIHR4L3J4IGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIuCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfVFhfQUREUkVTUyhVU0J4LCBiRXBOdW0pICgodWludDE2X3QpKlBDRF9FUF9UWF9BRERSRVNTKChVU0J4KSwgKGJFcE51bSkpKQorI2RlZmluZSBQQ0RfR0VUX0VQX1JYX0FERFJFU1MoVVNCeCwgYkVwTnVtKSAoKHVpbnQxNl90KSpQQ0RfRVBfUlhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKworLyoqCisgICogQGJyaWVmICBTZXRzIGNvdW50ZXIgb2YgcnggYnVmZmVyIHdpdGggbm8uIG9mIGJsb2Nrcy4KKyAgKiBAcGFyYW0gIHBkd1JlZyBSZWdpc3RlciBwb2ludGVyCisgICogQHBhcmFtICB3Q291bnQgQ291bnRlci4KKyAgKiBAcGFyYW0gIHdOQmxvY2tzIG5vLiBvZiBCbG9ja3MuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9DQUxDX0JMSzMyKHBkd1JlZywgd0NvdW50LCB3TkJsb2NrcykgZG8geyBcCisgICAgKHdOQmxvY2tzKSA9ICh3Q291bnQpID4+IDU7IFwKKyAgICAqKHBkd1JlZykgPSAodWludDE2X3QpKCgod05CbG9ja3MpIDw8IDEwKSB8IFVTQl9DTlRSWF9CTFNJWkUpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX0NBTENfQkxLMzIgKi8KKworI2RlZmluZSBQQ0RfQ0FMQ19CTEsyKHBkd1JlZywgd0NvdW50LCB3TkJsb2NrcykgZG8geyBcCisgICAgKHdOQmxvY2tzKSA9ICh3Q291bnQpID4+IDE7IFwKKyAgICBpZiAoKCh3Q291bnQpICYgMHgxVSkgIT0gMFUpIFwKKyAgICB7IFwKKyAgICAgICh3TkJsb2NrcykrKzsgXAorICAgIH0gXAorICAgICoocGR3UmVnKSA9ICh1aW50MTZfdCkoKHdOQmxvY2tzKSA8PCAxMCk7IFwKKyAgfSB3aGlsZSgwKSAvKiBQQ0RfQ0FMQ19CTEsyICovCisKKyNkZWZpbmUgUENEX1NFVF9FUF9DTlRfUlhfUkVHKHBkd1JlZywgd0NvdW50KSAgZG8geyBcCisgICAgdWludDMyX3Qgd05CbG9ja3M7IFwKKyAgICBpZiAoKHdDb3VudCkgPT0gMFUpIFwKKyAgICB7IFwKKyAgICAgICoocGR3UmVnKSAmPSAodWludDE2X3QpflVTQl9DTlRSWF9OQkxLX01TSzsgXAorICAgICAgKihwZHdSZWcpIHw9IFVTQl9DTlRSWF9CTFNJWkU7IFwKKyAgICB9IFwKKyAgICBlbHNlIGlmKCh3Q291bnQpIDwgNjJVKSBcCisgICAgeyBcCisgICAgICBQQ0RfQ0FMQ19CTEsyKChwZHdSZWcpLCAod0NvdW50KSwgd05CbG9ja3MpOyBcCisgICAgfSBcCisgICAgZWxzZSBcCisgICAgeyBcCisgICAgICBQQ0RfQ0FMQ19CTEszMigocGR3UmVnKSwod0NvdW50KSwgd05CbG9ja3MpOyBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9DTlRfUlhfUkVHICovCisKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9EQlVGMF9DTlQoVVNCeCwgYkVwTnVtLCB3Q291bnQpIGRvIHsgXAorICAgICByZWdpc3RlciB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyBcCisgICAgIHVpbnQxNl90ICpwZHdSZWc7IFwKKyAgICAgXAorICAgIF93UmVnQmFzZSArPSAodWludDMyX3QpKFVTQngpLT5CVEFCTEU7IFwKKyAgICBwZHdSZWcgPSAodWludDE2X3QgKikoX3dSZWdCYXNlICsgMHg0MDBVICsgKCgoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgMlUpICogUE1BX0FDQ0VTUykpOyBcCisgICAgUENEX1NFVF9FUF9DTlRfUlhfUkVHKHBkd1JlZywgKHdDb3VudCkpOyBcCisgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBzZXRzIGNvdW50ZXIgZm9yIHRoZSB0eC9yeCBidWZmZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgd0NvdW50IENvdW50ZXIgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfVFhfQ05UKFVTQngsIGJFcE51bSwgd0NvdW50KSBkbyB7IFwKKyAgICByZWdpc3RlciB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyBcCisgICAgdWludDE2X3QgKl93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnQmFzZSArPSAodWludDMyX3QpKFVTQngpLT5CVEFCTEU7IFwKKyAgICBfd1JlZ1ZhbCA9ICh1aW50MTZfdCAqKShfd1JlZ0Jhc2UgKyAweDQwMFUgKyAoKCgodWludDMyX3QpKGJFcE51bSkgKiA4VSkgKyAyVSkgKiBQTUFfQUNDRVNTKSk7IFwKKyAgICAqX3dSZWdWYWwgPSAodWludDE2X3QpKHdDb3VudCk7IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBQQ0RfU0VUX0VQX1JYX0NOVChVU0J4LCBiRXBOdW0sIHdDb3VudCkgZG8geyBcCisgICAgcmVnaXN0ZXIgdWludDMyX3QgX3dSZWdCYXNlID0gKHVpbnQzMl90KShVU0J4KTsgXAorICAgIHVpbnQxNl90ICpfd1JlZ1ZhbDsgXAorICAgIFwKKyAgICBfd1JlZ0Jhc2UgKz0gKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFOyBcCisgICAgX3dSZWdWYWwgPSAodWludDE2X3QgKikoX3dSZWdCYXNlICsgMHg0MDBVICsgKCgoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgNlUpICogUE1BX0FDQ0VTUykpOyBcCisgICAgUENEX1NFVF9FUF9DTlRfUlhfUkVHKF93UmVnVmFsLCAod0NvdW50KSk7IFwKK30gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBnZXRzIGNvdW50ZXIgb2YgdGhlIHR4IGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBDb3VudGVyIHZhbHVlCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfVFhfQ05UKFVTQngsIGJFcE51bSkgICAgICAgICgodWludDMyX3QpKCpQQ0RfRVBfVFhfQ05UKChVU0J4KSwgKGJFcE51bSkpKSAmIDB4M2ZmVSkKKyNkZWZpbmUgUENEX0dFVF9FUF9SWF9DTlQoVVNCeCwgYkVwTnVtKSAgICAgICAgKCh1aW50MzJfdCkoKlBDRF9FUF9SWF9DTlQoKFVTQngpLCAoYkVwTnVtKSkpICYgMHgzZmZVKQorCisvKioKKyAgKiBAYnJpZWYgIFNldHMgYnVmZmVyIDAvMSBhZGRyZXNzIGluIGEgZG91YmxlIGJ1ZmZlciBlbmRwb2ludC4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHBhcmFtICB3QnVmMEFkZHIgYnVmZmVyIDAgYWRkcmVzcy4KKyAgKiBAcmV0dmFsIENvdW50ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMF9BRERSKFVTQngsIGJFcE51bSwgd0J1ZjBBZGRyKSBkbyB7IFwKKyAgICBQQ0RfU0VUX0VQX1RYX0FERFJFU1MoKFVTQngpLCAoYkVwTnVtKSwgKHdCdWYwQWRkcikpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9EQlVGMF9BRERSICovCisjZGVmaW5lIFBDRF9TRVRfRVBfREJVRjFfQUREUihVU0J4LCBiRXBOdW0sIHdCdWYxQWRkcikgZG8geyBcCisgICAgUENEX1NFVF9FUF9SWF9BRERSRVNTKChVU0J4KSwgKGJFcE51bSksICh3QnVmMUFkZHIpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfREJVRjFfQUREUiAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldHMgYWRkcmVzc2VzIGluIGEgZG91YmxlIGJ1ZmZlciBlbmRwb2ludC4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHBhcmFtICB3QnVmMEFkZHI6IGJ1ZmZlciAwIGFkZHJlc3MuCisgICogQHBhcmFtICB3QnVmMUFkZHIgPSBidWZmZXIgMSBhZGRyZXNzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfU0VUX0VQX0RCVUZfQUREUihVU0J4LCBiRXBOdW0sIHdCdWYwQWRkciwgd0J1ZjFBZGRyKSBkbyB7IFwKKyAgICBQQ0RfU0VUX0VQX0RCVUYwX0FERFIoKFVTQngpLCAoYkVwTnVtKSwgKHdCdWYwQWRkcikpOyBcCisgICAgUENEX1NFVF9FUF9EQlVGMV9BRERSKChVU0J4KSwgKGJFcE51bSksICh3QnVmMUFkZHIpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfREJVRl9BRERSICovCisKKy8qKgorICAqIEBicmllZiAgR2V0cyBidWZmZXIgMC8xIGFkZHJlc3Mgb2YgYSBkb3VibGUgYnVmZmVyIGVuZHBvaW50LgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMF9BRERSKFVTQngsIGJFcE51bSkgICAgKFBDRF9HRVRfRVBfVFhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMV9BRERSKFVTQngsIGJFcE51bSkgICAgKFBDRF9HRVRfRVBfUlhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKworLyoqCisgICogQGJyaWVmICBHZXRzIGJ1ZmZlciAwLzEgYWRkcmVzcyBvZiBhIGRvdWJsZSBidWZmZXIgZW5kcG9pbnQuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgYkRpciBlbmRwb2ludCBkaXIgIEVQX0RCVUZfT1VUID0gT1VUCisgICogICAgICAgICBFUF9EQlVGX0lOICA9IElOCisgICogQHBhcmFtICB3Q291bnQ6IENvdW50ZXIgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMF9DTlQoVVNCeCwgYkVwTnVtLCBiRGlyLCB3Q291bnQpIGRvIHsgXAorICAgIGlmICgoYkRpcikgPT0gMFUpIFwKKyAgICAgIC8qIE9VVCBlbmRwb2ludCAqLyBcCisgICAgeyBcCisgICAgICBQQ0RfU0VUX0VQX1JYX0RCVUYwX0NOVCgoVVNCeCksIChiRXBOdW0pLCAod0NvdW50KSk7IFwKKyAgICB9IFwKKyAgICBlbHNlIFwKKyAgICB7IFwKKyAgICAgIGlmICgoYkRpcikgPT0gMVUpIFwKKyAgICAgIHsgXAorICAgICAgICAvKiBJTiBlbmRwb2ludCAqLyBcCisgICAgICAgIFBDRF9TRVRfRVBfVFhfQ05UKChVU0J4KSwgKGJFcE51bSksICh3Q291bnQpKTsgXAorICAgICAgfSBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogU2V0RVBEYmxCdWYwQ291bnQqLworCisjZGVmaW5lIFBDRF9TRVRfRVBfREJVRjFfQ05UKFVTQngsIGJFcE51bSwgYkRpciwgd0NvdW50KSBkbyB7IFwKKyAgICByZWdpc3RlciB1aW50MzJfdCBfd0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyBcCisgICAgdWludDE2X3QgKl93RVBSZWdWYWw7IFwKKyAgICBcCisgICAgaWYgKChiRGlyKSA9PSAwVSkgXAorICAgIHsgXAorICAgICAgLyogT1VUIGVuZHBvaW50ICovIFwKKyAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSksICh3Q291bnQpKTsgXAorICAgIH0gXAorICAgIGVsc2UgXAorICAgIHsgXAorICAgICAgaWYgKChiRGlyKSA9PSAxVSkgXAorICAgICAgeyBcCisgICAgICAgIC8qIElOIGVuZHBvaW50ICovIFwKKyAgICAgICAgX3dCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgXAorICAgICAgICBfd0VQUmVnVmFsID0gKHVpbnQxNl90ICopKF93QmFzZSArIDB4NDAwVSArICgoKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSArIDZVKSAqIFBNQV9BQ0NFU1MpKTsgXAorICAgICAgICAqX3dFUFJlZ1ZhbCA9ICh1aW50MTZfdCkod0NvdW50KTsgXAorICAgICAgfSBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogU2V0RVBEYmxCdWYxQ291bnQgKi8KKworI2RlZmluZSBQQ0RfU0VUX0VQX0RCVUZfQ05UKFVTQngsIGJFcE51bSwgYkRpciwgd0NvdW50KSBkbyB7IFwKKyAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVCgoVVNCeCksIChiRXBOdW0pLCAoYkRpciksICh3Q291bnQpKTsgXAorICAgIFBDRF9TRVRfRVBfREJVRjFfQ05UKChVU0J4KSwgKGJFcE51bSksIChiRGlyKSwgKHdDb3VudCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9EQlVGX0NOVCAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXRzIGJ1ZmZlciAwLzEgcngvdHggY291bnRlciBmb3IgZG91YmxlIGJ1ZmZlcmluZy4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfREJVRjBfQ05UKFVTQngsIGJFcE51bSkgICAgIChQQ0RfR0VUX0VQX1RYX0NOVCgoVVNCeCksIChiRXBOdW0pKSkKKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMV9DTlQoVVNCeCwgYkVwTnVtKSAgICAgKFBDRF9HRVRfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSkpKQorCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkIChVU0IpICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkwweHhfSEFMX1BDRF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9wY2RfZXguaCBiL0luYy9zdG0zMmwweHhfaGFsX3BjZF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYTRhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9wY2RfZXguaApAQCAtMCwwICsxLDkzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9wY2RfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUENEIEhBTCBFeHRlbnNpb24gbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9IQUxfUENEX0VYX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9QQ0RfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworI2lmIGRlZmluZWQgKFVTQikKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQQ0RFeAorICAqIEB7CisgICovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBDREV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBQQ0RFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqIEBhZGR0b2dyb3VwIFBDREV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKworCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX1BDREV4X1BNQUNvbmZpZyhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVwX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcF9raW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG1hYWRyZXNzKTsKKworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfQWN0aXZhdGVMUE0oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0RlQWN0aXZhdGVMUE0oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9BY3RpdmF0ZUJDRChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfRGVBY3RpdmF0ZUJDRChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit2b2lkIEhBTF9QQ0RFeF9CQ0RfVkJVU0RldGVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK3ZvaWQgSEFMX1BDREV4X0xQTV9DYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgUENEX0xQTV9Nc2dUeXBlRGVmIG1zZyk7Cit2b2lkIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIFBDRF9CQ0RfTXNnVHlwZURlZiBtc2cpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9QQ0RfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfcHdyLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9wd3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmIwNGU1Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfcHdyLmgKQEAgLTAsMCArMSw0NjAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3B3ci5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQV1IgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9QV1JfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfUFdSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUiBQV1IKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9UeXBlcyBQV1IgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLyAKKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBQV1IgUFZEIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBWRExldmVsOyAgIC8qITwgUFZETGV2ZWw6IFNwZWNpZmllcyB0aGUgUFZEIGRldGVjdGlvbiBsZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFBXUl9QVkRfZGV0ZWN0aW9uX2xldmVsICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgLyohPCBNb2RlOiBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFBXUl9QVkRfTW9kZSAqLworfVBXUl9QVkRUeXBlRGVmOworI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQV1JfUHJpdmF0ZQorICAqIEB7CisgICovIAorCisjaWYgZGVmaW5lZChQV1JfUFZEX1NVUFBPUlQpCisjZGVmaW5lIFBXUl9FWFRJX0xJTkVfUFZEICAgICAgRVhUSV9GVFNSX1RSMTYgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTYgQ29ubmVjdGVkIHRvIHRoZSBQVkQgRVhUSSBMaW5lICovCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfRXhwb3J0ZWRfQ29uc3RhbnRzIFBXUiBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9yZWdpc3Rlcl9hbGlhc19hZGRyZXNzIFBXUiBSZWdpc3RlciBhbGlhcyBhZGRyZXNzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4xICAgICAgICAgICAgICAgIFBXUl9DU1JfRVdVUDEKKyNpZiBkZWZpbmVkIChTVE0zMkwwMTB4NCkgfHwgZGVmaW5lZCAoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2Vsc2UKKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4yICAgICAgICAgICAgICAgIFBXUl9DU1JfRVdVUDIKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNUTTMyTDAxMHg0KSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4NikgfHwgZGVmaW5lZCAoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KSB8fCBcCisgICAgZGVmaW5lZCAoU1RNMzJMMDMxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA0MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDcyeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4zICAgICAgICAgICAgICAgIFBXUl9DU1JfRVdVUDMKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyoqIEBkZWZncm91cCBQV1JfUFZEX2RldGVjdGlvbl9sZXZlbCBQVkQgZGV0ZWN0aW9uIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzAgICAgICAgICAgICAgICAgIFBXUl9DUl9QTFNfTEVWMAorI2RlZmluZSBQV1JfUFZETEVWRUxfMSAgICAgICAgICAgICAgICAgUFdSX0NSX1BMU19MRVYxCisjZGVmaW5lIFBXUl9QVkRMRVZFTF8yICAgICAgICAgICAgICAgICBQV1JfQ1JfUExTX0xFVjIKKyNkZWZpbmUgUFdSX1BWRExFVkVMXzMgICAgICAgICAgICAgICAgIFBXUl9DUl9QTFNfTEVWMworI2RlZmluZSBQV1JfUFZETEVWRUxfNCAgICAgICAgICAgICAgICAgUFdSX0NSX1BMU19MRVY0CisjZGVmaW5lIFBXUl9QVkRMRVZFTF81ICAgICAgICAgICAgICAgICBQV1JfQ1JfUExTX0xFVjUKKyNkZWZpbmUgUFdSX1BWRExFVkVMXzYgICAgICAgICAgICAgICAgIFBXUl9DUl9QTFNfTEVWNgorI2RlZmluZSBQV1JfUFZETEVWRUxfNyAgICAgICAgICAgICAgICAgUFdSX0NSX1BMU19MRVY3ICAvKiBFeHRlcm5hbCBpbnB1dCBhbmFsb2cgdm9sdGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbXBhcmUgaW50ZXJuYWxseSB0byBWUkVGSU5UKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUFZEX01vZGUgUFdSIFBWRCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1BWRF9NT0RFX05PUk1BTCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAvKiE8IGJhc2ljIG1vZGUgaXMgdXNlZCAqLworI2RlZmluZSBQV1JfUFZEX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDFVKSAgIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZEX01PREVfSVRfRkFMTElORyAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDJVKSAgIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRF9NT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgICAgKCh1aW50MzJfdCkweDAwMDEwMDAzVSkgICAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZEX01PREVfRVZFTlRfUklTSU5HICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMjAwMDFVKSAgIC8qITwgRXZlbnQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRfTU9ERV9FVkVOVF9GQUxMSU5HICAgICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMlUpICAgLyohPCBFdmVudCBNb2RlIHdpdGggRmFsbGluZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORyAgICgodWludDMyX3QpMHgwMDAyMDAwM1UpICAgLyohPCBFdmVudCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBQV1JfUFZEX1NVUFBPUlQgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUmVndWxhdG9yX3N0YXRlX2luX1NMRUVQX1NUT1BfbW9kZSBQV1IgUmVndWxhdG9yIHN0YXRlIGluIFNMRUVQL1NUT1AgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9NQUlOUkVHVUxBVE9SX09OICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04gICAgICAgUFdSX0NSX0xQU0RTUgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9TTEVFUF9tb2RlX2VudHJ5IFBXUiBTTEVFUCBtb2RlIGVudHJ5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1NMRUVQRU5UUllfV0ZJICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgUFdSX1NMRUVQRU5UUllfV0ZFICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX1NUT1BfbW9kZV9lbnRyeSBQV1IgU1RPUCBtb2RlIGVudHJ5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1NUT1BFTlRSWV9XRkkgICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgUFdSX1NUT1BFTlRSWV9XRkUgICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX1JlZ3VsYXRvcl9Wb2x0YWdlX1NjYWxlIFBXUiBSZWd1bGF0b3IgVm9sdGFnZSBTY2FsZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSAgIFBXUl9DUl9WT1NfMAorI2RlZmluZSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyICAgUFdSX0NSX1ZPU18xCisjZGVmaW5lIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTMgICBQV1JfQ1JfVk9TCisKKyNkZWZpbmUgSVNfUFdSX1ZPTFRBR0VfU0NBTElOR19SQU5HRShSQU5HRSkgKCgoUkFOR0UpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkFOR0UpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkFOR0UpID09IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTMpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfRmxhZyBQV1IgRmxhZworICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9GTEFHX1dVICAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX1dVRgorI2RlZmluZSBQV1JfRkxBR19TQiAgICAgICAgICAgICAgICAgICAgUFdSX0NTUl9TQkYKKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKyNkZWZpbmUgUFdSX0ZMQUdfUFZETyAgICAgICAgICAgICAgICAgIFBXUl9DU1JfUFZETworI2VuZGlmCisjZGVmaW5lIFBXUl9GTEFHX1ZSRUZJTlRSRFkgICAgICAgICAgICBQV1JfQ1NSX1ZSRUZJTlRSRFlGCisjZGVmaW5lIFBXUl9GTEFHX1ZPUyAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX1ZPU0YKKyNkZWZpbmUgUFdSX0ZMQUdfUkVHTFAgICAgICAgICAgICAgICAgIFBXUl9DU1JfUkVHTFBGCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfRXhwb3J0ZWRfTWFjcm8gUFdSIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisvKiogQGJyaWVmICBtYWNyb3MgY29uZmlndXJlIHRoZSBtYWluIGludGVybmFsIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZS4KKyAgKiAgICAgICAgIFdoZW4gZXhpdGluZyBMb3cgUG93ZXIgUnVuIE1vZGUgb3IgZHVyaW5nIGR5bmFtaWMgdm9sdGFnZSBzY2FsaW5nIGNvbmZpZ3VyYXRpb24sCisgICogICAgICAgICB0aGUgcmVmZXJlbmNlIG1hbnVhbCByZWNvbW1lbmRzIHRvIHBvbGwgUFdSX0ZMQUdfUkVHTFAgYml0IHRvIHdhaXQgZm9yIHRoZSByZWd1bGF0b3IgCisgICogICAgICAgICB0byByZWFjaCBtYWluIG1vZGUgKHJlc3AuIHRvIGdldCBzdGFiaWxpemVkKSBmb3IgYSB0cmFuc2l0aW9uIGZyb20gMCB0byAxLiAKKyAgKiAgICAgICAgIE9ubHkgdGhlbiB0aGUgY2xvY2sgY2FuIGJlIGluY3JlYXNlZC4KKyAgKgorICAqIEBwYXJhbSAgX19SRUdVTEFUT1JfXyBzcGVjaWZpZXMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSB0byBhY2hpZXZlCisgICogICAgICAgICBhIHRyYWRlb2ZmIGJldHdlZW4gcGVyZm9ybWFuY2UgYW5kIHBvd2VyIGNvbnN1bXB0aW9uIHdoZW4gdGhlIGRldmljZSBkb2VzCisgICogICAgICAgICBub3Qgb3BlcmF0ZSBhdCB0aGUgbWF4aW11bSBmcmVxdWVuY3kgKHJlZmVyIHRvIHRoZSBkYXRhc2hlZXRzIGZvciBtb3JlIGRldGFpbHMpLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTE6IFJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dCBTY2FsZSAxIG1vZGUsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0gZnJlcXVlbmN5IHVwIHRvIDMyIE1Iei4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMjogUmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IFNjYWxlIDIgbW9kZSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbSBmcmVxdWVuY3kgdXAgdG8gMTYgTUh6LgorICAqICAgICAgICAgICAgQGFyZyBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUzOiBSZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQgU2NhbGUgMyBtb2RlLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtIGZyZXF1ZW5jeSB1cCB0byA0LjIgTUh6CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9WT0xUQUdFU0NBTElOR19DT05GSUcoX19SRUdVTEFUT1JfXykgKE1PRElGWV9SRUcoUFdSLT5DUiwgUFdSX0NSX1ZPUywgKF9fUkVHVUxBVE9SX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2sgUFdSIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1U6IFdha2UgVXAgZmxhZy4gVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gb3IgZnJvbSB0aGUgUlRDIGFsYXJtIChBbGFybSBCKSwKKyAgKiAgICAgICAgICAgICAgICAgIFJUQyBUYW1wZXIgZXZlbnQsIFJUQyBUaW1lU3RhbXAgZXZlbnQgb3IgUlRDIFdha2V1cC4KKyAgKiAgICAgICAgICAgICAgICAgIEFuIGFkZGl0aW9uYWwgd2FrZXVwIGV2ZW50IGlzIGRldGVjdGVkIGlmIHRoZSBXS1VQIHBpbiBpcyBlbmFibGVkCisgICogICAgICAgICAgICAgICAgICAoYnkgc2V0dGluZyB0aGUgRVdVUCBiaXQpIHdoZW4gdGhlIFdLVVAgcGluIGxldmVsIGlzIGFscmVhZHkgaGlnaC4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfU0I6IFN0YW5kQnkgZmxhZy4gVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBzeXN0ZW0gd2FzCisgICogICAgICAgICAgICAgICAgICByZXN1bWVkIGZyb20gU3RhbmRCeSBtb2RlLgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19QVkRPOiBQVkQgT3V0cHV0LiBUaGlzIGZsYWcgaXMgdmFsaWQgb25seSBpZiBQVkQgaXMgZW5hYmxlZCAKKyAgKiAgICAgICAgICAgICAgICAgIGJ5IHRoZSBIQUxfUFdSX0VuYWJsZVBWRCgpIGZ1bmN0aW9uLiBUaGUgUFZEIGlzIHN0b3BwZWQgYnkgU3RhbmRieSBtb2RlLgorICAqICAgICAgICAgICAgICAgICAgRm9yIHRoaXMgcmVhc29uLCB0aGlzIGJpdCBpcyBlcXVhbCB0byAwIGFmdGVyIFN0YW5kYnkgb3IgcmVzZXQKKyAgKiAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBQVkRFIGJpdCBpcyBzZXQuIE5vdCBhdmFpbGFibGUgb24gTDAgVmFsdWUgbGluZS4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfVlJFRklOVFJEWTogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgKFZSRUZJTlQpIHJlYWR5IGZsYWcuCisgICogICAgICAgICAgICAgICAgIFRoaXMgYml0IGluZGljYXRlcyB0aGUgc3RhdGUgb2YgdGhlIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLCBWUkVGSU5ULgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19WT1M6IFZvbHRhZ2UgU2NhbGluZyBzZWxlY3QgZmxhZy4gQSBkZWxheSBpcyByZXF1aXJlZCBmb3IKKyAgKiAgICAgICAgICAgICAgICAgdGhlIGludGVybmFsIHJlZ3VsYXRvciB0byBiZSByZWFkeSBhZnRlciB0aGUgdm9sdGFnZSByYW5nZSBpcyBjaGFuZ2VkLgorICAqICAgICAgICAgICAgICAgICBUaGUgVk9TRiBiaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHJlZ3VsYXRvciBoYXMgcmVhY2hlZCB0aGUgdm9sdGFnZSBsZXZlbAorICAqICAgICAgICAgICAgICAgICBkZWZpbmVkIHdpdGggYml0cyBWT1Mgb2YgUFdSX0NSIHJlZ2lzdGVyLgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19SRUdMUDogUmVndWxhdG9yIExQIGZsYWcuIFdoZW4gdGhlIE1DVSBleGl0cyBmcm9tIExvdyBwb3dlciBydW4KKyAgKiAgICAgICAgICAgICAgICAgbW9kZSwgdGhpcyBiaXQgc3RheXMgYXQgMSB1bnRpbCB0aGUgcmVndWxhdG9yIGlzIHJlYWR5IGluIG1haW4gbW9kZS4KKyAgKiAgICAgICAgICAgICAgICAgQSBwb2xsaW5nIG9uIHRoaXMgYml0IGlzIHJlY29tbWVuZGVkIHRvIHdhaXQgZm9yIHRoZSByZWd1bGF0b3IgbWFpbiBtb2RlLgorICAqICAgICAgICAgICAgICAgICBUaGlzIGJpdCBpcyByZXNldCBieSBoYXJkd2FyZSB3aGVuIHRoZSByZWd1bGF0b3IgaXMgcmVhZHkuCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICgoUFdSLT5DU1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgUFdSIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1U6IFdha2UgVXAgZmxhZworICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19TQjogU3RhbmRCeSBmbGFnCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICBTRVRfQklUKFBXUi0+Q1IsIChfX0ZMQUdfXykgPDwgMlUpCisKKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiBFbmFibGUgaW50ZXJydXB0IG9uIFBWRCBFeHRpIExpbmUgMTYuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0lUKCkgICAgICBTRVRfQklUKEVYVEktPklNUiwgUFdSX0VYVElfTElORV9QVkQpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIGludGVycnVwdCBvbiBQVkQgRXh0aSBMaW5lIDE2LiAKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0lUKCkgICAgIENMRUFSX0JJVChFWFRJLT5JTVIsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIGV2ZW50IG9uIFBWRCBFeHRpIExpbmUgMTYuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0VWRU5UKCkgICBTRVRfQklUKEVYVEktPkVNUiwgUFdSX0VYVElfTElORV9QVkQpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIGV2ZW50IG9uIFBWRCBFeHRpIExpbmUgMTYuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9FVkVOVCgpICBDTEVBUl9CSVQoRVhUSS0+RU1SLCBQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmICBQVkQgRVhUSSBsaW5lIGNvbmZpZ3VyYXRpb246IHNldCBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4gIAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgU0VUX0JJVChFWFRJLT5GVFNSLCBQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgIENMRUFSX0JJVChFWFRJLT5GVFNSLCBQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmICBQVkQgRVhUSSBsaW5lIGNvbmZpZ3VyYXRpb246IHNldCByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgU0VUX0JJVChFWFRJLT5SVFNSLCBQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nIFRyaWdnZXIuCisgICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgQ0xFQVJfQklUKEVYVEktPlJUU1IsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgIFBWRCBFWFRJIGxpbmUgY29uZmlndXJhdGlvbjogc2V0IHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgICBkbyB7IF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTtfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOyB9IHdoaWxlKDApOworCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuCisgICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICBkbyB7IF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7X19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7IH0gd2hpbGUoMCk7CisKKy8qKgorICAqIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUFZEIEVYVEkgaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcmV0dmFsIEVYVEkgUFZEIExpbmUgU3RhdHVzLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfR0VUX0ZMQUcoKSAgICAgICAoRVhUSS0+UFIgJiAoUFdSX0VYVElfTElORV9QVkQpKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFBWRCBFWFRJIGZsYWcuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRkxBRygpICAgICAoRVhUSS0+UFIgPSAoUFdSX0VYVElfTElORV9QVkQpKQorCisvKioKKyAgKiBAYnJpZWYgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgU0VUX0JJVChFWFRJLT5TV0lFUiwgUFdSX0VYVElfTElORV9QVkQpCisKKy8qKgorICAqIEBicmllZiBHZW5lcmF0ZSBhIFNvZnR3YXJlIGludGVycnVwdCBvbiBzZWxlY3RlZCBFWFRJIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfR0VORVJBVEVfU1dJVCgpICAgICAgICAgICAgU0VUX0JJVChFWFRJLT5TV0lFUiwgUFdSX0VYVElfTElORV9QVkQpCisKKyNlbmRpZiAvKiBQV1JfUFZEX1NVUFBPUlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUl9Qcml2YXRlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKyNkZWZpbmUgSVNfUFdSX1BWRF9MRVZFTChMRVZFTCkgKCgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF8wKSB8fCAoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfMSl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfMikgfHwgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzMpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzQpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF81KXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF82KSB8fCAoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfNykpCisKKyNkZWZpbmUgSVNfUFdSX1BWRF9NT0RFKE1PREUpICgoKE1PREUpID09IFBXUl9QVkRfTU9ERV9JVF9SSVNJTkcpfHwgKChNT0RFKSA9PSBQV1JfUFZEX01PREVfSVRfRkFMTElORykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0lUX1JJU0lOR19GQUxMSU5HKSB8fCAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9FVkVOVF9GQUxMSU5HKSB8fCAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX05PUk1BTCkpIAorI2VuZGlmIC8qIFBXUl9QVkRfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJMMDEweDYpIHx8IGRlZmluZWQgKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpCisjZGVmaW5lIElTX1BXUl9XQUtFVVBfUElOKFBJTikgKCgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElOMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU4zKSkKKyNlbGlmIGRlZmluZWQgKFNUTTMyTDAxMHhCKSB8fCBkZWZpbmVkIChTVE0zMkwwNTF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDUyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA1M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2M3h4KQorI2RlZmluZSBJU19QV1JfV0FLRVVQX1BJTihQSU4pICgoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU4xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjIpKQorI2VsaWYgZGVmaW5lZCAoU1RNMzJMMDEweDgpIHx8IGRlZmluZWQgKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkKKyNkZWZpbmUgSVNfUFdSX1dBS0VVUF9QSU4oUElOKSAoKChQSU4pID09IFBXUl9XQUtFVVBfUElOMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU4yKSkKKyNlbGlmIGRlZmluZWQgKFNUTTMyTDAxMHg0KSB8fCBkZWZpbmVkIChTVE0zMkwwMTF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDIxeHgpCisjZGVmaW5lIElTX1BXUl9XQUtFVVBfUElOKFBJTikgKCgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElOMykpCisjZW5kaWYKKworI2RlZmluZSBJU19QV1JfUkVHVUxBVE9SKFJFR1VMQVRPUikgKCgoUkVHVUxBVE9SKSA9PSBQV1JfTUFJTlJFR1VMQVRPUl9PTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVUxBVE9SKSA9PSBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04pKQorI2RlZmluZSBJU19QV1JfU0xFRVBfRU5UUlkoRU5UUlkpICgoKEVOVFJZKSA9PSBQV1JfU0xFRVBFTlRSWV9XRkkpIHx8ICgoRU5UUlkpID09IFBXUl9TTEVFUEVOVFJZX1dGRSkpCisKKyNkZWZpbmUgSVNfUFdSX1NUT1BfRU5UUlkoRU5UUlkpICgoKEVOVFJZKSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkgfHwgKChFTlRSWSkgPT0gUFdSX1NUT1BFTlRSWV9XRkUpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFBXUiBIQUwgRXh0ZW5zaW9uIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfcHdyX2V4LmgiCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9ucyBQV1IgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCisgICogQHsKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EZUluaXQodm9pZCk7Cit2b2lkIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2Vzcyh2b2lkKTsKK3ZvaWQgSEFMX1BXUl9EaXNhYmxlQmtVcEFjY2Vzcyh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyogUFZEIGNvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9QV1JfQ29uZmlnUFZEKFBXUl9QVkRUeXBlRGVmICpzQ29uZmlnUFZEKTsKK3ZvaWQgSEFMX1BXUl9FbmFibGVQVkQodm9pZCk7Cit2b2lkIEhBTF9QV1JfRGlzYWJsZVBWRCh2b2lkKTsKK3ZvaWQgSEFMX1BXUl9QVkRfSVJRSGFuZGxlcih2b2lkKTsKK3ZvaWQgSEFMX1BXUl9QVkRDYWxsYmFjayh2b2lkKTsKKyNlbmRpZgorCisvKiBXYWtlVXAgcGlucyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfUFdSX0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW54KTsKK3ZvaWQgSEFMX1BXUl9EaXNhYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbngpOworCisvKiBMb3cgUG93ZXIgbW9kZXMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfUFdSX0VudGVyU1RPUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNUT1BFbnRyeSk7Cit2b2lkIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNMRUVQRW50cnkpOwordm9pZCBIQUxfUFdSX0VudGVyU1RBTkRCWU1vZGUodm9pZCk7CisKK3ZvaWQgSEFMX1BXUl9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKTsKK3ZvaWQgSEFMX1BXUl9EaXNhYmxlU2xlZXBPbkV4aXQodm9pZCk7Cit2b2lkIEhBTF9QV1JfRW5hYmxlU0VWT25QZW5kKHZvaWQpOwordm9pZCBIQUxfUFdSX0Rpc2FibGVTRVZPblBlbmQodm9pZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIERlZmluZSB0aGUgcHJpdmF0ZSBncm91cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUFdSX1ByaXZhdGUgUFdSIFByaXZhdGUKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfUFdSX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfcHdyX2V4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF9wd3JfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U3ZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfcHdyX2V4LmgKQEAgLTAsMCArMSw5OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfcHdyX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFBXUiBIQUwgRXh0ZW5zaW9uIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9QV1JfRVhfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfUFdSX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4IFBXUkV4CisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9FeHBvcnRlZF9NYWNyb3MgUFdSRXggRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgdGhlIERlZXAtc2xlZXAgbW9kZSB3aXRoIEZsYXNoIG1lbW9yeSBrZXB0IG9mZi4KKyAgKiBAbm90ZSAgIFdoZW4gZW50ZXJpbmcgbG93IHBvd2VyIG1vZGUgKHN0b3Agb3Igc3RhbmRieSBvbmx5KSwgaWYgRFNfRUVfS09GRiBhbmQgUlVOX1BEIG9mCisgICogICAgICAgICBGTEFTSF9BQ1IgcmVnaXN0ZXIgYXJlIGJvdGggc2V0ICwgdGhlIEZsYXNoIG1lbW9yeSB3aWxsIG5vdCBiZSB3b2tlbiB1cCAKKyAgKiAgICAgICAgIHdoZW4gZXhpdGluZyBmcm9tIGRlZXAtc2xlZXAgbW9kZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX0ZMQVNIV0FLRVVQX0VOQUJMRSgpICAgICAgQ0xFQVJfQklUKFBXUi0+Q1IsIFBXUl9DUl9EU0VFS09GRikKKworLyoqIEBicmllZiAgTWFjcm9zIHRvIGRpc2FibGUgdGhlIERlZXAtc2xlZXAgbW9kZSB3aXRoIEZsYXNoIG1lbW9yeSBrZXB0IG9mZi4KKyAgKiBAbm90ZSAgIFdoZW4gZW50ZXJpbmcgbG93IHBvd2VyIG1vZGUgKHN0b3Agb3Igc3RhbmRieSBvbmx5KSwgaWYgRFNfRUVfS09GRiBhbmQgUlVOX1BEIG9mCisgICogICAgICAgICBGTEFTSF9BQ1IgcmVnaXN0ZXIgYXJlIGJvdGggc2V0ICwgdGhlIEZsYXNoIG1lbW9yeSB3aWxsIG5vdCBiZSB3b2tlbiB1cCAKKyAgKiAgICAgICAgIHdoZW4gZXhpdGluZyBmcm9tIGRlZXAtc2xlZXAgbW9kZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX0ZMQVNIV0FLRVVQX0RJU0FCTEUoKSAgICAgU0VUX0JJVChQV1ItPkNSLCBQV1JfQ1JfRFNFRUtPRkYpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBQV1JFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KK3VpbnQzMl90IEhBTF9QV1JFeF9HZXRWb2x0YWdlUmFuZ2Uodm9pZCk7Cit2b2lkIEhBTF9QV1JFeF9FbmFibGVGYXN0V2FrZVVwKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZUZhc3RXYWtlVXAodm9pZCk7Cit2b2lkIEhBTF9QV1JFeF9FbmFibGVVbHRyYUxvd1Bvd2VyKHZvaWQpOwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVVsdHJhTG93UG93ZXIodm9pZCk7Cit2b2lkIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIERlZmluZSB0aGUgcHJpdmF0ZSBncm91cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUFdSRXhfUHJpdmF0ZSBQV1JFeCBQcml2YXRlCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfUFdSX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfcmNjLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9yY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDYyZmIzCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfcmNjLmgKQEAgLTAsMCArMSwxNzM4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9yY2MuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUkNDIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9IQUxfUkNDX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfSEFMX1JDQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19UaW1lb3V0IFJDQyBUaW1lb3V0CisgICogQHsKKyAgKi8KKworLyogRGlzYWJsZSBCYWNrdXAgZG9tYWluIHdyaXRlIHByb3RlY3Rpb24gc3RhdGUgY2hhbmdlIHRpbWVvdXQgKi8KKyNkZWZpbmUgUkNDX0RCUF9USU1FT1VUX1ZBTFVFICAgICAgKDEwMFUpICAgICAgIC8qIDEwMCBtcyAqLworLyogTFNFIHN0YXRlIGNoYW5nZSB0aW1lb3V0ICovCisjZGVmaW5lIFJDQ19MU0VfVElNRU9VVF9WQUxVRSAgICAgIExTRV9TVEFSVFVQX1RJTUVPVVQKKyNkZWZpbmUgQ0xPQ0tTV0lUQ0hfVElNRU9VVF9WQUxVRSAgKDUwMDBVKSAgLyogNSBzICAgICovCisjZGVmaW5lIEhTRV9USU1FT1VUX1ZBTFVFICAgICAgICAgIEhTRV9TVEFSVFVQX1RJTUVPVVQKKyNkZWZpbmUgTVNJX1RJTUVPVVRfVkFMVUUgICAgICAgICAgKDJVKSAgICAgIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDEpICovCisjZGVmaW5lIEhTSV9USU1FT1VUX1ZBTFVFICAgICAgICAgICgyVSkgICAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAqLworI2RlZmluZSBMU0lfVElNRU9VVF9WQUxVRSAgICAgICAgICAoMlUpICAgICAgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgKi8KKyNkZWZpbmUgUExMX1RJTUVPVVRfVkFMVUUgICAgICAgICAgKDJVKSAgICAgIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDEpICovCisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKyNkZWZpbmUgSFNJNDhfVElNRU9VVF9WQUxVRSAgICAgICAgKDJVKSAgICAgIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDEpICovCisjZW5kaWYgLyogUkNDX0hTSTQ4X1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSQ0NfQml0QWRkcmVzc19BbGlhc1JlZ2lvbiBCaXRBZGRyZXNzIEFsaWFzUmVnaW9uCisgICogQGJyaWVmIFJDQyByZWdpc3RlcnMgYml0IGFkZHJlc3MgaW4gdGhlIGFsaWFzIHJlZ2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19PRkZTRVQgICAgICAgICAgICAgICAgKFJDQ19CQVNFIC0gUEVSSVBIX0JBU0UpCisvKiAtLS0gQ1IgUmVnaXN0ZXIgLS0tKi8KKy8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBIU0lPTiBiaXQgKi8KKyNkZWZpbmUgUkNDX0NSX09GRlNFVCAgICAgICAgICAgICAoUkNDX09GRlNFVCArIDB4MDBVKQorLyogLS0tIENGR1IgUmVnaXN0ZXIgLS0tKi8KKy8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBJMlNTUkMgYml0ICovCisjZGVmaW5lIFJDQ19DRkdSX09GRlNFVCAgICAgICAgICAgKFJDQ19PRkZTRVQgKyAweDA4VSkKKy8qIC0tLSBDU1IgUmVnaXN0ZXIgLS0tKi8KKyNkZWZpbmUgUkNDX0NTUl9PRkZTRVQgICAgICAgICAgICAoUkNDX09GRlNFVCArIDB4NzRVKQorCisvKiBDUiByZWdpc3RlciBieXRlIDMgKEJpdHNbMjM6MTZdKSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkNDX0NSX0JZVEUyX0FERFJFU1MgICAgICAoMHg0MDAyMzgwMlUpCisKKy8qIENJRVIgcmVnaXN0ZXIgYnl0ZSAwIChCaXRzWzA6OF0pIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDSUVSX0JZVEUwX0FERFJFU1MgICAgICAgICgodWludDMyX3QpKFJDQ19CQVNFICsgMHgxMFUgKyAweDAwVSkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIERlZmluZXMgdXNlZCBmb3IgRmxhZ3MgKi8KKyNkZWZpbmUgQ1JfUkVHX0lOREVYICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTEpCisjZGVmaW5lIENTUl9SRUdfSU5ERVggICAgICAgICAgICAgICAgICAgICgodWludDhfdCkyKQorI2RlZmluZSBDUlJDUl9SRUdfSU5ERVggICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMykKKworI2RlZmluZSBSQ0NfRkxBR19NQVNLICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxRikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ19Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKyNkZWZpbmUgSVNfUkNDX09TQ0lMTEFUT1JUWVBFKF9fT1NDSUxMQVRPUl9fKSAoKChfX09TQ0lMTEFUT1JfXykgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX05PTkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgICA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkgICA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTQ4KSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJNDgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgICA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSkgICA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX01TSSkgICA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTVNJKSkKKworI2RlZmluZSBJU19SQ0NfSFNJNDgoX19IU0k0OF9fKSAoKChfX0hTSTQ4X18pID09IFJDQ19IU0k0OF9PRkYpIHx8ICgoX19IU0k0OF9fKSA9PSBSQ0NfSFNJNDhfT04pKQorI2Vsc2UKKyNkZWZpbmUgSVNfUkNDX09TQ0lMTEFUT1JUWVBFKF9fT1NDSUxMQVRPUl9fKSAoKChfX09TQ0lMTEFUT1JfXykgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX05PTkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX09TQ0lMTEFUT1JfXykgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fT1NDSUxMQVRPUl9fKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpID09IFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX09TQ0lMTEFUT1JfXykgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fT1NDSUxMQVRPUl9fKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9NU0kpID09IFJDQ19PU0NJTExBVE9SVFlQRV9NU0kpKQorI2VuZGlmIC8qIFJDQ19IU0k0OF9TVVBQT1JUICovCisjZGVmaW5lIElTX1JDQ19QTExTT1VSQ0UoX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1BMTFNPVVJDRV9IU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUExMU09VUkNFX0hTRSkpCisjZGVmaW5lIElTX1JDQ19IU0UoX19IU0VfXykgKCgoX19IU0VfXykgPT0gUkNDX0hTRV9PRkYpIHx8ICgoX19IU0VfXykgPT0gUkNDX0hTRV9PTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSFNFX18pID09IFJDQ19IU0VfQllQQVNTKSkKKyNkZWZpbmUgSVNfUkNDX0xTRShfX0xTRV9fKSAoKChfX0xTRV9fKSA9PSBSQ0NfTFNFX09GRikgfHwgKChfX0xTRV9fKSA9PSBSQ0NfTFNFX09OKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MU0VfXykgPT0gUkNDX0xTRV9CWVBBU1MpKQorI2lmIGRlZmluZWQoUkNDX0NSX0hTSU9VVEVOKQorI2RlZmluZSBJU19SQ0NfSFNJKF9fSFNJX18pICgoKF9fSFNJX18pID09IFJDQ19IU0lfT0ZGKSAgfHwgKChfX0hTSV9fKSA9PSBSQ0NfSFNJX09OKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSFNJX18pID09IFJDQ19IU0lfRElWNCkgfHwgKChfX0hTSV9fKSA9PSBSQ0NfSFNJX09VVEVOKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSFNJX18pID09IChSQ0NfSFNJX09VVEVOfFJDQ19IU0lfT04pKSB8fCAoKF9fSFNJX18pID09IChSQ0NfSFNJX09VVEVOfFJDQ19IU0lfRElWNCkpKQorI2Vsc2UKKyNkZWZpbmUgSVNfUkNDX0hTSShfX0hTSV9fKSAoKChfX0hTSV9fKSA9PSBSQ0NfSFNJX09GRikgfHwgKChfX0hTSV9fKSA9PSBSQ0NfSFNJX09OKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IU0lfXykgPT0gUkNDX0hTSV9ESVY0KSkKKyNlbmRpZiAvKiBSQ0NfQ1JfSFNJT1VURU4gKi8KKyNkZWZpbmUgSVNfUkNDX0NBTElCUkFUSU9OX1ZBTFVFKF9fVkFMVUVfXykgKChfX1ZBTFVFX18pIDw9IDB4MUZVKQorI2RlZmluZSBJU19SQ0NfTVNJQ0FMSUJSQVRJT05fVkFMVUUoX19WQUxVRV9fKSAoKF9fVkFMVUVfXykgPD0gMHhGRlUpCisjZGVmaW5lIElTX1JDQ19NU0lfQ0xPQ0tfUkFOR0UoX19SQU5HRV9fKSAgKCgoX19SQU5HRV9fKSA9PSBSQ0NfTVNJUkFOR0VfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkFOR0VfXykgPT0gUkNDX01TSVJBTkdFXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBTkdFX18pID09IFJDQ19NU0lSQU5HRV8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SQU5HRV9fKSA9PSBSQ0NfTVNJUkFOR0VfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkFOR0VfXykgPT0gUkNDX01TSVJBTkdFXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBTkdFX18pID09IFJDQ19NU0lSQU5HRV81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SQU5HRV9fKSA9PSBSQ0NfTVNJUkFOR0VfNikpCisjZGVmaW5lIElTX1JDQ19MU0koX19MU0lfXykgKCgoX19MU0lfXykgPT0gUkNDX0xTSV9PRkYpIHx8ICgoX19MU0lfXykgPT0gUkNDX0xTSV9PTikpCisjZGVmaW5lIElTX1JDQ19NU0koX19NU0lfXykgKCgoX19NU0lfXykgPT0gUkNDX01TSV9PRkYpIHx8ICgoX19NU0lfXykgPT0gUkNDX01TSV9PTikpCisKKyNkZWZpbmUgSVNfUkNDX1BMTChfX1BMTF9fKSAoKChfX1BMTF9fKSA9PSBSQ0NfUExMX05PTkUpIHx8ICgoX19QTExfXykgPT0gUkNDX1BMTF9PRkYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BMTF9fKSA9PSBSQ0NfUExMX09OKSkKKyNkZWZpbmUgSVNfUkNDX1BMTF9ESVYoX19ESVZfXykgKCgoX19ESVZfXykgPT0gUkNDX1BMTF9ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFJDQ19QTExfRElWMykgfHwgKChfX0RJVl9fKSA9PSBSQ0NfUExMX0RJVjQpKQorCisjZGVmaW5lIElTX1JDQ19QTExfTVVMKF9fTVVMX18pICgoKF9fTVVMX18pID09IFJDQ19QTExfTVVMMykgIHx8ICgoX19NVUxfXykgPT0gUkNDX1BMTF9NVUw0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01VTF9fKSA9PSBSQ0NfUExMX01VTDYpICB8fCAoKF9fTVVMX18pID09IFJDQ19QTExfTVVMOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NVUxfXykgPT0gUkNDX1BMTF9NVUwxMikgfHwgKChfX01VTF9fKSA9PSBSQ0NfUExMX01VTDE2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTVVMX18pID09IFJDQ19QTExfTVVMMjQpIHx8ICgoX19NVUxfXykgPT0gUkNDX1BMTF9NVUwzMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01VTF9fKSA9PSBSQ0NfUExMX01VTDQ4KSkKKyNkZWZpbmUgSVNfUkNDX0NMT0NLVFlQRShDTEspICgoKChDTEspICYgUkNDX0NMT0NLVFlQRV9TWVNDTEspID09IFJDQ19DTE9DS1RZUEVfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoQ0xLKSAmIFJDQ19DTE9DS1RZUEVfSENMSykgICA9PSBSQ0NfQ0xPQ0tUWVBFX0hDTEspICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKENMSykgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSAgPT0gUkNDX0NMT0NLVFlQRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDTEspICYgUkNDX0NMT0NLVFlQRV9QQ0xLMikgID09IFJDQ19DTE9DS1RZUEVfUENMSzIpKQorI2RlZmluZSBJU19SQ0NfU1lTQ0xLU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfTVNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NZU0NMS1NPVVJDRV9IU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX0hTRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLKSkKKyNkZWZpbmUgSVNfUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVMoX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfTVNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKSkKKyNkZWZpbmUgSVNfUkNDX0hDTEsoX19IQ0xLX18pICgoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjEpIHx8ICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNCkgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYxNikgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY2NCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMTI4KSB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjI1NikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNTEyKSkKKyNkZWZpbmUgSVNfUkNDX1BDTEsoX19QQ0xLX18pICgoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVYxKSB8fCAoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWNCkgfHwgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQ0xLX18pID09IFJDQ19IQ0xLX0RJVjE2KSkKKyNpZiAgZGVmaW5lZChTVE0zMkwwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNDF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZChTVE0zMkwwODN4eCkgXAorICB8fCBkZWZpbmVkKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4MXh4KQorI2RlZmluZSBJU19SQ0NfTUNPKF9fTUNPX18pICgoKF9fTUNPX18pID09IFJDQ19NQ08xKSB8fCAoKF9fTUNPX18pID09IFJDQ19NQ08yKSB8fCAoKF9fTUNPX18pID09IFJDQ19NQ08zKSkKKyNlbHNlCisjZGVmaW5lIElTX1JDQ19NQ08oX19NQ09fXykgKCgoX19NQ09fXykgPT0gUkNDX01DTzEpIHx8ICgoX19NQ09fXykgPT0gUkNDX01DTzIpKQorCisjZW5kaWYKKyNkZWZpbmUgSVNfUkNDX01DT0RJVihfX0RJVl9fKSAoKChfX0RJVl9fKSA9PSBSQ0NfTUNPRElWXzEpIHx8ICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl80KSB8fCAoKF9fRElWX18pID09IFJDQ19NQ09ESVZfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFJDQ19NQ09ESVZfMTYpKQorI2lmIGRlZmluZWQoUkNDX0NGR1JfTUNPU0VMX0hTSTQ4KQorI2RlZmluZSBJU19SQ0NfTUNPMVNPVVJDRShfX1NPVVJDRV9fKSAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLKSB8fCAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX0hTSSkgIHx8ICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTVNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfSFNFKSAgfHwgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9QTExDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9MU0kpIHx8ICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTFNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfSFNJNDgpKQorI2Vsc2UKKyNkZWZpbmUgSVNfUkNDX01DTzFTT1VSQ0UoX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTk9DTE9DSykgfHwgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9TWVNDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9IU0kpICB8fCAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX01TSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX0hTRSkgIHx8ICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfUExMQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTFNJKSB8fCAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX0xTRSkpCisjZW5kaWYgLyogUkNDX0NGR1JfTUNPU0VMX0hTSTQ4ICovCisjZGVmaW5lIElTX1JDQ19SVENDTEtTT1VSQ0UoX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9OT19DTEspICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19SVENDTEtTT1VSQ0VfTFNFKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUlRDQ0xLU09VUkNFX0xTSSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVY4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMTYpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9UeXBlcyBSQ0MgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJDQyBQTEwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUExMU3RhdGU7ICAgICAgLyohPCBQTExTdGF0ZTogVGhlIG5ldyBzdGF0ZSBvZiB0aGUgUExMLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMX0NvbmZpZyAqLworCisgIHVpbnQzMl90IFBMTFNvdXJjZTsgICAgIC8qITwgUExMU291cmNlOiBQTEwgZW50cnkgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTF9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBQTExNVUw7ICAgICAgICAvKiE8IFBMTE1VTDogTXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMX011bHRpcGxpY2F0aW9uX0ZhY3RvciovCisKKyAgdWludDMyX3QgUExMRElWOyAgICAgICAgLyohPCBQTExESVY6IERpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTF9EaXZpc2lvbl9GYWN0b3IqLworfSBSQ0NfUExMSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUkNDIEludGVybmFsL0V4dGVybmFsIE9zY2lsbGF0b3IgKEhTRSwgSFNJLCBMU0UgYW5kIExTSSkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgT3NjaWxsYXRvclR5cGU7ICAgICAgICAvKiE8IFRoZSBvc2NpbGxhdG9ycyB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfT3NjaWxsYXRvcl9UeXBlICovCisKKyAgdWludDMyX3QgSFNFU3RhdGU7ICAgICAgICAgICAgICAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIEhTRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0hTRV9Db25maWcgKi8KKworICB1aW50MzJfdCBMU0VTdGF0ZTsgICAgICAgICAgICAgIC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgTFNFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTFNFX0NvbmZpZyAqLworCisgIHVpbnQzMl90IEhTSVN0YXRlOyAgICAgICAgICAgICAgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBIU0kuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19IU0lfQ29uZmlnICovCisKKyAgdWludDMyX3QgSFNJQ2FsaWJyYXRpb25WYWx1ZTsgICAvKiE8IFRoZSBIU0kgY2FsaWJyYXRpb24gdHJpbW1pbmcgdmFsdWUgKGRlZmF1bHQgaXMgUkNDX0hTSUNBTElCUkFUSU9OX0RFRkFVTFQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDFGICovCisKKyAgdWludDMyX3QgTFNJU3RhdGU7ICAgICAgICAgICAgICAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIExTSS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xTSV9Db25maWcgKi8KKworI2lmIGRlZmluZWQoUkNDX0hTSTQ4X1NVUFBPUlQpCisgIHVpbnQzMl90IEhTSTQ4U3RhdGU7ICAgICAgICAgICAgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBIU0k0OC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0hTSTQ4X0NvbmZpZyAqLworCisjZW5kaWYgLyogUkNDX0hTSTQ4X1NVUFBPUlQgKi8KKyAgdWludDMyX3QgTVNJU3RhdGU7ICAgICAgICAgICAgICAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIE1TSS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX01TSV9Db25maWcgKi8KKworICB1aW50MzJfdCBNU0lDYWxpYnJhdGlvblZhbHVlOyAgIC8qITwgVGhlIE1TSSBjYWxpYnJhdGlvbiB0cmltbWluZyB2YWx1ZS4gKGRlZmF1bHQgaXMgUkNDX01TSUNBTElCUkFUSU9OX0RFRkFVTFQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGICovCisKKyAgdWludDMyX3QgTVNJQ2xvY2tSYW5nZTsgICAgICAgICAvKiE8IFRoZSBNU0kgIGZyZXF1ZW5jeSAgcmFuZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTVNJX0Nsb2NrX1JhbmdlICovCisKKyAgUkNDX1BMTEluaXRUeXBlRGVmIFBMTDsgICAgICAgICAvKiE8IFBMTCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyAqLworCit9IFJDQ19Pc2NJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSQ0MgU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNzZXMgY2xvY2sgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tUeXBlOyAgICAgICAgICAgICAvKiE8IFRoZSBjbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfU3lzdGVtX0Nsb2NrX1R5cGUgKi8KKworICB1aW50MzJfdCBTWVNDTEtTb3VyY2U7ICAgICAgICAgIC8qITwgVGhlIGNsb2NrIHNvdXJjZSAoU1lTQ0xLUykgdXNlZCBhcyBzeXN0ZW0gY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19TeXN0ZW1fQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgQUhCQ0xLRGl2aWRlcjsgICAgICAgICAvKiE8IFRoZSBBSEIgY2xvY2sgKEhDTEspIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBzeXN0ZW0gY2xvY2sgKFNZU0NMSykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19BSEJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgQVBCMUNMS0RpdmlkZXI7ICAgICAgICAvKiE8IFRoZSBBUEIxIGNsb2NrIChQQ0xLMSkgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIEFIQiBjbG9jayAoSENMSykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19BUEIxX0FQQjJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgQVBCMkNMS0RpdmlkZXI7ICAgICAgICAvKiE8IFRoZSBBUEIyIGNsb2NrIChQQ0xLMikgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIEFIQiBjbG9jayAoSENMSykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19BUEIxX0FQQjJfQ2xvY2tfU291cmNlICovCit9IFJDQ19DbGtJbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX0NvbnN0YW50cyBSQ0MgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMX0Nsb2NrX1NvdXJjZSBQTEwgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfUExMU09VUkNFX0hTSSAgICAgICAgICAgUkNDX0NGR1JfUExMU1JDX0hTSSAgICAgICAgLyohPCBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfUExMU09VUkNFX0hTRSAgICAgICAgICAgUkNDX0NGR1JfUExMU1JDX0hTRSAgICAgICAgLyohPCBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19Pc2NpbGxhdG9yX1R5cGUgT3NjaWxsYXRvciBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX05PTkUgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9IU0UgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKQorI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikKKyNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9MU0kgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4KQorI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfTVNJICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMCkKKyNpZiBkZWZpbmVkKFJDQ19IU0k0OF9TVVBQT1JUKQorI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJNDggICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkKKyNlbmRpZiAvKiBSQ0NfSFNJNDhfU1VQUE9SVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSFNFX0NvbmZpZyBIU0UgQ29uZmlnCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0hTRV9PRkYgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNFIGNsb2NrIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfSFNFX09OICAgICAgICAgICAgICAgICAgICAgICBSQ0NfQ1JfSFNFT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0UgY2xvY2sgYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfSFNFX0JZUEFTUyAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShSQ0NfQ1JfSFNFQllQIHwgUkNDX0NSX0hTRU9OKSkgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgZm9yIEhTRSBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTFNFX0NvbmZpZyBMU0UgQ29uZmlnCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0xTRV9PRkYgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMU0UgY2xvY2sgZGVhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19MU0VfT04gICAgICAgICAgICAgICAgICAgICAgIFJDQ19DU1JfTFNFT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTFNFIGNsb2NrIGFjdGl2YXRpb24gKi8KKyNkZWZpbmUgUkNDX0xTRV9CWVBBU1MgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoUkNDX0NTUl9MU0VCWVAgfCBSQ0NfQ1NSX0xTRU9OKSkgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgZm9yIExTRSBjbG9jayAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19IU0lfQ29uZmlnIEhTSSBDb25maWcKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSFNJX09GRiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApICAgICAgICAgICAvKiE8IEhTSSBjbG9jayBkZWFjdGl2YXRpb24gKi8KKyNkZWZpbmUgUkNDX0hTSV9PTiAgICAgICAgICAgICAgICAgICAgICAgUkNDX0NSX0hTSU9OICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgY2xvY2sgYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfSFNJX0RJVjQgICAgICAgICAgICAgICAgICAgICAoUkNDX0NSX0hTSURJVkVOIHwgUkNDX0NSX0hTSU9OKSAvKiE8IEhTSV9ESVY0IGNsb2NrIGFjdGl2YXRpb24gKi8KKyNpZiBkZWZpbmVkKFJDQ19DUl9IU0lPVVRFTikKKyNkZWZpbmUgUkNDX0hTSV9PVVRFTiAgICAgICAgICAgICAgICAgICAgUkNDX0NSX0hTSU9VVEVOICAgICAgICAgICAgICAgICAgLyohPCBIU0lfT1VURU4gY2xvY2sgYWN0aXZhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIHZhbHVlIGlzIHRvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBSQ0NfSFNJX09OL1JDQ19IU0lfRElWNCAqLworI2VuZGlmIC8qIFJDQ19DUl9IU0lPVVRFTiAqLworCisjZGVmaW5lIFJDQ19IU0lDQUxJQlJBVElPTl9ERUZBVUxUICAgICAgICgodWludDMyX3QpMHgxMCkgICAgICAgICAvKiBEZWZhdWx0IEhTSSBjYWxpYnJhdGlvbiB0cmltbWluZyB2YWx1ZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19NU0lfQ2xvY2tfUmFuZ2UgTVNJIENsb2NrIFJhbmdlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfTVNJUkFOR0VfMCAgICAgICAgICAgICAgICAgICBSQ0NfSUNTQ1JfTVNJUkFOR0VfMCAvKiE8IE1TSSA9IDY1LjUzNiBLSHogICovCisjZGVmaW5lIFJDQ19NU0lSQU5HRV8xICAgICAgICAgICAgICAgICAgIFJDQ19JQ1NDUl9NU0lSQU5HRV8xIC8qITwgTVNJID0gMTMxLjA3MiBLSHogKi8KKyNkZWZpbmUgUkNDX01TSVJBTkdFXzIgICAgICAgICAgICAgICAgICAgUkNDX0lDU0NSX01TSVJBTkdFXzIgLyohPCBNU0kgPSAyNjIuMTQ0IEtIeiAqLworI2RlZmluZSBSQ0NfTVNJUkFOR0VfMyAgICAgICAgICAgICAgICAgICBSQ0NfSUNTQ1JfTVNJUkFOR0VfMyAvKiE8IE1TSSA9IDUyNC4yODggS0h6ICovCisjZGVmaW5lIFJDQ19NU0lSQU5HRV80ICAgICAgICAgICAgICAgICAgIFJDQ19JQ1NDUl9NU0lSQU5HRV80IC8qITwgTVNJID0gMS4wNDggTUh6ICAgKi8KKyNkZWZpbmUgUkNDX01TSVJBTkdFXzUgICAgICAgICAgICAgICAgICAgUkNDX0lDU0NSX01TSVJBTkdFXzUgLyohPCBNU0kgPSAyLjA5NyBNSHogICAqLworI2RlZmluZSBSQ0NfTVNJUkFOR0VfNiAgICAgICAgICAgICAgICAgICBSQ0NfSUNTQ1JfTVNJUkFOR0VfNiAvKiE8IE1TSSA9IDQuMTk0IE1IeiAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xTSV9Db25maWcgTFNJIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19MU0lfT0ZGICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkgICAvKiE8IExTSSBjbG9jayBkZWFjdGl2YXRpb24gKi8KKyNkZWZpbmUgUkNDX0xTSV9PTiAgICAgICAgICAgICAgICAgICAgICAgUkNDX0NTUl9MU0lPTiAgICAgICAgICAgIC8qITwgTFNJIGNsb2NrIGFjdGl2YXRpb24gKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTVNJX0NvbmZpZyBNU0kgQ29uZmlnCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX01TSV9PRkYgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQorI2RlZmluZSBSQ0NfTVNJX09OICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpCisKKyNkZWZpbmUgUkNDX01TSUNBTElCUkFUSU9OX0RFRkFVTFQgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAvKiBEZWZhdWx0IE1TSSBjYWxpYnJhdGlvbiB0cmltbWluZyB2YWx1ZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTSTQ4X0NvbmZpZyBIU0k0OCBDb25maWcKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSFNJNDhfT0ZGICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDApCisjZGVmaW5lIFJDQ19IU0k0OF9PTiAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSQ0NfSFNJNDhfU1VQUE9SVCAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExfQ29uZmlnIFBMTCBDb25maWcKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUExMX05PTkUgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAgLyohPCBQTEwgaXMgbm90IGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgUkNDX1BMTF9PRkYgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkgIC8qITwgUExMIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfUExMX09OICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKSAgLyohPCBQTEwgYWN0aXZhdGlvbiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19TeXN0ZW1fQ2xvY2tfVHlwZSBTeXN0ZW0gQ2xvY2sgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfU1lTQ0xLICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkgLyohPCBTWVNDTEsgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfSENMSyAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikgLyohPCBIQ0xLIHRvIGNvbmZpZ3VyZSAqLworI2RlZmluZSBSQ0NfQ0xPQ0tUWVBFX1BDTEsxICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpIC8qITwgUENMSzEgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfUENMSzIgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOCkgLyohPCBQQ0xLMiB0byBjb25maWd1cmUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZSBTeXN0ZW0gQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9NU0kgICAgICAgICAgICAgUkNDX0NGR1JfU1dfTVNJIC8qITwgTVNJIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX0hTSSAgICAgICAgICAgICBSQ0NfQ0ZHUl9TV19IU0kgLyohPCBIU0kgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfSFNFICAgICAgICAgICAgIFJDQ19DRkdSX1NXX0hTRSAvKiE8IEhTRSBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9QTExDTEsgICAgICAgICAgUkNDX0NGR1JfU1dfUExMIC8qITwgUExMIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19TeXN0ZW1fQ2xvY2tfU291cmNlX1N0YXR1cyBTeXN0ZW0gQ2xvY2sgU291cmNlIFN0YXR1cworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX01TSSAgICAgIFJDQ19DRkdSX1NXU19NU0kgICAgICAgICAgICAvKiE8IE1TSSB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0kgICAgICBSQ0NfQ0ZHUl9TV1NfSFNJICAgICAgICAgICAgLyohPCBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNFICAgICAgUkNDX0NGR1JfU1dTX0hTRSAgICAgICAgICAgIC8qITwgSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSyAgIFJDQ19DRkdSX1NXU19QTEwgICAgICAgICAgICAvKiE8IFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEJfQ2xvY2tfU291cmNlIEFIQiBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjEgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjEgICAvKiE8IFNZU0NMSyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjIgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjIgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVY0ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVY0ICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWOCAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWOCAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjE2ICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjE2ICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWNjQgICAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWNjQgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVYxMjggICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVYxMjggLyohPCBTWVNDTEsgZGl2aWRlZCBieSAxMjggKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVYyNTYgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVYyNTYgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyNTYgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVY1MTIgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVY1MTIgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA1MTIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9BUEIyX0Nsb2NrX1NvdXJjZSBBUEIxIEFQQjIgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWMSAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTFfRElWMSAgLyohPCBIQ0xLIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIFJDQ19IQ0xLX0RJVjIgICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUxX0RJVjIgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWNCAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTFfRElWNCAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBSQ0NfSENMS19ESVY4ICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMV9ESVY4ICAvKiE8IEhDTEsgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIFJDQ19IQ0xLX0RJVjE2ICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUxX0RJVjE2IC8qITwgSENMSyBkaXZpZGVkIGJ5IDE2ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hBTF9FQ19SVENfSFNFX0RJViBSVEMgSFNFIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19SVENfSFNFX0RJVl8yICAgICAgICAgICAgICAgKHVpbnQzMl90KTB4MDAwMDAwMDBVIC8qITwgSFNFIGlzIGRpdmlkZWQgYnkgMiBmb3IgUlRDIGNsb2NrICAqLworI2RlZmluZSBSQ0NfUlRDX0hTRV9ESVZfNCAgICAgICAgICAgICAgIFJDQ19DUl9SVENQUkVfMCAgICAgICAvKiE8IEhTRSBpcyBkaXZpZGVkIGJ5IDQgZm9yIFJUQyBjbG9jayAgKi8KKyNkZWZpbmUgUkNDX1JUQ19IU0VfRElWXzggICAgICAgICAgICAgICBSQ0NfQ1JfUlRDUFJFXzEgICAgICAgLyohPCBIU0UgaXMgZGl2aWRlZCBieSA4IGZvciBSVEMgY2xvY2sgICovCisjZGVmaW5lIFJDQ19SVENfSFNFX0RJVl8xNiAgICAgICAgICAgICAgUkNDX0NSX1JUQ1BSRSAgICAgICAgIC8qITwgSFNFIGlzIGRpdmlkZWQgYnkgMTYgZm9yIFJUQyBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUlRDX0xDRF9DbG9ja19Tb3VyY2UgUlRDIExDRCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSyAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApICAgICAgICAgICAgICAgICAvKiE8IE5vIGNsb2NrICovCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTFNFICAgICAgICAgICAgIFJDQ19DU1JfUlRDU0VMX0xTRSAgICAgICAgICAgICAgICAgIC8qITwgTFNFIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9MU0kgICAgICAgICAgICAgUkNDX0NTUl9SVENTRUxfTFNJICAgICAgICAgICAgICAgICAgLyohPCBMU0kgb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVZYICAgICAgICBSQ0NfQ1NSX1JUQ1NFTF9IU0UgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0Ugb3NjaWxsYXRvciBjbG9jayBkaXZpZGVkIGJ5IFggdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMiAgICAgICAgKFJDQ19SVENfSFNFX0RJVl8yICB8IFJDQ19DU1JfUlRDU0VMX0hTRSkgIC8qITwgSFNFIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSAyIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjQgICAgICAgIChSQ0NfUlRDX0hTRV9ESVZfNCAgfCBSQ0NfQ1NSX1JUQ1NFTF9IU0UpICAvKiE8IEhTRSBvc2NpbGxhdG9yIGNsb2NrIGRpdmlkZWQgYnkgNCB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVY4ICAgICAgICAoUkNDX1JUQ19IU0VfRElWXzggIHwgUkNDX0NTUl9SVENTRUxfSFNFKSAgLyohPCBIU0Ugb3NjaWxsYXRvciBjbG9jayBkaXZpZGVkIGJ5IDggdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMTYgICAgICAgKFJDQ19SVENfSFNFX0RJVl8xNiB8IFJDQ19DU1JfUlRDU0VMX0hTRSkgIC8qITwgSFNFIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSAxNiB1c2VkIGFzIFJUQyBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMX0RpdmlzaW9uX0ZhY3RvciBQTEwgRGl2aXNpb24gRmFjdG9yCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfUExMX0RJVjIgICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTERJVjIKKyNkZWZpbmUgUkNDX1BMTF9ESVYzICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExESVYzCisjZGVmaW5lIFJDQ19QTExfRElWNCAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMRElWNAorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExfTXVsdGlwbGljYXRpb25fRmFjdG9yIFBMTCBNdWx0aXBsaWNhdGlvbiBGYWN0b3IKKyAgKiBAeworICAqLworCisjZGVmaW5lIFJDQ19QTExfTVVMMyAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMworI2RlZmluZSBSQ0NfUExMX01VTDQgICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDQKKyNkZWZpbmUgUkNDX1BMTF9NVUw2ICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUw2CisjZGVmaW5lIFJDQ19QTExfTVVMOCAgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMOAorI2RlZmluZSBSQ0NfUExMX01VTDEyICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDEyCisjZGVmaW5lIFJDQ19QTExfTVVMMTYgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMTYKKyNkZWZpbmUgUkNDX1BMTF9NVUwyNCAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUwyNAorI2RlZmluZSBSQ0NfUExMX01VTDMyICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDMyCisjZGVmaW5lIFJDQ19QTExfTVVMNDggICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMNDgKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTUNPX0luZGV4IE1DTyBJbmRleAorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19NQ08xICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkKKyNkZWZpbmUgUkNDX01DTzIgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKQorI2lmICBkZWZpbmVkKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KSBcCisgIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgxeHgpCisjZGVmaW5lIFJDQ19NQ08zICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19NQ094X0Nsb2NrX1ByZXNjYWxlciBNQ08gQ2xvY2sgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX01DT0RJVl8xICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09fUFJFXzEKKyNkZWZpbmUgUkNDX01DT0RJVl8yICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09fUFJFXzIKKyNkZWZpbmUgUkNDX01DT0RJVl80ICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09fUFJFXzQKKyNkZWZpbmUgUkNDX01DT0RJVl84ICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09fUFJFXzgKKyNkZWZpbmUgUkNDX01DT0RJVl8xNiAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09fUFJFXzE2CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX01DTzFfQ2xvY2tfU291cmNlIE1DTzEgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfTk9DTE9DSyAgICAgICAgICAgUkNDX0NGR1JfTUNPX05PQ0xPQ0sKKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfU1lTQ0xLICAgICAgICAgICAgUkNDX0NGR1JfTUNPX1NZU0NMSworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9NU0kgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09fTVNJCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX0hTSSAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT19IU0kKKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfTFNFICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPX0xTRQorI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9MU0kgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09fTFNJCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX0hTRSAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT19IU0UKKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfUExMQ0xLICAgICAgICAgICAgUkNDX0NGR1JfTUNPX1BMTAorI2lmIGRlZmluZWQoUkNDX0NGR1JfTUNPU0VMX0hTSTQ4KQorI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9IU0k0OCAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09fSFNJNDgKKyNlbmRpZiAvKiBSQ0NfQ0ZHUl9NQ09TRUxfSFNJNDggKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0ludGVycnVwdCBJbnRlcnJ1cHRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0lUX0xTSVJEWSAgICAgICAgICAgICAgICAgICAgUkNDX0NJRlJfTFNJUkRZRiAgIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9MU0VSRFkgICAgICAgICAgICAgICAgICAgIFJDQ19DSUZSX0xTRVJEWUYgICAvKiE8IExTRSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfSFNJUkRZICAgICAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9IU0lSRFlGICAgLyohPCBIU0kgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX0hTRVJEWSAgICAgICAgICAgICAgICAgICAgUkNDX0NJRlJfSFNFUkRZRiAgIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9QTExSRFkgICAgICAgICAgICAgICAgICAgIFJDQ19DSUZSX1BMTFJEWUYgICAvKiE8IFBMTCBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfTVNJUkRZICAgICAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9NU0lSRFlGICAgLyohPCBNU0kgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX0xTRUNTUyAgICAgICAgICAgICAgICAgICAgUkNDX0NJRlJfQ1NTTFNFRiAgIC8qITwgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgZmxhZyAqLworI2lmIGRlZmluZWQoUkNDX0hTRUNTU19TVVBQT1JUKQorI2RlZmluZSBSQ0NfSVRfQ1NTICAgICAgICAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9DU1NIU0VGICAgLyohPCBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8KKyNlbmRpZiAvKiBSQ0NfSFNFQ1NTX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFJDQ19IU0k0OF9TVVBQT1JUKQorI2RlZmluZSBSQ0NfSVRfSFNJNDhSRFkgICAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9IU0k0OFJEWUYgLyohPCBIU0k0OCBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2VuZGlmIC8qIFJDQ19IU0k0OF9TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19GbGFnIEZsYWdzCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiBYWFhZWVlZWWIKKyAgKiAgICAgICAgICAgLSBZWVlZWSAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSByZWdpc3RlcgorICAqICAgICAgICAgICAtIFhYWCAgOiBSZWdpc3RlciBpbmRleAorICAqICAgICAgICAgICAgICAgICAtIDAwMTogQ1IgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTA6IENTUiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDAxMTogQ1JSQ1IgcmVnaXN0ZXIgKCopCisgICogKCopICAgQXBwbGljYWJsZSBvbmx5IGZvciBTVE0zMkwwNTJ4eCwgU1RNMzJMMDUzeHgsICguLi4pLCBTVE0zMkwwNzN4eCAmIFNUTTMyTDA4Mnh4CisgICogQHsKKyAgKi8KKy8qIEZsYWdzIGluIHRoZSBDUiByZWdpc3RlciAqLworI2RlZmluZSBSQ0NfRkxBR19IU0lSRFkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDUl9SRUdfSU5ERVggPDwgNSkgfCBSQ0NfQ1JfSFNJUkRZX1BvcykpICAgICAvKiE8IEludGVybmFsIEhpZ2ggU3BlZWQgY2xvY2sgcmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19IU0lESVYgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDUl9SRUdfSU5ERVggPDwgNSkgfCBSQ0NfQ1JfSFNJRElWRl9Qb3MpKSAgICAvKiE8IEhTSTE2IGRpdmlkZXIgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19NU0lSRFkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDUl9SRUdfSU5ERVggPDwgNSkgfCBSQ0NfQ1JfTVNJUkRZX1BvcykpICAgICAvKiE8IE1TSSBjbG9jayByZWFkeSBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX0hTRVJEWSAgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENSX1JFR19JTkRFWCA8PCA1KSB8IFJDQ19DUl9IU0VSRFlfUG9zKSkgICAgIC8qITwgRXh0ZXJuYWwgSGlnaCBTcGVlZCBjbG9jayByZWFkeSBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX1BMTFJEWSAgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENSX1JFR19JTkRFWCA8PCA1KSB8IFJDQ19DUl9QTExSRFlfUG9zKSkgICAgIC8qITwgUExMIGNsb2NrIHJlYWR5IGZsYWcgKi8KKy8qIEZsYWdzIGluIHRoZSBDU1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfTFNJUkRZICAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoQ1NSX1JFR19JTkRFWCA8PCA1KSB8IFJDQ19DU1JfTFNJUkRZX1BvcykpICAgLyohPCBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciBSZWFkeSAqLworI2RlZmluZSBSQ0NfRkxBR19MU0VSRFkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDU1JfUkVHX0lOREVYIDw8IDUpIHwgUkNDX0NTUl9MU0VSRFlfUG9zKSkgICAvKiE8IEV4dGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIFJlYWR5ICovCisjZGVmaW5lIFJDQ19GTEFHX0xTRUNTUyAgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENTUl9SRUdfSU5ERVggPDwgNSkgfCBSQ0NfQ1NSX0xTRUNTU0RfUG9zKSkgIC8qITwgQ1NTIG9uIExTRSBmYWlsdXJlIERldGVjdGlvbiAqLworI2RlZmluZSBSQ0NfRkxBR19PQkxSU1QgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDU1JfUkVHX0lOREVYIDw8IDUpIHwgUkNDX0NTUl9PQkxSU1RGX1BvcykpICAvKiE8IE9wdGlvbnMgYnl0ZXMgbG9hZGluZyByZXNldCBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX1BJTlJTVCAgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENTUl9SRUdfSU5ERVggPDwgNSkgfCBSQ0NfQ1NSX1BJTlJTVEZfUG9zKSkgIC8qITwgUElOIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfUE9SUlNUICAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoQ1NSX1JFR19JTkRFWCA8PCA1KSB8IFJDQ19DU1JfUE9SUlNURl9Qb3MpKSAgLyohPCBQT1IvUERSIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfU0ZUUlNUICAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoQ1NSX1JFR19JTkRFWCA8PCA1KSB8IFJDQ19DU1JfU0ZUUlNURl9Qb3MpKSAgLyohPCBTb2Z0d2FyZSBSZXNldCBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX0lXREdSU1QgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENTUl9SRUdfSU5ERVggPDwgNSkgfCBSQ0NfQ1NSX0lXREdSU1RGX1BvcykpIC8qITwgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19XV0RHUlNUICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDU1JfUkVHX0lOREVYIDw8IDUpIHwgUkNDX0NTUl9XV0RHUlNURl9Qb3MpKSAvKiE8IFdpbmRvdyB3YXRjaGRvZyByZXNldCBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX0xQV1JSU1QgICAgICAgICAgICAgICAgICgodWludDhfdCkoKENTUl9SRUdfSU5ERVggPDwgNSkgfCBSQ0NfQ1NSX0xQV1JSU1RGX1BvcykpIC8qITwgTG93LVBvd2VyIHJlc2V0IGZsYWcgKi8KKyNpZiBkZWZpbmVkKFJDQ19DU1JfRldSU1RGKQorI2RlZmluZSBSQ0NfRkxBR19GV1JTVCAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKChDU1JfUkVHX0lOREVYIDw8IDUpIHwgUkNDX0NTUl9GV1JTVEZfUG9zKSkgICAvKiE8IFJDQyBmbGFnIEZXIHJlc2V0ICovCisjZW5kaWYgLyogUkNDX0NTUl9GV1JTVEYgKi8KKy8qIEZsYWdzIGluIHRoZSBDUlJDUiByZWdpc3RlciAqLworI2lmIGRlZmluZWQoUkNDX0hTSTQ4X1NVUFBPUlQpCisjZGVmaW5lIFJDQ19GTEFHX0hTSTQ4UkRZICAgICAgICAgICAgICAgICgodWludDhfdCkoKENSUkNSX1JFR19JTkRFWCA8PCA1KSB8IFJDQ19DUlJDUl9IU0k0OFJEWV9Qb3MpKSAgLyohPCBIU0k0OCBjbG9jayByZWFkeSBmbGFnICovCisjZW5kaWYgLyogUkNDX0hTSTQ4X1NVUFBPUlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfTWFjcm9zIFJDQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEJfUGVyaXBoZXJhbF9DbG9ja19FbmFibGVfRGlzYWJsZSBBSEIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQiBwZXJpcGhlcmFsIGNsb2NrLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0NMS19FTkFCTEUoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9ETUExRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfRE1BMUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19NSUZfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX01JRkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX01JRkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0NSQ0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0NSQ0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfRE1BMUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfTUlGX0NMS19ESVNBQkxFKCkgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9NSUZFTikKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19DTEtfRElTQUJMRSgpICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfQ1JDRU4pCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0lPUE9SVF9DbG9ja19FbmFibGVfRGlzYWJsZSBJT1BPUlQgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIElPUE9SVCBwZXJpcGhlcmFsIGNsb2NrLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0FFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPQUVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0JFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPQkVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0NFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPQ0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPSF9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0hFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPSEVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0NMS19ESVNBQkxFKCkgICAgICAgIENMRUFSX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPQUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX0RJU0FCTEUoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9CRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfRElTQUJMRSgpICAgICAgICBDTEVBUl9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0NFTikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0NMS19ESVNBQkxFKCkgICAgICAgIENMRUFSX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPSEVOKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIxX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFQQjEgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIExvdyBTcGVlZCBBUEIgKEFQQjEpIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfV1dER0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9DTEtfRU5BQkxFKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfUFdSRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX1dXREdFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX1BXUkVOKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgQVBCMiBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgSGlnaCBTcGVlZCBBUEIgKEFQQjIpIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCkgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgKFJDQ19BUEIyRU5SX1NZU0NGR0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RCR01DVV9DTEtfRU5BQkxFKCkgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgKFJDQ19BUEIyRU5SX0RCR01DVUVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCAoUkNDX0FQQjJFTlJfU1lTQ0ZHRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfREJHTUNVX0NMS19ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCAoUkNDX0FQQjJFTlJfREJHTUNVRU4pKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCX1BlcmlwaGVyYWxfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFIQiBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9ETUExRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfTUlGX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfTUlGRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfQ1JDRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfRE1BMUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX01JRl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX01JRkVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0NSQ0VOKSA9PSAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSU9QT1JUX1BlcmlwaGVyYWxfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIElPUE9SVCBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBJT1BPUlQgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0FFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0JFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0NFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPSF9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0hFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0FFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0JFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0NFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPSF9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0hFTikgPT0gMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFQQjEgUGVyaXBoZXJhbCBDbG9jayBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cworICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1dXREdFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1BXUkVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfV1dER0VOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfUFdSRU4pID09IDBVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIyX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFQQjIgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NZU0NGR0VOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0RCR01DVV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9EQkdNQ1VFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfU1lTQ0ZHRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfREJHTUNVX0lTX0NMS19ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX0RCR01DVUVOKSA9PSAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworIC8qKiBAZGVmZ3JvdXAgUkNDX0FIQl9Gb3JjZV9SZWxlYXNlX1Jlc2V0IEFIQiBQZXJpcGhlcmFsIEZvcmNlIFJlbGVhc2UgUmVzZXQKKyAgKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQUhCIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FIQl9GT1JDRV9SRVNFVCgpICAgICAoUkNDLT5BSEJSU1RSID0gMHhGRkZGRkZGRlUpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0ZPUkNFX1JFU0VUKCkgICAgU0VUX0JJVChSQ0MtPkFIQlJTVFIsIChSQ0NfQUhCUlNUUl9ETUExUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX01JRl9GT1JDRV9SRVNFVCgpICAgICBTRVRfQklUKFJDQy0+QUhCUlNUUiwgKFJDQ19BSEJSU1RSX01JRlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfRk9SQ0VfUkVTRVQoKSAgICAgU0VUX0JJVChSQ0MtPkFIQlJTVFIsIChSQ0NfQUhCUlNUUl9DUkNSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BSEJfUkVMRUFTRV9SRVNFVCgpICAgICAoUkNDLT5BSEJSU1RSID0gMHgwMDAwMDAwMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfUkVMRUFTRV9SRVNFVCgpICAgICBDTEVBUl9CSVQoUkNDLT5BSEJSU1RSLCAoUkNDX0FIQlJTVFJfQ1JDUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfUkVMRUFTRV9SRVNFVCgpICAgIENMRUFSX0JJVChSQ0MtPkFIQlJTVFIsIChSQ0NfQUhCUlNUUl9ETUExUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX01JRl9SRUxFQVNFX1JFU0VUKCkgICAgIENMRUFSX0JJVChSQ0MtPkFIQlJTVFIsIChSQ0NfQUhCUlNUUl9NSUZSU1QpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSU9QT1JUX0ZvcmNlX1JlbGVhc2VfUmVzZXQgSU9QT1JUIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldAorICAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBJT1BPUlQgcGVyaXBoZXJhbCByZXNldC4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSU9QX0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPklPUFJTVFIgPSAweEZGRkZGRkZGVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0ZPUkNFX1JFU0VUKCkgICBTRVRfQklUKFJDQy0+SU9QUlNUUiwgKFJDQ19JT1BSU1RSX0dQSU9BUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0ZPUkNFX1JFU0VUKCkgICBTRVRfQklUKFJDQy0+SU9QUlNUUiwgKFJDQ19JT1BSU1RSX0dQSU9CUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0ZPUkNFX1JFU0VUKCkgICBTRVRfQklUKFJDQy0+SU9QUlNUUiwgKFJDQ19JT1BSU1RSX0dQSU9DUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0ZPUkNFX1JFU0VUKCkgICBTRVRfQklUKFJDQy0+SU9QUlNUUiwgKFJDQ19JT1BSU1RSX0dQSU9IUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfSU9QX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPklPUFJTVFIgPSAweDAwMDAwMDAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX1JFTEVBU0VfUkVTRVQoKSBDTEVBUl9CSVQoUkNDLT5JT1BSU1RSLCAoUkNDX0lPUFJTVFJfR1BJT0FSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfUkVMRUFTRV9SRVNFVCgpIENMRUFSX0JJVChSQ0MtPklPUFJTVFIsIChSQ0NfSU9QUlNUUl9HUElPQlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19SRUxFQVNFX1JFU0VUKCkgQ0xFQVJfQklUKFJDQy0+SU9QUlNUUiwgKFJDQ19JT1BSU1RSX0dQSU9DUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX1JFTEVBU0VfUkVTRVQoKSBDTEVBUl9CSVQoUkNDLT5JT1BSU1RSLCAoUkNDX0lPUFJTVFJfR1BJT0hSU1QpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIxX0ZvcmNlX1JlbGVhc2VfUmVzZXQgQVBCMSBQZXJpcGhlcmFsIEZvcmNlIFJlbGVhc2UgUmVzZXQKKyAgKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQVBCMSBwZXJpcGhlcmFsIHJlc2V0LgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUKCkgICAgIChSQ0MtPkFQQjFSU1RSID0gMHhGRkZGRkZGRlUpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0ZPUkNFX1JFU0VUKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9XV0RHUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9GT1JDRV9SRVNFVCgpICAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1BXUlJTVCkpCisKKyNkZWZpbmUgX19IQUxfUkNDX0FQQjFfUkVMRUFTRV9SRVNFVCgpICAgKFJDQy0+QVBCMVJTVFIgPSAweDAwMDAwMDAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfUkVMRUFTRV9SRVNFVCgpICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfV1dER1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfUkVMRUFTRV9SRVNFVCgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1BXUlJTVCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfRm9yY2VfUmVsZWFzZV9SZXNldCBBUEIyIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldAorICAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBUEIyIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FQQjJfRk9SQ0VfUkVTRVQoKSAgICAgKFJDQy0+QVBCMlJTVFIgPSAweEZGRkZGRkZGVSkKKyNkZWZpbmUgX19IQUxfUkNDX0RCR01DVV9GT1JDRV9SRVNFVCgpICAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCAoUkNDX0FQQjJSU1RSX0RCR01DVVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfRk9SQ0VfUkVTRVQoKSAgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgKFJDQ19BUEIyUlNUUl9TWVNDRkdSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BUEIyX1JFTEVBU0VfUkVTRVQoKSAgIChSQ0MtPkFQQjJSU1RSID0gMHgwMDAwMDAwMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19EQkdNQ1VfUkVMRUFTRV9SRVNFVCgpIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCAoUkNDX0FQQjJSU1RSX0RCR01DVVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfUkVMRUFTRV9SRVNFVCgpIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCAoUkNDX0FQQjJSU1RSX1NZU0NGR1JTVCkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQl9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBBSEIgUGVyaXBoZXJhbCBDbG9jayBTbGVlcCBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgYWN0aXZhdGVkIGNsb2NrcyByZW1haW4gZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgIFNFVF9CSVQoUkNDLT5BSEJTTUVOUiwgKFJDQ19BSEJTTUVOUl9DUkNTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX01JRl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBTRVRfQklUKFJDQy0+QUhCU01FTlIsIChSQ0NfQUhCU01FTlJfTUlGU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPkFIQlNNRU5SLCAoUkNDX0FIQlNNRU5SX1NSQU1TTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBTRVRfQklUKFJDQy0+QUhCU01FTlIsIChSQ0NfQUhCU01FTlJfRE1BMVNNRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgQ0xFQVJfQklUKFJDQy0+QUhCU01FTlIsIChSQ0NfQUhCU01FTlJfQ1JDU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19NSUZfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgQ0xFQVJfQklUKFJDQy0+QUhCU01FTlIsIChSQ0NfQUhCU01FTlJfTUlGU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QUhCU01FTlIsIChSQ0NfQUhCU01FTlJfU1JBTVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFIQlNNRU5SLCAoUkNDX0FIQlNNRU5SX0RNQTFTTUVOKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0lPUE9SVF9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBJT1BPUlQgUGVyaXBoZXJhbCBDbG9jayBTbGVlcCBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIElPUE9SVCBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgYWN0aXZhdGVkIGNsb2NrcyByZW1haW4gZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPklPUFNNRU5SLCAoUkNDX0lPUFNNRU5SX0dQSU9BU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPklPUFNNRU5SLCAoUkNDX0lPUFNNRU5SX0dQSU9CU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPklPUFNNRU5SLCAoUkNDX0lPUFNNRU5SX0dQSU9DU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPSF9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPklPUFNNRU5SLCAoUkNDX0lPUFNNRU5SX0dQSU9IU01FTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0NMS19TTEVFUF9ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5JT1BTTUVOUiwgKFJDQ19JT1BTTUVOUl9HUElPQVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgIENMRUFSX0JJVChSQ0MtPklPUFNNRU5SLCAoUkNDX0lPUFNNRU5SX0dQSU9CU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfU0xFRVBfRElTQUJMRSgpICAgQ0xFQVJfQklUKFJDQy0+SU9QU01FTlIsIChSQ0NfSU9QU01FTlJfR1BJT0NTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0NMS19TTEVFUF9ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5JT1BTTUVOUiwgKFJDQ19JT1BTTUVOUl9HUElPSFNNRU4pKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBBUEIxIFBlcmlwaGVyYWwgQ2xvY2sgU2xlZXAgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBhY3RpdmF0ZWQgY2xvY2tzIHJlbWFpbiBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9FTkFCTEUoKSAgICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9XV0RHU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9QV1JTTUVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRElTQUJMRSgpICAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SLCAgKFJDQ19BUEIxU01FTlJfV1dER1NNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SLCAgKFJDQ19BUEIxU01FTlJfUFdSU01FTikpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQVBCMiBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgYWN0aXZhdGVkIGNsb2NrcyByZW1haW4gZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19TTEVFUF9FTkFCTEUoKSAgIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIChSQ0NfQVBCMlNNRU5SX1NZU0NGR1NNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfREJHTUNVX0NMS19TTEVFUF9FTkFCTEUoKSAgIFNFVF9CSVQoUkNDLT5BUEIyU01FTlIsIChSQ0NfQVBCMlNNRU5SX0RCR01DVVNNRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgICAoUkNDX0FQQjJTTUVOUl9TWVNDRkdTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RCR01DVV9DTEtfU0xFRVBfRElTQUJMRSgpICAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCAgIChSQ0NfQVBCMlNNRU5SX0RCR01DVVNNRU4pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEJfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFIQiBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QUhCU01FTlIsIFJDQ19BSEJTTUVOUl9DUkNTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX01JRl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfTUlGU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX1NSQU1TTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfRE1BMVNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgKFJFQURfQklUKFJDQy0+QUhCU01FTlIsIFJDQ19BSEJTTUVOUl9DUkNTTUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX01JRl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfTUlGU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX1NSQU1TTUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfRE1BMVNNRU4pID09IDBVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19JT1BPUlRfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIElPUE9SVCBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBJT1BPUlQgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5JT1BTTUVOUiwgUkNDX0lPUFNNRU5SX0dQSU9BU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0JTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+SU9QU01FTlIsIFJDQ19JT1BTTUVOUl9HUElPQ1NNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0hfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5JT1BTTUVOUiwgUkNDX0lPUFNNRU5SX0dQSU9IU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0FTTUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgKFJFQURfQklUKFJDQy0+SU9QU01FTlIsIFJDQ19JT1BTTUVOUl9HUElPQlNNRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5JT1BTTUVOUiwgUkNDX0lPUFNNRU5SX0dQSU9DU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPSF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0hTTUVOKSA9PSAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQVBCMSBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfV1dER1NNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9QV1JTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfV1dER1NNRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9QV1JTTUVOKSA9PSAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMl9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQVBCMiBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TWVNDRkdTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0RCR01DVV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9EQkdNQ1VTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TWVNDRkdTTUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0RCR01DVV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9EQkdNQ1VTTUVOKSA9PSAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0hTSV9Db25maWd1cmF0aW9uIEhTSSBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgTWFjcm8gdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKS4KKyAgKiBAbm90ZSAgICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIEhTSSwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uCisgICogICAgICAgICAgIEhTSVJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgSFNJIGNsb2NrIGlzIHN0YWJsZSBhbmQgY2FuCisgICogICAgICAgICAgIGJlIHVzZWQgdG8gY2xvY2sgdGhlIFBMTCBhbmQvb3Igc3lzdGVtIGNsb2NrLgorICAqIEBub3RlICAgICBIU0kgY2FuIG5vdCBiZSBzdG9wcGVkIGlmIGl0IGlzIHVzZWQgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgUExMCisgICogICAgICAgICAgIGFzIHN5c3RlbSBjbG9jay4gSW4gdGhpcyBjYXNlLCB5b3UgaGF2ZSB0byBzZWxlY3QgYW5vdGhlciBzb3VyY2UKKyAgKiAgICAgICAgICAgb2YgdGhlIHN5c3RlbSBjbG9jayB0aGVuIHN0b3AgdGhlIEhTSS4KKyAgKiBAbm90ZSAgICAgVGhlIEhTSSBpcyBzdG9wcGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAgKiBAcGFyYW0gICAgX19TVEFURV9fIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBIU0kuCisgICogICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSV9PRkYgdHVybiBPRkYgdGhlIEhTSSBvc2NpbGxhdG9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSV9PTiB0dXJuIE9OIHRoZSBIU0kgb3NjaWxsYXRvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0lfRElWNCB0dXJuIE9OIHRoZSBIU0kgb3NjaWxsYXRvciBhbmQgZGl2aWRlIGl0IGJ5IDQKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIEhTSSBpcyBzdG9wcGVkLCBIU0lSRFkgZmxhZyBnb2VzIGxvdyBhZnRlciA2IEhTSSBvc2NpbGxhdG9yCisgICogICAgICAgICBjbG9jayBjeWNsZXMuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lfQ09ORklHKF9fU1RBVEVfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04gfCBSQ0NfQ1JfSFNJRElWRU4gLCAodWludDMyX3QpKF9fU1RBVEVfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpLgorICAqIEBub3RlICAgVGhlIEhTSSBpcyBzdG9wcGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAgKiAgICAgICAgIEl0IGlzIHVzZWQgKGVuYWJsZWQgYnkgaGFyZHdhcmUpIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgYWZ0ZXIgc3RhcnR1cAorICAqICAgICAgICAgZnJvbSBSZXNldCwgd2FrZXVwIGZyb20gU1RPUCBhbmQgU1RBTkRCWSBtb2RlLCBvciBpbiBjYXNlIG9mIGZhaWx1cmUKKyAgKiAgICAgICAgIG9mIHRoZSBIU0UgdXNlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGFzIHN5c3RlbSBjbG9jayAoaWYgdGhlIENsb2NrCisgICogICAgICAgICBTZWN1cml0eSBTeXN0ZW0gQ1NTIGlzIGVuYWJsZWQpLgorICAqIEBub3RlICAgSFNJIGNhbiBub3QgYmUgc3RvcHBlZCBpZiBpdCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuIEluIHRoaXMgY2FzZSwKKyAgKiAgICAgICAgIHlvdSBoYXZlIHRvIHNlbGVjdCBhbm90aGVyIHNvdXJjZSBvZiB0aGUgc3lzdGVtIGNsb2NrIHRoZW4gc3RvcCB0aGUgSFNJLgorICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIEhTSSwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uIEhTSVJEWQorICAqICAgICAgICAgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IEhTSSBjbG9jayBpcyBzdGFibGUgYW5kIGNhbiBiZSB1c2VkIGFzCisgICogICAgICAgICBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqIEBub3RlICAgV2hlbiB0aGUgSFNJIGlzIHN0b3BwZWQsIEhTSVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyIDYgSFNJIG9zY2lsbGF0b3IKKyAgKiAgICAgICAgIGNsb2NrIGN5Y2xlcy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTSV9FTkFCTEUoKSAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04pCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04pCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGFkanVzdCB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLgorICAqIEBub3RlICAgVGhlIGNhbGlicmF0aW9uIGlzIHVzZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIHZhcmlhdGlvbnMgaW4gdm9sdGFnZQorICAqICAgICAgICAgYW5kIHRlbXBlcmF0dXJlIHRoYXQgaW5mbHVlbmNlIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGludGVybmFsIEhTSSBSQy4KKyAgKiBAcGFyYW0gIF9IU0lDQUxJQlJBVElPTlZBTFVFXyBzcGVjaWZpZXMgdGhlIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlLgorICAqICAgICAgICAgKGRlZmF1bHQgaXMgUkNDX0hTSUNBTElCUkFUSU9OX0RFRkFVTFQpLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDB4MUYuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoX0hTSUNBTElCUkFUSU9OVkFMVUVfKSBcCisgICAgICAgICAgKE1PRElGWV9SRUcoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX0hTSVRSSU0sICh1aW50MzJfdCkoX0hTSUNBTElCUkFUSU9OVkFMVUVfKSA8PCBSQ0NfSUNTQ1JfSFNJVFJJTV9Qb3MpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MU0lfQ29uZmlndXJhdGlvbiAgTFNJIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIE1hY3JvIHRvIGVuYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSSkuCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgTFNJLCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgc2hvdWxkIHdhaXQgb24KKyAgKiAgICAgICAgIExTSVJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgTFNJIGNsb2NrIGlzIHN0YWJsZSBhbmQgY2FuCisgICogICAgICAgICBiZSB1c2VkIHRvIGNsb2NrIHRoZSBJV0RHIGFuZC9vciB0aGUgUlRDLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNJX0VOQUJMRSgpIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJT04pCisKKy8qKiBAYnJpZWYgTWFjcm8gdG8gZGlzYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSSkuCisgICogQG5vdGUgICBMU0kgY2FuIG5vdCBiZSBkaXNhYmxlZCBpZiB0aGUgSVdERyBpcyBydW5uaW5nLgorICAqIEBub3RlICAgV2hlbiB0aGUgTFNJIGlzIHN0b3BwZWQsIExTSVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyIDYgTFNJIG9zY2lsbGF0b3IKKyAgKiAgICAgICAgIGNsb2NrIGN5Y2xlcy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTSV9ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSU9OKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19IU0VfQ29uZmlndXJhdGlvbiBIU0UgQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBFeHRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTRSkuCisgICogQG5vdGUgICBUcmFuc2l0aW9uIEhTRSBCeXBhc3MgdG8gSFNFIE9uIGFuZCBIU0UgT24gdG8gSFNFIEJ5cGFzcyBhcmUgbm90CisgICogICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBtYWNyby4gVXNlciBzaG91bGQgcmVxdWVzdCBhIHRyYW5zaXRpb24gdG8gSFNFIE9mZgorICAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gSFNFIE9uIG9yIEhTRSBCeXBhc3MuCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgSFNFIChSQ0NfSFNFX09OIG9yIFJDQ19IU0VfQnlwYXNzKSwgdGhlIGFwcGxpY2F0aW9uCisgICogICAgICAgICBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBIU0VSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IEhTRSBjbG9jaworICAqICAgICAgICAgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCB0byBjbG9jayB0aGUgUExMIGFuZC9vciBzeXN0ZW0gY2xvY2suCisgICogQG5vdGUgICBIU0Ugc3RhdGUgY2FuIG5vdCBiZSBjaGFuZ2VkIGlmIGl0IGlzIHVzZWQgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUKKyAgKiAgICAgICAgIFBMTCBhcyBzeXN0ZW0gY2xvY2suIEluIHRoaXMgY2FzZSwgeW91IGhhdmUgdG8gc2VsZWN0IGFub3RoZXIgc291cmNlCisgICogICAgICAgICBvZiB0aGUgc3lzdGVtIGNsb2NrIHRoZW4gY2hhbmdlIHRoZSBIU0Ugc3RhdGUgKGV4LiBkaXNhYmxlIGl0KS4KKyAgKiBAbm90ZSAgIFRoZSBIU0UgaXMgc3RvcHBlZCBieSBoYXJkd2FyZSB3aGVuIGVudGVyaW5nIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJlc2V0IHRoZSBDU1NPTiBiaXQsIHNvIGlmIHRoZSBjbG9jayBzZWN1cml0eSBzeXN0ZW0oQ1NTKQorICAqICAgICAgICAgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCB5b3UgaGF2ZSB0byBlbmFibGUgaXQgYWdhaW4gYWZ0ZXIgY2FsbGluZyB0aGlzCisgICogICAgICAgICBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIF9fU1RBVEVfXyBzcGVjaWZpZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgSFNFLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTRV9PRkYgdHVybiBPRkYgdGhlIEhTRSBvc2NpbGxhdG9yLCBIU0VSRFkgZmxhZyBnb2VzIGxvdyBhZnRlcgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiBIU0Ugb3NjaWxsYXRvciBjbG9jayBjeWNsZXMuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTRV9PTiB0dXJuIE9OIHRoZSBIU0Ugb3NjaWxsYXRvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQllQQVNTIEhTRSBvc2NpbGxhdG9yIGJ5cGFzc2VkIHdpdGggZXh0ZXJuYWwgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTRV9DT05GSUcoX19TVEFURV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKF9fU1RBVEVfXykgPT0gUkNDX0hTRV9PTikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKF9fU1RBVEVfXykgPT0gUkNDX0hTRV9CWVBBU1MpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRUJZUCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTFNFX0NvbmZpZ3VyYXRpb24gTFNFIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTRSkuCisgICogQG5vdGUgVHJhbnNpdGlvbnMgTFNFIEJ5cGFzcyB0byBMU0UgT24gYW5kIExTRSBPbiB0byBMU0UgQnlwYXNzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uCisgICogQG5vdGUgICBBcyB0aGUgTFNFIGlzIGluIHRoZSBCYWNrdXAgZG9tYWluIGFuZCB3cml0ZSBhY2Nlc3MgaXMgZGVuaWVkIHRvCisgICogICAgICAgICB0aGlzIGRvbWFpbiBhZnRlciByZXNldCwgeW91IGhhdmUgdG8gZW5hYmxlIHdyaXRlIGFjY2VzcyB1c2luZworICAqICAgICAgICAgQHJlZiBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3MoKSBmdW5jdGlvbiBiZWZvcmUgdG8gY29uZmlndXJlIHRoZSBMU0UKKyAgKiAgICAgICAgICh0byBiZSBkb25lIG9uY2UgYWZ0ZXIgcmVzZXQpLgorICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIExTRSAoUkNDX0xTRV9PTiBvciBSQ0NfTFNFX0JZUEFTUyksIHRoZSBhcHBsaWNhdGlvbgorICAqICAgICAgICAgc29mdHdhcmUgc2hvdWxkIHdhaXQgb24gTFNFUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBMU0UgY2xvY2sKKyAgKiAgICAgICAgIGlzIHN0YWJsZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2xvY2sgdGhlIFJUQy4KKyAgKiBAcGFyYW0gIF9fU1RBVEVfXyBzcGVjaWZpZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgTFNFLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFX09GRiB0dXJuIE9GRiB0aGUgTFNFIG9zY2lsbGF0b3IsIExTRVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IExTRSBvc2NpbGxhdG9yIGNsb2NrIGN5Y2xlcy4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFX09OIHR1cm4gT04gdGhlIExTRSBvc2NpbGxhdG9yLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VfQllQQVNTIExTRSBvc2NpbGxhdG9yIGJ5cGFzc2VkIHdpdGggZXh0ZXJuYWwgY2xvY2suCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VfQ09ORklHKF9fU1RBVEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKF9fU1RBVEVfXykgPT0gUkNDX0xTRV9PTikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0VPTik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKF9fU1RBVEVfXykgPT0gUkNDX0xTRV9PRkYpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0VPTik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNFQllQKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoX19TVEFURV9fKSA9PSBSQ0NfTFNFX0JZUEFTUykgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0VCWVApOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNFT04pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNFT04pOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTRUJZUCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19NU0lfQ29uZmlndXJhdGlvbiAgTVNJIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBNYWNybyB0byBlbmFibGUgSW50ZXJuYWwgTXVsdGkgU3BlZWQgb3NjaWxsYXRvciAoTVNJKS4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBNU0ksIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBNU0lSRFkKKyAgKiAgICAgICAgIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBNU0kgY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCBhcworICAqICAgICAgICAgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX01TSV9FTkFCTEUoKSAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfTVNJT04pCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGRpc2FibGUgdGhlIEludGVybmFsIE11bHRpIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkuCisgICogQG5vdGUgICBUaGUgTVNJIGlzIHN0b3BwZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLgorICAqICAgICAgICAgSXQgaXMgdXNlZCAoZW5hYmxlZCBieSBoYXJkd2FyZSkgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSBhZnRlciBzdGFydHVwCisgICogICAgICAgICBmcm9tIFJlc2V0LCB3YWtldXAgZnJvbSBTVE9QIGFuZCBTVEFOREJZIG1vZGUsIG9yIGluIGNhc2Ugb2YgZmFpbHVyZQorICAqICAgICAgICAgb2YgdGhlIEhTRSB1c2VkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYXMgc3lzdGVtIGNsb2NrIChpZiB0aGUgQ2xvY2sKKyAgKiAgICAgICAgIFNlY3VyaXR5IFN5c3RlbSBDU1MgaXMgZW5hYmxlZCkuCisgICogQG5vdGUgICBNU0kgY2FuIG5vdCBiZSBzdG9wcGVkIGlmIGl0IGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4gSW4gdGhpcyBjYXNlLAorICAqICAgICAgICAgeW91IGhhdmUgdG8gc2VsZWN0IGFub3RoZXIgc291cmNlIG9mIHRoZSBzeXN0ZW0gY2xvY2sgdGhlbiBzdG9wIHRoZSBNU0kuCisgICogQG5vdGUgICBXaGVuIHRoZSBNU0kgaXMgc3RvcHBlZCwgTVNJUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXIgNiBNU0kgb3NjaWxsYXRvcgorICAqICAgICAgICAgY2xvY2sgY3ljbGVzLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTVNJX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX01TSU9OKQorCisvKiogQGJyaWVmICBNYWNybyBhZGp1c3RzIEludGVybmFsIE11bHRpIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkgY2FsaWJyYXRpb24gdmFsdWUuCisgICogQG5vdGUgICBUaGUgY2FsaWJyYXRpb24gaXMgdXNlZCB0byBjb21wZW5zYXRlIGZvciB0aGUgdmFyaWF0aW9ucyBpbiB2b2x0YWdlCisgICogICAgICAgICBhbmQgdGVtcGVyYXR1cmUgdGhhdCBpbmZsdWVuY2UgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgaW50ZXJuYWwgTVNJIFJDLgorICAqICAgICAgICAgUmVmZXIgdG8gdGhlIEFwcGxpY2F0aW9uIE5vdGUgQU4zMzAwIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvCisgICogICAgICAgICBjYWxpYnJhdGUgdGhlIE1TSS4KKyAgKiBAcGFyYW0gIF9NU0lDQUxJQlJBVElPTlZBTFVFXyBzcGVjaWZpZXMgdGhlIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlLgorICAqICAgICAgICAgKGRlZmF1bHQgaXMgUkNDX01TSUNBTElCUkFUSU9OX0RFRkFVTFQpLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDB4RkYuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19NU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoX01TSUNBTElCUkFUSU9OVkFMVUVfKSBcCisgICAgICAgICAgKE1PRElGWV9SRUcoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX01TSVRSSU0sICh1aW50MzJfdCkoX01TSUNBTElCUkFUSU9OVkFMVUVfKSA8PCBSQ0NfSUNTQ1JfTVNJVFJJTV9Qb3MpKQorCisvKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZXMgdGhlIEludGVybmFsIE11bHRpIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkgY2xvY2sgcmFuZ2UuCisgICogQG5vdGUgICAgIEFmdGVyIHJlc3RhcnQgZnJvbSBSZXNldCBvciB3YWtldXAgZnJvbSBTVEFOREJZLCB0aGUgTVNJIGNsb2NrIGlzCisgICogICAgICAgICAgIGFyb3VuZCAyLjA5NyBNSHouIFRoZSBNU0kgY2xvY2sgZG9lcyBub3QgY2hhbmdlIGFmdGVyIHdha2UtdXAgZnJvbQorICAqICAgICAgICAgICBTVE9QIG1vZGUuCisgICogQG5vdGUgICAgVGhlIE1TSSBjbG9jayByYW5nZSBjYW4gYmUgbW9kaWZpZWQgb24gdGhlIGZseS4KKyAgKiBAcGFyYW0gIF9NU0lSQU5HRVZBTFVFXyBzcGVjaWZpZXMgdGhlIE1TSSBDbG9jayByYW5nZS4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgUkNDX01TSVJBTkdFXzAgTVNJIGNsb2NrIGlzIGFyb3VuZCA2NS41MzYgS0h6CisgICogICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMSBNU0kgY2xvY2sgaXMgYXJvdW5kIDEzMS4wNzIgS0h6CisgICogICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMiBNU0kgY2xvY2sgaXMgYXJvdW5kIDI2Mi4xNDQgS0h6CisgICogICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMyBNU0kgY2xvY2sgaXMgYXJvdW5kIDUyNC4yODggS0h6CisgICogICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfNCBNU0kgY2xvY2sgaXMgYXJvdW5kIDEuMDQ4IE1IegorICAqICAgICBAYXJnIEByZWYgUkNDX01TSVJBTkdFXzUgTVNJIGNsb2NrIGlzIGFyb3VuZCAyLjA5NyBNSHogKGRlZmF1bHQgYWZ0ZXIgUmVzZXQgb3Igd2FrZS11cCBmcm9tIFNUQU5EQlkpCisgICogICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfNiBNU0kgY2xvY2sgaXMgYXJvdW5kIDQuMTk0IE1IegorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTVNJX1JBTkdFX0NPTkZJRyhfTVNJUkFOR0VWQUxVRV8pIChNT0RJRllfUkVHKFJDQy0+SUNTQ1IsIFwKKyAgICAgICAgICBSQ0NfSUNTQ1JfTVNJUkFOR0UsICh1aW50MzJfdCkoX01TSVJBTkdFVkFMVUVfKSkpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgSW50ZXJuYWwgTXVsdGkgU3BlZWQgb3NjaWxsYXRvciAoTVNJKSBjbG9jayByYW5nZSBpbiBydW4gbW9kZQorICAqIEByZXR2YWwgTVNJIGNsb2NrIHJhbmdlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMCBNU0kgY2xvY2sgaXMgYXJvdW5kIDY1LjUzNiBLSHoKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19NU0lSQU5HRV8xIE1TSSBjbG9jayBpcyBhcm91bmQgMTMxLjA3MiBLSHoKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19NU0lSQU5HRV8yIE1TSSBjbG9jayBpcyBhcm91bmQgMjYyLjE0NCBLSHoKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19NU0lSQU5HRV8zIE1TSSBjbG9jayBpcyBhcm91bmQgNTI0LjI4OCBLSHoKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19NU0lSQU5HRV80IE1TSSBjbG9jayBpcyBhcm91bmQgMS4wNDggTUh6CisgICogICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfNSBNU0kgY2xvY2sgaXMgYXJvdW5kIDIuMDk3IE1IeiAoZGVmYXVsdCBhZnRlciBSZXNldCBvciB3YWtlLXVwIGZyb20gU1RBTkRCWSkKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19NU0lSQU5HRV82IE1TSSBjbG9jayBpcyBhcm91bmQgNC4xOTQgTUh6CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfTVNJX1JBTkdFKCkgKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPklDU0NSLCBSQ0NfSUNTQ1JfTVNJUkFOR0UpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExfQ29uZmlndXJhdGlvbiBQTEwgQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgTWFjcm8gdG8gZW5hYmxlIHRoZSBtYWluIFBMTC4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBtYWluIFBMTCwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uCisgICogICAgICAgICBQTExSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IFBMTCBjbG9jayBpcyBzdGFibGUgYW5kIGNhbgorICAqICAgICAgICAgYmUgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqIEBub3RlICAgVGhlIG1haW4gUExMIGlzIGRpc2FibGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9FTkFCTEUoKSBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExPTikKKworLyoqIEBicmllZiBNYWNybyB0byBkaXNhYmxlIHRoZSBtYWluIFBMTC4KKyAgKiBAbm90ZSAgIFRoZSBtYWluIFBMTCBjYW4gbm90IGJlIGRpc2FibGVkIGlmIGl0IGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTE9OKQorCisvKiogQGJyaWVmIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgbWFpbiBQTEwgY2xvY2sgc291cmNlLCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gZmFjdG9ycy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgbWFpbiBQTEwgaXMgZGlzYWJsZWQuCisgICoKKyAgKiBAcGFyYW0gIF9fUkNDX1BMTFNPVVJDRV9fIHNwZWNpZmllcyB0aGUgUExMIGVudHJ5IGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfSFNJIEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfSFNFIEhTRSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeQorICAqIEBwYXJhbSAgX19QTExNVUxfXyBzcGVjaWZpZXMgdGhlIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgUExMIFZDTyBvdXRwdXQgY2xvY2sKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX01VTDMgICBQTExWQ08gPSBQTEwgY2xvY2sgZW50cnkgeCAzCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfTVVMNCAgIFBMTFZDTyA9IFBMTCBjbG9jayBlbnRyeSB4IDQKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTF9NVUw2ICAgUExMVkNPID0gUExMIGNsb2NrIGVudHJ5IHggNgorICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX01VTDggICBQTExWQ08gPSBQTEwgY2xvY2sgZW50cnkgeCA4CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfTVVMMTIgIFBMTFZDTyA9IFBMTCBjbG9jayBlbnRyeSB4IDEyCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfTVVMMTYgIFBMTFZDTyA9IFBMTCBjbG9jayBlbnRyeSB4IDE2CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfTVVMMjQgIFBMTFZDTyA9IFBMTCBjbG9jayBlbnRyeSB4IDI0CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfTVVMMzIgIFBMTFZDTyA9IFBMTCBjbG9jayBlbnRyeSB4IDMyCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfTVVMNDggIFBMTFZDTyA9IFBMTCBjbG9jayBlbnRyeSB4IDQ4CisgICogQG5vdGUgVGhlIFBMTCBWQ08gY2xvY2sgZnJlcXVlbmN5IG11c3Qgbm90IGV4Y2VlZCA5NiBNSHogd2hlbiB0aGUgcHJvZHVjdCBpcyBpbiBSYW5nZSAxLAorICAqICAgICAgIDQ4IE1IeiB3aGVuIHRoZSBwcm9kdWN0IGlzIGluIFJhbmdlIDJhbmQgMjQgTUh6IHdoZW4gdGhlIHByb2R1Y3QgaXMgaW4gUmFuZ2UgMy4KKyAgKgorICAqIEBwYXJhbSAgX19QTExESVZfXyBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jaworICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfRElWMiBQTEwgY2xvY2sgb3V0cHV0ID0gUExMVkNPIC8gMgorICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX0RJVjMgUExMIGNsb2NrIG91dHB1dCA9IFBMTFZDTyAvIDMKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTF9ESVY0IFBMTCBjbG9jayBvdXRwdXQgPSBQTExWQ08gLyA0CisgICoKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9DT05GSUcoX19SQ0NfUExMU09VUkNFX18sIF9fUExMTVVMX18sIF9fUExMRElWX18pXAorICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCAoUkNDX0NGR1JfUExMU1JDfFJDQ19DRkdSX1BMTE1VTHxSQ0NfQ0ZHUl9QTExESVYpLCgoX19SQ0NfUExMU09VUkNFX18pIHwgKF9fUExMTVVMX18pIHwgKF9fUExMRElWX18pKSkKKworLyoqIEBicmllZiAgR2V0IG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGlucHV0IGNsb2NrCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIHVzZWQgZm9yIFBMTCBlbnRyeS4gVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUKKyAgKiAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmc6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfSFNJIEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBpbnB1dCBjbG9jaworICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTRSBIU0Ugb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwgaW5wdXQgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QTExTUkMpKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfR2V0X0Nsb2NrX3NvdXJjZSBHZXQgQ2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX1NZU0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9NU0kgTVNJIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9IU0kgSFNJIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9IU0UgSFNFIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9QTExDTEsgUExMIG91dHB1dCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDTEtfQ09ORklHKF9fU1lTQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TVywgKF9fU1lTQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIGNsb2NrIHNvdXJjZSB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lCisgICogICAgICAgICBvZiB0aGUgZm9sbG93aW5nOgorICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19NU0kgTVNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSSBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNFIEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jaworICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEsgUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUixSQ0NfQ0ZHUl9TV1MpKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9NQ094X0Nsb2NrX0NvbmZpZyBSQ0MgRXh0ZW5kZWQgTUNPeCBDbG9jayBDb25maWcKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIE1DTyBjbG9jay4KKyAgKiBAcGFyYW0gIF9fTUNPQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBNQ08gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTk9DTE9DSyAgICAgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1NZU0NMSyAgICAgICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJICAgICAgICAgIEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX01TSSAgICAgICAgICBNU0kgb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0UgSFNFIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfUExMQ0xLICAgICAgIFBMTCBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0kgICAgICAgICAgTFNJIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0xTRSAgICAgICAgICBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgIEBpZiBTVE0zMkwwNTJ4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTSTQ4ICAgICAgIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICBAZWxzZWlmIFNUTTMyTDA1M3h4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJNDggICAgICAgSFNJNDggY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgIEBlbHNlaWYgU1RNMzJMMDYyeHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0k0OCAgICAgICBIU0k0OCBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgQGVsc2VpZiBTVE0zMkwwNjN4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTSTQ4ICAgICAgIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICBAZWxzZWlmIFNUTTMyTDA3Mnh4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJNDggICAgICAgSFNJNDggY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgIEBlbHNlaWYgU1RNMzJMMDczeHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0k0OCAgICAgICBIU0k0OCBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgQGVsc2VpZiBTVE0zMkwwODJ4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTSTQ4ICAgICAgIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICBAZWxzZWlmIFNUTTMyTDA4M3h4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJNDggICAgICAgSFNJNDggY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgIEBlbmRpZgorICAqIEBwYXJhbSAgX19NQ09ESVZfXyBzcGVjaWZpZXMgdGhlIE1DTyBjbG9jayBwcmVzY2FsZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzEgICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgMQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMiAgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl80ICAgTUNPIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzggICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMTYgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAxNgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTUNPMV9DT05GSUcoX19NQ09DTEtTT1VSQ0VfXywgX19NQ09ESVZfXykgXAorICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgKFJDQ19DRkdSX01DT1NFTCB8IFJDQ19DRkdSX01DT19QUkUpLCAoKF9fTUNPQ0xLU09VUkNFX18pIHwgKF9fTUNPRElWX18pKSkKKworLyoqCisgICogQH0KKyAgKi8KKworICAvKiogQGRlZmdyb3VwIFJDQ19SVENfQ2xvY2tfQ29uZmlndXJhdGlvbiBSQ0MgUlRDIENsb2NrIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUlRDIGNsb2NrIChSVENDTEspLgorICAqIEBub3RlICAgQXMgdGhlIFJUQyBjbG9jayBjb25maWd1cmF0aW9uIGJpdHMgYXJlIGluIHRoZSBCYWNrdXAgZG9tYWluIGFuZCB3cml0ZQorICAqICAgICAgICAgYWNjZXNzIGlzIGRlbmllZCB0byB0aGlzIGRvbWFpbiBhZnRlciByZXNldCwgeW91IGhhdmUgdG8gZW5hYmxlIHdyaXRlCisgICogICAgICAgICBhY2Nlc3MgdXNpbmcgdGhlIFBvd2VyIEJhY2t1cCBBY2Nlc3MgbWFjcm8gYmVmb3JlIHRvIGNvbmZpZ3VyZQorICAqICAgICAgICAgdGhlIFJUQyBjbG9jayBzb3VyY2UgKHRvIGJlIGRvbmUgb25jZSBhZnRlciByZXNldCkuCisgICogQG5vdGUgICBPbmNlIHRoZSBSVEMgY2xvY2sgaXMgY29uZmlndXJlZCBpdCBjYW5ub3QgYmUgY2hhbmdlZCB1bmxlc3MgdGhlCisgICogICAgICAgICBCYWNrdXAgZG9tYWluIGlzIHJlc2V0IHVzaW5nIEByZWYgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX0ZPUkNFKCkgbWFjcm8sIG9yIGJ5CisgICogICAgICAgICBhIFBvd2VyIE9uIFJlc2V0IChQT1IpLgorICAqIEBub3RlICAgUlRDIHByZXNjYWxlciBjYW5ub3QgYmUgbW9kaWZpZWQgaWYgSFNFIGlzIGVuYWJsZWQgKEhTRU9OID0gMSkuCisgICoKKyAgKiBAcGFyYW0gIF9fUlRDX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgUlRDIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSyBObyBjbG9jayBzZWxlY3RlZCBhcyBSVEMgY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9MU0UgTFNFIHNlbGVjdGVkIGFzIFJUQyBjbG9jaworICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0xTSSBMU0kgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjIgSFNFIGRpdmlkZWQgYnkgMiBzZWxlY3RlZCBhcyBSVEMgY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWNCBIU0UgZGl2aWRlZCBieSA0IHNlbGVjdGVkIGFzIFJUQyBjbG9jaworICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVY4IEhTRSBkaXZpZGVkIGJ5IDggc2VsZWN0ZWQgYXMgUlRDIGNsb2NrCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjE2IEhTRSBkaXZpZGVkIGJ5IDE2IHNlbGVjdGVkIGFzIFJUQyBjbG9jaworICAqIEBub3RlICAgSWYgdGhlIExTRSBvciBMU0kgaXMgdXNlZCBhcyBSVEMgY2xvY2sgc291cmNlLCB0aGUgUlRDIGNvbnRpbnVlcyB0bworICAqICAgICAgICAgd29yayBpbiBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLCBhbmQgY2FuIGJlIHVzZWQgYXMgd2FrZXVwIHNvdXJjZS4KKyAgKiAgICAgICAgIEhvd2V2ZXIsIHdoZW4gdGhlIEhTRSBjbG9jayBpcyB1c2VkIGFzIFJUQyBjbG9jayBzb3VyY2UsIHRoZSBSVEMKKyAgKiAgICAgICAgIGNhbm5vdCBiZSB1c2VkIGluIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMuCisgICogQG5vdGUgICBUaGUgbWF4aW11bSBpbnB1dCBjbG9jayBmcmVxdWVuY3kgZm9yIFJUQyBpcyAxTUh6ICh3aGVuIHVzaW5nIEhTRSBhcworICAqICAgICAgICAgUlRDIGNsb2NrIHNvdXJjZSkuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19SVENfQ0xLUFJFU0NBTEVSKF9fUlRDX0NMS1NPVVJDRV9fKSBkbyB7IFwKKyAgICAgICAgICAgIGlmKCgoX19SVENfQ0xLU09VUkNFX18pICYgUkNDX0NTUl9SVENTRUxfSFNFKSA9PSBSQ0NfQ1NSX1JUQ1NFTF9IU0UpICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNSLCBSQ0NfQ1JfUlRDUFJFLCAoKF9fUlRDX0NMS1NPVVJDRV9fKSAmIFJDQ19DUl9SVENQUkUpKTsgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fSEFMX1JDQ19SVENfQ09ORklHKF9fUlRDX0NMS1NPVVJDRV9fKSBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUkNDX1JUQ19DTEtQUkVTQ0FMRVIoX19SVENfQ0xLU09VUkNFX18pOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDLT5DU1IgfD0gKChfX1JUQ19DTEtTT1VSQ0VfXykgJiBSQ0NfQ1NSX1JUQ1NFTCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisKKy8qKiBAYnJpZWYgTWFjcm8gdG8gZ2V0IHRoZSBSVEMgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTk9fQ0xLIE5vIGNsb2NrIHNlbGVjdGVkIGFzIFJUQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0xTSSBMU0kgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWWCBIU0UgZGl2aWRlZCBieSBYIHNlbGVjdGVkIGFzIFJUQyBjbG9jayAoWCBjYW4gYmUgcmV0cmlldmVkIHRoYW5rcyB0byBAcmVmIF9fSEFMX1JDQ19HRVRfUlRDX0hTRV9QUkVTQ0FMRVIoKQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1JUQ19TT1VSQ0UoKSAoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUlRDU0VMKSkKKworLyoqCisgICogQGJyaWVmICAgR2V0IHRoZSBSVEMgYW5kIExDRCBIU0UgY2xvY2sgZGl2aWRlciAoUlRDQ0xLIC8gTENEQ0xLKS4KKyAgKgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDX0hTRV9ESVZfMiAgSFNFIGRpdmlkZWQgYnkgMiBzZWxlY3RlZCBhcyBSVEMgY2xvY2sKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDX0hTRV9ESVZfNCAgSFNFIGRpdmlkZWQgYnkgNCBzZWxlY3RlZCBhcyBSVEMgY2xvY2sKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDX0hTRV9ESVZfOCAgSFNFIGRpdmlkZWQgYnkgOCBzZWxlY3RlZCBhcyBSVEMgY2xvY2sKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDX0hTRV9ESVZfMTYgSFNFIGRpdmlkZWQgYnkgMTYgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrCisgICoKKyAgKi8KKyNkZWZpbmUgIF9fSEFMX1JDQ19HRVRfUlRDX0hTRV9QUkVTQ0FMRVIoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUlRDUFJFKSkpCisKKy8qKiBAYnJpZWYgTWFjcm8gdG8gZW5hYmxlIHRoZSB0aGUgUlRDIGNsb2NrLgorICAqIEBub3RlICAgVGhlc2UgbWFjcm9zIG11c3QgYmUgdXNlZCBvbmx5IGFmdGVyIHRoZSBSVEMgY2xvY2sgc291cmNlIHdhcyBzZWxlY3RlZC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JUQ19FTkFCTEUoKSBTRVRfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX1JUQ0VOKQorCisvKiogQGJyaWVmIE1hY3JvIHRvIGRpc2FibGUgdGhlIHRoZSBSVEMgY2xvY2suCisgICogQG5vdGUgIFRoZXNlIG1hY3JvcyBtdXN0IGJlIHVzZWQgb25seSBhZnRlciB0aGUgUlRDIGNsb2NrIHNvdXJjZSB3YXMgc2VsZWN0ZWQuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19SVENfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9SVENFTikKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZm9yY2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgUlRDIHBlcmlwaGVyYWwgKGluY2x1ZGluZyB0aGUgYmFja3VwIHJlZ2lzdGVycykKKyAgKiAgICAgICAgIGFuZCB0aGUgUlRDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gaW4gUkNDX0NTUiByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIFRoZSBCS1BTUkFNIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIHJlc2V0LgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UoKSAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9SVENSU1QpCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byByZWxlYXNlIHRoZSBCYWNrdXAgZG9tYWluIHJlc2V0LgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRSgpIENMRUFSX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9SVENSU1QpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0ZsYWdzX0ludGVycnVwdHNfTWFuYWdlbWVudCBGbGFncyBJbnRlcnJ1cHRzIE1hbmFnZW1lbnQKKyAgKiBAYnJpZWYgbWFjcm9zIHRvIG1hbmFnZSB0aGUgc3BlY2lmaWVkIFJDQyBGbGFncyBhbmQgaW50ZXJydXB0cy4KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIEVuYWJsZSBSQ0MgaW50ZXJydXB0LgorICAqIEBub3RlICAgVGhlIENTUyBpbnRlcnJ1cHQgZG9lc24ndCBoYXZlIGFuIGVuYWJsZSBiaXQ7IG9uY2UgdGhlIENTUyBpcyBlbmFibGVkCisgICogICAgICAgICBhbmQgaWYgdGhlIEhTRSBjbG9jayBmYWlscywgdGhlIENTUyBpbnRlcnJ1cHQgb2NjdXJzIGFuZCBhbiBOTUkgaXMKKyAgKiAgICAgICAgIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBUaGUgTk1JIHdpbGwgYmUgZXhlY3V0ZWQgaW5kZWZpbml0ZWx5LCBhbmQKKyAgKiAgICAgICAgIHNpbmNlIE5NSSBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gYW55IG90aGVyIElSUSAoYW5kIG1haW4gcHJvZ3JhbSkKKyAgKiAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHN0YWNrZWQgaW4gdGhlIE5NSSBJU1IgdW5sZXNzIHRoZSBDU1MgaW50ZXJydXB0CisgICogICAgICAgICBwZW5kaW5nIGJpdCBpcyBjbGVhcmVkLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJDQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSVJEWSBMU0kgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRVJEWSBMU0UgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSVJEWSBIU0kgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTRVJEWSBIU0UgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSBtYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTVNJUkRZIE1TSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFQ1NTIExTRSBDU1MgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSTQ4UkRZIEhTSTQ4IHJlYWR5IGludGVycnVwdCAobm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcykKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0VOQUJMRV9JVChfX0lOVEVSUlVQVF9fKSBTRVRfQklUKFJDQy0+Q0lFUiwgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmIERpc2FibGUgUkNDIGludGVycnVwdC4KKyAgKiBAbm90ZSAgIFRoZSBDU1MgaW50ZXJydXB0IGRvZXNuJ3QgaGF2ZSBhbiBlbmFibGUgYml0OyBvbmNlIHRoZSBDU1MgaXMgZW5hYmxlZAorICAqICAgICAgICAgYW5kIGlmIHRoZSBIU0UgY2xvY2sgZmFpbHMsIHRoZSBDU1MgaW50ZXJydXB0IG9jY3VycyBhbmQgYW4gTk1JIGlzCisgICogICAgICAgICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gVGhlIE5NSSB3aWxsIGJlIGV4ZWN1dGVkIGluZGVmaW5pdGVseSwgYW5kCisgICogICAgICAgICBzaW5jZSBOTUkgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIGFueSBvdGhlciBJUlEgKGFuZCBtYWluIHByb2dyYW0pCisgICogICAgICAgICB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBzdGFja2VkIGluIHRoZSBOTUkgSVNSIHVubGVzcyB0aGUgQ1NTIGludGVycnVwdAorICAqICAgICAgICAgcGVuZGluZyBiaXQgaXMgY2xlYXJlZC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSQ0MgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNJUkRZIExTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFUkRZIExTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJUkRZIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNFUkRZIEhTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfUExMUkRZIG1haW4gUExMIHJlYWR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9NU0lSRFkgTVNJIHJlYWR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VDU1MgTFNFIENTUyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJNDhSRFkgSFNJNDggcmVhZHkgaW50ZXJydXB0IChub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzKQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfRElTQUJMRV9JVChfX0lOVEVSUlVQVF9fKSBDTEVBUl9CSVQoUkNDLT5DSUVSLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgQ2xlYXIgdGhlIFJDQydzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSVJEWSBMU0kgcmVhZHkgaW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VSRFkgTFNFIHJlYWR5IGludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJUkRZIEhTSSByZWFkeSBpbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTRVJEWSBIU0UgcmVhZHkgaW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9QTExSRFkgTWFpbiBQTEwgcmVhZHkgaW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9NU0lSRFkgTVNJIHJlYWR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VDU1MgTFNFIENTUyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJNDhSRFkgSFNJNDggcmVhZHkgaW50ZXJydXB0IChub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9DU1MgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdAorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ0xFQVJfSVQoX19JTlRFUlJVUFRfXykgKFJDQy0+Q0lDUiA9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgdGhlIFJDQydzIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJDQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0lSRFkgTFNJIHJlYWR5IGludGVycnVwdAorICAqICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRVJEWSBMU0UgcmVhZHkgaW50ZXJydXB0CisgICogICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJUkRZIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0VSRFkgSFNFIHJlYWR5IGludGVycnVwdAorICAqICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSBQTEwgcmVhZHkgaW50ZXJydXB0CisgICogICAgIEBhcmcgQHJlZiBSQ0NfSVRfTVNJUkRZIE1TSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VDU1MgTFNFIENTUyBpbnRlcnJ1cHQKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19JVF9DU1MgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9JVChfX0lOVEVSUlVQVF9fKSAoKFJDQy0+Q0lGUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorCisKKy8qKiBAYnJpZWYgU2V0IFJNVkYgYml0IHRvIGNsZWFyIHRoZSByZXNldCBmbGFncy4KKyAgKiAgICAgICAgIFRoZSByZXNldCBmbGFncyBhcmUgUkNDX0ZMQUdfUElOUlNULCBSQ0NfRkxBR19QT1JSU1QsIFJDQ19GTEFHX1NGVFJTVCwKKyAgKiAgICAgICAgIFJDQ19GTEFHX09CTFJTVCwgUkNDX0ZMQUdfSVdER1JTVCwgUkNDX0ZMQUdfV1dER1JTVCwgUkNDX0ZMQUdfTFBXUlJTVAorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ0xFQVJfUkVTRVRfRkxBR1MoKSAoUkNDLT5DU1IgfD0gUkNDX0NTUl9STVZGKQorCisvKiogQGJyaWVmICBDaGVjayBSQ0MgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0hTSVJEWSBIU0kgb3NjaWxsYXRvciBjbG9jayByZWFkeQorICAqICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfSFNJNDhSRFkgSFNJNDggb3NjaWxsYXRvciBjbG9jayByZWFkeSAobm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcykKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0hTSURJViBIU0kxNiBkaXZpZGVyIGZsYWcKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX01TSVJEWSBNU0kgb3NjaWxsYXRvciBjbG9jayByZWFkeQorICAqICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfSFNFUkRZIEhTRSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5CisgICogICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19QTExSRFkgUExMIGNsb2NrIHJlYWR5CisgICogICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0VDU1MgTFNFIG9zY2lsbGF0b3IgY2xvY2sgQ1NTIGRldGVjdGVkCisgICogICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0VSRFkgTFNFIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0ZXUlNUIEZpcmV3YWxsIHJlc2V0CisgICogICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0lSRFkgTFNJIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX09CTFJTVCBPcHRpb24gQnl0ZSBMb2FkZXIgKE9CTCkgcmVzZXQKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1BJTlJTVCBQaW4gcmVzZXQKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1BPUlJTVCBQT1IvUERSIHJlc2V0CisgICogICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19TRlRSU1QgU29mdHdhcmUgcmVzZXQKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0lXREdSU1QgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1dXREdSU1QgV2luZG93IFdhdGNoZG9nIHJlc2V0CisgICogICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MUFdSUlNUIExvdyBQb3dlciByZXNldAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9GTEFHKF9fRkxBR19fKSAoKCgoKCgoKChfX0ZMQUdfXykgPj4gNSkgPT0gQ1JfUkVHX0lOREVYKT8gUkNDLT5DUiA6KCgoKF9fRkxBR19fKSA+PiA1KSA9PSBDU1JfUkVHX0lOREVYKSA/IFJDQy0+Q1NSIDpSQ0MtPkNSUkNSKSkpKSAmICgodWludDMyX3QpMSA8PCAoKF9fRkxBR19fKSAmIFJDQ19GTEFHX01BU0spKSkgIT0gMFUgKSA/IDFVIDogMFUgKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9GTEFHKF9fRkxBR19fKSAoKCgoKCgoKChfX0ZMQUdfXykgPj4gNSkgPT0gQ1JfUkVHX0lOREVYKT8gUkNDLT5DUiA6IFJDQy0+Q1NSKSkpICYgKCh1aW50MzJfdCkxIDw8ICgoX19GTEFHX18pICYgUkNDX0ZMQUdfTUFTSykpKSAhPSAwVSApID8gMVUgOiAwVSApCisjZW5kaWYgLyogUkNDX0hTSTQ4X1NVUFBPUlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBSQ0MgSEFMIEV4dGVuc2lvbiBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3JjY19leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX0RlSW5pdCh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfT3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAgKlJDQ19Pc2NJbml0U3RydWN0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfQ2xvY2tDb25maWcoUkNDX0Nsa0luaXRUeXBlRGVmICAqUkNDX0Nsa0luaXRTdHJ1Y3QsIHVpbnQzMl90IEZMYXRlbmN5KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ19NQ09Db25maWcodWludDMyX3QgUkNDX01DT3gsIHVpbnQzMl90IFJDQ19NQ09Tb3VyY2UsIHVpbnQzMl90IFJDQ19NQ09EaXYpOworI2lmIGRlZmluZWQoUkNDX0hTRUNTU19TVVBQT1JUKQordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ19FbmFibGVDU1Modm9pZCk7CisvKiBDU1MgTk1JIElSUSBoYW5kbGVyICovCit2b2lkICAgICAgICAgICAgICBIQUxfUkNDX05NSV9JUlFIYW5kbGVyKHZvaWQpOworLyogVXNlciBDYWxsYmFja3MgaW4gbm9uIGJsb2NraW5nIG1vZGUgKElUIG1vZGUpICovCit2b2lkICAgICAgICAgICAgICBIQUxfUkNDX0NTU0NhbGxiYWNrKHZvaWQpOworI2VuZGlmIC8qIFJDQ19IU0VDU1NfU1VQUE9SVCAqLwordWludDMyX3QgICAgICAgICAgSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEodm9pZCk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUkNDX0dldEhDTEtGcmVxKHZvaWQpOwordWludDMyX3QgICAgICAgICAgSEFMX1JDQ19HZXRQQ0xLMUZyZXEodm9pZCk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUkNDX0dldFBDTEsyRnJlcSh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfR2V0T3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAgKlJDQ19Pc2NJbml0U3RydWN0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfR2V0Q2xvY2tDb25maWcoUkNDX0Nsa0luaXRUeXBlRGVmICAqUkNDX0Nsa0luaXRTdHJ1Y3QsIHVpbnQzMl90ICpwRkxhdGVuY3kpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfSEFMX1JDQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX3JjY19leC5oIGIvSW5jL3N0bTMybDB4eF9oYWxfcmNjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmNDM4YgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX3JjY19leC5oCkBAIC0wLDAgKzEsMjAyMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfcmNjX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJDQyBIQUwgRXh0ZW5zaW9uIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9SQ0NfRVhfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfUkNDX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDRXgKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDRXhfUHJpdmF0ZV9Db25zdGFudHMKKyAqIEB7CisgKi8KKworCisjaWYgZGVmaW5lZChDUlMpCisvKiBDUlMgSVQgRXJyb3IgTWFzayAqLworI2RlZmluZSAgUkNDX0NSU19JVF9FUlJPUl9NQVNLICAoKHVpbnQzMl90KShSQ0NfQ1JTX0lUX1RSSU1PVkYgfCBSQ0NfQ1JTX0lUX1NZTkNFUlIgfCBSQ0NfQ1JTX0lUX1NZTkNNSVNTKSkKKworLyogQ1JTIEZsYWcgRXJyb3IgTWFzayAqLworI2RlZmluZSBSQ0NfQ1JTX0ZMQUdfRVJST1JfTUFTSyAoKHVpbnQzMl90KShSQ0NfQ1JTX0ZMQUdfVFJJTU9WRiB8IFJDQ19DUlNfRkxBR19TWU5DRVJSIHwgUkNDX0NSU19GTEFHX1NZTkNNSVNTKSkKKworI2VuZGlmIC8qIENSUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwNTJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjJ4eCkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fQ0xLX18pICgoX19DTEtfXykgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgfCBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgICB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19VU0IgfCBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkpCisjZWxpZiBkZWZpbmVkIChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjN4eCkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fQ0xLX18pICgoX19DTEtfXykgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgfCBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgICB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19VU0IgfCBSQ0NfUEVSSVBIQ0xLX0xQVElNMSB8IFJDQ19QRVJJUEhDTEtfTENEKSkKKyNlbGlmIGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19DTEtfXykgKChfX0NMS19fKSA8PSAoUkNDX1BFUklQSENMS19VU0FSVDEgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiB8IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzEgICB8IFJDQ19QRVJJUEhDTEtfSTJDMiB8IFJDQ19QRVJJUEhDTEtfUlRDICAgICAgIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1VTQiB8IFJDQ19QRVJJUEhDTEtfTFBUSU0xICB8IFJDQ19QRVJJUEhDTEtfSTJDMyApKQorI2VsaWYgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpCisjZGVmaW5lIElTX1JDQ19QRVJJUEhDTE9DSyhfX0NMS19fKSAoKF9fQ0xLX18pIDw9IChSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19MUFVBUlQxIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfSTJDMSAgIHwgUkNDX1BFUklQSENMS19JMkMyIHwgUkNDX1BFUklQSENMS19SVEMgIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1VTQiB8IFJDQ19QRVJJUEhDTEtfTFBUSU0xICB8IFJDQ19QRVJJUEhDTEtfSTJDMyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0xDRCkpCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQoU1RNMzJMMDIxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDMxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDQxeHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyTDAxMHhCKSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg4KSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg2KSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg0KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19DTEtfXykgKChfX0NMS19fKSA8PSAoIFJDQ19QRVJJUEhDTEtfVVNBUlQyIHwgUkNDX1BFUklQSENMS19MUFVBUlQxIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzEgICB8ICBSQ0NfUEVSSVBIQ0xLX1JUQyAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19MUFRJTTEpKQorI2VsaWYgZGVmaW5lZChTVE0zMkwwNTF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjF4eCkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fQ0xLX18pICgoX19DTEtfXykgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgfCBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgICB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19MUFRJTTEpKQorI2VsaWYgZGVmaW5lZChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwODF4eCkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fQ0xLX18pICgoX19DTEtfXykgPD0gKFJDQ19QRVJJUEhDTEtfVVNBUlQxIHwgUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzIgfCBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgICB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19MUFRJTTEgfCBSQ0NfUEVSSVBIQ0xLX0kyQzMpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChSQ0NfQ0NJUFJfVVNBUlQxU0VMKQorI2RlZmluZSBJU19SQ0NfVVNBUlQxQ0xLU09VUkNFKF9fU09VUkNFX18pICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSkpCisjZW5kaWYgLyogUkNDX0NDSVBSX1VTQVJUMVNFTCAqLworCisjZGVmaW5lIElTX1JDQ19VU0FSVDJDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICgoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJKSkKKworI2RlZmluZSBJU19SQ0NfTFBVQVJUMUNMS1NPVVJDRShfX1NPVVJDRV9fKSAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0kpKQorCisjZGVmaW5lIElTX1JDQ19JMkMxQ0xLU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFJDQ19JMkMxQ0xLU09VUkNFX1BDTEsxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSyl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMxQ0xLU09VUkNFX0hTSSkpCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9JMkMzU0VMKQorI2RlZmluZSBJU19SQ0NfSTJDM0NMS1NPVVJDRShfX1NPVVJDRV9fKSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfUENMSzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMzQ0xLU09VUkNFX1NZU0NMSyl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kpKQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9JMkMzU0VMICovCisKKyNpZiBkZWZpbmVkKFVTQikKKyNkZWZpbmUgSVNfUkNDX1VTQkNMS1NPVVJDRShfX1NPVVJDRV9fKSAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQkNMS1NPVVJDRV9IU0k0OCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNCQ0xLU09VUkNFX1BMTCkpCisjZW5kaWYgLyogVVNCICovCisKKyNpZiBkZWZpbmVkKFJORykKKyNkZWZpbmUgSVNfUkNDX1JOR0NMS1NPVVJDRShfU09VUkNFXykgICgoKF9TT1VSQ0VfKSA9PSBSQ0NfUk5HQ0xLU09VUkNFX0hTSTQ4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX1NPVVJDRV8pID09IFJDQ19STkdDTEtTT1VSQ0VfUExMQ0xLKSkKKyNlbmRpZiAvKiBSTkcgKi8KKworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0hTSTQ4U0VMKQorI2RlZmluZSBJU19SQ0NfSFNJNDhNQ0xLU09VUkNFKF9fSFNJNDhNQ0xLX18pICgoKF9fSFNJNDhNQ0xLX18pID09IFJDQ19IU0k0OE1fUExMKSB8fCAoKF9fSFNJNDhNQ0xLX18pID09IFJDQ19IU0k0OE1fSFNJNDgpKQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9IU0k0OFNFTCAqLworCisjZGVmaW5lIElTX1JDQ19MUFRJTUNMSyhfX0xQVElNQ0xLXykgICAgICgoKF9fTFBUSU1DTEtfKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTFBUSU1DTEtfKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTSSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTFBUSU1DTEtfKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTFBUSU1DTEtfKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSkpCisKKyNkZWZpbmUgSVNfUkNDX1NUT1BXQUtFVVBfQ0xPQ0soX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfTVNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19TVE9QX1dBS0VVUENMT0NLX0hTSSkpCisKKyNkZWZpbmUgSVNfUkNDX0xTRV9EUklWRShfX0RSSVZFX18pICgoKF9fRFJJVkVfXykgPT0gUkNDX0xTRURSSVZFX0xPVykgICAgICAgIHx8ICgoX19TT1VSQ0VfXykgPT0gUkNDX0xTRURSSVZFX01FRElVTUxPVykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EUklWRV9fKSA9PSBSQ0NfTFNFRFJJVkVfTUVESVVNSElHSCkgfHwgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFNFRFJJVkVfSElHSCkpCisKKyNpZiBkZWZpbmVkKENSUykKKworI2RlZmluZSBJU19SQ0NfQ1JTX1NZTkNfU09VUkNFKF9TT1VSQ0VfKSAoKChfU09VUkNFXykgPT0gUkNDX0NSU19TWU5DX1NPVVJDRV9HUElPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9TT1VSQ0VfKSA9PSBSQ0NfQ1JTX1NZTkNfU09VUkNFX0xTRSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX1NPVVJDRV8pID09IFJDQ19DUlNfU1lOQ19TT1VSQ0VfVVNCKSkKKyNkZWZpbmUgSVNfUkNDX0NSU19TWU5DX0RJVihfRElWXykgKCgoX0RJVl8pID09IFJDQ19DUlNfU1lOQ19ESVYxKSAgfHwgKChfRElWXykgPT0gUkNDX0NSU19TWU5DX0RJVjIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9ESVZfKSA9PSBSQ0NfQ1JTX1NZTkNfRElWNCkgIHx8ICgoX0RJVl8pID09IFJDQ19DUlNfU1lOQ19ESVY4KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfRElWXykgPT0gUkNDX0NSU19TWU5DX0RJVjE2KSB8fCAoKF9ESVZfKSA9PSBSQ0NfQ1JTX1NZTkNfRElWMzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX0RJVl8pID09IFJDQ19DUlNfU1lOQ19ESVY2NCkgfHwgKChfRElWXykgPT0gUkNDX0NSU19TWU5DX0RJVjEyOCkpCisjZGVmaW5lIElTX1JDQ19DUlNfU1lOQ19QT0xBUklUWShfUE9MQVJJVFlfKSAoKChfUE9MQVJJVFlfKSA9PSBSQ0NfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfUE9MQVJJVFlfKSA9PSBSQ0NfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORykpCisjZGVmaW5lIElTX1JDQ19DUlNfUkVMT0FEVkFMVUUoX1ZBTFVFXykgKCgoX1ZBTFVFXykgPD0gMHhGRkZGVSkpCisjZGVmaW5lIElTX1JDQ19DUlNfRVJST1JMSU1JVChfVkFMVUVfKSAoKChfVkFMVUVfKSA8PSAweEZGVSkpCisjZGVmaW5lIElTX1JDQ19DUlNfSFNJNDhDQUxJQlJBVElPTihfVkFMVUVfKSAoKChfVkFMVUVfKSA8PSAweDNGVSkpCisjZGVmaW5lIElTX1JDQ19DUlNfRlJFUUVSUk9SRElSKF9ESVJfKSAoKChfRElSXykgPT0gUkNDX0NSU19GUkVRRVJST1JESVJfVVApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9ESVJfKSA9PSBSQ0NfQ1JTX0ZSRVFFUlJPUkRJUl9ET1dOKSkKKyNlbmRpZiAvKiBDUlMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfVHlwZXMgUkNDRXggRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJDQyBleHRlbmRlZCBjbG9ja3Mgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBlcmlwaENsb2NrU2VsZWN0aW9uOyAgICAgICAgICAgICAgICAvKiE8IFRoZSBFeHRlbmRlZCBDbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1BlcmlwaF9DbG9ja19TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBSVENDbG9ja1NlbGVjdGlvbjsgICAgICAgICAvKiE8IHNwZWNpZmllcyB0aGUgUlRDIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1JUQ19MQ0RfQ2xvY2tfU291cmNlICovCisKKyNpZiBkZWZpbmVkKExDRCkKKworICB1aW50MzJfdCBMQ0RDbG9ja1NlbGVjdGlvbjsgICAgICAgICAvKiE8IHNwZWNpZmllcyB0aGUgTENEIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1JUQ19MQ0RfQ2xvY2tfU291cmNlICovCisKKyNlbmRpZiAvKiBMQ0QgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9VU0FSVDFTRUwpCisgIHVpbnQzMl90IFVzYXJ0MUNsb2NrU2VsZWN0aW9uOyAgIC8qITwgVVNBUlQxIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSAqLworI2VuZGlmIC8qIFJDQ19DQ0lQUl9VU0FSVDFTRUwgKi8KKyAgdWludDMyX3QgVXNhcnQyQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBVU0FSVDIgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9VU0FSVDJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgTHB1YXJ0MUNsb2NrU2VsZWN0aW9uOyAgLyohPCBMUFVBUlQxIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfTFBVQVJUMV9DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBJMmMxQ2xvY2tTZWxlY3Rpb247ICAgICAvKiE8IEkyQzEgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMkMxX0Nsb2NrX1NvdXJjZSAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfSTJDM1NFTCkKKyAgdWludDMyX3QgSTJjM0Nsb2NrU2VsZWN0aW9uOyAgICAgLyohPCBJMkMzIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJDM19DbG9ja19Tb3VyY2UgKi8KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfSTJDM1NFTCAqLworICB1aW50MzJfdCBMcHRpbUNsb2NrU2VsZWN0aW9uOyAgICAvKiE8IExQVElNMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0xQVElNMV9DbG9ja19Tb3VyY2UgKi8KKyNpZiBkZWZpbmVkKFVTQikKKyAgdWludDMyX3QgVXNiQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgVVNCIGFuZCBSTkcgQ2xvY2sgIFNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfVVNCX0Nsb2NrX1NvdXJjZSAqLworI2VuZGlmIC8qIFVTQiAqLworfSBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWY7CisKKyNpZiBkZWZpbmVkIChDUlMpCisvKioKKyAgKiBAYnJpZWYgUkNDX0NSUyBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBkaXZpc2lvbiBmYWN0b3Igb2YgdGhlIFNZTkMgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQ1JTX1N5bmNocm9EaXZpZGVyICovCisKKyAgdWludDMyX3QgU291cmNlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1lOQyBzaWduYWwgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQ1JTX1N5bmNocm9Tb3VyY2UgKi8KKworICB1aW50MzJfdCBQb2xhcml0eTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBwb2xhcml0eSBmb3IgdGhlIFNZTkMgc2lnbmFsIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0NSU19TeW5jaHJvUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBSZWxvYWRWYWx1ZTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW4gdGhlIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyIHdpdGggZWFjaCBTWU5DIGV2ZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBjYW4gYmUgY2FsY3VsYXRlZCBpbiB1c2luZyBtYWNybyBAcmVmIF9fSEFMX1JDQ19DUlNfUkVMT0FEVkFMVUVfQ0FMQ1VMQVRFKF9fRlRBUkdFVF9fLCBfX0ZTWU5DX18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDB4RkZGRiBvciBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQ1JTX1JlbG9hZFZhbHVlRGVmYXVsdCAuKi8KKworICB1aW50MzJfdCBFcnJvckxpbWl0VmFsdWU7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSB1c2VkIHRvIGV2YWx1YXRlIHRoZSBjYXB0dXJlZCBmcmVxdWVuY3kgZXJyb3IgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDB4RkYgb3IgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0NSU19FcnJvckxpbWl0RGVmYXVsdCAqLworCisgIHVpbnQzMl90IEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZTsgLyohPCBTcGVjaWZpZXMgYSB1c2VyLXByb2dyYW1tYWJsZSB0cmltbWluZyB2YWx1ZSB0byB0aGUgSFNJNDggb3NjaWxsYXRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHgzRiBvciBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQ1JTX0hTSTQ4Q2FsaWJyYXRpb25EZWZhdWx0ICovCisKK31SQ0NfQ1JTSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBSQ0NfQ1JTIFN5bmNocm9uaXphdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUmVsb2FkVmFsdWU7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgdmFsdWUgbG9hZGVkIGluIHRoZSBDb3VudGVyIHJlbG9hZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHhGRkZGICovCisKKyAgdWludDMyX3QgSFNJNDhDYWxpYnJhdGlvblZhbHVlOyAvKiE8IFNwZWNpZmllcyB2YWx1ZSBsb2FkZWQgaW4gSFNJNDggb3NjaWxsYXRvciBzbW9vdGggdHJpbW1pbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDB4M0YgKi8KKworICB1aW50MzJfdCBGcmVxRXJyb3JDYXB0dXJlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSBsb2FkZWQgaW4gdGhlIC5GRUNBUCwgdGhlIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxhdGNoZWQgaW4gdGhlIHRpbWUgb2YgdGhlIGxhc3QgU1lOQyBldmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweEZGRkYgKi8KKworICB1aW50MzJfdCBGcmVxRXJyb3JEaXJlY3Rpb247ICAgIC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSBsb2FkZWQgaW4gdGhlIC5GRURJUiwgdGhlIGNvdW50aW5nIGRpcmVjdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgbGF0Y2hlZCBpbiB0aGUgdGltZSBvZiB0aGUgbGFzdCBTWU5DIGV2ZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBzaG93cyB3aGV0aGVyIHRoZSBhY3R1YWwgZnJlcXVlbmN5IGlzIGJlbG93IG9yIGFib3ZlIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9DUlNfRnJlcUVycm9yRGlyZWN0aW9uKi8KKworfVJDQ19DUlNTeW5jaHJvSW5mb1R5cGVEZWY7CisKKyNlbmRpZiAvKiBDUlMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9FeHBvcnRlZF9Db25zdGFudHMgUkNDRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0VYVElfTElORV9MU0VDU1MgIFJDQyBMU0UgQ1NTIGV4dGVybmFsIGludGVycnVwdCBsaW5lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0VYVElfTElORV9MU0VDU1MgICAgICAgICAgICAgKEVYVElfSU1SX0lNMTkpICAgICAgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxOSBjb25uZWN0ZWQgdG8gdGhlIExTRSBDU1MgRVhUSSBMaW5lICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1BlcmlwaF9DbG9ja19TZWxlY3Rpb24gIFJDQ0V4IFBlcmlwaCBDbG9jayBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1VTQVJUMVNFTCkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0FSVDEgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQxU0VMICovCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQyICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMiAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTApCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUlRDICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjApCisjaWYgZGVmaW5lZChVU0IpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNCICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApCisjZW5kaWYgLyogVVNCICovCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfTFBUSU0xICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODApCisjaWYgZGVmaW5lZChMQ0QpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfTENEICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDApCisjZW5kaWYgLyogTENEICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfSTJDM1NFTCkKKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMkMzICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMCkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfSTJDM1NFTCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZCAoUkNDX0NDSVBSX1VTQVJUMVNFTCkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSBSQ0NFeCBVU0FSVDEgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSyAgICAgICBSQ0NfQ0NJUFJfVVNBUlQxU0VMXzAKKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NDSVBSX1VTQVJUMVNFTF8xCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFICAgICAgICAgIChSQ0NfQ0NJUFJfVVNBUlQxU0VMXzAgfCBSQ0NfQ0NJUFJfVVNBUlQxU0VMXzEpCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJDQ19DQ0lQUl9VU0FSVDFTRUwgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9VU0FSVDJfQ2xvY2tfU291cmNlIFJDQ0V4IFVTQVJUMiBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLICAgICAgIFJDQ19DQ0lQUl9VU0FSVDJTRUxfMAorI2RlZmluZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSAgICAgICAgICBSQ0NfQ0NJUFJfVVNBUlQyU0VMXzEKKyNkZWZpbmUgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0UgICAgICAgICAgKFJDQ19DQ0lQUl9VU0FSVDJTRUxfMCB8IFJDQ19DQ0lQUl9VU0FSVDJTRUxfMSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfTFBVQVJUMV9DbG9ja19Tb3VyY2UgUkNDRXggTFBVQVJUMSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9TWVNDTEsgICAgICAgUkNDX0NDSVBSX0xQVUFSVDFTRUxfMAorI2RlZmluZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NDSVBSX0xQVUFSVDFTRUxfMQorI2RlZmluZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0UgICAgICAgICAgKFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzAgfCBSQ0NfQ0NJUFJfTFBVQVJUMVNFTF8xKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9JMkMxX0Nsb2NrX1NvdXJjZSBSQ0NFeCBJMkMxIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19JMkMxQ0xLU09VUkNFX1BDTEsxICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgUkNDX0NDSVBSX0kyQzFTRUxfMAorI2RlZmluZSBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kgICAgICAgICAgICBSQ0NfQ0NJUFJfSTJDMVNFTF8xCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfSTJDM1NFTCkKKworLyoqIEBkZWZncm91cCBSQ0NFeF9JMkMzX0Nsb2NrX1NvdXJjZSBSQ0NFeCBJMkMzIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19JMkMzQ0xLU09VUkNFX1BDTEsxICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgUkNDX0NDSVBSX0kyQzNTRUxfMAorI2RlZmluZSBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kgICAgICAgICAgICBSQ0NfQ0NJUFJfSTJDM1NFTF8xCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJDQ19DQ0lQUl9JMkMzU0VMICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVElNX1BSZXNjYWxlcl9TZWxlY3Rpb24gIFJDQ0V4IFRJTSBQcmVzY2FsZXIgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1RJTVBSRVNfREVTQUNUSVZBVEVEICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKyNkZWZpbmUgUkNDX1RJTVBSRVNfQUNUSVZBVEVEICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTQikKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNCX0Nsb2NrX1NvdXJjZSBSQ0NFeCBVU0IgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1VTQkNMS1NPVVJDRV9IU0k0OCAgICAgICAgICAgUkNDX0NDSVBSX0hTSTQ4U0VMCisjZGVmaW5lIFJDQ19VU0JDTEtTT1VSQ0VfUExMICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNCICovCisKKyNpZiBkZWZpbmVkKFJORykKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfUk5HX0Nsb2NrX1NvdXJjZSBSQ0NFeCBSTkcgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1JOR0NMS1NPVVJDRV9IU0k0OCAgICAgICAgICAgUkNDX0NDSVBSX0hTSTQ4U0VMCisjZGVmaW5lIFJDQ19STkdDTEtTT1VSQ0VfUExMQ0xLICAgICAgICAgICgweDAwMDAwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUk5HICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9IU0k0OFNFTCkKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSFNJNDhNX0Nsb2NrX1NvdXJjZSBSQ0NFeCBIU0k0OE0gQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfSFNJNDggICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IzX1ZSRUZJTlRfUkRZRgorCisjZGVmaW5lIFJDQ19IU0k0OE1fUExMICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUkNDX0hTSTQ4TV9IU0k0OCAgICAgICAgICAgICAgICAgUkNDX0NDSVBSX0hTSTQ4U0VMCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUkNDX0NDSVBSX0hTSTQ4U0VMICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfTFBUSU0xX0Nsb2NrX1NvdXJjZSBSQ0NFeCBMUFRJTTEgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTSSAgICAgICAgICBSQ0NfQ0NJUFJfTFBUSU0xU0VMXzAKKyNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NDSVBSX0xQVElNMVNFTF8xCisjZGVmaW5lIFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNFICAgICAgICAgIFJDQ19DQ0lQUl9MUFRJTTFTRUwKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfU3RvcFdha2VVcF9DbG9jayBSQ0NFeCBTdG9wV2FrZVVwIENsb2NrCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfU1RPUF9XQUtFVVBDTE9DS19NU0kgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJDQ19TVE9QX1dBS0VVUENMT0NLX0hTSSAgICAgICAgIFJDQ19DRkdSX1NUT1BXVUNLCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0xTRURyaXZlX0NvbmZpZ3VyYXRpb24gUkNDRXggTFNFIERyaXZlIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisjZGVmaW5lIFJDQ19MU0VEUklWRV9MT1cgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUkNDX0xTRURSSVZFX01FRElVTUxPVyAgICAgICAgICAgUkNDX0NTUl9MU0VEUlZfMAorI2RlZmluZSBSQ0NfTFNFRFJJVkVfTUVESVVNSElHSCAgICAgICAgICBSQ0NfQ1NSX0xTRURSVl8xCisjZGVmaW5lIFJDQ19MU0VEUklWRV9ISUdIICAgICAgICAgICAgICAgIFJDQ19DU1JfTFNFRFJWCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChDUlMpCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX1N0YXR1cyBSQ0NFeCBDUlMgU3RhdHVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19OT05FICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBSQ0NfQ1JTX1RJTUVPVVQgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpCisjZGVmaW5lIFJDQ19DUlNfU1lOQ09LICAgICgodWludDMyX3QpMHgwMDAwMDAwMikKKyNkZWZpbmUgUkNDX0NSU19TWU5DV0FSTiAgKCh1aW50MzJfdCkweDAwMDAwMDA0KQorI2RlZmluZSBSQ0NfQ1JTX1NZTkNFUlIgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpCisjZGVmaW5lIFJDQ19DUlNfU1lOQ01JU1MgICgodWludDMyX3QpMHgwMDAwMDAxMCkKKyNkZWZpbmUgUkNDX0NSU19UUklNT1ZGICAgKCh1aW50MzJfdCkweDAwMDAwMDIwKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19TeW5jaHJvU291cmNlIFJDQ0V4IENSUyBTeW5jaHJvbml6YXRpb24gU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX1NPVVJDRV9HUElPICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIEdQSU8gKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX1NPVVJDRV9MU0UgICAgICAgIENSU19DRkdSX1NZTkNTUkNfMCAgICAgIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIExTRSAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfU09VUkNFX1VTQiAgICAgICAgQ1JTX0NGR1JfU1lOQ1NSQ18xICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBzb3VyY2UgVVNCIFNPRiAoZGVmYXVsdCkqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfU3luY2hyb0RpdmlkZXIgUkNDRXggQ1JTIFN5bmNocm9uaXphdGlvbiBEaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjEgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgbm90IGRpdmlkZWQgKGRlZmF1bHQpICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19ESVYyICAgICAgICBDUlNfQ0ZHUl9TWU5DRElWXzAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfRElWNCAgICAgICAgQ1JTX0NGR1JfU1lOQ0RJVl8xICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjggICAgICAgIChDUlNfQ0ZHUl9TWU5DRElWXzEgfCBDUlNfQ0ZHUl9TWU5DRElWXzApIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19ESVYxNiAgICAgICBDUlNfQ0ZHUl9TWU5DRElWXzIgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMTYgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjMyICAgICAgIChDUlNfQ0ZHUl9TWU5DRElWXzIgfCBDUlNfQ0ZHUl9TWU5DRElWXzApIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfRElWNjQgICAgICAgKENSU19DRkdSX1NZTkNESVZfMiB8IENSU19DRkdSX1NZTkNESVZfMSkgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19ESVYxMjggICAgICBDUlNfQ0ZHUl9TWU5DRElWICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgMTI4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19TeW5jaHJvUG9sYXJpdHkgUkNDRXggQ1JTIFN5bmNocm9uaXphdGlvbiBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19QT0xBUklUWV9SSVNJTkcgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFN5bmNocm8gQWN0aXZlIG9uIHJpc2luZyBlZGdlIChkZWZhdWx0KSAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORyAgQ1JTX0NGR1JfU1lOQ1BPTCAgICAgICAgLyohPCBTeW5jaHJvIEFjdGl2ZSBvbiBmYWxsaW5nIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX1JlbG9hZFZhbHVlRGVmYXVsdCBSQ0NFeCBDUlMgRGVmYXVsdCBSZWxvYWQgVmFsdWUKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfQ1JTX1JFTE9BRFZBTFVFX0RFRkFVTFQgICAgKCh1aW50MzJfdCkweDAwMDBCQjdGVSkgLyohPCBUaGUgcmVzZXQgdmFsdWUgb2YgdGhlIFJFTE9BRCBmaWVsZCBjb3JyZXNwb25kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIHRhcmdldCBmcmVxdWVuY3kgb2YgNDggTUh6IGFuZCBhIHN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJlcXVlbmN5IG9mIDEga0h6IChTT0Ygc2lnbmFsIGZyb20gVVNCKS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0Vycm9yTGltaXREZWZhdWx0IFJDQ0V4IENSUyBEZWZhdWx0IEVycm9yIExpbWl0IFZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19FUlJPUkxJTUlUX0RFRkFVTFQgICAgICgodWludDMyX3QpMHgwMDAwMDAyMlUpIC8qITwgRGVmYXVsdCBGcmVxdWVuY3kgZXJyb3IgbGltaXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0hTSTQ4Q2FsaWJyYXRpb25EZWZhdWx0IFJDQ0V4IENSUyBEZWZhdWx0IEhTSTQ4IENhbGlicmF0aW9uIHZha3llCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19IU0k0OENBTElCUkFUSU9OX0RFRkFVTFQgKCh1aW50MzJfdCkweDAwMDAwMDIwVSkgLyohPCBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMiwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIG1pZGRsZSBvZiB0aGUgdHJpbW1pbmcgaW50ZXJ2YWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRyaW1taW5nIHN0ZXAgaXMgYXJvdW5kIDY3IGtIeiBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBUUklNIHN0ZXBzLiBBIGhpZ2hlciBUUklNIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gYSBoaWdoZXIgb3V0cHV0IGZyZXF1ZW5jeSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfRnJlcUVycm9yRGlyZWN0aW9uIFJDQ0V4IENSUyBGcmVxdWVuY3kgRXJyb3IgRGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19GUkVRRVJST1JESVJfVVAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgLyohPCBVcGNvdW50aW5nIGRpcmVjdGlvbiwgdGhlIGFjdHVhbCBmcmVxdWVuY3kgaXMgYWJvdmUgdGhlIHRhcmdldCAqLworI2RlZmluZSBSQ0NfQ1JTX0ZSRVFFUlJPUkRJUl9ET1dOICAgICAgKCh1aW50MzJfdClDUlNfSVNSX0ZFRElSKSAvKiE8IERvd25jb3VudGluZyBkaXJlY3Rpb24sIHRoZSBhY3R1YWwgZnJlcXVlbmN5IGlzIGJlbG93IHRoZSB0YXJnZXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0ludGVycnVwdF9Tb3VyY2VzIFJDQ0V4IENSUyBJbnRlcnJ1cHQgU291cmNlcworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19DUlNfSVRfU1lOQ09LICAgICAgICAgICAgICBDUlNfQ1JfU1lOQ09LSUUgICAgICAgICAgIC8qITwgU1lOQyBldmVudCBPSyAqLworI2RlZmluZSBSQ0NfQ1JTX0lUX1NZTkNXQVJOICAgICAgICAgICAgQ1JTX0NSX1NZTkNXQVJOSUUgICAgICAgICAvKiE8IFNZTkMgd2FybmluZyAqLworI2RlZmluZSBSQ0NfQ1JTX0lUX0VSUiAgICAgICAgICAgICAgICAgQ1JTX0NSX0VSUklFICAgICAgICAgICAgICAvKiE8IEVycm9yICovCisjZGVmaW5lIFJDQ19DUlNfSVRfRVNZTkMgICAgICAgICAgICAgICBDUlNfQ1JfRVNZTkNJRSAgICAgICAgICAgIC8qITwgRXhwZWN0ZWQgU1lOQyAqLworI2RlZmluZSBSQ0NfQ1JTX0lUX1NZTkNFUlIgICAgICAgICAgICAgQ1JTX0NSX0VSUklFICAgICAgICAgICAgICAvKiE8IFNZTkMgZXJyb3IgKi8KKyNkZWZpbmUgUkNDX0NSU19JVF9TWU5DTUlTUyAgICAgICAgICAgIENSU19DUl9FUlJJRSAgICAgICAgICAgICAgLyohPCBTWU5DIG1pc3NlZCAqLworI2RlZmluZSBSQ0NfQ1JTX0lUX1RSSU1PVkYgICAgICAgICAgICAgQ1JTX0NSX0VSUklFICAgICAgICAgICAgICAvKiE8IFRyaW1taW5nIG92ZXJmbG93IG9yIHVuZGVyZmxvdyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19GbGFncyBSQ0NFeCBDUlMgRmxhZ3MKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfQ1JTX0ZMQUdfU1lOQ09LICAgICAgICAgICAgQ1JTX0lTUl9TWU5DT0tGICAgICAgICAgICAvKiE8IFNZTkMgZXZlbnQgT0sgZmxhZyAgICAgKi8KKyNkZWZpbmUgUkNDX0NSU19GTEFHX1NZTkNXQVJOICAgICAgICAgIENSU19JU1JfU1lOQ1dBUk5GICAgICAgICAgLyohPCBTWU5DIHdhcm5pbmcgZmxhZyAgICAgICovCisjZGVmaW5lIFJDQ19DUlNfRkxBR19FUlIgICAgICAgICAgICAgICBDUlNfSVNSX0VSUkYgICAgICAgICAgICAgIC8qITwgRXJyb3IgZmxhZyAgICAgICAgKi8KKyNkZWZpbmUgUkNDX0NSU19GTEFHX0VTWU5DICAgICAgICAgICAgIENSU19JU1JfRVNZTkNGICAgICAgICAgICAgLyohPCBFeHBlY3RlZCBTWU5DIGZsYWcgICAgICovCisjZGVmaW5lIFJDQ19DUlNfRkxBR19TWU5DRVJSICAgICAgICAgICBDUlNfSVNSX1NZTkNFUlIgICAgICAgICAgIC8qITwgU1lOQyBlcnJvciAqLworI2RlZmluZSBSQ0NfQ1JTX0ZMQUdfU1lOQ01JU1MgICAgICAgICAgQ1JTX0lTUl9TWU5DTUlTUyAgICAgICAgICAvKiE8IFNZTkMgbWlzc2VkKi8KKyNkZWZpbmUgUkNDX0NSU19GTEFHX1RSSU1PVkYgICAgICAgICAgIENSU19JU1JfVFJJTU9WRiAgICAgICAgICAgLyohPCBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIENSUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NFeF9FeHBvcnRlZF9NYWNyb3MgUkNDRXggRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfUGVyaXBoZXJhbF9DbG9ja19FbmFibGVfRGlzYWJsZSBBSEIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQiBwZXJpcGhlcmFsIGNsb2NrLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDA2Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA2M3h4KXx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpIHx8IGRlZmluZWQoU1RNMzJMMDQxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDIxeHgpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0NSWVBFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9DUllQRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfQ0xLX0RJU0FCTEUoKSAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFIQkVOUiwgKFJDQ19BSEJFTlJfQ1JZUEVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9DUllQRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0lTX0NMS19ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9DUllQRU4pID09IDBVKQorCisjZW5kaWYgLyogU1RNMzJMMDYyeHggfHwgU1RNMzJMMDYzeHggfHwgU1RNMzJMMDcyeHggIHx8IFNUTTMyTDA3M3h4IHx8IFNUTTMyTDA4Mnh4ICB8fCBTVE0zMkwwODN4eCB8fCBTVE0zMkwwNDF4eCB8fCBTVE0zMkwwMjF4eCAqLworCisjaWYgIWRlZmluZWQoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkKFNUTTMyTDAxMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwMjF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDMxeHgpICYmICFkZWZpbmVkKFNUTTMyTDA0MXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNTF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDYxeHgpICYmICFkZWZpbmVkKFNUTTMyTDA3MXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwODF4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RTQ19DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfVFNDRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfVFNDRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFIQkVOUiwgKFJDQ19BSEJFTlJfVFNDRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX1RTQ0VOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1RTQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfVFNDRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX1JOR0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX1JOR0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0NMS19ESVNBQkxFKCkgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFIQkVOUiwgKFJDQ19BSEJFTlJfUk5HRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX1JOR0VOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfUk5HRU4pID09IDBVKQorI2VuZGlmIC8qICEoU1RNMzJMMDEweEIpICYmICEoU1RNMzJMMDEweDgpICYmICEoU1RNMzJMMDEweDYpICYmICEoU1RNMzJMMDEweDQpICYmICEoU1RNMzJMMDExeHgpICYmICEoU1RNMzJMMDIxeHgpICYmICEoU1RNMzJMMDMxeHggKSAmJiAhKFNUTTMyTDA0MXh4ICkgJiYgIShTVE0zMkwwNTF4eCApICYmICEoU1RNMzJMMDYxeHggKSAmJiAhKFNUTTMyTDA3MXh4ICkgJiYgIShTVE0zMkwwODF4eCApICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSU9QT1JUX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIElPUE9SVCBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgSU9QT1JUIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKEdQSU9FKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX0VOQUJMRSgpICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9FRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0VFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX0RJU0FCTEUoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+SU9QRU5SLChSQ0NfSU9QRU5SX0dQSU9FRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0VFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0VFTikgPT0gMFUpCisKKyNlbmRpZiAvKiBHUElPRSAqLworI2lmIGRlZmluZWQoR1BJT0QpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9DTEtfRU5BQkxFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0RFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPREVOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX0RJU0FCTEUoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+SU9QRU5SLChSQ0NfSU9QRU5SX0dQSU9ERU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0RFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0RFTikgPT0gMFUpCisKKyNlbmRpZiAgLyogR1BJT0QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQVBCMV9DbG9ja19FbmFibGVfRGlzYWJsZSBBUEIxIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2lmICFkZWZpbmVkKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDIxeHgpICYmICFkZWZpbmVkKFNUTTMyTDAzMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNDF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDUxeHgpICYmICFkZWZpbmVkKFNUTTMyTDA2MXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNzF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDgxeHgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfQ0xLX0VOQUJMRSgpICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX1VTQkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9DTEtfRElTQUJMRSgpICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9VU0JFTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9VU0JFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVVNCRU4pID09IDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xLX0VOQUJMRSgpICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX0NSU0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DTEtfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIsKFJDQ19BUEIxRU5SX0NSU0VOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0NSU0VOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9DUlNFTikgPT0gMFUpCisKKyNlbmRpZiAvKiAhKFNUTTMyTDAxMHhCKSAmJiAhKFNUTTMyTDAxMHg4KSAmJiAhKFNUTTMyTDAxMHg2KSAmJiAhKFNUTTMyTDAxMHg0KSAmJiAhKFNUTTMyTDAxMXh4KSAmJiAhKFNUTTMyTDAyMXh4KSAmJiAhKFNUTTMyTDAzMXh4ICkgJiYgIShTVE0zMkwwNDF4eCApICYmICEoU1RNMzJMMDUxeHggKSAmJiAhKFNUTTMyTDA2MXh4ICkgJiYgIShTVE0zMkwwNzF4eCApICYmICEoU1RNMzJMMDgxeHggKSAqLworCisKKyNpZiBkZWZpbmVkKFNUTTMyTDA1M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA2M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KQorI2RlZmluZSBfX0hBTF9SQ0NfTENEX0NMS19FTkFCTEUoKSAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX0xDREVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xDRF9DTEtfRElTQUJMRSgpICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX0xDREVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfTENEX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0xDREVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xDRF9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9MQ0RFTikgPT0gMFUpCisKKyNlbmRpZiAvKiBTVE0zMkwwNTN4eCB8fCBTVE0zMkwwNjN4eCB8fCBTVE0zMkwwNzN4eCAgfHwgU1RNMzJMMDgzeHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMDUzeHgpIHx8IGRlZmluZWQoU1RNMzJMMDYzeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDA1Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA2Mnh4KSBcCisgfHwgZGVmaW5lZChTVE0zMkwwNTF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjF4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNNkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfU1BJMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRU5BQkxFKCkgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVVNBUlQyRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfRU5BQkxFKCkgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9MUFVBUlQxRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9JMkMxRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9DTEtfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9JMkMyRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDX0NMS19FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9EQUNFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX0VOQUJMRSgpICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX0xQVElNMUVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9DTEtfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9USU0yRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9DTEtfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9USU02RU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9DTEtfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9TUEkyRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19ESVNBQkxFKCkgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9VU0FSVDJFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX0xQVUFSVDFFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0NMS19ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX0kyQzFFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0NMS19ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX0kyQzJFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUNfQ0xLX0RJU0FCTEUoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX0RBQ0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DTEtfRElTQUJMRSgpICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfTFBUSU0xRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTJFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0lTX0NMS19FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTZFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1NQSTJFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX0VOQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1VTQVJUMkVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfSVNfQ0xLX0VOQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfTFBVQVJUMUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDMUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDMkVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQ19JU19DTEtfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfREFDRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19FTkFCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9MUFRJTTFFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTJFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0lTX0NMS19ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTZFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1NQSTJFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX0RJU0FCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1VTQVJUMkVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfSVNfQ0xLX0RJU0FCTEVEKCkgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfTFBVQVJUMUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDMUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0RJU0FCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDMkVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQ19JU19DTEtfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfREFDRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19ESVNBQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9MUFRJTTFFTikgPT0gMFUpCisKKyNlbmRpZiAvKiBTVE0zMkwwNTF4eCAgfHwgU1RNMzJMMDYxeHggIHx8ICAqLworICAgICAgIC8qIFNUTTMyTDA1Mnh4ICB8fCBTVE0zMkwwNjJ4eCAgfHwgICovCisgICAgICAgLyogU1RNMzJMMDUzeHggIHx8IFNUTTMyTDA2M3h4ICB8fCAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMDEweEIpIHx8IGRlZmluZWQoU1RNMzJMMDEweDgpIHx8IGRlZmluZWQoU1RNMzJMMDEweDYpIHx8IGRlZmluZWQoU1RNMzJMMDEweDQpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDAyMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA0MXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9DTEtfRU5BQkxFKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRU5BQkxFKCkgICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX1VTQVJUMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0VOQUJMRSgpICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX0xQVUFSVDFFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0NMS19FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9JMkMxRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19FTkFCTEUoKSAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfTFBUSU0xRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0NMS19ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX1RJTTJFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX0RJU0FCTEUoKSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX1VTQVJUMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfTFBVQVJUMUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfSTJDMUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DTEtfRElTQUJMRSgpICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfTFBUSU0xRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTJFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX0VOQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1VTQVJUMkVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfSVNfQ0xLX0VOQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfTFBVQVJUMUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDMUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfRU5BQkxFRCgpICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfTFBUSU0xRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVElNMkVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1VTQVJUMkVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfSVNfQ0xLX0RJU0FCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0xQVUFSVDFFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9JMkMxRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19ESVNBQkxFRCgpICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfTFBUSU0xRU4pID09IDBVKQorCisjZW5kaWYgLyogU1RNMzJMMDEweEIgfHwgU1RNMzJMMDEweDggfHwgU1RNMzJMMDEweDYgfHwgU1RNMzJMMDEweDQgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwMTF4eCB8fCBTVE0zMkwwMjF4eCB8fCBTVE0zMkwwMzF4eCB8fCBTVE0zMkwwNDF4eCAgICovCisKKworI2lmIGRlZmluZWQoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSBcCisgfHwgZGVmaW5lZChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwODF4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNM0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNNkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTdfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNN0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfU1BJMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRU5BQkxFKCkgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVVNBUlQyRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQ0X0NMS19FTkFCTEUoKSAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9VU0FSVDRFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDVfQ0xLX0VOQUJMRSgpICBTRVRfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX1VTQVJUNUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0VOQUJMRSgpIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfTFBVQVJUMUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfSTJDMUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfSTJDMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfSTJDM0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQ19DTEtfRU5BQkxFKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfREFDRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19FTkFCTEUoKSAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9MUFRJTTFFTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfQ0xLX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNM0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNNkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTdfQ0xLX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVElNN0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfU1BJMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRElTQUJMRSgpICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfVVNBUlQyRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQ0X0NMS19ESVNBQkxFKCkgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9VU0FSVDRFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDVfQ0xLX0RJU0FCTEUoKSAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUiwgKFJDQ19BUEIxRU5SX1VTQVJUNUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfTFBVQVJUMUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfSTJDMUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfSTJDMkVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfQ0xLX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfSTJDM0VOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQ19DTEtfRElTQUJMRSgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxRU5SLCAoUkNDX0FQQjFFTlJfREFDRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19ESVNBQkxFKCkgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9MUFRJTTFFTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU0yRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1RJTTNFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0lTX0NMS19FTkFCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVElNNkVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTdfSVNfQ0xLX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU03RU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1NQSTJFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX0VOQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVVNBUlQyRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQ0X0lTX0NMS19FTkFCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1VTQVJUNEVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUNV9JU19DTEtfRU5BQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9VU0FSVDVFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19FTkFCTEVEKCkgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfTFBVQVJUMUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9JMkMxRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0kyQzJFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0lTX0NMS19FTkFCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfSTJDM0VOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQ19JU19DTEtfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9EQUNFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfSVNfQ0xLX0VOQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfTFBUSU0xRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU0yRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU0zRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU02RU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19JU19DTEtfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9USU03RU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9TUEkyRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19ESVNBQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9VU0FSVDJFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDRfSVNfQ0xLX0RJU0FCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX1VTQVJUNEVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUNV9JU19DTEtfRElTQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMUVOUiwgUkNDX0FQQjFFTlJfVVNBUlQ1RU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9JU19DTEtfRElTQUJMRUQoKSAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9MUFVBUlQxRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9JMkMxRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9JMkMyRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19JU19DTEtfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9JMkMzRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDX0lTX0NMS19ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxRU5SLCBSQ0NfQVBCMUVOUl9EQUNFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfSVNfQ0xLX0RJU0FCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFJDQ19BUEIxRU5SX0xQVElNMUVOKSA9PSAwVSkKKworI2VuZGlmIC8qIFNUTTMyTDA3MXh4ICB8fCAgU1RNMzJMMDgxeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDcyeHggIHx8ICBTVE0zMkwwODJ4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwNzN4eCAgfHwgIFNUTTMyTDA4M3h4ICAgICAqLworCisgLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMDUzeHgpIHx8IGRlZmluZWQoU1RNMzJMMDYzeHgpIHx8IGRlZmluZWQoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDA1Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA2Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSBcCisgfHwgZGVmaW5lZChTVE0zMkwwNTF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwODF4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJMMDMxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDQxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQoU1RNMzJMMDIxeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDAxMHhCKSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg4KSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg2KSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg0KQorLyoqIEBkZWZncm91cCBSQ0NFeF9BUEIyX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFQQjIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQQjIgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVElNMjFfQ0xLX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCAoUkNDX0FQQjJFTlJfVElNMjFFTikpCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDIxeHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMl9DTEtfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIChSQ0NfQVBCMkVOUl9USU0yMkVOKSkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9DTEtfRU5BQkxFKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCAoUkNDX0FQQjJFTlJfQURDMUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfQ0xLX0VOQUJMRSgpICAgICBTRVRfQklUKFJDQy0+QVBCMkVOUiwgKFJDQ19BUEIyRU5SX1NQSTFFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX0VOQUJMRSgpICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIChSQ0NfQVBCMkVOUl9VU0FSVDFFTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIxX0NMS19ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgIChSQ0NfQVBCMkVOUl9USU0yMUVOKSkKKyNpZiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDExeHgpICYmICFkZWZpbmVkIChTVE0zMkwwMjF4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIyX0NMS19ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgIChSQ0NfQVBCMkVOUl9USU0yMkVOKSkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9DTEtfRElTQUJMRSgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCAgKFJDQ19BUEIyRU5SX0FEQzFFTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0NMS19ESVNBQkxFKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQjJFTlIsICAoUkNDX0FQQjJFTlJfU1BJMUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9DTEtfRElTQUJMRSgpICAgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgIChSQ0NfQVBCMkVOUl9VU0FSVDFFTikpCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDIxeHgpICYmICFkZWZpbmVkKFNUTTMyTDAzMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNDF4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0ZJUkVXQUxMX0NMS19FTkFCTEUoKSAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIChSQ0NfQVBCMkVOUl9NSUZJRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfRklSRVdBTExfQ0xLX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCAgKFJDQ19BUEIyRU5SX01JRklFTikpCisjZW5kaWYgLyogIShTVE0zMkwwMTB4NCkgJiYgIShTVE0zMkwwMTB4NikgJiYgIShTVE0zMkwwMTB4OCkgJiYgIShTVE0zMkwwMTB4QikgJiYgIShTVE0zMkwwMTF4eCkgJiYgIShTVE0zMkwwMjF4eCkgJiYgIVNUTTMyTDAzMXh4ICYmICFTVE0zMkwwNDF4eCAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMV9JU19DTEtfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1RJTTIxRU4pICE9IDBVKQorI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjJfSVNfQ0xLX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9USU0yMkVOKSAhPSAwVSkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9JU19DTEtfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9BREMxRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9TUEkxRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0lTX0NMS19FTkFCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBSQ0NfQVBCMkVOUl9VU0FSVDFFTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIxX0lTX0NMS19ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsICAoUkNDX0FQQjJFTlJfVElNMjFFTikgPT0gMFUpCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDIxeHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMl9JU19DTEtfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCAgKFJDQ19BUEIyRU5SX1RJTTIyRU4pID09IDBVKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0lTX0NMS19ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCAgKFJDQ19BUEIyRU5SX0FEQzFFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCAgKFJDQ19BUEIyRU5SX1NQSTFFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCAgKFJDQ19BUEIyRU5SX1VTQVJUMUVOKSA9PSAwVSkKKyNpZiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkKFNUTTMyTDAxMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwMjF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDMxeHgpICYmICFkZWZpbmVkKFNUTTMyTDA0MXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfRklSRVdBTExfSVNfQ0xLX0VOQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUkNDX0FQQjJFTlJfTUlGSUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0ZJUkVXQUxMX0lTX0NMS19ESVNBQkxFRCgpIChSRUFEX0JJVChSQ0MtPkFQQjJFTlIsICAoUkNDX0FQQjJFTlJfTUlGSUVOKSA9PSAwVSkKKyNlbmRpZiAvKiAhKFNUTTMyTDAxMHg0KSAmJiAhKFNUTTMyTDAxMHg2KSAmJiAhKFNUTTMyTDAxMHg4KSAmJiAhKFNUTTMyTDAxMHhCKSAmJiAhKFNUTTMyTDAxMXh4KSAmJiAhKFNUTTMyTDAyMXh4KSAmJiAhU1RNMzJMMDMxeHggJiYgIVNUTTMyTDA0MXh4ICovCisKKyNlbmRpZiAvKiBTVE0zMkwwNTF4eCAgfHwgU1RNMzJMMDYxeHggIHx8IFNUTTMyTDA3MXh4ICB8fCAgU1RNMzJMMDgxeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDUyeHggIHx8IFNUTTMyTDA2Mnh4ICB8fCBTVE0zMkwwNzJ4eCAgfHwgIFNUTTMyTDA4Mnh4ICB8fCAqLworICAgICAgIC8qIFNUTTMyTDA1M3h4ICB8fCBTVE0zMkwwNjN4eCAgfHwgU1RNMzJMMDczeHggIHx8ICBTVE0zMkwwODN4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwMzF4eCAgfHwgU1RNMzJMMDQxeHggIHx8IFNUTTMyTDAxMXh4ICB8fCBTVE0zMkwwMjF4eCAgIHx8ICovCisgICAgICAgLyogU1RNMzJMMDEweEIgIHx8IFNUTTMyTDAxMHg4ICB8fCBTVE0zMkwwMTB4NiAgfHwgU1RNMzJMMDEweDQgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9BSEJfRm9yY2VfUmVsZWFzZV9SZXNldCBBSEIgUGVyaXBoZXJhbCBGb3JjZSBSZWxlYXNlIFJlc2V0CisgICogQGJyaWVmICBGb3JjZSBvciByZWxlYXNlIEFIQiBwZXJpcGhlcmFsIHJlc2V0LgorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkwwNjJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjN4eCl8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDAyMXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0ZPUkNFX1JFU0VUKCkgICAgIFNFVF9CSVQoUkNDLT5BSEJSU1RSLCAoUkNDX0FIQlJTVFJfQ1JZUFJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfUkVMRUFTRV9SRVNFVCgpICAgQ0xFQVJfQklUKFJDQy0+QUhCUlNUUiwgKFJDQ19BSEJSU1RSX0NSWVBSU1QpKQorI2VuZGlmIC8qIFNUTTMyTDA2Mnh4IHx8IFNUTTMyTDA2M3h4IHx8IFNUTTMyTDA3Mnh4ICB8fCBTVE0zMkwwNzN4eCB8fCBTVE0zMkwwODJ4eCAgfHwgU1RNMzJMMDgzeHggfHwgU1RNMzJMMDQxeHggfHwgU1RNMzJMMDIxeHgqLworCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDIxeHgpICYmICFkZWZpbmVkKFNUTTMyTDAzMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNDF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDUxeHgpICYmICFkZWZpbmVkKFNUTTMyTDA2MXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNzF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDgxeHgpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfRk9SQ0VfUkVTRVQoKSAgICAgICAgU0VUX0JJVChSQ0MtPkFIQlJTVFIsIChSQ0NfQUhCUlNUUl9UU0NSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVFNDX1JFTEVBU0VfUkVTRVQoKSAgICAgIENMRUFSX0JJVChSQ0MtPkFIQlJTVFIsIChSQ0NfQUhCUlNUUl9UU0NSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0ZPUkNFX1JFU0VUKCkgICAgICAgIFNFVF9CSVQoUkNDLT5BSEJSU1RSLCAoUkNDX0FIQlJTVFJfUk5HUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19SRUxFQVNFX1JFU0VUKCkgICAgICBDTEVBUl9CSVQoUkNDLT5BSEJSU1RSLCAoUkNDX0FIQlJTVFJfUk5HUlNUKSkKKyNlbmRpZiAvKiAhKFNUTTMyTDAxMHg0KSAmJiAhKFNUTTMyTDAxMHg2KSAmJiAhKFNUTTMyTDAxMHg4KSAmJiAhKFNUTTMyTDAxMHhCKSAmJiAhKFNUTTMyTDAxMXh4KSAmJiAhKFNUTTMyTDAyMXh4KSAmJiAhKFNUTTMyTDAzMXh4ICkgJiYgIShTVE0zMkwwNDF4eCApICYmICEoU1RNMzJMMDUxeHggKSAmJiAhKFNUTTMyTDA2MXh4ICkgJiYgIShTVE0zMkwwNzF4eCApICYmICEoU1RNMzJMMDgxeHggKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0lPUE9SVF9Gb3JjZV9SZWxlYXNlX1Jlc2V0IElPUE9SVCBQZXJpcGhlcmFsIEZvcmNlIFJlbGVhc2UgUmVzZXQKKyAgKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgSU9QT1JUIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KSBcCisgfHwgZGVmaW5lZChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwODJ4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgxeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDAxMHhCKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfRk9SQ0VfUkVTRVQoKSAgIFNFVF9CSVQoUkNDLT5JT1BSU1RSLCAoUkNDX0lPUFJTVFJfR1BJT0VSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9SRUxFQVNFX1JFU0VUKCkgQ0xFQVJfQklUKFJDQy0+SU9QUlNUUiwoUkNDX0lPUFJTVFJfR1BJT0VSU1QpKQorCisjZW5kaWYgLyogU1RNMzJMMDcxeHggIHx8ICBTVE0zMkwwODF4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwNzJ4eCAgfHwgIFNUTTMyTDA4Mnh4ICB8fCAqLworICAgICAgIC8qIFNUTTMyTDA3M3h4ICB8fCAgU1RNMzJMMDgzeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDEweEIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiAhZGVmaW5lZChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkKFNUTTMyTDAxMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwMjF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDMxeHgpICYmICFkZWZpbmVkKFNUTTMyTDA0MXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfRk9SQ0VfUkVTRVQoKSAgIFNFVF9CSVQoUkNDLT5JT1BSU1RSLCAoUkNDX0lPUFJTVFJfR1BJT0RSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfUkVMRUFTRV9SRVNFVCgpIENMRUFSX0JJVChSQ0MtPklPUFJTVFIsKFJDQ19JT1BSU1RSX0dQSU9EUlNUKSkKKyNlbmRpZiAgLyogIShTVE0zMkwwMTB4NCkgJiYgIShTVE0zMkwwMTB4NikgJiYgIShTVE0zMkwwMTF4eCkgJiYgIShTVE0zMkwwMjF4eCkgJiYgIShTVE0zMkwwMzF4eCApICYmICEoU1RNMzJMMDQxeHggKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9BUEIxX0ZvcmNlX1JlbGVhc2VfUmVzZXQgQVBCMSBQZXJpcGhlcmFsIEZvcmNlIFJlbGVhc2UgUmVzZXQKKyAgKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQVBCMSBwZXJpcGhlcmFsIHJlc2V0LgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDA1M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA2M3h4KSBcCisgfHwgZGVmaW5lZChTVE0zMkwwNTJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjJ4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJMMDUxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDYxeHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0ZPUkNFX1JFU0VUKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9USU0yUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfRk9SQ0VfUkVTRVQoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1RJTTZSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUKCkgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfTFBUSU0xUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfRk9SQ0VfUkVTRVQoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0kyQzFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9GT1JDRV9SRVNFVCgpICAgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfSTJDMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfRk9SQ0VfUkVTRVQoKSAgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9VU0FSVDJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9GT1JDRV9SRVNFVCgpICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfTFBVQVJUMVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0ZPUkNFX1JFU0VUKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9TUEkyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQ19GT1JDRV9SRVNFVCgpICAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0RBQ1JTVCkpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfUkVMRUFTRV9SRVNFVCgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9USU0yUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfUkVMRUFTRV9SRVNFVCgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9USU02UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9SRUxFQVNFX1JFU0VUKCkgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9MUFRJTTFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9SRUxFQVNFX1JFU0VUKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0kyQzFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9SRUxFQVNFX1JFU0VUKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0kyQzJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX1JFTEVBU0VfUkVTRVQoKSAgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1VTQVJUMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX1JFTEVBU0VfUkVTRVQoKSAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfTFBVQVJUMVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX1JFTEVBU0VfUkVTRVQoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfU1BJMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUNfUkVMRUFTRV9SRVNFVCgpICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfREFDUlNUKSkKKyNlbmRpZiAvKiBTVE0zMkwwNTF4eCAgfHwgU1RNMzJMMDYxeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDUyeHggIHx8IFNUTTMyTDA2Mnh4ICB8fCAqLworICAgICAgIC8qIFNUTTMyTDA1M3h4ICB8fCBTVE0zMkwwNjN4eCAgICAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDAyMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA0MXh4KSB8fCBcCisgICAgZGVmaW5lZChTVE0zMkwwMTB4QikgfHwgZGVmaW5lZChTVE0zMkwwMTB4OCkgfHwgZGVmaW5lZChTVE0zMkwwMTB4NikgfHwgZGVmaW5lZChTVE0zMkwwMTB4NCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfRk9SQ0VfUkVTRVQoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1RJTTJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUKCkgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfTFBUSU0xUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfRk9SQ0VfUkVTRVQoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0kyQzFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0ZPUkNFX1JFU0VUKCkgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfVVNBUlQyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfRk9SQ0VfUkVTRVQoKSAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0xQVUFSVDFSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX1JFTEVBU0VfUkVTRVQoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfVElNMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfUkVMRUFTRV9SRVNFVCgpICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfTFBUSU0xUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfUkVMRUFTRV9SRVNFVCgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9JMkMxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9SRUxFQVNFX1JFU0VUKCkgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9VU0FSVDJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9SRUxFQVNFX1JFU0VUKCkgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0xQVUFSVDFSU1QpKQorI2VuZGlmIC8qIFNUTTMyTDAzMXh4IHx8IFNUTTMyTDA0MXh4IHx8IFNUTTMyTDAxMXh4IHx8IFNUTTMyTDAyMXh4IHx8ICovCisgICAgICAgLyogU1RNMzJMMDEweEIgfHwgU1RNMzJMMDEweDggfHwgU1RNMzJMMDEweDYgfHwgU1RNMzJMMDEweDQgICAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSBcCisgfHwgZGVmaW5lZChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwODF4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfRk9SQ0VfUkVTRVQoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1RJTTJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19GT1JDRV9SRVNFVCgpICAgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfVElNM1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0ZPUkNFX1JFU0VUKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9USU02UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTdfRk9SQ0VfUkVTRVQoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1RJTTdSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUKCkgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfTFBUSU0xUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfRk9SQ0VfUkVTRVQoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0kyQzFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9GT1JDRV9SRVNFVCgpICAgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfSTJDMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0ZPUkNFX1JFU0VUKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9JMkMzUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9GT1JDRV9SRVNFVCgpICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1VTQVJUMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDRfRk9SQ0VfUkVTRVQoKSAgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9VU0FSVDRSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQ1X0ZPUkNFX1JFU0VUKCkgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfVVNBUlQ1UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfRk9SQ0VfUkVTRVQoKSAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0xQVUFSVDFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9GT1JDRV9SRVNFVCgpICAgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfU1BJMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUNfRk9SQ0VfUkVTRVQoKSAgICAgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9EQUNSU1QpKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX1JFTEVBU0VfUkVTRVQoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfVElNMlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX1JFTEVBU0VfUkVTRVQoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfVElNM1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X1JFTEVBU0VfUkVTRVQoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfVElNNlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X1JFTEVBU0VfUkVTRVQoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfVElNN1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfUkVMRUFTRV9SRVNFVCgpICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfTFBUSU0xUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfUkVMRUFTRV9SRVNFVCgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9JMkMxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfUkVMRUFTRV9SRVNFVCgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9JMkMyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfUkVMRUFTRV9SRVNFVCgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9JMkMzUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9SRUxFQVNFX1JFU0VUKCkgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9VU0FSVDJSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQ0X1JFTEVBU0VfUkVTRVQoKSAgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1VTQVJUNFJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDVfUkVMRUFTRV9SRVNFVCgpICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfVVNBUlQ1UlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfUkVMRUFTRV9SRVNFVCgpICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9MUFVBUlQxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfUkVMRUFTRV9SRVNFVCgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9TUEkyUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQ19SRUxFQVNFX1JFU0VUKCkgICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9EQUNSU1QpKQorI2VuZGlmIC8qIFNUTTMyTDA3MXh4ICB8fCAgU1RNMzJMMDgxeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDcyeHggIHx8ICBTVE0zMkwwODJ4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwNzN4eCAgfHwgIFNUTTMyTDA4M3h4ICB8fCAqLworCisjaWYgIWRlZmluZWQoU1RNMzJMMDExeHgpICYmICFkZWZpbmVkKFNUTTMyTDAyMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwMzF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDQxeHgpICYmIFwKKyAgICAhZGVmaW5lZChTVE0zMkwwNTF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDYxeHgpICYmICFkZWZpbmVkKFNUTTMyTDA3MXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwODF4eCkgJiYgXAorICAgICFkZWZpbmVkKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkKFNUTTMyTDAxMHg0KQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0ZPUkNFX1JFU0VUKCkgICAgICAgIFNFVF9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9VU0JSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX1JFTEVBU0VfUkVTRVQoKSAgICAgIENMRUFSX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX1VTQlJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRk9SQ0VfUkVTRVQoKSAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSLCAoUkNDX0FQQjFSU1RSX0NSU1JTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfUkVMRUFTRV9SRVNFVCgpICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIsKFJDQ19BUEIxUlNUUl9DUlNSU1QpKQorI2VuZGlmIC8qICEoU1RNMzJMMDExeHgpICYmICEoU1RNMzJMMDIxeHgpICYmICEoU1RNMzJMMDMxeHgpICYmICEoU1RNMzJMMDQxeHgpICYmICovCisgICAgICAgLyogIShTVE0zMkwwNTF4eCkgJiYgIShTVE0zMkwwNjF4eCkgJiYgIShTVE0zMkwwNzF4eCkgJiYgIShTVE0zMkwwODF4eCkgJiYgKi8KKyAgICAgICAvKiAhKFNUTTMyTDAxMHhCKSAmJiAhKFNUTTMyTDAxMHg4KSAmJiAhKFNUTTMyTDAxMHg2KSAmJiAhKFNUTTMyTDAxMHg0KSAmJiAqLworCisjaWYgZGVmaW5lZChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZChTVE0zMkwwODN4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0xDRF9GT1JDRV9SRVNFVCgpICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIChSQ0NfQVBCMVJTVFJfTENEUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xDRF9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgKFJDQ19BUEIxUlNUUl9MQ0RSU1QpKQorI2VuZGlmIC8qIFNUTTMyTDA1M3h4IHx8IFNUTTMyTDA2M3h4IHx8IFNUTTMyTDA3M3h4ICB8fCBTVE0zMkwwODN4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZChTVE0zMkwwODN4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJMMDUyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDYyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDA1MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA2MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4MXh4KQorCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FQQjJfRm9yY2VfUmVsZWFzZV9SZXNldCBBUEIyIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldAorICAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBUEIyIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9GT1JDRV9SRVNFVCgpICAgICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIChSQ0NfQVBCMlJTVFJfVVNBUlQxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfRk9SQ0VfUkVTRVQoKSAgICAgICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIChSQ0NfQVBCMlJTVFJfQURDMVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0ZPUkNFX1JFU0VUKCkgICAgICAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCAoUkNDX0FQQjJSU1RSX1NQSTFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjFfRk9SQ0VfUkVTRVQoKSAgICAgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgKFJDQ19BUEIyUlNUUl9USU0yMVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMl9GT1JDRV9SRVNFVCgpICAgICAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCAoUkNDX0FQQjJSU1RSX1RJTTIyUlNUKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX1JFTEVBU0VfUkVTRVQoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIChSQ0NfQVBCMlJTVFJfVVNBUlQxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfUkVMRUFTRV9SRVNFVCgpICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCAoUkNDX0FQQjJSU1RSX0FEQzFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIChSQ0NfQVBCMlJTVFJfU1BJMVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMV9SRUxFQVNFX1JFU0VUKCkgICAgICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgKFJDQ19BUEIyUlNUUl9USU0yMVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMl9SRUxFQVNFX1JFU0VUKCkgICAgICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgKFJDQ19BUEIyUlNUUl9USU0yMlJTVCkpCisKKyNlbmRpZiAvKiBTVE0zMkwwNTF4eCAgfHwgU1RNMzJMMDYxeHggIHx8IFNUTTMyTDA3MXh4ICB8fCAgU1RNMzJMMDgxeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDUyeHggIHx8IFNUTTMyTDA2Mnh4ICB8fCBTVE0zMkwwNzJ4eCAgfHwgIFNUTTMyTDA4Mnh4ICB8fCAqLworICAgICAgIC8qIFNUTTMyTDA1M3h4ICB8fCBTVE0zMkwwNjN4eCAgfHwgU1RNMzJMMDczeHggIHx8ICBTVE0zMkwwODN4eCAgfHwgKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQoU1RNMzJMMDIxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDMxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDQxeHgpIHx8IFwKKyAgICBkZWZpbmVkKFNUTTMyTDAxMHhCKSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg4KSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg2KSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg0KQorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9GT1JDRV9SRVNFVCgpICAgICAgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgKFJDQ19BUEIyUlNUUl9BREMxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfRk9SQ0VfUkVTRVQoKSAgICAgICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIChSQ0NfQVBCMlJTVFJfU1BJMVJTVCkpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMV9GT1JDRV9SRVNFVCgpICAgICAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCAoUkNDX0FQQjJSU1RSX1RJTTIxUlNUKSkKKyNpZiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDExeHgpICYmICFkZWZpbmVkIChTVE0zMkwwMjF4eCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIyX0ZPUkNFX1JFU0VUKCkgICAgICBTRVRfQklUKFJDQy0+QVBCMlJTVFIsIChSQ0NfQVBCMlJTVFJfVElNMjJSU1QpKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX1JFTEVBU0VfUkVTRVQoKSAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgKFJDQ19BUEIyUlNUUl9BREMxUlNUKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfUkVMRUFTRV9SRVNFVCgpICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCAoUkNDX0FQQjJSU1RSX1NQSTFSU1QpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjFfUkVMRUFTRV9SRVNFVCgpICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIChSQ0NfQVBCMlJTVFJfVElNMjFSU1QpKQorI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjJfUkVMRUFTRV9SRVNFVCgpICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCMlJTVFIsIChSQ0NfQVBCMlJTVFJfVElNMjJSU1QpKQorI2VuZGlmCisjZW5kaWYgLyogU1RNMzJMMDMxeHggfHwgU1RNMzJMMDQxeHggfHwgU1RNMzJMMDExeHggfHwgU1RNMzJMMDIxeHggfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwMTB4QiB8fCBTVE0zMkwwMTB4OCB8fCBTVE0zMkwwMTB4NiB8fCBTVE0zMkwwMTB4NCAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FIQl9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBBSEIgUGVyaXBoZXJhbCBDbG9jayBTbGVlcCBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisKKyNpZiAhZGVmaW5lZChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDIxeHgpICYmICFkZWZpbmVkKFNUTTMyTDAzMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNDF4eCkgJiYgXAorICAgICFkZWZpbmVkKFNUTTMyTDA1MXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNjF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDcxeHgpICYmICFkZWZpbmVkKFNUTTMyTDA4MXh4KSAmJiBcCisgICAgIWRlZmluZWQoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQoU1RNMzJMMDEweDQpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCU01FTlIsIChSQ0NfQUhCU01FTlJfVFNDU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCU01FTlIsIChSQ0NfQUhCU01FTlJfUk5HU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BSEJTTUVOUiwgKFJDQ19BSEJTTUVOUl9UU0NTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFIQlNNRU5SLCAoUkNDX0FIQlNNRU5SX1JOR1NNRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfVFNDU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfUk5HU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfVFNDU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfUk5HU01FTikgPT0gMFUpCisjZW5kaWYgLyogIShTVE0zMkwwMTF4eCkgJiYgIShTVE0zMkwwMjF4eCkgJiYgIShTVE0zMkwwMzF4eCkgJiYgIShTVE0zMkwwNDF4eCkgJiYgKi8KKyAgICAgICAvKiAhKFNUTTMyTDA1MXh4KSAmJiAhKFNUTTMyTDA2MXh4KSAmJiAhKFNUTTMyTDA3MXh4KSAmJiAhKFNUTTMyTDA4MXh4KSAmJiAqLworICAgICAgIC8qICEoU1RNMzJMMDEweEIpICYmICEoU1RNMzJMMDEweDgpICYmICEoU1RNMzJMMDEweDYpICYmICEoU1RNMzJMMDEweDQpICYmICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDA2Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA2M3h4KXx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpIHx8IGRlZmluZWQoU1RNMzJMMDQxeHgpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgIFNFVF9CSVQoUkNDLT5BSEJMUEVOUiwgKFJDQ19BSEJTTUVOUl9DUllQU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFIQkxQRU5SLCAoUkNDX0FIQlNNRU5SX0NSWVBTTUVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJMUEVOUiwgUkNDX0FIQlNNRU5SX0NSWVBTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0FFU19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QUhCTFBFTlIsIFJDQ19BSEJTTUVOUl9DUllQU01FTikgPT0gMFUpCisjZW5kaWYgLyogU1RNMzJMMDYyeHggfHwgU1RNMzJMMDYzeHggfHwgU1RNMzJMMDcyeHggfHwgU1RNMzJMMDczeHggfHwgU1RNMzJMMDgyeHggfHwgU1RNMzJMMDgzeHggfHwgU1RNMzJMMDQxeHggKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9JT1BPUlRfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgSU9QT1JUIFBlcmlwaGVyYWwgQ2xvY2sgU2xlZXAgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBJT1BPUlQgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSBcCisgfHwgZGVmaW5lZChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwODF4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJMMDEweEIpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgICBTRVRfQklUKFJDQy0+SU9QU01FTlIsIChSQ0NfSU9QU01FTlJfR1BJT0VTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgIENMRUFSX0JJVChSQ0MtPklPUFNNRU5SLChSQ0NfSU9QU01FTlJfR1BJT0VTTUVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+SU9QU01FTlIsIFJDQ19JT1BTTUVOUl9HUElPRVNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+SU9QU01FTlIsIFJDQ19JT1BTTUVOUl9HUElPRVNNRU4pID09IDBVKQorI2VuZGlmIC8qIFNUTTMyTDA3MXh4ICB8fCAgU1RNMzJMMDgxeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDcyeHggIHx8ICBTVE0zMkwwODJ4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwNzN4eCAgfHwgIFNUTTMyTDA4M3h4ICB8fCAqLworICAgICAgIC8qIFNUTTMyTDAxMHhCICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgIWRlZmluZWQoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDIxeHgpICYmICFkZWZpbmVkKFNUTTMyTDAzMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNDF4eCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0NMS19TTEVFUF9FTkFCTEUoKSAgICBTRVRfQklUKFJDQy0+SU9QU01FTlIsIChSQ0NfSU9QU01FTlJfR1BJT0RTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0NMS19TTEVFUF9ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5JT1BTTUVOUiwoUkNDX0lPUFNNRU5SX0dQSU9EU01FTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0RTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0RTTUVOKSA9PSAwVSkKKyNlbmRpZiAgLyogIShTVE0zMkwwMTB4NCkgJiYgIShTVE0zMkwwMTB4NikgJiYgIShTVE0zMkwwMTF4eCkgJiYgIShTVE0zMkwwMjF4eCkgJiYgIShTVE0zMkwwMzF4eCApICYmICEoU1RNMzJMMDQxeHggKSAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FQQjFfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQVBCMSBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDA1M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA2M3h4KSBcCisgfHwgZGVmaW5lZChTVE0zMkwwNTJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjJ4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJMMDUxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDYxeHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0NMS19TTEVFUF9FTkFCTEUoKSAgICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9USU0yU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0NMS19TTEVFUF9FTkFCTEUoKSAgICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9USU02U01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0NMS19TTEVFUF9FTkFCTEUoKSAgICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9TUEkyU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX1NMRUVQX0VOQUJMRSgpICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9VU0FSVDJTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0VOQUJMRSgpIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX0xQVUFSVDFTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX0kyQzFTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX1NMRUVQX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX0kyQzJTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQ19DTEtfU0xFRVBfRU5BQkxFKCkgICAgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX0RBQ1NNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19TTEVFUF9FTkFCTEUoKSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfTFBUSU0xU01FTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX1RJTTJTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX1RJTTZTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX1NQSTJTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfU0xFRVBfRElTQUJMRSgpICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX1VTQVJUMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfTFBVQVJUMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfSTJDMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfSTJDMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfREFDU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9MUFRJTTFTTUVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVElNMlNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVElNNlNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfU1BJMlNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVVNBUlQyU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9MUFVBUlQxU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9JMkMxU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9JMkMyU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9EQUNTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX0xQVElNMVNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVElNMlNNRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVElNNlNNRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfU1BJMlNNRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVVNBUlQyU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9MUFVBUlQxU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9JMkMxU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9JMkMyU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9EQUNTTUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX0xQVElNMVNNRU4pID09IDBVKQorI2VuZGlmIC8qIFNUTTMyTDA1MXh4ICB8fCBTVE0zMkwwNjF4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwNTJ4eCAgfHwgU1RNMzJMMDYyeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDUzeHggIHx8IFNUTTMyTDA2M3h4ICAgICAqLworCisjaWYgZGVmaW5lZChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZChTVE0zMkwwODN4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4MXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVElNMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVElNM1NNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVElNNlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVElNN1NNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfU1BJMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9FTkFCTEUoKSAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVVNBUlQyU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDRfQ0xLX1NMRUVQX0VOQUJMRSgpICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9VU0FSVDRTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUNV9DTEtfU0xFRVBfRU5BQkxFKCkgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX1VTQVJUNVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRU5BQkxFKCkgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfTFBVQVJUMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfSTJDMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfSTJDMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfSTJDM1NNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfREFDU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0VOQUJMRSgpICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9MUFRJTTFTTUVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVElNMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVElNM1NNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVElNNlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVElNN1NNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfU1BJMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9ESVNBQkxFKCkgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVVNBUlQyU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDRfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9VU0FSVDRTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUNV9DTEtfU0xFRVBfRElTQUJMRSgpICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX1VTQVJUNVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfTFBVQVJUMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfSTJDMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfSTJDMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfSTJDM1NNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfREFDU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9MUFRJTTFTTUVOKSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9USU0yU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX1RJTTNTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVElNNlNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9USU03U01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX1NQSTJTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVVNBUlQyU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDRfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX1VTQVJUNFNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQ1X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9VU0FSVDVTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfTFBVQVJUMVNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9JMkMxU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX0kyQzJTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfSTJDM1NNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9EQUNTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfTFBUSU0xU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9USU0yU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9USU0zU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9USU02U01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9USU03U01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9TUEkyU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9VU0FSVDJTTUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUNF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX1VTQVJUNFNNRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQ1X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVVNBUlQ1U01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9MUFVBUlQxU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9JMkMxU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9JMkMyU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9JMkMzU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9EQUNTTUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX0xQVElNMVNNRU4pID09IDBVKQorI2VuZGlmIC8qICBTVE0zMkwwNzF4eCAgfHwgIFNUTTMyTDA4MXh4ICB8fCAqLworICAgICAgIC8qICBTVE0zMkwwNzJ4eCAgfHwgIFNUTTMyTDA4Mnh4ICB8fCAqLworICAgICAgIC8qICBTVE0zMkwwNzN4eCAgfHwgIFNUTTMyTDA4M3h4ICB8fCAqLworCisjaWYgZGVmaW5lZChTVE0zMkwwMTF4eCkgfHwgZGVmaW5lZChTVE0zMkwwMjF4eCkgfHwgZGVmaW5lZChTVE0zMkwwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNDF4eCkgfHwgXAorICAgIGRlZmluZWQoU1RNMzJMMDEweEIpIHx8IGRlZmluZWQoU1RNMzJMMDEweDgpIHx8IGRlZmluZWQoU1RNMzJMMDEweDYpIHx8IGRlZmluZWQoU1RNMzJMMDEweDQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfVElNMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9FTkFCTEUoKSAgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX1VTQVJUMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRU5BQkxFKCkgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX0xQVUFSVDFTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9JMkMxU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfTFBUSU0xU01FTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX1RJTTJTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfU0xFRVBfRElTQUJMRSgpICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX1VTQVJUMlNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfU0xFRVBfRElTQUJMRSgpIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfTFBVQVJUMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfSTJDMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19TTEVFUF9ESVNBQkxFKCkgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfTFBUSU0xU01FTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX1RJTTJTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX1VTQVJUMlNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfTFBVQVJUMVNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfSTJDMVNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfTFBUSU0xU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVElNMlNNRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX1VTQVJUMlNNRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX0xQVUFSVDFTTUVOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9JMkMxU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfTFBUSU0xU01FTikgPT0gMFUpCisKKyNlbmRpZiAvKiBTVE0zMkwwMzF4eCB8fCBTVE0zMkwwNDF4eCB8fCBTVE0zMkwwMTF4eCB8fCBTVE0zMkwwMjF4eCAqLworICAgICAgIC8qIFNUTTMyTDAxMHhCIHx8IFNUTTMyTDAxMHg4IHx8IFNUTTMyTDAxMHg2IHx8IFNUTTMyTDAxMHg0ICovCisKKyNpZiAhZGVmaW5lZChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDIxeHgpICYmICFkZWZpbmVkKFNUTTMyTDAzMXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNDF4eCkgJiYgXAorICAgICFkZWZpbmVkKFNUTTMyTDA1MXh4KSAmJiAhZGVmaW5lZChTVE0zMkwwNjF4eCkgJiYgIWRlZmluZWQoU1RNMzJMMDcxeHgpICYmICFkZWZpbmVkKFNUTTMyTDA4MXh4KSAgJiYgXAorICAgICFkZWZpbmVkKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkKFNUTTMyTDAxMHg0KQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0NMS19TTEVFUF9FTkFCTEUoKSAgICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9VU0JTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9DTEtfU0xFRVBfRElTQUJMRSgpICAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SLCAoUkNDX0FQQjFTTUVOUl9VU0JTTUVOKSkKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfQ1JTU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfQ1JTU01FTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfVVNCU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX1VTQlNNRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUiwgUkNDX0FQQjFTTUVOUl9DUlNTTUVOKSAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfQ1JTU01FTikgPT0gMFUpCisjZW5kaWYgLyogIShTVE0zMkwwMTF4eCkgJiYgIShTVE0zMkwwMjF4eCkgJiYgIShTVE0zMkwwMzF4eCkgJiYgIShTVE0zMkwwNDF4eCkgJiYgKi8KKyAgICAgICAvKiAhKFNUTTMyTDA1MXh4KSAmJiAhKFNUTTMyTDA2MXh4KSAmJiAhKFNUTTMyTDA3MXh4KSAmJiAhKFNUTTMyTDA4MXh4KSAmJiAqLworICAgICAgIC8qICEoU1RNMzJMMDEweEIpICYmICEoU1RNMzJMMDEweDgpICYmICEoU1RNMzJMMDEweDYpICYmICEoU1RNMzJMMDEweDQpICAgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDA1M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA2M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KQorI2RlZmluZSBfX0hBTF9SQ0NfTENEX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgIFNFVF9CSVQoUkNDLT5BUEIxU01FTlIsIChSQ0NfQVBCMVNNRU5SX0xDRFNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfTENEX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUiwgKFJDQ19BUEIxU01FTlJfTENEU01FTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX0xDRF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIsIFJDQ19BUEIxU01FTlJfTENEU01FTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19MQ0RfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBSQ0NfQVBCMVNNRU5SX0xDRFNNRU4pID09IDBVKQorI2VuZGlmIC8qIFNUTTMyTDA1M3h4IHx8IFNUTTMyTDA2M3h4IHx8IFNUTTMyTDA3M3h4ICB8fCBTVE0zMkwwODN4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZChTVE0zMkwwODN4eCkgXAorIHx8IGRlZmluZWQoU1RNMzJMMDUyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDYyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDA1MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA2MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4MXh4KSBcCisgfHwgZGVmaW5lZChTVE0zMkwwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNDF4eCkgfHwgZGVmaW5lZChTVE0zMkwwMTF4eCkgfHwgZGVmaW5lZChTVE0zMkwwMjF4eCkgIFwKKyB8fCBkZWZpbmVkKFNUTTMyTDAxMHhCKSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg4KSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg2KSB8fCBkZWZpbmVkKFNUTTMyTDAxMHg0KQorCisvKiogQGRlZmdyb3VwIFJDQ0V4X0FQQjJfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQVBCMiBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMV9DTEtfU0xFRVBfRU5BQkxFKCkgICBTRVRfQklUKFJDQy0+QVBCMlNNRU5SLCAoUkNDX0FQQjJTTUVOUl9USU0yMVNNRU4pKQorI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjJfQ0xLX1NMRUVQX0VOQUJMRSgpICAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgKFJDQ19BUEIyU01FTlJfVElNMjJTTUVOKSkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgKFJDQ19BUEIyU01FTlJfQURDMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgKFJDQ19BUEIyU01FTlJfU1BJMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19TTEVFUF9FTkFCTEUoKSAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgKFJDQ19BUEIyU01FTlJfVVNBUlQxU01FTikpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIxX0NMS19TTEVFUF9ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5BUEIyU01FTlIsICAoUkNDX0FQQjJTTUVOUl9USU0yMVNNRU4pKQorI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgIChSQ0NfQVBCMlNNRU5SX1RJTTIyU01FTikpCisjZW5kaWYKKyNkZWZpbmUgX19IQUxfUkNDX0FEQzFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEIyU01FTlIsICAoUkNDX0FQQjJTTUVOUl9BREMxU01FTikpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCAgKFJDQ19BUEIyU01FTlJfU1BJMVNNRU4pKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19TTEVFUF9ESVNBQkxFKCkgIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgIChSQ0NfQVBCMlNNRU5SX1VTQVJUMVNNRU4pKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0yMVNNRU4pICE9IDBVKQorI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMjJfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMjJTTUVOKSAhPSAwVSkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfQURDMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfQURDMVNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU1BJMVNNRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVVNBUlQxU01FTikgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTIxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgIChSQ0NfQVBCMlNNRU5SX1RJTTIxU01FTikgPT0gMFUpCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDIxeHgpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsICAoUkNDX0FQQjJTTUVOUl9USU0yMlNNRU4pID09IDBVKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19BREMxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsICAoUkNDX0FQQjJTTUVOUl9BREMxU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsICAoUkNDX0FQQjJTTUVOUl9TUEkxU01FTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsICAoUkNDX0FQQjJTTUVOUl9VU0FSVDFTTUVOKSA9PSAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFNUTTMyTDA1MXh4ICB8fCBTVE0zMkwwNjF4eCAgfHwgU1RNMzJMMDcxeHggIHx8ICBTVE0zMkwwODF4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwNTJ4eCAgfHwgU1RNMzJMMDYyeHggIHx8IFNUTTMyTDA3Mnh4ICB8fCAgU1RNMzJMMDgyeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDUzeHggIHx8IFNUTTMyTDA2M3h4ICB8fCBTVE0zMkwwNzN4eCAgfHwgIFNUTTMyTDA4M3h4ICB8fCAqLworICAgICAgIC8qIFNUTTMyTDAzMXh4ICB8fCBTVE0zMkwwNDF4eCAgfHwgU1RNMzJMMDExeHggIHx8ICBTVE0zMkwwMjF4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwMTB4QiAgfHwgU1RNMzJMMDEweDggIHx8IFNUTTMyTDAxMHg2ICB8fCAgU1RNMzJMMDEweDQgICAgICovCisKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBpbnRlcnJ1cHQgb24gUkNDIExTRSBDU1MgRVhUSSBMaW5lIDE5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX0lUKCkgICAgICBTRVRfQklUKEVYVEktPklNUiwgUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIGludGVycnVwdCBvbiBSQ0MgTFNFIENTUyBFWFRJIExpbmUgMTkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX0lUKCkgICAgIENMRUFSX0JJVChFWFRJLT5JTVIsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIGV2ZW50IG9uIFJDQyBMU0UgQ1NTIEVYVEkgTGluZSAxOS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfRVZFTlQoKSAgIFNFVF9CSVQoRVhUSS0+RU1SLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgZXZlbnQgb24gUkNDIExTRSBDU1MgRVhUSSBMaW5lIDE5LgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0RJU0FCTEVfRVZFTlQoKSAgQ0xFQVJfQklUKEVYVEktPkVNUiwgUkNDX0VYVElfTElORV9MU0VDU1MpCisKKworLyoqCisgICogQGJyaWVmICBSQ0MgTFNFIENTUyBFWFRJIGxpbmUgY29uZmlndXJhdGlvbjogc2V0IGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgU0VUX0JJVChFWFRJLT5GVFNSLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykKKworCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IEZhbGxpbmcgVHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICBDTEVBUl9CSVQoRVhUSS0+RlRTUiwgUkNDX0VYVElfTElORV9MU0VDU1MpCisKKworLyoqCisgICogQGJyaWVmICBSQ0MgTFNFIENTUyBFWFRJIGxpbmUgY29uZmlndXJhdGlvbjogc2V0IHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICBTRVRfQklUKEVYVEktPlJUU1IsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgQ0xFQVJfQklUKEVYVEktPlJUU1IsIFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAgKiBAYnJpZWYgIFJDQyBMU0UgQ1NTIEVYVEkgbGluZSBjb25maWd1cmF0aW9uOiBzZXQgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICAgXAorICAgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICAgXAorICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgICBcCisgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSQ0MgTFNFIENTUyBFWFRJIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHJldHZhbCBFWFRJIFJDQyBMU0UgQ1NTIExpbmUgU3RhdHVzLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfR0VUX0ZMQUcoKSAgICAgICAoRVhUSS0+UFIgJiAoUkNDX0VYVElfTElORV9MU0VDU1MpKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFJDQyBMU0UgQ1NTIEVYVEkgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9DTEVBUl9GTEFHKCkgICAgIChFWFRJLT5QUiA9IChSQ0NfRVhUSV9MSU5FX0xTRUNTUykpCisKKy8qKgorICAqIEBicmllZiBHZW5lcmF0ZSBhIFNvZnR3YXJlIGludGVycnVwdCBvbiBzZWxlY3RlZCBFWFRJIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfR0VORVJBVEVfU1dJVCgpICBTRVRfQklUKEVYVEktPlNXSUVSLCBSQ0NfRVhUSV9MSU5FX0xTRUNTUykKKworCisjaWYgZGVmaW5lZChMQ0QpCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfTENEX0NvbmZpZ3VyYXRpb24gTENEIENvbmZpZ3VyYXRpb24KKyAgKiBAYnJpZWYgIE1hY3JvcyB0byBjb25maWd1cmUgY2xvY2sgc291cmNlIG9mIExDRCBwZXJpcGhlcmFscy4KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIE1hY3JvIHRvIGNvbmZpZ3VyZXMgTENEIGNsb2NrIChMQ0RDTEspLgorICAqICBAbm90ZSAgIExDRCBhbmQgUlRDIHVzZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uCisgICogIEBub3RlICAgTENEIGNhbiBob3dldmVyIGJlIHVzZWQgaW4gdGhlIFN0b3AgbG93IHBvd2VyIG1vZGUgaWYgdGhlIExTRSBvciBMU0kgaXMgdXNlZCBhcyB0aGUKKyAgKiAgICAgICAgICBMQ0QgY2xvY2sgc291cmNlLgorICAqCisgICogIEBwYXJhbSAgX19MQ0RfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBMQ0QgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBMQ0QgY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9MU0kgTFNJIHNlbGVjdGVkIGFzIExDRCBjbG9jaworICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYyIEhTRSBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgTENEIGNsb2NrCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjQgSFNFIGRpdmlkZWQgYnkgNCBzZWxlY3RlZCBhcyBMQ0QgY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWOCBIU0UgZGl2aWRlZCBieSA4IHNlbGVjdGVkIGFzIExDRCBjbG9jaworICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYxNiBIU0UgZGl2aWRlZCBieSAxNiBzZWxlY3RlZCBhcyBMQ0QgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xDRF9DT05GSUcoX19MQ0RfQ0xLU09VUkNFX18pIF9fSEFMX1JDQ19SVENfQ09ORklHKF9fTENEX0NMS1NPVVJDRV9fKQorCisvKiogQGJyaWVmIE1hY3JvIHRvIGdldCB0aGUgTENEIGNsb2NrIHNvdXJjZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9MQ0RfU09VUkNFKCkgICAgICAgICAgICAgIF9fSEFMX1JDQ19HRVRfUlRDX1NPVVJDRSgpCisKKy8qKiBAYnJpZWYgTWFjcm8gdG8gZ2V0IHRoZSBMQ0QgY2xvY2sgcHJlLXNjYWxlci4KKyAgKi8KKyNkZWZpbmUgIF9fSEFMX1JDQ19HRVRfTENEX0hTRV9QUkVTQ0FMRVIoKSAgICAgIF9fSEFMX1JDQ19HRVRfUlRDX0hTRV9QUkVTQ0FMRVIoKQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogTENEICovCisKKy8qKiBAYnJpZWYgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBJMkMxIGNsb2NrIChJMkMxQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19JMkMxX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgSTJDMSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0NPTkZJRyhfX0kyQzFfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyQzFTRUwsICh1aW50MzJfdCkoX19JMkMxX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMkMxIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSTJDMV9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSTJDMVNFTCkpKQorCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfSTJDM1NFTCkKKy8qKiBAYnJpZWYgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBJMkMzIGNsb2NrIChJMkMzQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19JMkMzX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgSTJDMyBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0NPTkZJRyhfX0kyQzNfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyQzNTRUwsICh1aW50MzJfdCkoX19JMkMzX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMkMzIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSTJDM19TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSTJDM1NFTCkpKQorCisjZW5kaWYgLyogUkNDX0NDSVBSX0kyQzNTRUwgKi8KKworI2lmIGRlZmluZWQgKFJDQ19DQ0lQUl9VU0FSVDFTRUwpCisvKiogQGJyaWVmIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVVNBUlQxIGNsb2NrIChVU0FSVDFDTEspLgorICAqCisgICogQHBhcmFtICBfX1VTQVJUMV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyIFBDTEsyIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0UgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NPTkZJRyhfX1VTQVJUMV9DTEtTT1VSQ0VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVVNBUlQxU0VMLCAodWludDMyX3QpKF9fVVNBUlQxX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBVU0FSVDEgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9VU0FSVDFTRUwpKSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQxU0VMICovCisKKy8qKiBAYnJpZWYgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBVU0FSVDIgY2xvY2sgKFVTQVJUMkNMSykuCisgICoKKyAgKiBAcGFyYW0gIF9fVVNBUlQyX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzEgUENMSzEgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0kgSFNJIHNlbGVjdGVkIGFzIFVTQVJUMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX0xTRSBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfQ09ORklHKF9fVVNBUlQyX0NMS1NPVVJDRV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9VU0FSVDJTRUwsICh1aW50MzJfdCkoX19VU0FSVDJfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVTQVJUMiBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIFVTQVJUMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1VTQVJUMlNFTCkpKQorCisvKiogQGJyaWVmIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTFBVQVJUMSBjbG9jayAoTFBVQVJUMUNMSykuCisgICoKKyAgKiBAcGFyYW0gIF9fTFBVQVJUMV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIExQVUFSVDEgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzEgUENMSzEgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRSBMU0Ugc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DT05GSUcoX19MUFVBUlQxX0NMS1NPVVJDRV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9MUFVBUlQxU0VMLCAodWludDMyX3QpKF9fTFBVQVJUMV9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgTFBVQVJUMSBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzEgUENMSzEgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSBIU0kgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRSBMU0Ugc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0xQVUFSVDFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVUFSVDFTRUwpKSkKKworLyoqIEBicmllZiBNYWNybyB0byBjb25maWd1cmUgdGhlIExQVElNMSBjbG9jayAoTFBUSU0xQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19MUFRJTTFfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBMUFRJTTEgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSBQQ0xLMSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTSSAgSFNJICBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSAgTFNJICBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSAgTFNFICBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DT05GSUcoX19MUFRJTTFfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVElNMVNFTCwgKHVpbnQzMl90KShfX0xQVElNMV9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgTFBUSU0xIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxIFBDTEsxIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTSSAgSFNJIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9MUFRJTTFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVElNMVNFTCkpKQorCisjaWYgZGVmaW5lZChVU0IpCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVTQiBjbG9jayAoVVNCQ0xLKS4KKyAgKiBAcGFyYW0gIF9fVVNCX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVVNCIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQkNMS1NPVVJDRV9IU0k0OCAgSFNJNDggc2VsZWN0ZWQgYXMgVVNCIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQkNMS1NPVVJDRV9QTEwgUExMIENsb2NrIHNlbGVjdGVkIGFzIFVTQiBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0NPTkZJRyhfX1VTQl9DTEtTT1VSQ0VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSFNJNDhTRUwsICh1aW50MzJfdCkoX19VU0JfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFVTQiBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQkNMS1NPVVJDRV9IU0k0OCAgSFNJNDggc2VsZWN0ZWQgYXMgVVNCIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQkNMS1NPVVJDRV9QTEwgUExMIENsb2NrIHNlbGVjdGVkIGFzIFVTQiBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1VTQl9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSFNJNDhTRUwpKSkKKyNlbmRpZiAvKiBVU0IgKi8KKworI2lmIGRlZmluZWQoUk5HKQorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBSTkcgY2xvY2sgKFJOR0NMSykuCisgICogQHBhcmFtICBfX1JOR19DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFVTQiBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfSFNJNDggIEhTSTQ4IHNlbGVjdGVkIGFzIFJORyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfUExMQ0xLIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBSTkcgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JOR19DT05GSUcoX19STkdfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0hTSTQ4U0VMLCAodWludDMyX3QpKF9fUk5HX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBSTkcgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfSFNJNDggIEhTSTQ4IHNlbGVjdGVkIGFzIFJORyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfUExMQ0xLIFBMTCBDbG9jayBzZWxlY3RlZCBhcyBSTkcgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9STkdfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0hTSTQ4U0VMKSkpCisjZW5kaWYgLyogUk5HICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9IU0k0OFNFTCkKKy8qKiBAYnJpZWYgTWFjcm8gdG8gc2VsZWN0IHRoZSBIU0k0OE0gY2xvY2sgc291cmNlCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGNhbiBiZSByZXBsYWNlZCBieSBlaXRoZXIgX19IQUxfUkNDX1JOR19DT05GSUcgb3IKKyAgKiAgICAgICAgIF9fSEFMX1JDQ19VU0JfQ09ORklHIHRvIGNvbmZpZ3VyZSByZXNwZWN0aXZlbHkgUk5HIG9yIFVCUyBjbG9jayBzb3VyY2VzLgorICAqCisgICogQHBhcmFtICBfX0hTSTQ4TV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIEhTSTQ4TSBjbG9jayBzb3VyY2UgZGVkaWNhdGVkIGZvcgorICAqICAgICAgICAgIFVTQiBhbiBSTkcgcGVyaXBoZXJhbHMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFNJNDhNX1BMTCBBIGRlZGljYXRlZCA0OE1IWiBQTEwgb3V0cHV0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0k0OE1fSFNJNDggNDhNSFogaXNzdWVkIGZyb20gaW50ZXJuYWwgSFNJNDggb3NjaWxsYXRvci4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTSTQ4TV9DT05GSUcoX19IU0k0OE1fQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0hTSTQ4U0VMLCAodWludDMyX3QpKF9fSFNJNDhNX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBIU0k0OE0gY2xvY2sgc291cmNlLgorICAqIEBub3RlICAgVGhpcyBtYWNybyBjYW4gYmUgcmVwbGFjZWQgYnkgZWl0aGVyIF9fSEFMX1JDQ19HRVRfUk5HX1NPVVJDRSBvcgorICAqICAgICAgICAgX19IQUxfUkNDX0dFVF9VU0JfU09VUkNFIHRvIGdldCByZXNwZWN0aXZlbHkgUk5HIG9yIFVCUyBjbG9jayBzb3VyY2VzLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSTQ4TV9QTEwgQSBkZWRpY2F0ZWQgNDhNSFogUExMIG91dHB1dC4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFNJNDhNX0hTSTQ4IDQ4TUhaIGlzc3VlZCBmcm9tIGludGVybmFsIEhTSTQ4IG9zY2lsbGF0b3IuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSFNJNDhNX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9IU0k0OFNFTCkpKQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9IU0k0OFNFTCAqLworCisvKioKKyAgKiBAYnJpZWYgICAgTWFjcm8gdG8gZW5hYmxlIHRoZSBmb3JjZSBvZiB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpCisgICogICAgICAgICAgIGluIFNUT1AgbW9kZSB0byBiZSBxdWlja2x5IGF2YWlsYWJsZSBhcyBrZXJuZWwgY2xvY2sgZm9yIFVTQVJUIGFuZCBJMkMuCisgICogQG5vdGUgICAgIFRoZSBFbmFibGUgb2YgdGhpcyBmdW5jdGlvbiBoYXMgbm90IGVmZmVjdCBvbiB0aGUgSFNJT04gYml0LgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSFNJU1RPUF9FTkFCTEUoKSAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJS0VST04pCisKKy8qKgorICAqIEBicmllZiAgICBNYWNybyB0byBkaXNhYmxlIHRoZSBmb3JjZSBvZiB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpCisgICogICAgICAgICAgIGluIFNUT1AgbW9kZSB0byBiZSBxdWlja2x5IGF2YWlsYWJsZSBhcyBrZXJuZWwgY2xvY2sgZm9yIFVTQVJUIGFuZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lTVE9QX0RJU0FCTEUoKSBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSUtFUk9OKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZXMgdGhlIEV4dGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0UpIGRyaXZlIGNhcGFiaWxpdHkuCisgICogQHBhcmFtICBfX1JDQ19MU0VEUklWRV9fIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBMU0UgZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9MT1cgTFNFIG9zY2lsbGF0b3IgbG93IGRyaXZlIGNhcGFiaWxpdHkuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRURSSVZFX01FRElVTUxPVyBMU0Ugb3NjaWxsYXRvciBtZWRpdW0gbG93IGRyaXZlIGNhcGFiaWxpdHkuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRURSSVZFX01FRElVTUhJR0ggTFNFIG9zY2lsbGF0b3IgbWVkaXVtIGhpZ2ggZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFRFJJVkVfSElHSCBMU0Ugb3NjaWxsYXRvciBoaWdoIGRyaXZlIGNhcGFiaWxpdHkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VEUklWRV9DT05GSUcoX19SQ0NfTFNFRFJJVkVfXykgKE1PRElGWV9SRUcoUkNDLT5DU1IsXAorICAgICAgICBSQ0NfQ1NSX0xTRURSViwgKHVpbnQzMl90KShfX1JDQ19MU0VEUklWRV9fKSApKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZXMgdGhlIHdha2UgdXAgZnJvbSBzdG9wIGNsb2NrLgorICAqIEBwYXJhbSAgX19SQ0NfU1RPUFdVQ0xLX18gc3BlY2lmaWVzIHRoZSBjbG9jayBzb3VyY2UgdXNlZCBhZnRlciB3YWtlIHVwIGZyb20gc3RvcAorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIFJDQ19TVE9QX1dBS0VVUENMT0NLX01TSSAgICBNU0kgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQorICAqICAgICBAYXJnIEByZWYgUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfSFNJICAgIEhTSSBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19XQUtFVVBTVE9QX0NMS19DT05GSUcoX19SQ0NfU1RPUFdVQ0xLX18pIChNT0RJRllfUkVHKFJDQy0+Q0ZHUixcCisgICAgICAgIFJDQ19DRkdSX1NUT1BXVUNLLCAodWludDMyX3QpKF9fUkNDX1NUT1BXVUNMS19fKSApKQorCisjaWYgZGVmaW5lZChDUlMpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIHNwZWNpZmllZCBDUlMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBDUlMgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DT0sKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ1dBUk4KKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVJSCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX0VTWU5DCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRU5BQkxFX0lUKF9fSU5URVJSVVBUX18pICAgU0VUX0JJVChDUlMtPkNSLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIHNwZWNpZmllZCBDUlMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBDUlMgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ09LCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNXQVJOCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX0VSUgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FU1lOQworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0RJU0FCTEVfSVQoX19JTlRFUlJVUFRfXykgIENMRUFSX0JJVChDUlMtPkNSLChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgdGhlIENSUyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBDUlMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNPSworICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DV0FSTgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FUlIKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVNZTkMKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19HRVRfSVRfU09VUkNFKF9fSU5URVJSVVBUX18pICAgICAoKENSUy0+Q1IgJiAoX19JTlRFUlJVUFRfXykpPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIENSUyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzCisgICogICAgICAgICBiaXRzIHRvIGNsZWFyIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNPSworICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DV0FSTgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FUlIKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVNZTkMKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfVFJJTU9WRgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DRVJSCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNNSVNTCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xFQVJfSVQoX19JTlRFUlJVUFRfXykgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoX19JTlRFUlJVUFRfXykgJiBSQ0NfQ1JTX0lUX0VSUk9SX01BU0spICE9IDBVKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURV9SRUcoQ1JTLT5JQ1IsIENSU19JQ1JfRVJSQyB8ICgoX19JTlRFUlJVUFRfXykgJiB+UkNDX0NSU19JVF9FUlJPUl9NQVNLKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgKF9fSU5URVJSVVBUX18pKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBDUlMgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ09LCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4KKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19FUlIKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19FU1lOQworICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1RSSU1PVkYKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19TWU5DRVJSCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ01JU1MKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0dFVF9GTEFHKF9fRkxBR19fKSAgKChDUlMtPklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIHRoZSBDUlMgc3BlY2lmaWVkIEZMQUcuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNPSworICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNXQVJOCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfRVJSCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfRVNZTkMKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19UUklNT1ZGCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ0VSUgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNNSVNTCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoX19GTEFHX18pICYgUkNDX0NSU19GTEFHX0VSUk9SX01BU0spICE9IDBVKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURV9SRUcoQ1JTLT5JQ1IsIENSU19JQ1JfRVJSQyB8ICgoX19GTEFHX18pICYgflJDQ19DUlNfRkxBR19FUlJPUl9NQVNLKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgKF9fRkxBR19fKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIG9zY2lsbGF0b3IgY2xvY2sgZm9yIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyLgorICAqIEBub3RlICAgd2hlbiB0aGUgQ0VOIGJpdCBpcyBzZXQgdGhlIENSU19DRkdSIHJlZ2lzdGVyIGJlY29tZXMgd3JpdGUtcHJvdGVjdGVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0ZSRVFfRVJST1JfQ09VTlRFUl9FTkFCTEUoKSBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9DRU4pCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIG9zY2lsbGF0b3IgY2xvY2sgZm9yIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0ZSRVFfRVJST1JfQ09VTlRFUl9ESVNBQkxFKCkgIENMRUFSX0JJVChDUlMtPkNSLCBDUlNfQ1JfQ0VOKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIGF1dG9tYXRpYyBoYXJkd2FyZSBhZGp1c3RtZW50IG9mIFRSSU0gYml0cy4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIEFVVE9UUklNRU4gYml0IGlzIHNldCB0aGUgQ1JTX0NGR1IgcmVnaXN0ZXIgYmVjb21lcyB3cml0ZS1wcm90ZWN0ZWQuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQVVUT01BVElDX0NBTElCX0VOQUJMRSgpICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9BVVRPVFJJTUVOKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBoYXJkd2FyZSBhZGp1c3RtZW50IG9mIFRSSU0gYml0cy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19BVVRPTUFUSUNfQ0FMSUJfRElTQUJMRSgpICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0FVVE9UUklNRU4pCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY2FsY3VsYXRlIHJlbG9hZCB2YWx1ZSB0byBiZSBzZXQgaW4gQ1JTIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0YXJnZXQgYW5kIHN5bmMgZnJlcXVlbmNpZXMKKyAgKiBAbm90ZSAgIFRoZSBSRUxPQUQgdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkIGFjY29yZGluZyB0byB0aGUgcmF0aW8gYmV0d2VlbiB0aGUgdGFyZ2V0IGZyZXF1ZW5jeSBhbmQgdGhlIGZyZXF1ZW5jeQorICAqICAgICAgICAgICAgIG9mIHRoZSBzeW5jaHJvbml6YXRpb24gc291cmNlIGFmdGVyIHByZXNjYWxpbmcuIEl0IGlzIHRoZW4gZGVjcmVhc2VkIGJ5IG9uZSBpbiBvcmRlciB0bworICAqICAgICAgICAgICAgIHJlYWNoIHRoZSBleHBlY3RlZCBzeW5jaHJvbml6YXRpb24gb24gdGhlIHplcm8gdmFsdWUuIFRoZSBmb3JtdWxhIGlzIHRoZSBmb2xsb3dpbmc6CisgICogICAgICAgICAgICAgUkVMT0FEID0gKGZUQVJHRVQgLyBmU1lOQykgLTEKKyAgKiBAcGFyYW0gIF9fRlRBUkdFVF9fIFRhcmdldCBmcmVxdWVuY3kgKHZhbHVlIGluIEh6KQorICAqIEBwYXJhbSAgX19GU1lOQ19fICAgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcmVxdWVuY3kgKHZhbHVlIGluIEh6KQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX1JFTE9BRFZBTFVFX0NBTENVTEFURShfX0ZUQVJHRVRfXywgX19GU1lOQ19fKSAgKCgoX19GVEFSR0VUX18pIC8gKF9fRlNZTkNfXykpIC0gMSkKKworI2VuZGlmIC8qIENSUyAqLworCisKKyNpZiBkZWZpbmVkKFJDQ19DUl9IU0lPVVRFTikKKy8qKiBAYnJpZWYgIEVuYWJsZSBoZSBIU0kgT1VUIC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgSFNJIG91dHB1dCBpcyBub3QgYXZhaWxhYmxlCisgICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0hTSV9PVVRfRU5BQkxFKCkgICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPVVRFTikKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgSFNJIE9VVCAuCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIEhTSSBvdXRwdXQgaXMgbm90IGF2YWlsYWJsZQorICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lfT1VUX0RJU0FCTEUoKSAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPVVRFTikKKworI2VuZGlmIC8qIFJDQ19DUl9IU0lPVVRFTiAqLworCisjaWYgZGVmaW5lZChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZChTVE0zMkwwODN4eClcCisgICAgIHx8IGRlZmluZWQoU1RNMzJMMDUyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDYyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgZm9yIFVTQiAoSFNJNDgpLgorICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIEhTSTQ4LCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgc2hvdWxkIHdhaXQgb24KKyAgKiAgICAgICAgIEhTSTQ4UkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBIU0k0OCBjbG9jayBpcyBzdGFibGUgYW5kIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byBjbG9jayB0aGUgVVNCLgorICAqIEBub3RlICAgVGhlIEhTSTQ4IGlzIHN0b3BwZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSFNJNDhfRU5BQkxFKCkgIGRvIHsgU0VUX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhPTik7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFJDQ19BUEIyRU5SX1NZU0NGR0VOKTsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChTWVNDRkctPkNGR1IzLCBTWVNDRkdfQ0ZHUjNfRU5SRUZfSFNJNDgpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciBmb3IgVVNCIChIU0k0OCkuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0k0OF9ESVNBQkxFKCkgIGRvIHsgQ0xFQVJfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OE9OKTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTlJFRl9IU0k0OCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgSW50ZXJuYWwgNDhNaHogSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0k0OCkgc3RhdGUuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSTQ4X09OICBIU0k0OCBlbmFibGVkCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSTQ4X09GRiBIU0k0OCBkaXNhYmxlZAorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0hTSTQ4X1NUQVRFKCkgXAorICAgICAgICAgICAgICAgICAgKCgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OE9OKSkgIT0gMFUpID8gUkNDX0hTSTQ4X09OIDogUkNDX0hTSTQ4X09GRikKKworLyoqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEhTSTQ4TSBESVY2IE9VVCAuCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIEhTSTQ4TWh6IChkaXZpZGVkIGJ5IDYpIG91dHB1dCBpcyBub3QgYXZhaWxhYmxlCisgICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0hTSTQ4TV9ESVY2X09VVF9FTkFCTEUoKSAgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSUkNSX0hTSTQ4RElWNk9VVEVOKQorI2RlZmluZSBfX0hBTF9SQ0NfSFNJNDhNX0RJVjZfT1VUX0RJU0FCTEUoKSAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUlJDUl9IU0k0OERJVjZPVVRFTikKKworI2VuZGlmIC8qIFNUTTMyTDA3MXh4ICB8fCAgU1RNMzJMMDgxeHggIHx8ICovCisgICAgICAgLyogU1RNMzJMMDcyeHggIHx8ICBTVE0zMkwwODJ4eCAgfHwgKi8KKyAgICAgICAvKiBTVE0zMkwwNzN4eCAgfHwgIFNUTTMyTDA4M3h4ICAgICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgKlBlcmlwaENsa0luaXQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0dldFBlcmlwaENMS0NvbmZpZyhSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgICpQZXJpcGhDbGtJbml0KTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9SQ0NFeF9HZXRQZXJpcGhDTEtGcmVxKHVpbnQzMl90IFBlcmlwaENsayk7CisKKwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0VuYWJsZUxTRUNTUyh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9EaXNhYmxlTFNFQ1NTKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0VuYWJsZUxTRUNTU19JVCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9MU0VDU1NfSVJRSGFuZGxlcih2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9MU0VDU1NfQ2FsbGJhY2sodm9pZCk7CisKKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IzX0VOUkVGX0hTSTQ4KQordm9pZCBIQUxfUkNDRXhfRW5hYmxlSFNJNDhfVlJFRklOVCh2b2lkKTsKK3ZvaWQgSEFMX1JDQ0V4X0Rpc2FibGVIU0k0OF9WUkVGSU5UKHZvaWQpOworI2VuZGlmIC8qIFNZU0NGR19DRkdSM19FTlJFRl9IU0k0OCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChDUlMpCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0NSU0NvbmZpZyhSQ0NfQ1JTSW5pdFR5cGVEZWYgKnBJbml0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9DUlNTb2Z0d2FyZVN5bmNocm9uaXphdGlvbkdlbmVyYXRlKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0NSU0dldFN5bmNocm9uaXphdGlvbkluZm8oUkNDX0NSU1N5bmNocm9JbmZvVHlwZURlZiAqcFN5bmNocm9JbmZvKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9SQ0NFeF9DUlNXYWl0U3luY2hyb25pemF0aW9uKHVpbnQzMl90IFRpbWVvdXQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0NSU19JUlFIYW5kbGVyKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0NSU19TeW5jT2tDYWxsYmFjayh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9DUlNfU3luY1dhcm5DYWxsYmFjayh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9DUlNfRXhwZWN0ZWRTeW5jQ2FsbGJhY2sodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfQ1JTX0Vycm9yQ2FsbGJhY2sodWludDMyX3QgRXJyb3IpOworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQ1JTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfUkNDX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfcm5nLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9ybmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGI0N2QxCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfcm5nLmgKQEAgLTAsMCArMSwzNTMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3JuZy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBSTkcgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9IQUxfUk5HX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9STkdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChSTkcpCisKKy8qKiBAZGVmZ3JvdXAgUk5HIFJORworICAqIEBicmllZiBSTkcgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9UeXBlcyBSTkcgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9UeXBlc19Hcm91cDEgUk5HIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9UeXBlc19Hcm91cDIgUk5HIFN0YXRlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfUk5HX1NUQVRFX1JFU0VUICAgICA9IDB4MDBVLCAgLyohPCBSTkcgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAqLworICBIQUxfUk5HX1NUQVRFX1JFQURZICAgICA9IDB4MDFVLCAgLyohPCBSTkcgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAqLworICBIQUxfUk5HX1NUQVRFX0JVU1kgICAgICA9IDB4MDJVLCAgLyohPCBSTkcgaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAqLworICBIQUxfUk5HX1NUQVRFX1RJTUVPVVQgICA9IDB4MDNVLCAgLyohPCBSTkcgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworICBIQUxfUk5HX1NUQVRFX0VSUk9SICAgICA9IDB4MDRVICAgLyohPCBSTkcgZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLworCit9IEhBTF9STkdfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9UeXBlc19Hcm91cDMgUk5HIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdCAgX19STkdfSGFuZGxlVHlwZURlZgoreworICBSTkdfVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICovCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICBMb2NrOyAgICAgICAgIC8qITwgUk5HIGxvY2tpbmcgb2JqZWN0ICAgICAgKi8KKworICBfX0lPIEhBTF9STkdfU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgICAvKiE8IFJORyBjb21tdW5pY2F0aW9uIHN0YXRlICovCisKKyAgX19JTyAgdWludDMyX3QgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgIC8qITwgUk5HIEVycm9yIGNvZGUgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBSYW5kb21OdW1iZXI7IC8qITwgTGFzdCBHZW5lcmF0ZWQgUk5HIERhdGEgKi8KKworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBSZWFkeURhdGFDYWxsYmFjaykoc3RydWN0IF9fUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIHVpbnQzMl90IHJhbmRvbTMyYml0KTsgIC8qITwgUk5HIERhdGEgUmVhZHkgQ2FsbGJhY2sgICAgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19STkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUk5HIEVycm9yIENhbGxiYWNrICAgICAgICAgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSTkcgTXNwIEluaXQgY2FsbGJhY2sgICAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19STkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSTkcgTXNwIERlSW5pdCBjYWxsYmFjayAgICAqLworI2VuZGlmICAvKiBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworfSBSTkdfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFJORyBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1JOR19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDBVLCAgICAgLyohPCBSTkcgRXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAgKi8KKworICBIQUxfUk5HX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwMVUsICAgICAvKiE8IFJORyBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfUk5HX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwMlUgICAgICAvKiE8IFJORyBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAgICAqLworCit9IEhBTF9STkdfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFJORyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwUk5HX0NhbGxiYWNrVHlwZURlZikoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYSBjb21tb24gUk5HIGNhbGxiYWNrIGZ1bmN0aW9uICovCit0eXBlZGVmICB2b2lkICgqcFJOR19SZWFkeURhdGFDYWxsYmFja1R5cGVEZWYpKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCB1aW50MzJfdCByYW5kb20zMmJpdCk7ICAgLyohPCBwb2ludGVyIHRvIGFuIFJORyBEYXRhIFJlYWR5IHNwZWNpZmljIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX0NvbnN0YW50cyBSTkcgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfQ29uc3RhbnRzX0dyb3VwMSBSTkcgSW50ZXJydXB0IGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSTkdfSVRfRFJEWSAgUk5HX1NSX0RSRFkgIC8qITwgRGF0YSBSZWFkeSBpbnRlcnJ1cHQgICovCisjZGVmaW5lIFJOR19JVF9DRUkgICBSTkdfU1JfQ0VJUyAgLyohPCBDbG9jayBlcnJvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUk5HX0lUX1NFSSAgIFJOR19TUl9TRUlTICAvKiE8IFNlZWQgZXJyb3IgaW50ZXJydXB0ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfQ29uc3RhbnRzX0dyb3VwMiBSTkcgRmxhZyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUk5HX0ZMQUdfRFJEWSAgIFJOR19TUl9EUkRZICAvKiE8IERhdGEgcmVhZHkgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJOR19GTEFHX0NFQ1MgICBSTkdfU1JfQ0VDUyAgLyohPCBDbG9jayBlcnJvciBjdXJyZW50IHN0YXR1cyAqLworI2RlZmluZSBSTkdfRkxBR19TRUNTICAgUk5HX1NSX1NFQ1MgIC8qITwgU2VlZCBlcnJvciBjdXJyZW50IHN0YXR1cyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSTkdfRXJyb3JfRGVmaW5pdGlvbiAgIFJORyBFcnJvciBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIEhBTF9STkdfRVJST1JfTk9ORSAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICovCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSAgSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLIDB4MDAwMDAwMDFVICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyNkZWZpbmUgIEhBTF9STkdfRVJST1JfVElNRU9VVCAgICAgICAgICAweDAwMDAwMDAyVSAgICAvKiE8IFRpbWVvdXQgZXJyb3IgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9NYWNyb3MgUk5HIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgUmVzZXQgUk5HIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSTkcgSGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9STkdfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfUkVTRVQ7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1JOR19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX1JFU0VUKQorI2VuZGlmIC8qVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyB0aGUgUk5HIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJORyBIYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUk5HX0VOQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIFJOR19DUl9STkdFTikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyB0aGUgUk5HIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJORyBIYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUk5HX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH5STkdfQ1JfUk5HRU4pCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgdGhlIHNlbGVjdGVkIFJORyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gUk5HIEhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gUk5HIGZsYWcKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSTkdfRkxBR19EUkRZOiAgRGF0YSByZWFkeQorICAqICAgICAgICAgICAgQGFyZyBSTkdfRkxBR19DRUNTOiAgQ2xvY2sgZXJyb3IgY3VycmVudCBzdGF0dXMKKyAgKiAgICAgICAgICAgIEBhcmcgUk5HX0ZMQUdfU0VDUzogIFNlZWQgZXJyb3IgY3VycmVudCBzdGF0dXMKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1JOR19HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIHRoZSBzZWxlY3RlZCBSTkcgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJORyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fIFJORyBmbGFnIHRvIGNsZWFyCisgICogQG5vdGUgICBXQVJOSU5HOiBUaGlzIGlzIGEgZHVtbXkgbWFjcm8gZm9yIEhBTCBjb2RlIGFsaWdubWVudCwKKyAgKiAgICAgICAgIGZsYWdzIFJOR19GTEFHX0RSRFksIFJOR19GTEFHX0NFQ1MgYW5kIFJOR19GTEFHX1NFQ1MgYXJlIHJlYWQtb25seS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUk5HX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgIC8qIGR1bW15ICBtYWNybyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIFJORyBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSTkcgSGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JOR19FTkFCTEVfSVQoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBSTkdfQ1JfSUUpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIFJORyBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSTkcgSGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JOR19ESVNBQkxFX0lUKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+Uk5HX0NSX0lFKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUk5HIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSTkcgSGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUk5HIGludGVycnVwdCBzdGF0dXMgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJOR19JVF9EUkRZOiBEYXRhIHJlYWR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBSTkdfSVRfQ0VJOiBDbG9jayBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUk5HX0lUX1NFSTogU2VlZCBlcnJvciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUk5HX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIFJORyBpbnRlcnJ1cHQgc3RhdHVzIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSTkcgSGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUk5HIGludGVycnVwdCBzdGF0dXMgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSTkdfSVRfQ0VJOiBDbG9jayBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUk5HX0lUX1NFSTogU2VlZCBlcnJvciBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIFJOR19JVF9EUkRZIGZsYWcgaXMgcmVhZC1vbmx5LCByZWFkaW5nIFJOR19EUiByZWdpc3RlciBhdXRvbWF0aWNhbGx5IGNsZWFycyBSTkdfSVRfRFJEWS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUk5HX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IpID0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9ucyBSTkcgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19Jbml0KFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfRGVJbml0KFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKK3ZvaWQgSEFMX1JOR19Nc3BJbml0KFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKK3ZvaWQgSEFMX1JOR19Nc3BEZUluaXQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOworCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfUmVnaXN0ZXJDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgSEFMX1JOR19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwUk5HX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19VblJlZ2lzdGVyQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIEhBTF9STkdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfUmVnaXN0ZXJSZWFkeURhdGFDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgcFJOR19SZWFkeURhdGFDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfVW5SZWdpc3RlclJlYWR5RGF0YUNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3VpbnQzMl90IEhBTF9STkdfR2V0UmFuZG9tTnVtYmVyKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsgICAgLyogT2Jzb2xldGUsIHVzZSBIQUxfUk5HX0dlbmVyYXRlUmFuZG9tTnVtYmVyKCkgaW5zdGVhZCAgICAqLwordWludDMyX3QgSEFMX1JOR19HZXRSYW5kb21OdW1iZXJfSVQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOyAvKiBPYnNvbGV0ZSwgdXNlIEhBTF9STkdfR2VuZXJhdGVSYW5kb21OdW1iZXJfSVQoKSBpbnN0ZWFkICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX0dlbmVyYXRlUmFuZG9tTnVtYmVyKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCB1aW50MzJfdCAqcmFuZG9tMzJiaXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19HZW5lcmF0ZVJhbmRvbU51bWJlcl9JVChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7Cit1aW50MzJfdCBIQUxfUk5HX1JlYWRMYXN0UmFuZG9tTnVtYmVyKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKKwordm9pZCBIQUxfUk5HX0lSUUhhbmRsZXIoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOwordm9pZCBIQUxfUk5HX0Vycm9yQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOwordm9pZCBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCB1aW50MzJfdCByYW5kb20zMmJpdCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX1JOR19TdGF0ZVR5cGVEZWYgSEFMX1JOR19HZXRTdGF0ZShSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfUk5HX0dldEVycm9yKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19Qcml2YXRlX01hY3JvcyBSTkcgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19STkdfSVQoSVQpICgoKElUKSA9PSBSTkdfSVRfQ0VJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IFJOR19JVF9TRUkpKQorCisjZGVmaW5lIElTX1JOR19GTEFHKEZMQUcpICgoKEZMQUcpID09IFJOR19GTEFHX0RSRFkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFJOR19GTEFHX0NFQ1MpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFJOR19GTEFHX1NFQ1MpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisjZW5kaWYgLyogUk5HICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfUk5HX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX3J0Yy5oIGIvSW5jL3N0bTMybDB4eF9oYWxfcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkYTU5YwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX3J0Yy5oCkBAIC0wLDAgKzEsOTQyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9ydGMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUlRDIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0hBTF9SVENfSAorI2RlZmluZSBTVE0zMkwweHhfSEFMX1JUQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQyBSVEMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfVHlwZXMgUlRDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIQUwgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1JUQ19TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgLyohPCBSVEMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAqLworICBIQUxfUlRDX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAvKiE8IFJUQyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICovCisgIEhBTF9SVENfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgIC8qITwgUlRDIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8KKyAgSEFMX1JUQ19TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4MDNVLCAgLyohPCBSVEMgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworICBIQUxfUlRDX1NUQVRFX0VSUk9SICAgICAgICAgICAgID0gMHgwNFUgICAvKiE8IFJUQyBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICovCisKK30gSEFMX1JUQ1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSVEMgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgSG91ckZvcm1hdDsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEhvdXIgRm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfSG91cl9Gb3JtYXRzICovCisKKyAgdWludDMyX3QgQXN5bmNoUHJlZGl2OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFzeW5jaHJvbm91cyBQcmVkaXZpZGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDdGICovCisKKyAgdWludDMyX3QgU3luY2hQcmVkaXY7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFN5bmNocm9ub3VzIFByZWRpdmlkZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4N0ZGRiAqLworCisgIHVpbnQzMl90IE91dFB1dDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hpY2ggc2lnbmFsIHdpbGwgYmUgcm91dGVkIHRvIHRoZSBSVEMgb3V0cHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENFeF9PdXRwdXRfc2VsZWN0aW9uX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgT3V0UHV0UmVtYXA7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSByZW1hcCBmb3IgUlRDIG91dHB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgIFJUQ19PdXRwdXRfQUxBUk1fT1VUX1JlbWFwICovCisKKyAgdWludDMyX3QgT3V0UHV0UG9sYXJpdHk7ICAvKiE8IFNwZWNpZmllcyB0aGUgcG9sYXJpdHkgb2YgdGhlIG91dHB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19PdXRwdXRfUG9sYXJpdHlfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBPdXRQdXRUeXBlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgT3V0cHV0IFBpbiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfT3V0cHV0X1R5cGVfQUxBUk1fT1VUICovCit9IFJUQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSVEMgVGltZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCBIb3VyczsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgSG91ci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTIgaWYgdGhlIFJUQ19Ib3VyRm9ybWF0XzEyIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyMyBpZiB0aGUgUlRDX0hvdXJGb3JtYXRfMjQgaXMgc2VsZWN0ZWQgKi8KKworICB1aW50OF90IE1pbnV0ZXM7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgVGltZSBNaW51dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA1OSAqLworCisgIHVpbnQ4X3QgU2Vjb25kczsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lIFNlY29uZHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDU5ICovCisKKyAgdWludDhfdCBUaW1lRm9ybWF0OyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFNL1BNIFRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19BTV9QTV9EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IFN1YlNlY29uZHM7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDX1NTUiBSVEMgU3ViIFNlY29uZCByZWdpc3RlciBjb250ZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY29ycmVzcG9uZHMgdG8gYSB0aW1lIHVuaXQgcmFuZ2UgYmV0d2VlbiBbMC0xXSBTZWNvbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggWzEgU2VjIC8gU2Vjb25kRnJhY3Rpb24gKzFdIGdyYW51bGFyaXR5ICovCisKKyAgdWludDMyX3QgU2Vjb25kRnJhY3Rpb247ICAvKiE8IFNwZWNpZmllcyB0aGUgcmFuZ2Ugb3IgZ3JhbnVsYXJpdHkgb2YgU3ViIFNlY29uZCByZWdpc3RlciBjb250ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIFN5bmNocm9ub3VzIHByZS1zY2FsZXIgZmFjdG9yIHZhbHVlIChQUkVESVZfUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNvcnJlc3BvbmRzIHRvIGEgdGltZSB1bml0IHJhbmdlIGJldHdlZW4gWzAtMV0gU2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFsxIFNlYyAvIFNlY29uZEZyYWN0aW9uICsxXSBncmFudWxhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgd2lsbCBiZSB1c2VkIG9ubHkgYnkgSEFMX1JUQ19HZXRUaW1lIGZ1bmN0aW9uICovCisKKyAgdWludDMyX3QgRGF5TGlnaHRTYXZpbmc7ICAvKiE8IFNwZWNpZmllcyBSVENfRGF5TGlnaHRTYXZlT3BlcmF0aW9uOiB0aGUgdmFsdWUgb2YgaG91ciBhZGp1c3RtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfRGF5TGlnaHRTYXZpbmdfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBTdG9yZU9wZXJhdGlvbjsgIC8qITwgU3BlY2lmaWVzIFJUQ19TdG9yZU9wZXJhdGlvbiB2YWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSBCQ0sgYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBDUiByZWdpc3RlciB0byBzdG9yZSB0aGUgb3BlcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfU3RvcmVPcGVyYXRpb25fRGVmaW5pdGlvbnMgKi8KK30gUlRDX1RpbWVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFJUQyBEYXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OF90IFdlZWtEYXk7ICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIERhdGUgV2Vla0RheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19XZWVrRGF5X0RlZmluaXRpb25zICovCisKKyAgdWludDhfdCBNb250aDsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIE1vbnRoIChpbiBCQ0QgZm9ybWF0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19Nb250aF9EYXRlX0RlZmluaXRpb25zICovCisKKyAgdWludDhfdCBEYXRlOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzEgKi8KKworICB1aW50OF90IFllYXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIERhdGUgWWVhci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDk5ICovCisKK30gUlRDX0RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFJUQyBBbGFybSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgUlRDX1RpbWVUeXBlRGVmIEFsYXJtVGltZTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gVGltZSBtZW1iZXJzICovCisKKyAgdWludDMyX3QgQWxhcm1NYXNrOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gTWFza3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0FsYXJtTWFza19EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IEFsYXJtU3ViU2Vjb25kTWFzazsgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIFN1YlNlY29uZHMgTWFza3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0FsYXJtX1N1Yl9TZWNvbmRzX01hc2tzX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgQWxhcm1EYXRlV2Vla0RheVNlbDsgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gaXMgb24gRGF0ZSBvciBXZWVrRGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0FsYXJtRGF0ZVdlZWtEYXlfRGVmaW5pdGlvbnMgKi8KKworICB1aW50OF90IEFsYXJtRGF0ZVdlZWtEYXk7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBEYXRlL1dlZWtEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBBbGFybSBEYXRlIGlzIHNlbGVjdGVkLCB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIHNldCB0byBhIHZhbHVlIGluIHRoZSAxLTMxIHJhbmdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgQWxhcm0gV2Vla0RheSBpcyBzZWxlY3RlZCwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfV2Vla0RheV9EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IEFsYXJtOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWxhcm0gLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19BbGFybXNfRGVmaW5pdGlvbnMgKi8KK30gUlRDX0FsYXJtVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSVEMgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYKK3sKKyAgUlRDX1R5cGVEZWYgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAqLworCisgIFJUQ19Jbml0VHlwZURlZiAgICAgICAgICAgSW5pdDsgICAgICAgLyohPCBSVEMgcmVxdWlyZWQgcGFyYW1ldGVycyAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgIExvY2s7ICAgICAgIC8qITwgUlRDIGxvY2tpbmcgb2JqZWN0ICAgICAgICovCisKKyAgX19JTyBIQUxfUlRDU3RhdGVUeXBlRGVmICBTdGF0ZTsgICAgICAvKiE8IFRpbWUgY29tbXVuaWNhdGlvbiBzdGF0ZSAqLworCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIEFsYXJtQUV2ZW50Q2FsbGJhY2spKHN0cnVjdCBfX1JUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsgICAgICAgICAgIC8qITwgUlRDIEFsYXJtIEEgRXZlbnQgY2FsbGJhY2sgICAgICAgICAqLworCisgIHZvaWQgKCogQWxhcm1CRXZlbnRDYWxsYmFjaykoc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOyAgICAgICAgICAgLyohPCBSVEMgQWxhcm0gQiBFdmVudCBjYWxsYmFjayAgICAgICAgICovCisKKyAgdm9pZCAoKiBUaW1lU3RhbXBFdmVudENhbGxiYWNrKShzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7ICAgICAgICAvKiE8IFJUQyBUaW1lU3RhbXAgRXZlbnQgY2FsbGJhY2sgICAgICAgKi8KKworICB2b2lkICgqIFdha2VVcFRpbWVyRXZlbnRDYWxsYmFjaykoc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOyAgICAgIC8qITwgUlRDIFdha2VVcFRpbWVyIEV2ZW50IGNhbGxiYWNrICAgICAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorICB2b2lkICgqIFRhbXBlcjFFdmVudENhbGxiYWNrKShzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7ICAgICAgICAgIC8qITwgUlRDIFRhbXBlciAxIEV2ZW50IGNhbGxiYWNrICAgICAgICAqLworI2VuZGlmCisKKyAgdm9pZCAoKiBUYW1wZXIyRXZlbnRDYWxsYmFjaykoc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOyAgICAgICAgICAvKiE8IFJUQyBUYW1wZXIgMiBFdmVudCBjYWxsYmFjayAgICAgICAgKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyAgdm9pZCAoKiBUYW1wZXIzRXZlbnRDYWxsYmFjaykoc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOyAgICAgICAgICAvKiE8IFJUQyBUYW1wZXIgMyBFdmVudCBjYWxsYmFjayAgICAgICAgKi8KKyNlbmRpZgorCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7ICAgICAgICAgICAgICAgLyohPCBSVEMgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOyAgICAgICAgICAgICAvKiE8IFJUQyBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgKi8KKworI2VuZGlmIC8qIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MpICovCisKK30gUlRDX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBMUFRJTSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1JUQ19BTEFSTV9BX0VWRU5UX0NCX0lEICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFJUQyBBbGFybSBBIEV2ZW50IENhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX1JUQ19BTEFSTV9CX0VWRU5UX0NCX0lEICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFJUQyBBbGFybSBCIEV2ZW50IENhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX1JUQ19USU1FU1RBTVBfRVZFTlRfQ0JfSUQgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IFJUQyBUaW1lU3RhbXAgRXZlbnQgQ2FsbGJhY2sgSUQgICAgKi8KKyAgSEFMX1JUQ19XQUtFVVBUSU1FUl9FVkVOVF9DQl9JRCAgICAgICA9IDB4MDNVLCAgICAvKiE8IFJUQyBXYWtlVXAgVGltZXIgRXZlbnQgQ2FsbGJhY2sgSUQgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisgIEhBTF9SVENfVEFNUEVSMV9FVkVOVF9DQl9JRCAgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBSVEMgVGFtcGVyIDEgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisjZW5kaWYKKyAgSEFMX1JUQ19UQU1QRVIyX0VWRU5UX0NCX0lEICAgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IFJUQyBUYW1wZXIgMiBDYWxsYmFjayBJRCAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisgIEhBTF9SVENfVEFNUEVSM19FVkVOVF9DQl9JRCAgICAgICAgICAgPSAweDA2VSwgICAgLyohPCBSVEMgVGFtcGVyIDMgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisjZW5kaWYKKyAgSEFMX1JUQ19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MEVVLCAgICAvKiE8IFJUQyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgKi8KKyAgSEFMX1JUQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MEZVICAgICAvKiE8IFJUQyBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgKi8KK30gSEFMX1JUQ19DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgUlRDIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBSVENfQ2FsbGJhY2tUeXBlRGVmKShSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7ICAvKiE8IHBvaW50ZXIgdG8gYW4gUlRDIGNhbGxiYWNrIGZ1bmN0aW9uICovCisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9Db25zdGFudHMgUlRDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0hvdXJfRm9ybWF0cyBSVEMgSG91ciBGb3JtYXRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0hPVVJGT1JNQVRfMjQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19IT1VSRk9STUFUXzEyICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9GTVQpCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSVENfT3V0cHV0X1BvbGFyaXR5X0RlZmluaXRpb25zIFJUQyBPdXRwdXQgUG9sYXJpdHkgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfT1VUUFVUX1BPTEFSSVRZX0hJR0ggICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX09VVFBVVF9QT0xBUklUWV9MT1cgICAgICAgICgodWludDMyX3QpUlRDX0NSX1BPTCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfT3V0cHV0X1R5cGVfQUxBUk1fT1VUIFJUQyBPdXRwdXQgVHlwZSBBTEFSTSBPVVQKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX09VVFBVVF9UWVBFX1BVU0hQVUxMICAgICAgICgodWludDMyX3QpUlRDX09SX0FMQVJNT1VUVFlQRSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfT3V0cHV0X0FMQVJNX09VVF9SZW1hcCBSVEMgT3V0cHV0IEFMQVJNIE9VVCBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19PVVRQVVRfUkVNQVBfTk9ORSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QT1MxICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfT1JfT1VUX1JNUCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0FNX1BNX0RlZmluaXRpb25zIFJUQyBBTSBQTSBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19IT1VSRk9STUFUMTJfQU0gICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpCisjZGVmaW5lIFJUQ19IT1VSRk9STUFUMTJfUE0gICAgICAgICAgICAoKHVpbnQ4X3QpMHg0MFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0RheUxpZ2h0U2F2aW5nX0RlZmluaXRpb25zIFJUQyBEYXlMaWdodFNhdmluZyBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19EQVlMSUdIVFNBVklOR19TVUIxSCAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9TVUIxSCkKKyNkZWZpbmUgUlRDX0RBWUxJR0hUU0FWSU5HX0FERDFIICAgICAgICgodWludDMyX3QpUlRDX0NSX0FERDFIKQorI2RlZmluZSBSVENfREFZTElHSFRTQVZJTkdfTk9ORSAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfU3RvcmVPcGVyYXRpb25fRGVmaW5pdGlvbnMgUlRDIFN0b3JlT3BlcmF0aW9uIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1NUT1JFT1BFUkFUSU9OX1JFU0VUICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBSVENfU1RPUkVPUEVSQVRJT05fU0VUICAgICAgICAgICgodWludDMyX3QpUlRDX0NSX0JLUCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfSW5wdXRfcGFyYW1ldGVyX2Zvcm1hdF9kZWZpbml0aW9ucyBSVEMgSW5wdXQgUGFyYW1ldGVyIEZvcm1hdCBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19GT1JNQVRfQklOICAgKCh1aW50MzJfdCkweDAwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19GT1JNQVRfQkNEICAgKCh1aW50MzJfdCkweDAwMDAwMDAwMVUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX01vbnRoX0RhdGVfRGVmaW5pdGlvbnMgUlRDIE1vbnRoIERhdGUgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworCisvKiBDb2RlZCBpbiBCQ0QgZm9ybWF0ICovCisjZGVmaW5lIFJUQ19NT05USF9KQU5VQVJZICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lIFJUQ19NT05USF9GRUJSVUFSWSAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpCisjZGVmaW5lIFJUQ19NT05USF9NQVJDSCAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpCisjZGVmaW5lIFJUQ19NT05USF9BUFJJTCAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpCisjZGVmaW5lIFJUQ19NT05USF9NQVkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpCisjZGVmaW5lIFJUQ19NT05USF9KVU5FICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpCisjZGVmaW5lIFJUQ19NT05USF9KVUxZICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpCisjZGVmaW5lIFJUQ19NT05USF9BVUdVU1QgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpCisjZGVmaW5lIFJUQ19NT05USF9TRVBURU1CRVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpCisjZGVmaW5lIFJUQ19NT05USF9PQ1RPQkVSICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMFUpCisjZGVmaW5lIFJUQ19NT05USF9OT1ZFTUJFUiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMVUpCisjZGVmaW5lIFJUQ19NT05USF9ERUNFTUJFUiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMlUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX1dlZWtEYXlfRGVmaW5pdGlvbnMgUlRDIFdlZWtEYXkgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfV0VFS0RBWV9NT05EQVkgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSBSVENfV0VFS0RBWV9UVUVTREFZICAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKQorI2RlZmluZSBSVENfV0VFS0RBWV9XRURORVNEQVkgICAgICAgICAgKCh1aW50OF90KTB4MDNVKQorI2RlZmluZSBSVENfV0VFS0RBWV9USFVSU0RBWSAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKQorI2RlZmluZSBSVENfV0VFS0RBWV9GUklEQVkgICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKQorI2RlZmluZSBSVENfV0VFS0RBWV9TQVRVUkRBWSAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKQorI2RlZmluZSBSVENfV0VFS0RBWV9TVU5EQVkgICAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19BbGFybURhdGVXZWVrRGF5X0RlZmluaXRpb25zIFJUQyBBbGFybURhdGVXZWVrRGF5IERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNREFURVdFRUtEQVlTRUxfREFURSAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX1dFRUtEQVkgICBSVENfQUxSTUFSX1dEU0VMCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0FsYXJtTWFza19EZWZpbml0aW9ucyBSVEMgQWxhcm1NYXNrIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNTUFTS19OT05FICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfREFURVdFRUtEQVkgICAgICAgUlRDX0FMUk1BUl9NU0s0CisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfSE9VUlMgICAgICAgICAgICAgUlRDX0FMUk1BUl9NU0szCisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfTUlOVVRFUyAgICAgICAgICAgUlRDX0FMUk1BUl9NU0syCisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfU0VDT05EUyAgICAgICAgICAgUlRDX0FMUk1BUl9NU0sxCisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfQUxMICAgICAgICAgICAgICAgKCh1aW50MzJfdCkgKFJUQ19BTEFSTU1BU0tfTk9ORSAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19BTEFSTU1BU0tfREFURVdFRUtEQVkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19BTEFSTU1BU0tfSE9VUlMgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19BTEFSTU1BU0tfTUlOVVRFUyAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19BTEFSTU1BU0tfU0VDT05EUykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0FsYXJtc19EZWZpbml0aW9ucyBSVEMgQWxhcm1zIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNX0EgICAgICAgICAgICAgICAgICAgICAgIFJUQ19DUl9BTFJBRQorI2RlZmluZSBSVENfQUxBUk1fQiAgICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX0FMUkJFCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSVENfQWxhcm1fU3ViX1NlY29uZHNfTWFza3NfRGVmaW5pdGlvbnMgUlRDIEFsYXJtIFN1YiBTZWNvbmRzIE1hc2tzIERlZmluaXRpb25zCisqIEB7CisqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX0FMTCAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQWxsIEFsYXJtIFNTIGZpZWxkcyBhcmUgbWFza2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gY29tcGFyaXNvbiBvbiBzdWIgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEFsYXJtICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xICAgICAgUlRDX0FMUk1BU1NSX01BU0tTU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNTWzE0OjFdIGFyZSBkb24ndCBjYXJlIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzBdIGlzIGNvbXBhcmVkLiAgICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMiAgICAgIFJUQ19BTFJNQVNTUl9NQVNLU1NfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDoyXSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbMTowXSBhcmUgY29tcGFyZWQgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8zICAgICAgKCh1aW50MzJfdCkgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMCB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNTWzE0OjNdIGFyZSBkb24ndCBjYXJlIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1syOjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzQgICAgICBSVENfQUxSTUFTU1JfTUFTS1NTXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6NF0gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzM6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNSAgICAgICgodWludDMyX3QpIChSVENfQUxSTUFTU1JfTUFTS1NTXzAgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDo1XSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzQ6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNiAgICAgICgodWludDMyX3QpIChSVENfQUxSTUFTU1JfTUFTS1NTXzEgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDo2XSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzU6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNyAgICAgICgodWludDMyX3QpIChSVENfQUxSTUFTU1JfTUFTS1NTXzAgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzEgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzIpKSAgLyohPCBTU1sxNDo3XSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzY6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfOCAgICAgIFJUQ19BTFJNQVNTUl9NQVNLU1NfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDo4XSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzc6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfOSAgICAgICgodWludDMyX3QpIChSVENfQUxSTUFTU1JfTUFTS1NTXzAgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzMpKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDo5XSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzg6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTAgICAgICgodWludDMyX3QpIChSVENfQUxSTUFTU1JfTUFTS1NTXzEgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzMpKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDoxMF0gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s5OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzExICAgICAoKHVpbnQzMl90KSAoUlRDX0FMUk1BU1NSX01BU0tTU18wIHwgUlRDX0FMUk1BU1NSX01BU0tTU18xIHwgUlRDX0FMUk1BU1NSX01BU0tTU18zKSkgIC8qITwgU1NbMTQ6MTFdIGFyZSBkb24ndCBjYXJlIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbMTA6MF0gYXJlIGNvbXBhcmVkICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMiAgICAgKCh1aW50MzJfdCkgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMiB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMykpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNTWzE0OjEyXSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLk9ubHkgU1NbMTE6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTMgICAgICgodWludDMyX3QpIChSVENfQUxSTUFTU1JfTUFTS1NTXzAgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzIgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzMpKSAgLyohPCBTU1sxNDoxM10gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1sxMjowXSBhcmUgY29tcGFyZWQgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0ICAgICAgICAoKHVpbnQzMl90KSAoUlRDX0FMUk1BU1NSX01BU0tTU18xIHwgUlRDX0FMUk1BU1NSX01BU0tTU18yIHwgUlRDX0FMUk1BU1NSX01BU0tTU18zKSkgIC8qITwgU1NbMTRdIGlzIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi5Pbmx5IFNTWzEzOjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19OT05FICAgICAgICBSVENfQUxSTUFTU1JfTUFTS1NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6MF0gYXJlIGNvbXBhcmVkIGFuZCBtdXN0IG1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFjdGl2YXRlIGFsYXJtLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfSW50ZXJydXB0c19EZWZpbml0aW9ucyBSVEMgSW50ZXJydXB0cyBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19JVF9UUyAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9UU0lFKSAgICAgICAgLyohPCBFbmFibGUgVGltZXN0YW1wIEludGVycnVwdCAgICAqLworI2RlZmluZSBSVENfSVRfV1VUICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQ1JfV1VUSUUpICAgICAgIC8qITwgRW5hYmxlIFdha2V1cCB0aW1lciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUlRDX0lUX0FMUkEgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0NSX0FMUkFJRSkgICAgICAvKiE8IEVuYWJsZSBBbGFybSBBIEludGVycnVwdCAgICAgICovCisjZGVmaW5lIFJUQ19JVF9BTFJCICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9BTFJCSUUpICAgICAgLyohPCBFbmFibGUgQWxhcm0gQiBJbnRlcnJ1cHQgICAgICAqLworI2RlZmluZSBSVENfSVRfVEFNUCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfVEFNUENSX1RBTVBJRSkgIC8qITwgRW5hYmxlIGFsbCBUYW1wZXIgSW50ZXJydXB0ICAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19JVF9UQU1QMSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDFJRSkgLyohPCBFbmFibGUgVGFtcGVyIDEgSW50ZXJydXB0ICAgICAqLworI2VuZGlmCisjZGVmaW5lIFJUQ19JVF9UQU1QMiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDJJRSkgLyohPCBFbmFibGUgVGFtcGVyIDIgSW50ZXJydXB0ICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19GbGFnc19EZWZpbml0aW9ucyBSVEMgRmxhZ3MgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfRkxBR19SRUNBTFBGICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX1JFQ0FMUEYpCisjZGVmaW5lIFJUQ19GTEFHX1RBTVAyRiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfVEFNUDJGKQorI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyNkZWZpbmUgUlRDX0ZMQUdfVEFNUDFGICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0lTUl9UQU1QMUYpCisjZW5kaWYKKyNkZWZpbmUgUlRDX0ZMQUdfVFNPVkYgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0lTUl9UU09WRikKKyNkZWZpbmUgUlRDX0ZMQUdfVFNGICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0lTUl9UU0YpCisjaWYgZGVmaW5lZChSVENfSVNSX0lUU0YpCisjZGVmaW5lIFJUQ19GTEFHX0lUU0YgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfSVRTRikKKyNlbmRpZgorI2RlZmluZSBSVENfRkxBR19XVVRGICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX1dVVEYpCisjZGVmaW5lIFJUQ19GTEFHX0FMUkJGICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfQUxSQkYpCisjZGVmaW5lIFJUQ19GTEFHX0FMUkFGICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfQUxSQUYpCisjZGVmaW5lIFJUQ19GTEFHX0lOSVRGICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfSU5JVEYpCisjZGVmaW5lIFJUQ19GTEFHX1JTRiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfUlNGKQorI2RlZmluZSBSVENfRkxBR19JTklUUyAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX0lOSVRTKQorI2RlZmluZSBSVENfRkxBR19TSFBGICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX1NIUEYpCisjZGVmaW5lIFJUQ19GTEFHX1dVVFdGICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfV1VUV0YpCisjZGVmaW5lIFJUQ19GTEFHX0FMUkJXRiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfQUxSQldGKQorI2RlZmluZSBSVENfRkxBR19BTFJBV0YgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX0FMUkFXRikKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9NYWNyb3MgUlRDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgUmVzZXQgUlRDIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfUlRDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkb3tcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRVNFVDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1JUQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFU0VUKQorI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5XUFIgPSAweENBVTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+V1BSID0gMHg1M1U7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPldQUiA9IDB4RkZVOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBBTEFSTUEgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfQUxSQUUpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBBTEFSTUEgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1BX0RJU0FCTEUoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KFJUQ19DUl9BTFJBRSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgQUxBUk1CIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNQl9FTkFCTEUoX19IQU5ETEVfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9BTFJCRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIEFMQVJNQiBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTUJfRElTQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oUlRDX0NSX0FMUkJFKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBBbGFybSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0lUX0FMUkE6IEFsYXJtIEEgaW50ZXJydXB0CisgICogICAgICAgICAgICAgQGFyZyBSVENfSVRfQUxSQjogQWxhcm0gQiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIEFsYXJtIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX0FMUkE6IEFsYXJtIEEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9BTFJCOiBBbGFybSBCIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIEFsYXJtIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGludGVycnVwdCBzb3VyY2VzIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfQUxSQTogQWxhcm0gQSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX0FMUkI6IEFsYXJtIEIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpJiAoKF9fSU5URVJSVVBUX18pPj4gNFUpKSAhPSAwVSk/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBBbGFybSBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gaW50ZXJydXB0IHNvdXJjZXMgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9BTFJBOiBBbGFybSBBIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfQUxSQjogQWxhcm0gQiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJiAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBSVEMgQWxhcm0ncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gRmxhZyBzb3VyY2VzIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19BTFJBRgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19BTFJCRgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19BTFJBV0YKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfQUxSQldGCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIChfX0ZMQUdfXykpICE9IDBVKT8gMVUgOiAwVSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgUlRDIEFsYXJtJ3MgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gRmxhZyBzb3VyY2VzIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX0FMUkFGCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19BTFJCRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSA9ICh+KChfX0ZMQUdfXykgfCBSVENfSVNSX0lOSVQpIHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgICAgIChFWFRJLT5JTVIgfD0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX0lUKCkgICAgICAgICAgIChFWFRJLT5JTVIgJj0gfihSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZXZlbnQgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9FVkVOVCgpICAgICAgICAgKEVYVEktPkVNUiB8PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXZlbnQgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfRVZFTlQoKSAgICAgICAgIChFWFRJLT5FTVIgJj0gfihSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIChFWFRJLT5GVFNSIHw9IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgKEVYVEktPkZUU1IgJj0gfihSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgcmlzaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgKEVYVEktPlJUU1IgfD0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIChFWFRJLT5SVFNSICY9IH4oUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHJldHZhbCBMaW5lIFN0YXR1cy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfR0VUX0ZMQUcoKSAgICAgICAgICAgICAgKEVYVEktPlBSICYgUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgIChFWFRJLT5QUiA9IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpCisKKy8qKgorICAqIEBicmllZiBHZW5lcmF0ZSBhIFNvZnR3YXJlIGludGVycnVwdCBvbiBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgICAgICAoRVhUSS0+U1dJRVIgfD0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBSVEMgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfcnRjX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnMgUlRDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19Jbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfRGVJbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKwordm9pZCBIQUxfUlRDX01zcEluaXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordm9pZCBIQUxfUlRDX01zcERlSW5pdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19SZWdpc3RlckNhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBIQUxfUlRDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBSVENfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1VuUmVnaXN0ZXJDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgSEFMX1JUQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFJUQyBUaW1lIGFuZCBEYXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBSVEMgVGltZSBhbmQgRGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXRUaW1lKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGltZVR5cGVEZWYgKnNUaW1lLCB1aW50MzJfdCBGb3JtYXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19HZXRUaW1lKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGltZVR5cGVEZWYgKnNUaW1lLCB1aW50MzJfdCBGb3JtYXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXREYXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfRGF0ZVR5cGVEZWYgKnNEYXRlLCB1aW50MzJfdCBGb3JtYXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19HZXREYXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfRGF0ZVR5cGVEZWYgKnNEYXRlLCB1aW50MzJfdCBGb3JtYXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBSVEMgQWxhcm0gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFJUQyBBbGFybSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldEFsYXJtKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEZvcm1hdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldEFsYXJtX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEZvcm1hdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0RlYWN0aXZhdGVBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQWxhcm0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19HZXRBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0FsYXJtVHlwZURlZiAqc0FsYXJtLCB1aW50MzJfdCBBbGFybSwgdWludDMyX3QgRm9ybWF0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfUG9sbEZvckFsYXJtQUV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwICBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgIEhBTF9SVENfV2FpdEZvclN5bmNocm8oUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1JUQ1N0YXRlVHlwZURlZiBIQUxfUlRDX0dldFN0YXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfQ29uc3RhbnRzIFJUQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiBNYXNrcyBEZWZpbml0aW9uICovCisjZGVmaW5lIFJUQ19UUl9SRVNFUlZFRF9NQVNLICAoKHVpbnQzMl90KSAoUlRDX1RSX1BNIHwgUlRDX1RSX0hUIHwgUlRDX1RSX0hVIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VfCBSVENfVFJfU1QgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RSX1NVKSkKKyNkZWZpbmUgUlRDX0RSX1JFU0VSVkVEX01BU0sgICgodWludDMyX3QpIChSVENfRFJfWVQgfCBSVENfRFJfWVUgfCBSVENfRFJfV0RVIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19EUl9NVCB8IFJUQ19EUl9NVSB8IFJUQ19EUl9EVCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0RSX0RVKSkKKyNkZWZpbmUgUlRDX0lOSVRfTUFTSyAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRkZGVSkKKyNkZWZpbmUgUlRDX1JTRl9NQVNLICAgICAgICAgICAgKCh1aW50MzJfdCl+KFJUQ19JU1JfSU5JVCB8IFJUQ19JU1JfUlNGKSkKKworI2RlZmluZSBSVENfVElNRU9VVF9WQUxVRSAgMTAwMFUKKworI2RlZmluZSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UICAgICAgICAgICAgIChFWFRJX0lNUl9JTTE3KSAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSBjb25uZWN0ZWQgdG8gdGhlIFJUQyBBbGFybSBldmVudCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfUHJpdmF0ZV9NYWNyb3MgUlRDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfSVNfUlRDX0RlZmluaXRpb25zIFJUQyBQcml2YXRlIG1hY3JvcyB0byBjaGVjayBpbnB1dCBwYXJhbWV0ZXJzCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19SVENfSE9VUl9GT1JNQVQoRk9STUFUKSAgICAgKCgoRk9STUFUKSA9PSBSVENfSE9VUkZPUk1BVF8xMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBSVENfSE9VUkZPUk1BVF8yNCkpCisKKyNkZWZpbmUgSVNfUlRDX09VVFBVVF9QT0woUE9MKSAoKChQT0wpID09IFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTCkgPT0gUlRDX09VVFBVVF9QT0xBUklUWV9MT1cpKQorCisjZGVmaW5lIElTX1JUQ19PVVRQVVRfVFlQRShUWVBFKSAoKChUWVBFKSA9PSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBSVENfT1VUUFVUX1RZUEVfUFVTSFBVTEwpKQorCisjZGVmaW5lIElTX1JUQ19PVVRQVVRfUkVNQVAoUkVNQVApICAgKCgoUkVNQVApID09IFJUQ19PVVRQVVRfUkVNQVBfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQKSA9PSBSVENfT1VUUFVUX1JFTUFQX1BPUzEpKQorCisjZGVmaW5lIElTX1JUQ19IT1VSRk9STUFUMTIoUE0pICAoKChQTSkgPT0gUlRDX0hPVVJGT1JNQVQxMl9BTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE0pID09IFJUQ19IT1VSRk9STUFUMTJfUE0pKQorCisjZGVmaW5lIElTX1JUQ19EQVlMSUdIVF9TQVZJTkcoU0FWRSkgKCgoU0FWRSkgPT0gUlRDX0RBWUxJR0hUU0FWSU5HX1NVQjFIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0FWRSkgPT0gUlRDX0RBWUxJR0hUU0FWSU5HX0FERDFIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0FWRSkgPT0gUlRDX0RBWUxJR0hUU0FWSU5HX05PTkUpKQorCisjZGVmaW5lIElTX1JUQ19TVE9SRV9PUEVSQVRJT04oT1BFUkFUSU9OKSAoKChPUEVSQVRJT04pID09IFJUQ19TVE9SRU9QRVJBVElPTl9SRVNFVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1BFUkFUSU9OKSA9PSBSVENfU1RPUkVPUEVSQVRJT05fU0VUKSkKKworI2RlZmluZSBJU19SVENfRk9STUFUKEZPUk1BVCkgKCgoRk9STUFUKSA9PSBSVENfRk9STUFUX0JJTikgfHwgKChGT1JNQVQpID09IFJUQ19GT1JNQVRfQkNEKSkKKworI2RlZmluZSBJU19SVENfWUVBUihZRUFSKSAgICAgICAgICAgICAgKChZRUFSKSA8PSAodWludDMyX3QpOTlVKQorCisjZGVmaW5lIElTX1JUQ19NT05USChNT05USCkgICAgICAgICAgICAoKChNT05USCkgPj0gKHVpbnQzMl90KTFVKSAmJiAoKE1PTlRIKSA8PSAodWludDMyX3QpMTJVKSkKKworI2RlZmluZSBJU19SVENfREFURShEQVRFKSAgICAgICAgICAgICAgKCgoREFURSkgPj0gKHVpbnQzMl90KTFVKSAmJiAoKERBVEUpIDw9ICh1aW50MzJfdCkzMVUpKQorCisjZGVmaW5lIElTX1JUQ19XRUVLREFZKFdFRUtEQVkpICgoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX01PTkRBWSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9UVUVTREFZKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfV0VETkVTREFZKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1RIVVJTREFZKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9GUklEQVkpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfU0FUVVJEQVkpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1NVTkRBWSkpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9EQVRFKERBVEUpICgoKERBVEUpID4odWludDMyX3QpMFUpICYmICgoREFURSkgPD0gKHVpbnQzMl90KTMxVSkpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9XRUVLREFZKFdFRUtEQVkpICgoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX01PTkRBWSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfVFVFU0RBWSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9XRURORVNEQVkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1RIVVJTREFZKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfRlJJREFZKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9TQVRVUkRBWSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1NVTkRBWSkpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9TRUwoU0VMKSAoKChTRUwpID09IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX0RBVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUwpID09IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX1dFRUtEQVkpKQorCisjZGVmaW5lIElTX1JUQ19BTEFSTV9NQVNLKE1BU0spICAoKChNQVNLKSAmIH4oUlRDX0FMQVJNTUFTS19BTEwpKSA9PSAwVSkKKworI2RlZmluZSBJU19SVENfQUxBUk0oQUxBUk0pICAgICAgKCgoQUxBUk0pID09IFJUQ19BTEFSTV9BKSB8fCAoKEFMQVJNKSA9PSBSVENfQUxBUk1fQikpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfVkFMVUUoVkFMVUUpICgoVkFMVUUpIDw9IFJUQ19BTFJNQVNTUl9TUykKKworI2RlZmluZSBJU19SVENfQUxBUk1fU1VCX1NFQ09ORF9NQVNLKE1BU0spICAgKCgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19BTEwpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF83KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX05PTkUpKQorCisjZGVmaW5lIElTX1JUQ19BU1lOQ0hfUFJFRElWKFBSRURJVikgICAoKFBSRURJVikgPD0gKHVpbnQzMl90KTB4N0ZVKQorCisjZGVmaW5lIElTX1JUQ19TWU5DSF9QUkVESVYoUFJFRElWKSAgICAoKFBSRURJVikgPD0gKHVpbnQzMl90KTB4N0ZGRlUpCisKKyNkZWZpbmUgSVNfUlRDX0hPVVIxMihIT1VSKSAgICAgICAgICAgICgoKEhPVVIpID4gKHVpbnQzMl90KTBVKSAmJiAoKEhPVVIpIDw9ICh1aW50MzJfdCkxMlUpKQorCisjZGVmaW5lIElTX1JUQ19IT1VSMjQoSE9VUikgICAgICAgICAgICAoKEhPVVIpIDw9ICh1aW50MzJfdCkyM1UpCisKKyNkZWZpbmUgSVNfUlRDX01JTlVURVMoTUlOVVRFUykgICAgICAgICgoTUlOVVRFUykgPD0gKHVpbnQzMl90KTU5VSkKKworI2RlZmluZSBJU19SVENfU0VDT05EUyhTRUNPTkRTKSAgICAgICAgKChTRUNPTkRTKSA8PSAodWludDMyX3QpNTlVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfRnVuY3Rpb25zIFJUQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgUlRDX0VudGVySW5pdE1vZGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordWludDhfdCAgICAgICAgICAgIFJUQ19CeXRlVG9CY2QyKHVpbnQ4X3QgVmFsdWUpOwordWludDhfdCAgICAgICAgICAgIFJUQ19CY2QyVG9CeXRlKHVpbnQ4X3QgVmFsdWUpOworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9SVENfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfcnRjX2V4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF9ydGNfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWUxZDUyCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfcnRjX2V4LmgKQEAgLTAsMCArMSwxMzQ4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9ydGNfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUlRDIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0hBTF9SVENfRVhfSAorI2RlZmluZSBTVE0zMkwweHhfSEFMX1JUQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4IFJUQ0V4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9UeXBlcyBSVENFeCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUlRDIFRhbXBlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVGFtcGVyOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIFBpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgIFJUQ0V4X1RhbXBlcl9QaW5zX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgSW50ZXJydXB0OyAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIEludGVycnVwdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgIFJUQ0V4X1RhbXBlcl9JbnRlcnJ1cHRfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBUcmlnZ2VyOyAgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUYW1wZXIgVHJpZ2dlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgIFJUQ0V4X1RhbXBlcl9UcmlnZ2VyX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgTm9FcmFzZTsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIG5vIGVyYXNlIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmICBSVENFeF9UYW1wZXJfRXJhc2VCYWNrVXBfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBNYXNrRmxhZzsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIEZsYWcgbWFza2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX01hc2tGbGFnX0RlZmluaXRpb25zICAgKi8KKworICB1aW50MzJfdCBGaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRmlsdGVyIFRhbXBlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX0ZpbHRlcl9EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5OyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1NhbXBsaW5nX0ZyZXF1ZW5jaWVzX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgUHJlY2hhcmdlRHVyYXRpb247ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUHJlY2hhcmdlIER1cmF0aW9uIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1Bpbl9QcmVjaGFyZ2VfRHVyYXRpb25fRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBUYW1wZXJQdWxsVXA7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUYW1wZXIgUHVsbFVwIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1B1bGxfVVBfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBUaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbjsgIC8qITwgU3BlY2lmaWVzIHRoZSBUaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1RpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uX0RlZmluaXRpb25zICovCit9IFJUQ19UYW1wZXJUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIFJUQ0V4IEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfT3V0cHV0X3NlbGVjdGlvbl9EZWZpbml0aW9ucyBSVENFeCBPdXRwdXQgU2VsZWN0aW9uIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfT1VUUFVUX0RJU0FCTEUgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX09VVFBVVF9BTEFSTUEgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0NSX09TRUxfMCkKKyNkZWZpbmUgUlRDX09VVFBVVF9BTEFSTUIgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0NSX09TRUxfMSkKKyNkZWZpbmUgUlRDX09VVFBVVF9XQUtFVVAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0NSX09TRUwpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfQmFja3VwX1JlZ2lzdGVyc19EZWZpbml0aW9ucyBSVENFeCBCYWNrdXAgUmVnaXN0ZXJzIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfQktQX0RSMCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX0JLUF9EUjEgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpCisjZGVmaW5lIFJUQ19CS1BfRFIyICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKQorI2RlZmluZSBSVENfQktQX0RSMyAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkKKyNkZWZpbmUgUlRDX0JLUF9EUjQgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGltZV9TdGFtcF9FZGdlc19kZWZpbml0aW9ucyBSVENFeCBUaW1lIFN0YW1wIEVkZ2VzIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVElNRVNUQU1QRURHRV9SSVNJTkcgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19USU1FU1RBTVBFREdFX0ZBTExJTkcgICAgICAgUlRDX0NSX1RTRURHRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RpbWVTdGFtcF9QaW5fU2VsZWN0aW9ucyBSVENFeCBUaW1lU3RhbXAgUGluIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9QaW5zX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBQaW5zIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyNkZWZpbmUgUlRDX1RBTVBFUl8xICAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAxRQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKworI2RlZmluZSBSVENfVEFNUEVSXzIgICAgICAgICAgICAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUDJFCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19UQU1QRVJfMyAgICAgICAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QM0UKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX0ludGVycnVwdF9EZWZpbml0aW9ucyBSVENFeCBUYW1wZXIgSW50ZXJydXB0IERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19UQU1QRVIxX0lOVEVSUlVQVCAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAxSUUKKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisKKworI2RlZmluZSBSVENfVEFNUEVSMl9JTlRFUlJVUFQgICAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QMklFCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19UQU1QRVIzX0lOVEVSUlVQVCAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAzSUUKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisjZGVmaW5lIFJUQ19BTExfVEFNUEVSX0lOVEVSUlVQVCAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVBJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfVHJpZ2dlcl9EZWZpbml0aW9ucyBSVENFeCBUYW1wZXIgVHJpZ2dlciBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19UQU1QRVJUUklHR0VSX1JJU0lOR0VER0UgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX1RBTVBFUlRSSUdHRVJfRkFMTElOR0VER0UgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKQorI2RlZmluZSBSVENfVEFNUEVSVFJJR0dFUl9MT1dMRVZFTCAgICAgICAgIFJUQ19UQU1QRVJUUklHR0VSX1JJU0lOR0VER0UKKyNkZWZpbmUgUlRDX1RBTVBFUlRSSUdHRVJfSElHSExFVkVMICAgICAgICBSVENfVEFNUEVSVFJJR0dFUl9GQUxMSU5HRURHRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9FcmFzZUJhY2tVcF9EZWZpbml0aW9ucyBSVENFeCBUYW1wZXIgRXJhc2VCYWNrVXAgRGVmaW5pdGlvbnMKKyogQHsKKyovCisjZGVmaW5lIFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0VOQUJMRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0RJU0FCTEUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9NYXNrRmxhZ19EZWZpbml0aW9ucyBSVENFeCBUYW1wZXIgTWFza0ZsYWcgRGVmaW5pdGlvbnMKKyogQHsKKyovCisjZGVmaW5lIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRElTQUJMRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRU5BQkxFICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA0MDAwMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX0ZpbHRlcl9EZWZpbml0aW9ucyBSVENFeCBUYW1wZXIgRmlsdGVyIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUkZJTFRFUl9ESVNBQkxFICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgIC8qITwgVGFtcGVyIGZpbHRlciBpcyBkaXNhYmxlZCAqLworCisjZGVmaW5lIFJUQ19UQU1QRVJGSUxURVJfMlNBTVBMRSAgIFJUQ19UQU1QQ1JfVEFNUEZMVF8wICAgIC8qITwgVGFtcGVyIGlzIGFjdGl2YXRlZCBhZnRlciAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsICovCisjZGVmaW5lIFJUQ19UQU1QRVJGSUxURVJfNFNBTVBMRSAgIFJUQ19UQU1QQ1JfVEFNUEZMVF8xICAgIC8qITwgVGFtcGVyIGlzIGFjdGl2YXRlZCBhZnRlciA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsICovCisjZGVmaW5lIFJUQ19UQU1QRVJGSUxURVJfOFNBTVBMRSAgIFJUQ19UQU1QQ1JfVEFNUEZMVCAgICAgIC8qITwgVGFtcGVyIGlzIGFjdGl2YXRlZCBhZnRlciA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmUuICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1NhbXBsaW5nX0ZyZXF1ZW5jaWVzX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBTYW1wbGluZyBGcmVxdWVuY2llcyBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjMyNzY4ICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMzI3NjggKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMTYzODQgIFJUQ19UQU1QQ1JfVEFNUEZSRVFfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDE2Mzg0ICovCisjZGVmaW5lIFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjgxOTIgICBSVENfVEFNUENSX1RBTVBGUkVRXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyA4MTkyICAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVY0MDk2ICAgKCh1aW50MzJfdCkgKFJUQ19UQU1QQ1JfVEFNUEZSRVFfMCB8IFJUQ19UQU1QQ1JfVEFNUEZSRVFfMSkpICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gNDA5NiAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMjA0OCAgIFJUQ19UQU1QQ1JfVEFNUEZSRVFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDIwNDggICovCisjZGVmaW5lIFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjEwMjQgICAoKHVpbnQzMl90KSAoUlRDX1RBTVBDUl9UQU1QRlJFUV8wIHwgUlRDX1RBTVBDUl9UQU1QRlJFUV8yKSkgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAxMDI0ICAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVY1MTIgICAgKCh1aW50MzJfdCkgKFJUQ19UQU1QQ1JfVEFNUEZSRVFfMSB8IFJUQ19UQU1QQ1JfVEFNUEZSRVFfMikpICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gNTEyICAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMjU2ICAgICgodWludDMyX3QpIChSVENfVEFNUENSX1RBTVBGUkVRXzAgfCBSVENfVEFNUENSX1RBTVBGUkVRXzEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QRlJFUV8yKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAyNTYgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9QaW5fUHJlY2hhcmdlX0R1cmF0aW9uX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBQaW4gUHJlY2hhcmdlIER1cmF0aW9uIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzFSVENDTEsgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgZHVyaW5nIDEgUlRDQ0xLIGN5Y2xlICAqLworI2RlZmluZSBSVENfVEFNUEVSUFJFQ0hBUkdFRFVSQVRJT05fMlJUQ0NMSyAgUlRDX1RBTVBDUl9UQU1QUFJDSF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRhbXBlciBwaW5zIGFyZSBwcmUtY2hhcmdlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBkdXJpbmcgMiBSVENDTEsgY3ljbGVzICovCisjZGVmaW5lIFJUQ19UQU1QRVJQUkVDSEFSR0VEVVJBVElPTl80UlRDQ0xLICBSVENfVEFNUENSX1RBTVBQUkNIXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIGR1cmluZyA0IFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzhSVENDTEsgKCh1aW50MzJfdCkoUlRDX1RBTVBDUl9UQU1QUFJDSF8wIHwgUlRDX1RBTVBDUl9UQU1QUFJDSF8xKSkgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgZHVyaW5nIDggUlRDQ0xLIGN5Y2xlcyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbl9EZWZpbml0aW9ucyBSVENFeCBUYW1wZXIgVGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb24gRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVElNRVNUQU1QT05UQU1QRVJERVRFQ1RJT05fRU5BQkxFICBSVENfVEFNUENSX1RBTVBUUyAgICAgICAvKiE8IFRpbWVTdGFtcCBvbiBUYW1wZXIgRGV0ZWN0aW9uIGV2ZW50IHNhdmVkICAgICAgICAqLworI2RlZmluZSBSVENfVElNRVNUQU1QT05UQU1QRVJERVRFQ1RJT05fRElTQUJMRSAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCBUaW1lU3RhbXAgb24gVGFtcGVyIERldGVjdGlvbiBldmVudCBpcyBub3Qgc2F2ZWQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfUHVsbF9VUF9EZWZpbml0aW9ucyBSVENFeCBUYW1wZXIgUHVsbCBVUCBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19UQU1QRVJfUFVMTFVQX0VOQUJMRSAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZSBzYW1wbGluZyAqLworI2RlZmluZSBSVENfVEFNUEVSX1BVTExVUF9ESVNBQkxFICBSVENfVEFNUENSX1RBTVBQVURJUyAgIC8qITwgVGFtcGVyIHBpbnMgcHJlLWNoYXJnZSBpcyBkaXNhYmxlZCAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1dha2V1cF9UaW1lcl9EZWZpbml0aW9ucyBSVENFeCBXYWtldXAgVGltZXIgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjE2ICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjggICAgICAgICBSVENfQ1JfV1VDS1NFTF8wCisjZGVmaW5lIFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWNCAgICAgICAgIFJUQ19DUl9XVUNLU0VMXzEKKyNkZWZpbmUgUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVYyICAgICAgICAgKCh1aW50MzJfdCkgKFJUQ19DUl9XVUNLU0VMXzAgfCBSVENfQ1JfV1VDS1NFTF8xKSkKKyNkZWZpbmUgUlRDX1dBS0VVUENMT0NLX0NLX1NQUkVfMTZCSVRTICAgICAgUlRDX0NSX1dVQ0tTRUxfMgorI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xN0JJVFMgICAgICAoKHVpbnQzMl90KSAoUlRDX0NSX1dVQ0tTRUxfMSB8IFJUQ19DUl9XVUNLU0VMXzIpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9TbW9vdGhfY2FsaWJfcGVyaW9kX0RlZmluaXRpb25zIFJUQ0V4IFNtb290aCBjYWxpYiBwZXJpb2QgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzMyU0VDICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAvKiE8IElmIFJUQ0NMSyA9IDMyNzY4IEh6LCBTbW9vdGggY2FsaWJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kIGlzIDMycywgIGVsc2UgMmV4cDIwIFJUQ0NMSyBwdWxzZXMgKi8KKyNkZWZpbmUgUlRDX1NNT09USENBTElCX1BFUklPRF8xNlNFQyAgIFJUQ19DQUxSX0NBTFcxNiAgICAgICAgICAvKiE8IElmIFJUQ0NMSyA9IDMyNzY4IEh6LCBTbW9vdGggY2FsaWJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kIGlzIDE2cywgZWxzZSAyZXhwMTkgUlRDQ0xLIHB1bHNlcyAqLworI2RlZmluZSBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzhTRUMgICAgUlRDX0NBTFJfQ0FMVzggICAgICAgICAgIC8qITwgSWYgUlRDQ0xLID0gMzI3NjggSHosIFNtb290aCBjYWxpYmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgaXMgOHMsIGVsc2UgMmV4cDE4IFJUQ0NMSyBwdWxzZXMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9TbW9vdGhfY2FsaWJfUGx1c19wdWxzZXNfRGVmaW5pdGlvbnMgUlRDRXggU21vb3RoIGNhbGliIFBsdXMgcHVsc2VzIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfU0VUICAgIFJUQ19DQUxSX0NBTFAgICAgICAgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgUlRDQ0xLIHB1bHNlcyBhZGRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGEgWCAtc2Vjb25kIHdpbmRvdyA9IFkgLSBDQUxNWzg6MF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggWSA9IDUxMiwgMjU2LCAxMjggd2hlbiBYID0gMzIsIDE2LCA4ICovCisjZGVmaW5lIFJUQ19TTU9PVEhDQUxJQl9QTFVTUFVMU0VTX1JFU0VUICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgIC8qITwgVGhlIG51bWJlciBvZiBSVENDTEsgcHVsc2VzIHN1YmJzdGl0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyBhIDMyLXNlY29uZCB3aW5kb3cgPSBDQUxNWzg6MF0gKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfQ2FsaWJfT3V0cHV0X3NlbGVjdGlvbl9EZWZpbml0aW9ucyBSVENFeCBDYWxpYiBPdXRwdXQgc2VsZWN0aW9uIERlZmluaXRpb25zCisgKiBAeworICovCisjZGVmaW5lIFJUQ19DQUxJQk9VVFBVVF81MTJIWiAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19DQUxJQk9VVFBVVF8xSFogICAgICAgICAgICAgIFJUQ19DUl9DT1NFTAorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfQWRkXzFfU2Vjb25kX1BhcmFtZXRlcl9EZWZpbml0aW9uIFJUQ0V4IEFkZCAxIFNlY29uZCBQYXJhbWV0ZXIgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfU0hJRlRBREQxU19SRVNFVCAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19TSElGVEFERDFTX1NFVCAgICAgICAgUlRDX1NISUZUUl9BREQxUworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfSW50ZXJydXB0c19EZWZpbml0aW9ucyBSVENFeCBJbnRlcnJ1cHRzIERlZmluaXRpb25zCisqIEB7CisqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgUlRDX0lUX1RBTVAzICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QM0lFKSAgLyohPCBFbmFibGUgVGFtcGVyIDMgSW50ZXJydXB0ICAgICAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X0ZsYWdzX0RlZmluaXRpb25zIFJUQ0V4IEZsYWdzIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19GTEFHX1RBTVAzRiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfVEFNUDNGKQorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9NYWNyb3MgUlRDRXggRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tV0FLRVVQVElNRVItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9XYWtlVXBfVGltZXIgUlRDIFdha2VVcCBUaW1lcgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFdha2VVcCBUaW1lciBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfV1VURSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFdha2VVcCBUaW1lciBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oUlRDX0NSX1dVVEUpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFdha2VVcFRpbWVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfV1VUOiBXYWtlVXBUaW1lciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZVVwVGltZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9XVVQ6IFdha2VVcFRpbWVyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgV2FrZVVwVGltZXIgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZVVwVGltZXIgaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfV1VUOiAgV2FrZVVwVGltZXIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoKF9fSU5URVJSVVBUX18pPj4gNFUpKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgV2FrZSBVcCB0aW1lciBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZSBVcCB0aW1lciBpbnRlcnJ1cHQgc291cmNlcyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1dVVDogIFdha2VVcFRpbWVyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJiAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBSVEMgV2FrZVVwVGltZXIncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZVVwVGltZXIgRmxhZyBpcyBwZW5kaW5nIG9yIG5vdC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19XVVRGCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19XVVRXRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSVEMgV2FrZSBVcCB0aW1lcidzIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFdha2VVcFRpbWVyIEZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1dVVEYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpID0gKH4oKF9fRkxBR19fKSB8IFJUQ19JU1JfSU5JVCl8KChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVCkpCisKKy8qIFdBS0UtVVAgVElNRVIgRVhUSSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpICAgICAgIChFWFRJLT5JTVIgfD0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9JVCgpICAgICAgKEVYVEktPklNUiAmPSB+KFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBldmVudCBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9FVkVOVCgpICAgIChFWFRJLT5FTVIgfD0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9FVkVOVCgpICAgKEVYVEktPkVNUiAmPSB+KFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIChFWFRJLT5GVFNSIHw9IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgIChFWFRJLT5GVFNSICY9IH4oUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICAoRVhUSS0+UlRTUiB8PSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgcmlzaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIChFWFRJLT5SVFNSICY9IH4oUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEByZXR2YWwgTGluZSBTdGF0dXMuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0dFVF9GTEFHKCkgICAgICAgICAgICAgIChFWFRJLT5QUiAmIFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiBDbGVhciB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZSBmbGFnLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfQ0xFQVJfRkxBRygpICAgICAgICAgICAgKEVYVEktPlBSID0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmIEdlbmVyYXRlIGEgU29mdHdhcmUgaW50ZXJydXB0IG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfR0VORVJBVEVfU1dJVCgpICAgICAgICAgKEVYVEktPlNXSUVSIHw9IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpCisvKioKKyAgKiBAfQorICAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1USU1FU1RBTVAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9UaW1lc3RhbXAgUlRDIFRpbWVzdGFtcAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFRpbWVTdGFtcCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9UU0UpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBUaW1lU3RhbXAgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oUlRDX0NSX1RTRSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgaW50ZXJydXB0IHNvdXJjZSB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfVFM6IFRpbWVTdGFtcCBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RJTUVTVEFNUF9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFRpbWVTdGFtcCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdCBzb3VyY2UgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9UUzogVGltZVN0YW1wIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBUaW1lU3RhbXAgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdCB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1RTOiBUaW1lU3RhbXAgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmICgoX19JTlRFUlJVUFRfXyk+PiA0VSkpICE9IDBVKSA/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBUaW1lIFN0YW1wIGludGVycnVwdCBoYXMgYmVlbiBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUaW1lIFN0YW1wIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9UUzogVGltZVN0YW1wIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJiAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBSVEMgVGltZVN0YW1wJ3MgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRpbWVTdGFtcCBGbGFnIGlzIHBlbmRpbmcgb3Igbm90LgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UU0YKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVFNPVkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RJTUVTVEFNUF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgIT0gMFUpID8gMVUgOiAwVSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgUlRDIFRpbWUgU3RhbXAncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRpbWVTdGFtcCBGbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RTRgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVFNPVkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RJTUVTVEFNUF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSA9ICh+KChfX0ZMQUdfXykgfCBSVENfSVNSX0lOSVQpfCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVQpKQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVRBTVBFUi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlciBSVEMgVGFtcGVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGFtcGVyMSBpbnB1dCBkZXRlY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUjFfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQU1QQ1IgfD0gKFJUQ19UQU1QQ1JfVEFNUDFFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGFtcGVyMSBpbnB1dCBkZXRlY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUjFfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQU1QQ1IgJj0gfihSVENfVEFNUENSX1RBTVAxRSkpCisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFRhbXBlcjIgaW5wdXQgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVIyX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSIHw9IChSVENfVEFNUENSX1RBTVAyRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFRhbXBlcjIgaW5wdXQgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVIyX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSICY9IH4oUlRDX1RBTVBDUl9UQU1QMkUpKQorCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBUYW1wZXIzIGlucHV0IGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSM19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUiB8PSAoUlRDX1RBTVBDUl9UQU1QM0UpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBUYW1wZXIzIGlucHV0IGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSM19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUiAmPSB+KFJUQ19UQU1QQ1JfVEFNUDNFKSkKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKSAmJiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QOiBBbGwgdGFtcGVycyBpbnRlcnJ1cHRzCisgICogICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAxOiBUYW1wZXIxIGludGVycnVwdAorICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMjogVGFtcGVyMiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDM6IFRhbXBlcjMgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVA6IEFsbCB0YW1wZXJzIGludGVycnVwdHMKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMTogVGFtcGVyMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMjogVGFtcGVyMiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMzogVGFtcGVyMyBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQU1QQ1IgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworI2VsaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFRhbXBlciBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDogQWxsIHRhbXBlcnMgaW50ZXJydXB0cworICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMTogVGFtcGVyMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDI6IFRhbXBlcjIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVA6IEFsbCB0YW1wZXJzIGludGVycnVwdHMKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMTogVGFtcGVyMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMjogVGFtcGVyMiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQU1QQ1IgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworI2VsaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QOiBBbGwgdGFtcGVycyBpbnRlcnJ1cHRzCisgICogICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMzogVGFtcGVyMyBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQU1QQ1IgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDogQWxsIHRhbXBlcnMgaW50ZXJydXB0cworICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAzOiBUYW1wZXIzIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkgJiYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgVGFtcGVyIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDE6IFRhbXBlcjEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDI6IFRhbXBlcjIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDM6IFRhbXBlcjMgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICgoKF9fSU5URVJSVVBUX18pID09IFJUQ19JVF9UQU1QMSkgPyAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmICgoX19JTlRFUlJVUFRfXyk+PiAzVSkpICE9IDBVKSA/IDFVIDogMFUpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0lOVEVSUlVQVF9fKSA9PSBSVENfSVRfVEFNUDIpID8gKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoKF9fSU5URVJSVVBUX18pPj4gNVUpKSAhPSAwVSkgPyAxVSA6IDBVKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlRFUlJVUFRfXykgPT0gUlRDX0lUX1RBTVAzKSA/ICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0lOVEVSUlVQVF9fKT4+IDdVKSkgIT0gMFUpID8gMVUgOiAwVSkpCisKKyNlbGlmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIFRhbXBlciBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAxOiBUYW1wZXIxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKChfX0lOVEVSUlVQVF9fKSA9PSBSVENfSVRfVEFNUDEpID8gKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoKF9fSU5URVJSVVBUX18pPj4gM1UpKSAhPSAwVSkgPyAxVSA6IDBVKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlRFUlJVUFRfXykgPT0gUlRDX0lUX1RBTVAyKSA/ICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0lOVEVSUlVQVF9fKT4+IDVVKSkgIT0gMFUpID8gMVUgOiAwVSkpCisKKyNlbGlmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIFRhbXBlciBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAzOiBUYW1wZXIzIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKChfX0lOVEVSUlVQVF9fKSA9PSBSVENfSVRfVEFNUDIpID8gKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoKF9fSU5URVJSVVBUX18pPj4gNVUpKSAhPSAwVSkgPyAxVSA6IDBVKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlRFUlJVUFRfXykgPT0gUlRDX0lUX1RBTVAzKSA/ICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0lOVEVSUlVQVF9fKT4+IDdVKSkgIT0gMFUpID8gMVUgOiAwVSkpCisKKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkgJiYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgVGFtcGVyIGludGVycnVwdCBoYXMgYmVlbiBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QOiBBbGwgdGFtcGVycyBpbnRlcnJ1cHRzCisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDE6IFRhbXBlcjEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDI6IFRhbXBlcjIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDM6IFRhbXBlcjMgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSKSAmIChfX0lOVEVSUlVQVF9fKSkgIT0gMFUpID8gMVUgOiAwVSkKKworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgUlRDIFRhbXBlcidzIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgRmxhZyBpcyBwZW5kaW5nIG9yIG5vdC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMUY6IFRhbXBlcjEgZmxhZworICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDJGOiBUYW1wZXIyIGZsYWcKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAzRjogVGFtcGVyMyBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIChfX0ZMQUdfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIFJUQyBUYW1wZXIncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgRmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMUY6IFRhbXBlcjEgZmxhZworICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDJGOiBUYW1wZXIyIGZsYWcKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAzRjogVGFtcGVyMyBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSA9ICh+KChfX0ZMQUdfXykgfCBSVENfSVNSX0lOSVQpfCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVQpKQorCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBUYW1wZXIgaW50ZXJydXB0IGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVA6IEFsbCB0YW1wZXJzIGludGVycnVwdHMKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMTogVGFtcGVyMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMjogVGFtcGVyMiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQU1QQ1IpICYgKF9fSU5URVJSVVBUX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBSVEMgVGFtcGVyJ3MgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBGbGFnIGlzIHBlbmRpbmcgb3Igbm90LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAxRjogVGFtcGVyMSBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMkY6IFRhbXBlcjIgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSVEMgVGFtcGVyJ3MgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIEZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDFGOiBUYW1wZXIxIGZsYWcKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAyRjogVGFtcGVyMiBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSA9ICh+KChfX0ZMQUdfXykgfCBSVENfSVNSX0lOSVQpfCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVQpKQorCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIFRhbXBlciBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDogQWxsIHRhbXBlcnMgaW50ZXJydXB0cworICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAzOiBUYW1wZXIzIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUikgJiAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFJUQyBUYW1wZXIncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIEZsYWcgaXMgcGVuZGluZyBvciBub3QuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDJGOiBUYW1wZXIyIGZsYWcKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAzRjogVGFtcGVyMyBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIChfX0ZMQUdfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIFJUQyBUYW1wZXIncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgRmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMkY6IFRhbXBlcjIgZmxhZworICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDNGOiBUYW1wZXIzIGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpID0gKH4oKF9fRkxBR19fKSB8IFJUQ19JU1JfSU5JVCl8KChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVCkpCisKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1UQU1QRVIvVElNRVNUQU1QLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1RpbWVzdGFtcCBFWFRJIFJUQyBUYW1wZXIgVGltZXN0YW1wIEVYVEkKKyAgKiBAeworICAqLworCisvKiBUQU1QRVIgVElNRVNUQU1QIEVYVEkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0lUKCkgICAgICAgIChFWFRJLT5JTVIgfD0gUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9JVCgpICAgICAgIChFWFRJLT5JTVIgJj0gfihSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBldmVudCBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAoRVhUSS0+RU1SIHw9IFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0RJU0FCTEVfRVZFTlQoKSAgIChFWFRJLT5FTVIgJj0gfihSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICAoRVhUSS0+RlRTUiB8PSBSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICAoRVhUSS0+RlRTUiAmPSB+KFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgKEVYVEktPlJUU1IgfD0gUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgcmlzaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICAoRVhUSS0+UlRTUiAmPSB+KFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHJldHZhbCBMaW5lIFN0YXR1cy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRVRfRkxBRygpICAgICAgICAgKEVYVEktPlBSICYgUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZSBmbGFnLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgKEVYVEktPlBSID0gUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZQorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgKEVYVEktPlNXSUVSIHw9IFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkKKy8qKgorICAqIEB9CisgICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUNhbGlicmF0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0NhbGlicmF0aW9uIFJUQyBDYWxpYnJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgY2FsaWJyYXRpb24gb3V0cHV0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19DQUxJQlJBVElPTl9PVVRQVVRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfQ09FKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjYWxpYnJhdGlvbiBvdXRwdXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0NBTElCUkFUSU9OX09VVFBVVF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfQ09FKSkKKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY2xvY2sgcmVmZXJlbmNlIGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQ0xPQ0tSRUZfREVURUNUSU9OX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoUlRDX0NSX1JFRkNLT04pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGNsb2NrIHJlZmVyZW5jZSBkZXRlY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0NMT0NLUkVGX0RFVEVDVElPTl9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfUkVGQ0tPTikpCisKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFJUQyBzaGlmdCBvcGVyYXRpb24ncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgc2hpZnQgb3BlcmF0aW9uIEZsYWcgaXMgcGVuZGluZyBvciBub3QuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfU0hQRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfU0hJRlRfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgIT0gMFUpPyAxVSA6IDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFJUQ0V4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFJUQyBUaW1lU3RhbXAgYW5kIFRhbXBlciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgUlRDIFRpbWVTdGFtcCBhbmQgVGFtcGVyIGZ1bmN0aW9ucworICogQHsKKyAqLworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lU3RhbXBFZGdlLCB1aW50MzJfdCBSVENfVGltZVN0YW1wUGluKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRUaW1lU3RhbXBfSVQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVTdGFtcEVkZ2UsIHVpbnQzMl90IFJUQ19UaW1lU3RhbXBQaW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVUaW1lU3RhbXAoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0dldFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RpbWVUeXBlRGVmICpzVGltZVN0YW1wLCBSVENfRGF0ZVR5cGVEZWYgKnNUaW1lU3RhbXBEYXRlLCB1aW50MzJfdCBGb3JtYXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRhbXBlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RhbXBlclR5cGVEZWYgKnNUYW1wZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRhbXBlcl9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RhbXBlclR5cGVEZWYgKnNUYW1wZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVUYW1wZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRhbXBlcik7Cit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfVGFtcGVyVGltZVN0YW1wSVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfVGFtcGVyMUV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9UYW1wZXIyRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1RhbXBlcjNFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfVGltZVN0YW1wRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRpbWVTdGFtcEV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KTsKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRhbXBlcjFFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1BvbGxGb3JUYW1wZXIyRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpOworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyM0V2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KTsKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBSVEMgV2FrZS11cCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEV4dGVuZGVkIFJUQyBXYWtlLXVwIGZ1bmN0aW9ucworICogQHsKKyAqLworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0V2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFdha2VVcENvdW50ZXIsIHVpbnQzMl90IFdha2VVcENsb2NrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcl9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVXYWtlVXBUaW1lcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUlRDRXhfR2V0V2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1dha2VVcFRpbWVySVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yV2FrZVVwVGltZXJFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHRlbmRlZCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogQHsKKyAqLworCit2b2lkIEhBTF9SVENFeF9CS1VQV3JpdGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IEJhY2t1cFJlZ2lzdGVyLCB1aW50MzJfdCBEYXRhKTsKK3VpbnQzMl90IEhBTF9SVENFeF9CS1VQUmVhZChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0U21vb3RoQ2FsaWIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFNtb290aENhbGliUGVyaW9kLCB1aW50MzJfdCBTbW9vdGhDYWxpYlBsdXNQdWxzZXMsIHVpbnQzMl90IFNtb290aENhbGliTWludXNQdWxzZXNWYWx1ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0U3luY2hyb1NoaWZ0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBTaGlmdEFkZDFTLCB1aW50MzJfdCBTaGlmdFN1YkZTKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRDYWxpYnJhdGlvbk91dFB1dChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQ2FsaWJPdXRwdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVDYWxpYnJhdGlvbk91dFB1dChSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0UmVmQ2xvY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVSZWZDbG9jayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRW5hYmxlQnlwYXNzU2hhZG93KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EaXNhYmxlQnlwYXNzU2hhZG93KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4dGVuZGVkIFJUQyBmZWF0dXJlcyBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAqIEB7CisgKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9BbGFybUJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yQWxhcm1CRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9Qcml2YXRlX0NvbnN0YW50cyBSVENFeCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIE1hc2tzIERlZmluaXRpb24gKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkgJiYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorCisjZGVmaW5lIFJUQ19GTEFHU19NQVNLICAgICAgICAgICgodWludDMyX3QpIChSVENfRkxBR19SRUNBTFBGIHwgUlRDX0ZMQUdfVEFNUDNGIHwgUlRDX0ZMQUdfVEFNUDJGIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfVEFNUDFGfCBSVENfRkxBR19UU09WRiB8IFJUQ19GTEFHX1RTRiAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX1dVVEYgfCBSVENfRkxBR19BTFJCRiB8IFJUQ19GTEFHX0FMUkFGICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19JTklURiB8IFJUQ19GTEFHX1JTRiAgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfSU5JVFMgfCBSVENfRkxBR19TSFBGIHwgUlRDX0ZMQUdfV1VUV0YgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX0FMUkJXRiB8IFJUQ19GTEFHX0FMUkFXRikpCisKKyNkZWZpbmUgUlRDX1RBTVBDUl9UQU1QWEUgICAgICgodWludDMyX3QpIChSVENfVEFNUENSX1RBTVAzRSB8IFJUQ19UQU1QQ1JfVEFNUDJFIHwgUlRDX1RBTVBDUl9UQU1QMUUpKQorI2RlZmluZSBSVENfVEFNUENSX1RBTVBYSUUgICAgKCh1aW50MzJfdCkgKFJUQ19UQU1QRVIxX0lOVEVSUlVQVCB8IFJUQ19UQU1QRVIyX0lOVEVSUlVQVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfVEFNUEVSM19JTlRFUlJVUFQgfCBSVENfQUxMX1RBTVBFUl9JTlRFUlJVUFQpKQorCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisKKyNkZWZpbmUgUlRDX0ZMQUdTX01BU0sgICAgICAgICAgKCh1aW50MzJfdCkgKFJUQ19GTEFHX1JFQ0FMUEYgfCBSVENfRkxBR19UQU1QMkYgfCBSVENfRkxBR19UQU1QMUZ8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX1RTT1ZGIHwgUlRDX0ZMQUdfVFNGIHwgUlRDX0ZMQUdfV1VURiAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX0FMUkJGIHwgUlRDX0ZMQUdfQUxSQUYgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX0lOSVRGIHwgUlRDX0ZMQUdfUlNGIHwgUlRDX0ZMQUdfSU5JVFMgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX1NIUEYgfCBSVENfRkxBR19XVVRXRiB8UlRDX0ZMQUdfQUxSQldGICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX0FMUkFXRikpCisKKyNkZWZpbmUgUlRDX1RBTVBDUl9UQU1QWEUgICAgICgodWludDMyX3QpIChSVENfVEFNUENSX1RBTVAyRSB8IFJUQ19UQU1QQ1JfVEFNUDFFKSkKKyNkZWZpbmUgUlRDX1RBTVBDUl9UQU1QWElFICAgICgodWludDMyX3QpIChSVENfVEFNUEVSMV9JTlRFUlJVUFQgfCBSVENfVEFNUEVSMl9JTlRFUlJVUFQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0FMTF9UQU1QRVJfSU5URVJSVVBUKSkKKworI2VsaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorCisjZGVmaW5lIFJUQ19GTEFHU19NQVNLICAgICAgICAgICgodWludDMyX3QpIChSVENfRkxBR19SRUNBTFBGIHwgUlRDX0ZMQUdfVEFNUDNGIHwgUlRDX0ZMQUdfVEFNUDJGIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfVFNPVkYgfCBSVENfRkxBR19UU0YgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX1dVVEYgfCBSVENfRkxBR19BTFJCRiB8IFJUQ19GTEFHX0FMUkFGICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19JTklURiB8IFJUQ19GTEFHX1JTRiAgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfSU5JVFMgfCBSVENfRkxBR19TSFBGIHwgUlRDX0ZMQUdfV1VUV0YgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX0FMUkJXRiB8IFJUQ19GTEFHX0FMUkFXRikpCisKKyNkZWZpbmUgUlRDX1RBTVBDUl9UQU1QWEUgICAgICgodWludDMyX3QpIChSVENfVEFNUENSX1RBTVAzRSB8IFJUQ19UQU1QQ1JfVEFNUDJFKSkKKyNkZWZpbmUgUlRDX1RBTVBDUl9UQU1QWElFICAgICgodWludDMyX3QpIChSVENfVEFNUEVSMl9JTlRFUlJVUFQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RBTVBFUjNfSU5URVJSVVBUIHwgUlRDX0FMTF9UQU1QRVJfSU5URVJSVVBUKSkKKyNlbmRpZgorCisjZGVmaW5lIFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCAgKEVYVElfSU1SX0lNMTkpICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE5IENvbm5lY3RlZCB0byB0aGUgUlRDIFRhbXBlciBhbmQgVGltZSBTdGFtcCBldmVudHMgKi8KKyNkZWZpbmUgUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCAgICAgICAoRVhUSV9JTVJfSU0yMCkgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMjAgQ29ubmVjdGVkIHRvIHRoZSBSVEMgV2FrZXVwIGV2ZW50ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X1ByaXZhdGVfTWFjcm9zIFJUQ0V4IFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9JU19SVENfRGVmaW5pdGlvbnMgUHJpdmF0ZSBtYWNyb3MgdG8gY2hlY2sgaW5wdXQgcGFyYW1ldGVycworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfUlRDX09VVFBVVChPVVRQVVQpICgoKE9VVFBVVCkgPT0gUlRDX09VVFBVVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IFJUQ19PVVRQVVRfQUxBUk1BKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBSVENfT1VUUFVUX0FMQVJNQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gUlRDX09VVFBVVF9XQUtFVVApKQorCisjZGVmaW5lIElTX1JUQ19CS1AoQktQKSAgICAgICAgICAgICAgICAgICAoKEJLUCkgPCAodWludDMyX3QpIFJUQ19CS1BfTlVNQkVSKQorCisjZGVmaW5lIElTX1RJTUVTVEFNUF9FREdFKEVER0UpICgoKEVER0UpID09IFJUQ19USU1FU1RBTVBFREdFX1JJU0lORykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBSVENfVElNRVNUQU1QRURHRV9GQUxMSU5HKSkKKworI2RlZmluZSAgSVNfUlRDX1RBTVBFUihUQU1QRVIpICAoKCgoVEFNUEVSKSAmICgodWludDMyX3QpKDB4RkZGRkZGRkZVIF4gUlRDX1RBTVBDUl9UQU1QWEUpKSkgPT0gMHgwMFUpICYmICgoVEFNUEVSKSAhPSAwVSkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9JTlRFUlJVUFQoSU5URVJSVVBUKSAoKCgoSU5URVJSVVBUKSAmICh1aW50MzJfdCkoMHhGRkZGRkZGRlUgXiBSVENfVEFNUENSX1RBTVBYSUUpKSA9PSAweDAwVSkgJiYgKChJTlRFUlJVUFQpICE9IDBVKSkKKworI2RlZmluZSBJU19SVENfVElNRVNUQU1QX1BJTihQSU4pICAoKChQSU4pID09IFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVCkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9UUklHR0VSKFRSSUdHRVIpICgoKFRSSUdHRVIpID09IFJUQ19UQU1QRVJUUklHR0VSX1JJU0lOR0VER0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IFJUQ19UQU1QRVJUUklHR0VSX0ZBTExJTkdFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBSVENfVEFNUEVSVFJJR0dFUl9MT1dMRVZFTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gUlRDX1RBTVBFUlRSSUdHRVJfSElHSExFVkVMKSkKKworI2RlZmluZSBJU19SVENfVEFNUEVSX0VSQVNFX01PREUoTU9ERSkgICAgICAgICAgICAgKCgoTU9ERSkgPT0gUlRDX1RBTVBFUl9FUkFTRV9CQUNLVVBfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19SVENfVEFNUEVSX01BU0tGTEFHX1NUQVRFKFNUQVRFKSAgICAgICAgKCgoU1RBVEUpID09IFJUQ19UQU1QRVJNQVNLX0ZMQUdfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFKSkKKworI2RlZmluZSBJU19SVENfVEFNUEVSX0ZJTFRFUihGSUxURVIpICAoKChGSUxURVIpID09IFJUQ19UQU1QRVJGSUxURVJfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUxURVIpID09IFJUQ19UQU1QRVJGSUxURVJfMlNBTVBMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUxURVIpID09IFJUQ19UQU1QRVJGSUxURVJfNFNBTVBMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUxURVIpID09IFJUQ19UQU1QRVJGSUxURVJfOFNBTVBMRSkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9TQU1QTElOR19GUkVRKEZSRVEpICgoKEZSRVEpID09IFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjMyNzY4KXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjE2Mzg0KXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjgxOTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjQwOTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjIwNDgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjEwMjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjUxMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlJFUSkgPT0gUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMjU2KSkKKworI2RlZmluZSBJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTihEVVJBVElPTikgKCgoRFVSQVRJT04pID09IFJUQ19UQU1QRVJQUkVDSEFSR0VEVVJBVElPTl8xUlRDQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEVVJBVElPTikgPT0gUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzJSVENDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERVUkFUSU9OKSA9PSBSVENfVEFNUEVSUFJFQ0hBUkdFRFVSQVRJT05fNFJUQ0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEVVJBVElPTikgPT0gUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzhSVENDTEspKQorCisjZGVmaW5lIElTX1JUQ19UQU1QRVJfVElNRVNUQU1QT05UQU1QRVJfREVURUNUSU9OKERFVEVDVElPTikgKCgoREVURUNUSU9OKSA9PSBSVENfVElNRVNUQU1QT05UQU1QRVJERVRFQ1RJT05fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREVURUNUSU9OKSA9PSBSVENfVElNRVNUQU1QT05UQU1QRVJERVRFQ1RJT05fRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9QVUxMVVBfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBSVENfVEFNUEVSX1BVTExVUF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBSVENfVEFNUEVSX1BVTExVUF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19SVENfV0FLRVVQX0NMT0NLKENMT0NLKSAoKChDTE9DSykgPT0gUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVYxNikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjgpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTE9DSykgPT0gUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVYyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xNkJJVFMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFJUQ19XQUtFVVBDTE9DS19DS19TUFJFXzE3QklUUykpCisKKyNkZWZpbmUgSVNfUlRDX1dBS0VVUF9DT1VOVEVSKENPVU5URVIpICAoKENPVU5URVIpIDw9IFJUQ19XVVRSX1dVVCkKKworI2RlZmluZSBJU19SVENfU01PT1RIX0NBTElCX1BFUklPRChQRVJJT0QpICgoKFBFUklPRCkgPT0gUlRDX1NNT09USENBTElCX1BFUklPRF8zMlNFQykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklPRCkgPT0gUlRDX1NNT09USENBTElCX1BFUklPRF8xNlNFQykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklPRCkgPT0gUlRDX1NNT09USENBTElCX1BFUklPRF84U0VDKSkKKworI2RlZmluZSBJU19SVENfU01PT1RIX0NBTElCX1BMVVMoUExVUykgKCgoUExVUykgPT0gUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQTFVTKSA9PSBSVENfU01PT1RIQ0FMSUJfUExVU1BVTFNFU19SRVNFVCkpCisKKworLyoqIEBkZWZncm91cCBSVENFeF9TbW9vdGhfY2FsaWJfTWludXNfcHVsc2VzX0RlZmluaXRpb25zIFJUQ0V4IFNtb290aCBjYWxpYiBNaW51cyBwdWxzZXMgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSAgSVNfUlRDX1NNT09USF9DQUxJQl9NSU5VUyhWQUxVRSkgKChWQUxVRSkgPD0gUlRDX0NBTFJfQ0FMTSkKKy8qKgorICAqIEB9CisgICovCisKKworI2RlZmluZSBJU19SVENfU0hJRlRfQUREMVMoU0VMKSAoKChTRUwpID09IFJUQ19TSElGVEFERDFTX1JFU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTCkgPT0gUlRDX1NISUZUQUREMVNfU0VUKSkKKworCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfU3Vic3RyYWN0X0ZyYWN0aW9uX09mX1NlY29uZF9WYWx1ZSBSVENFeCBTdWJzdHJhY3QgRnJhY3Rpb24gT2YgU2Vjb25kIFZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfUlRDX1NISUZUX1NVQkZTKEZTKSAoKEZTKSA8PSBSVENfU0hJRlRSX1NVQkZTKQorLyoqCisgICogQH0KKyAgKi8KKyNkZWZpbmUgSVNfUlRDX0NBTElCX09VVFBVVChPVVRQVVQpICAoKChPVVRQVVQpID09IFJUQ19DQUxJQk9VVFBVVF81MTJIWikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gUlRDX0NBTElCT1VUUFVUXzFIWikpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9SVENfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfc21hcnRjYXJkLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9zbWFydGNhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDVmMGRjCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfc21hcnRjYXJkLmgKQEAgLTAsMCArMSwxMTAxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9zbWFydGNhcmQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU01BUlRDQVJEIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0hBTF9TTUFSVENBUkRfSAorI2RlZmluZSBTVE0zMkwweHhfSEFMX1NNQVJUQ0FSRF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KQorLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJECisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX1R5cGVzIFNNQVJUQ0FSRCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBTTUFSVENBUkQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBTbWFydENhcmQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhdWQgcmF0ZSByZWdpc3RlciBpcyBjb21wdXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyID0gKCh1c2FydF9rZXJfY2twcmVzKSAvICgoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHVzYXJ0X2tlcl9ja3ByZXMgaXMgdGhlIFVTQVJUIGlucHV0IGNsb2NrIGRpdmlkZWQgYnkgYSBwcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBXb3JkTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIEByZWYgU01BUlRDQVJEX1dvcmRfTGVuZ3RoIGNhbiBvbmx5IGJlIHNldCB0byA5ICg4IGRhdGEgKyAxIHBhcml0eSBiaXRzKS4gKi8KKworICB1aW50MzJfdCBTdG9wQml0czsgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9TdG9wX0JpdHMuICovCisKKyAgdWludDE2X3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX1Bhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBwYXJpdHkgaXMgZW5hYmxlZCBieSBkZWZhdWx0IChQQ0UgaXMgZm9yY2VkIHRvIDEpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHRoZSBXb3JkTGVuZ3RoIGlzIGZvcmNlZCB0byA4IGJpdHMgKyBwYXJpdHksIE0gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZWQgdG8gMSBhbmQgdGhlIHBhcml0eSBiaXQgaXMgdGhlIDl0aCBiaXQuICovCisKKyAgdWludDE2X3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfTW9kZSAqLworCisgIHVpbnQxNl90IENMS1BvbGFyaXR5OyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9DbG9ja19Qb2xhcml0eSAqLworCisgIHVpbnQxNl90IENMS1BoYXNlOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0Nsb2NrX1BoYXNlICovCisKKyAgdWludDE2X3QgQ0xLTGFzdEJpdDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfTGFzdF9CaXQgKi8KKworICB1aW50MTZfdCBPbmVCaXRTYW1wbGluZzsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGEgc2luZ2xlIHNhbXBsZSBvciB0aHJlZSBzYW1wbGVzJyBtYWpvcml0eSB2b3RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGluZyB0aGUgc2luZ2xlIHNhbXBsZSBtZXRob2QgaW5jcmVhc2VzIHRoZSByZWNlaXZlciB0b2xlcmFuY2UgdG8gY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpYXRpb25zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9PbmVCaXRfU2FtcGxpbmcuICovCisKKyAgdWludDhfdCAgUHJlc2NhbGVyOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNtYXJ0Q2FyZCBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBmcm9tIDB4MDEgdG8gMHgxRi4gUHJlc2NhbGVyIHZhbHVlIGlzIG11bHRpcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAyIHRvIGdpdmUgdGhlIGRpdmlzaW9uIGZhY3RvciBvZiB0aGUgc291cmNlIGNsb2NrIGZyZXF1ZW5jeSAqLworCisgIHVpbnQ4X3QgIEd1YXJkVGltZTsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTbWFydENhcmQgR3VhcmQgVGltZSBhcHBsaWVkIGFmdGVyIHN0b3AgYml0cy4gKi8KKworICB1aW50MTZfdCBOQUNLRW5hYmxlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBTbWFydENhcmQgTkFDSyB0cmFuc21pc3Npb24gaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2YgcGFyaXR5IGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX05BQ0tfRW5hYmxlICovCisKKyAgdWludDMyX3QgVGltZU91dEVuYWJsZTsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZWl2ZXIgdGltZW91dCBpcyBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9UaW1lb3V0X0VuYWJsZSovCisKKyAgdWludDMyX3QgVGltZU91dFZhbHVlOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJlY2VpdmVyIHRpbWUgb3V0IHZhbHVlIGluIG51bWJlciBvZiBiYXVkIGJsb2NrczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgQ2hhcmFjdGVyIFdhaXQgVGltZSAoQ1dUKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9jayBXYWl0IFRpbWUgKEJXVCkuIEl0IGlzIGNvZGVkIG92ZXIgMjQgYml0cy4gKi8KKworICB1aW50OF90IEJsb2NrTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU21hcnRDYXJkIEJsb2NrIExlbmd0aCBpbiBUPTEgUmVjZXB0aW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBmcm9tIDB4MCB0byAweEZGICovCisKKyAgdWludDhfdCBBdXRvUmV0cnlDb3VudDsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNtYXJ0Q2FyZCBhdXRvLXJldHJ5IGNvdW50IChudW1iZXIgb2YgcmV0cmllcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlIGFuZCB0cmFuc21pdCBtb2RlKS4gV2hlbiBzZXQgdG8gMCwgcmV0cmFuc21pc3Npb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQuIE90aGVyd2lzZSwgaXRzIG1heGltdW0gdmFsdWUgaXMgNyAoYmVmb3JlIHNpZ25hbGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXJyb3IpICovCisKK30gU01BUlRDQVJEX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlcyBpbml0YWxpemF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBBZHZGZWF0dXJlSW5pdDsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCBhZHZhbmNlZCBTTUFSVENBUkQgZmVhdHVyZXMgaXMgaW5pdGlhbGl6ZWQuIFNldmVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlZCBmZWF0dXJlcyBtYXkgYmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHNhbWUgdGltZS4gVGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSREV4X0FkdmFuY2VkX0ZlYXR1cmVzX0luaXRpYWxpemF0aW9uX1R5cGUgKi8KKworICB1aW50MzJfdCBUeFBpbkxldmVsSW52ZXJ0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUWCBwaW4gYWN0aXZlIGxldmVsIGlzIGludmVydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX1R4X0ludiAgKi8KKworICB1aW50MzJfdCBSeFBpbkxldmVsSW52ZXJ0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSWCBwaW4gYWN0aXZlIGxldmVsIGlzIGludmVydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX1J4X0ludiAgKi8KKworICB1aW50MzJfdCBEYXRhSW52ZXJ0OyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGRhdGEgYXJlIGludmVydGVkIChwb3NpdGl2ZS9kaXJlY3QgbG9naWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cyBuZWdhdGl2ZS9pbnZlcnRlZCBsb2dpYykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfRGF0YV9JbnYgKi8KKworICB1aW50MzJfdCBTd2FwOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIFRYIGFuZCBSWCBwaW5zIGFyZSBzd2FwcGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX1J4X1R4X1N3YXAgKi8KKworICB1aW50MzJfdCBPdmVycnVuRGlzYWJsZTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZWNlcHRpb24gb3ZlcnJ1biBkZXRlY3Rpb24gaXMgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfT3ZlcnJ1bl9EaXNhYmxlICovCisKKyAgdWludDMyX3QgRE1BRGlzYWJsZW9uUnhFcnJvcjsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgRE1BIGlzIGRpc2FibGVkIGluIGNhc2Ugb2YgcmVjZXB0aW9uIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0RNQV9EaXNhYmxlX29uX1J4X0Vycm9yICovCisKKyAgdWludDMyX3QgTVNCRmlyc3Q7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBNU0IgaXMgc2VudCBmaXJzdCBvbiBVQVJUIGxpbmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfTVNCX0ZpcnN0ICovCisKKyAgdWludDE2X3QgVHhDb21wbGV0aW9uSW5kaWNhdGlvbjsgICAgIC8qITwgU3BlY2lmaWVzIHdoaWNoIHRyYW5zbWlzc2lvbiBjb21wbGV0aW9uIGluZGljYXRpb24gaXMgdXNlZDogYmVmb3JlICh3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW50IGZsYWcgaXMgYXZhaWxhYmxlKSBvciBvbmNlIGd1YXJkIHRpbWUgcGVyaW9kIGhhcyBlbGFwc2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJERXhfVHJhbnNtaXNzaW9uX0NvbXBsZXRpb25fSW5kaWNhdGlvbi4gKi8KK30gU01BUlRDQVJEX0FkdkZlYXR1cmVJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIEhBTCBTTUFSVENBUkQgU3RhdGUgZGVmaW5pdGlvbgorICAqIEBub3RlICBIQUwgU01BUlRDQVJEIFN0YXRlIHZhbHVlIGlzIGEgY29tYmluYXRpb24gb2YgMiBkaWZmZXJlbnQgc3Vic3RhdGVzOiBnU3RhdGUgYW5kIFJ4U3RhdGUgKHNlZSBAcmVmIFNNQVJUQ0FSRF9TdGF0ZV9EZWZpbml0aW9uKS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgU01BUlRDQVJEIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50CisgICogICAgICAgICAgYW5kIGFsc28gaW5mb3JtYXRpb24gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLgorICAqICAgICAgICAgIGdTdGF0ZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOgorICAqICAgICAgICAgIGI3LWI2ICBFcnJvciBpbmZvcm1hdGlvbgorICAqICAgICAgICAgICAgIDAwIDogTm8gRXJyb3IKKyAgKiAgICAgICAgICAgICAwMSA6IChOb3QgVXNlZCkKKyAgKiAgICAgICAgICAgICAxMCA6IFRpbWVvdXQKKyAgKiAgICAgICAgICAgICAxMSA6IEVycm9yCisgICogICAgICAgICAgYjUgICAgIFBlcmlwaGVyYWwgaW5pdGlhbGl6YXRpb24gc3RhdHVzCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAoUGVyaXBoZXJhbCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgICAgMSAgOiBJbml0IGRvbmUgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkLiBIQUwgU01BUlRDQVJEIEluaXQgZnVuY3Rpb24gYWxyZWFkeSBjYWxsZWQpCisgICogICAgICAgICAgYjQtYjMgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAKKyAgKiAgICAgICAgICBiMiAgICAgSW50cmluc2ljIHByb2Nlc3Mgc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5CisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChQZXJpcGhlcmFsIGJ1c3kgd2l0aCBzb21lIGNvbmZpZ3VyYXRpb24gb3IgaW50ZXJuYWwgb3BlcmF0aW9ucykKKyAgKiAgICAgICAgICBiMSAgICAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwCisgICogICAgICAgICAgYjAgICAgIFR4IHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgLSBSeFN0YXRlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gUnggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBSeFN0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6CisgICogICAgICAgICAgYjctYjYgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAKKyAgKiAgICAgICAgICBiNSAgICAgUGVyaXBoZXJhbCBpbml0aWFsaXphdGlvbiBzdGF0dXMKKyAgKiAgICAgICAgICAgICAwICA6IFJlc2V0IChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICAgICAxICA6IEluaXQgZG9uZSAoUGVyaXBoZXJhbCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgYjQtYjIgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgIHh4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAwCisgICogICAgICAgICAgYjEgICAgIFJ4IHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gUnggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICBiMCAgICAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwLgorICAqLwordHlwZWRlZiB1aW50MzJfdCBIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmCit7CisgIFVTQVJUX1R5cGVEZWYgICAgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgIC8qITwgVVNBUlQgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBTTUFSVENBUkRfSW5pdFR5cGVEZWYgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCisKKyAgU01BUlRDQVJEX0FkdkZlYXR1cmVJbml0VHlwZURlZiAgIEFkdmFuY2VkSW5pdDsgICAgICAgICAgLyohPCBTbWFydENhcmQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBTbWFydENhcmQgVHggdHJhbnNmZXIgQnVmZmVyICAgICAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgVHhYZmVyU2l6ZTsgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIFR4WGZlckNvdW50OyAgICAgICAgICAgLyohPCBTbWFydENhcmQgVHggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFJ4QnVmZlB0cjsgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBTbWFydENhcmQgUnggdHJhbnNmZXIgQnVmZmVyICAgICAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgUnhYZmVyU2l6ZTsgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIFJ4WGZlckNvdW50OyAgICAgICAgICAgLyohPCBTbWFydENhcmQgUnggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKyAgdm9pZCAoKlJ4SVNSKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgLyohPCBGdW5jdGlvbiBwb2ludGVyIG9uIFJ4IElSUSBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCpUeElTUikoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBvbiBUeCBJUlEgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAgICAgKmhkbWF0eDsgICAgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgICAgICpoZG1hcng7ICAgICAgICAgICAgICAgLyohPCBTbWFydENhcmQgUnggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmICAgZ1N0YXRlOyAgICAgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmICovCisKKyAgX19JTyBIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiAgIFJ4U3RhdGU7ICAgICAgICAgICAgICAgLyohPCBTbWFydENhcmQgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1NNQVJUQ0FSRF9TdGF0ZVR5cGVEZWYgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBUeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBSeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBFcnJvciBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogQWJvcnRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAqLworCisgIHZvaWQgKCogQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjaykoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAvKiE8IFNNQVJUQ0FSRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworCisgIHZvaWQgKCogQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7ICAvKiE8IFNNQVJUQ0FSRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICAqLworCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7ICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBNc3AgSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAqLworI2VuZGlmICAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworfSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFNNQVJUQ0FSRCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1NNQVJUQ0FSRF9UWF9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFNNQVJUQ0FSRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfU01BUlRDQVJEX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgU01BUlRDQVJEIFJ4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9TTUFSVENBUkRfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBTTUFSVENBUkQgRXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NNQVJUQ0FSRF9BQk9SVF9DT01QTEVURV9DQl9JRCAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFNNQVJUQ0FSRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAqLworICBIQUxfU01BUlRDQVJEX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEID0gMHgwNFUsICAgIC8qITwgU01BUlRDQVJEIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElEICovCisgIEhBTF9TTUFSVENBUkRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCAgPSAweDA1VSwgICAgLyohPCBTTUFSVENBUkQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayBJRCAgKi8KKworICBIQUxfU01BUlRDQVJEX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwOFUsICAgIC8qITwgU01BUlRDQVJEIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICovCisgIEhBTF9TTUFSVENBUkRfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDA5VSAgICAgLyohPCBTTUFSVENBUkQgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKworfSBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTTUFSVENBUkQgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcFNNQVJUQ0FSRF9DYWxsYmFja1R5cGVEZWYpKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgIC8qITwgcG9pbnRlciB0byBhbiBTTUFSVENBUkQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIFNNQVJUQ0FSRCBjbG9jayBzb3VyY2VzCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsxICAgICA9IDB4MDBVLCAvKiE8IFBDTEsxIGNsb2NrIHNvdXJjZSAgICAgICAgICovCisgIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9QQ0xLMiAgICAgPSAweDAxVSwgLyohPCBQQ0xLMiBjbG9jayBzb3VyY2UgICAgICAgICAqLworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJICAgICAgID0gMHgwMlUsIC8qITwgSFNJIGNsb2NrIHNvdXJjZSAgICAgICAgICAgKi8KKyAgU01BUlRDQVJEX0NMT0NLU09VUkNFX1NZU0NMSyAgICA9IDB4MDRVLCAvKiE8IFNZU0NMSyBjbG9jayBzb3VyY2UgICAgICAgICovCisgIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9MU0UgICAgICAgPSAweDA4VSwgLyohPCBMU0UgY2xvY2sgc291cmNlICAgICAgICAgICAqLworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEID0gMHgxMFUgIC8qITwgdW5kZWZpbmVkIGNsb2NrIHNvdXJjZSAgICAgKi8KK30gU01BUlRDQVJEX0Nsb2NrU291cmNlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0NvbnN0YW50cyAgU01BUlRDQVJEIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1N0YXRlX0RlZmluaXRpb24gU01BUlRDQVJEIFN0YXRlIENvZGUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSAgICAgICAgICAgIDB4MDAwMDAwMjBVICAgICAgICAgICAgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWSAgICAgICAgICAgICAweDAwMDAwMDI0VSAgICAgICAgICAgICAgICAgICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1RYICAgICAgICAgIDB4MDAwMDAwMjFVICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlggICAgICAgICAgMHgwMDAwMDAyMlUgICAgICAgICAgICAgICAgICAgICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIFJ4U3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFhfUlggICAgICAgMHgwMDAwMDAyM1UgICAgICAgICAgICAgICAgICAgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIGFuZCBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHRvIGJlIHVzZWQgZm9yIG5laXRoZXIgZ1N0YXRlIG5vciBSeFN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIHJlc3VsdCBvZiBjb21iaW5hdGlvbiAoT3IpIGJldHdlZW4gZ1N0YXRlIGFuZCBSeFN0YXRlIHZhbHVlcyAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX1RJTUVPVVQgICAgICAgICAgMHgwMDAwMDBBMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVvdXQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX0VSUk9SICAgICAgICAgICAgMHgwMDAwMDBFMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0Vycm9yX0RlZmluaXRpb24gU01BUlRDQVJEIEVycm9yIENvZGUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9FUlJPUl9QRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAgICAgICAgLyohPCBQYXJpdHkgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX05FICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgICAgICAgICAvKiE8IE5vaXNlIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfRkUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAgICAgICAgIC8qITwgZnJhbWUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9FUlJPUl9PUkUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOFUpICAgICAgICAgLyohPCBPdmVycnVuIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX0RNQSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkgICAgICAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfUlRPICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKSAgICAgICAgIC8qITwgUmVjZWl2ZXIgVGltZU91dCBlcnJvciAgKi8KKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAgICAgICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1dvcmRfTGVuZ3RoIFNNQVJUQ0FSRCBXb3JkIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9XT1JETEVOR1RIXzlCICAgICAgICAgICAgIFVTQVJUX0NSMV9NMCAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgbGVuZ3RoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9TdG9wX0JpdHMgU01BUlRDQVJEIE51bWJlciBvZiBTdG9wIEJpdHMKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfU1RPUEJJVFNfMF81ICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIHdpdGggMC41IHN0b3AgYml0ICAqLworI2RlZmluZSBTTUFSVENBUkRfU1RPUEJJVFNfMV81ICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUCAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIHdpdGggMS41IHN0b3AgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUGFyaXR5IFNNQVJUQ0FSRCBQYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICBVU0FSVF9DUjFfUENFICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGV2ZW4gcGFyaXR5ICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QQVJJVFlfT0REICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTKSAgLyohPCBTTUFSVENBUkQgZnJhbWUgb2RkIHBhcml0eSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX01vZGUgU01BUlRDQVJEIFRyYW5zZmVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfTU9ERV9SWCAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUkUgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIFJYIG1vZGUgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9NT0RFX1RYICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgVFggbW9kZSAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX01PREVfVFhfUlggICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgICAvKiE8IFNNQVJUQ0FSRCBSWCBhbmQgVFggbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfQ2xvY2tfUG9sYXJpdHkgU01BUlRDQVJEIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBsb3cgcG9sYXJpdHkgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QT0xBUklUWV9ISUdIICAgICAgICAgICAgIFVTQVJUX0NSMl9DUE9MICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgaGlnaCBwb2xhcml0eSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfQ2xvY2tfUGhhc2UgU01BUlRDQVJEIENsb2NrIFBoYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BIQVNFXzFFREdFICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBwaGFzZSBvbiBmaXJzdCBjbG9jayB0cmFuc2l0aW9uICAqLworI2RlZmluZSBTTUFSVENBUkRfUEhBU0VfMkVER0UgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ1BIQSAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIHBoYXNlIG9uIHNlY29uZCBjbG9jayB0cmFuc2l0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9MYXN0X0JpdCBTTUFSVENBUkQgTGFzdCBCaXQKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9ESVNBQkxFICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGxhc3QgZGF0YSBiaXQgY2xvY2sgcHVsc2Ugbm90IG91dHB1dCB0byBTQ0xLIHBpbiAqLworI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEUgICAgICAgICAgICBVU0FSVF9DUjJfTEJDTCAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGxhc3QgZGF0YSBiaXQgY2xvY2sgcHVsc2Ugb3V0cHV0IHRvIFNDTEsgcGluICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfT25lQml0X1NhbXBsaW5nIFNNQVJUQ0FSRCBPbmUgQml0IFNhbXBsaW5nIE1ldGhvZAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgb25lLWJpdCBzYW1wbGUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0VOQUJMRSAgICAgVVNBUlRfQ1IzX09ORUJJVCAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBvbmUtYml0IHNhbXBsZSBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfTkFDS19FbmFibGUgU01BUlRDQVJEIE5BQ0sgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX05BQ0tfRElTQUJMRSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBOQUNLIHRyYW5zbWlzc2lvbiBkaXNhYmxlZCAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX05BQ0tfRU5BQkxFICAgICAgICAgICAgICAgVVNBUlRfQ1IzX05BQ0sgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBOQUNLIHRyYW5zbWlzc2lvbiBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9UaW1lb3V0X0VuYWJsZSBTTUFSVENBUkQgVGltZW91dCBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfVElNRU9VVF9ESVNBQkxFICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RJTUVPVVRfRU5BQkxFICAgICAgICAgICAgVVNBUlRfQ1IyX1JUT0VOICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9UeF9JbnYgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9UWElOVl9ESVNBQkxFICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9UWElOVl9FTkFCTEUgICBVU0FSVF9DUjJfVFhJTlYgICAgICAgICAgICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUnhfSW52IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlZfRElTQUJMRSAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGRpc2FibGUgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlZfRU5BQkxFICAgVVNBUlRfQ1IyX1JYSU5WICAgICAgICAgICAgICAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0RhdGFfSW52IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIEJpbmFyeSBEYXRhIGludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZfRElTQUJMRSAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WX0VOQUJMRSAgIFVTQVJUX0NSMl9EQVRBSU5WICAgICAgICAgIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1J4X1R4X1N3YXAgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgUlggVFggcGlucyBzd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgc3dhcCBkaXNhYmxlICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfRU5BQkxFICAgIFVTQVJUX0NSMl9TV0FQICAgICAgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfT3ZlcnJ1bl9EaXNhYmxlIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIE92ZXJydW4gRGlzYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBSWCBvdmVycnVuIGVuYWJsZSAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFICBVU0FSVF9DUjNfT1ZSRElTICAgICAgICAgICAvKiE8IFJYIG92ZXJydW4gZGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRE1BX0Rpc2FibGVfb25fUnhfRXJyb3IgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgRE1BIERpc2FibGUgb24gUnggRXJyb3IKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRU5BQkxFT05SWEVSUk9SICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgRE1BIGVuYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQV9ESVNBQkxFT05SWEVSUk9SICBVU0FSVF9DUjNfRERSRSAgICAgICAgLyohPCBETUEgZGlzYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX01TQl9GaXJzdCAgIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIE1TQiBmaXJzdAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0RJU0FCTEUgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIGZpcnN0IGRpc2FibGUgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfRU5BQkxFICAgICAgIFVTQVJUX0NSMl9NU0JGSVJTVCAgICAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUmVxdWVzdF9QYXJhbWV0ZXJzIFNNQVJUQ0FSRCBSZXF1ZXN0IFBhcmFtZXRlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICBVU0FSVF9SUVJfUlhGUlEgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBkYXRhIGZsdXNoIHJlcXVlc3QgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgVVNBUlRfUlFSX1RYRlJRICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgZmx1c2ggcmVxdWVzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfSW50ZXJydXB0aW9uX01hc2sgU01BUlRDQVJEIGludGVycnVwdGlvbnMgZmxhZ3MgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRlUgICAvKiE8IFNNQVJUQ0FSRCBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBFMFUgICAvKiE8IFNNQVJUQ0FSRCBjb250cm9sIHJlZ2lzdGVyIG1hc2sgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DUl9QT1MgICAgICAgICAgICAgICAgICAgIDVVICAgICAgICAvKiE8IFNNQVJUQ0FSRCBjb250cm9sIHJlZ2lzdGVyIHBvc2l0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JU1JfTUFTSyAgICAgICAgICAgICAgICAgIDB4MUYwMFUgICAvKiE8IFNNQVJUQ0FSRCBJU1IgcmVnaXN0ZXIgbWFzayAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JU1JfUE9TICAgICAgICAgICAgICAgICAgIDhVICAgICAgICAvKiE8IFNNQVJUQ0FSRCBJU1IgcmVnaXN0ZXIgcG9zaXRpb24gICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfTWFjcm9zICBTTUFSVENBUkQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgU01BUlRDQVJEIGhhbmRsZSBzdGF0ZXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFNNQVJUQ0FSRCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2VuZGlmIC8qVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICAqLworCisvKiogQGJyaWVmICBGbHVzaCB0aGUgU21hcnRjYXJkIERhdGEgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9GTFVTSF9EUlJFR0lTVEVSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgU01BUlRDQVJEX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgICAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfUEVGICAgIFBhcml0eSBlcnJvciBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0ZFRiAgICBGcmFtaW5nIGVycm9yIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfTkVGICAgIE5vaXNlIGRldGVjdGVkIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfT1JFRiAgIE92ZXJSdW4gZXJyb3IgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9JRExFRiAgSWRsZSBsaW5lIGRldGVjdGVkIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfVENGICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1RDQkdURiBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9SVE9GICAgUmVjZWl2ZXIgdGltZW91dCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0VPQkYgICBFbmQgb2YgYmxvY2sgY2xlYXIgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUFSVENBUkQgUEUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9QRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFNNQVJUQ0FSRF9DTEVBUl9QRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUFSVENBUkQgRkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFNNQVJUQ0FSRF9DTEVBUl9GRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUFSVENBUkQgTkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9ORUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFNNQVJUQ0FSRF9DTEVBUl9ORUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUFSVENBUkQgT1JFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfT1JFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgU01BUlRDQVJEX0NMRUFSX09SRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUFSVENBUkQgSURMRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lETEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBTTUFSVENBUkRfQ0xFQVJfSURMRUYpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTbWFydGNhcmQgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfVENCR1QgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGZsYWcgKHdoZW4gZmxhZyBhdmFpbGFibGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfUkVBQ0sgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1RFQUNLIFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfQlVTWSAgQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfRU9CRiAgRW5kIG9mIGJsb2NrIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19SVE9GICBSZWNlaXZlciB0aW1lb3V0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19UWEUgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1JYTkUgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX09SRSAgIE92ZXJydW4gZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX05FICAgIE5vaXNlIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19GRSAgICBGcmFtaW5nIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19QRSAgICBQYXJpdHkgZXJyb3IgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBTbWFydENhcmQgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIGludGVycnVwdCB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRU9CICAgIEVuZCBvZiBibG9jayBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlRPICAgIFJlY2VpdmUgdGltZW91dCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhFICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RDICAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RDQkdUICBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgaW50ZXJydXB0ICh3aGVuIGludGVycnVwdGlvbiBhdmFpbGFibGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYTkUgICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9JRExFICAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUEUgICAgIFBhcml0eSBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRVJSICAgIEVycm9yIGludGVycnVwdChmcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9DUl9NQVNLKSA+PiBTTUFSVENBUkRfQ1JfUE9TKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzIHw9ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU21hcnRDYXJkIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FT0IgICAgRW5kIG9mIGJsb2NrIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SVE8gICAgUmVjZWl2ZSB0aW1lb3V0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEUgICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVEMgICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVENCR1QgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBpbnRlcnJ1cHQgKHdoZW4gaW50ZXJydXB0aW9uIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhORSAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0lETEUgICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9QRSAgICAgUGFyaXR5IGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FUlIgICAgRXJyb3IgaW50ZXJydXB0KGZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKCgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfQ1JfTUFTSykgPj4gU01BUlRDQVJEX0NSX1BPUykgPT0gMVUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfQ1JfTUFTSykgPj4gU01BUlRDQVJEX0NSX1BPUykgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0lUX01BU0spKSkpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTbWFydENhcmQgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0VPQiAgICBFbmQgb2YgYmxvY2sgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JUTyAgICBSZWNlaXZlIHRpbWVvdXQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRSAgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UQyAgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UQ0JHVCAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGludGVycnVwdCAod2hlbiBpbnRlcnJ1cHRpb24gYXZhaWxhYmxlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWE5FICAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfSURMRSAgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1BFICAgICBQYXJpdHkgZXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0VSUiAgICBFcnJvciBpbnRlcnJ1cHQoZnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgodWludDMyX3QpMHgwMVUgPDwgKCgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVNSX01BU0spPj4gU01BUlRDQVJEX0lTUl9QT1MpKSkgIT0gMFUpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTbWFydENhcmQgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0VPQiAgICBFbmQgb2YgYmxvY2sgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JUTyAgICBSZWNlaXZlIHRpbWVvdXQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRSAgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UQyAgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UQ0JHVCAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGludGVycnVwdCAod2hlbiBpbnRlcnJ1cHRpb24gYXZhaWxhYmxlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWE5FICAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfSURMRSAgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1BFICAgICBQYXJpdHkgZXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0VSUiAgICBFcnJvciBpbnRlcnJ1cHQoZnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDB4MDFVKT8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDB4MDJVKT8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgodWludDMyX3QpMHgwMVUgPDwgKCgodWludDE2X3QpKF9fSU5URVJSVVBUX18pKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpICAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JVF9DTEVBUl9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyIGZsYWcgdGhhdCBuZWVkcyB0byBiZSBzZXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgdG8gY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1BFRiAgICBQYXJpdHkgZXJyb3IgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9GRUYgICAgRnJhbWluZyBlcnJvciBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX05FRiAgICBOb2lzZSBkZXRlY3RlZCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX09SRUYgICBPdmVyUnVuIGVycm9yIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfSURMRUYgIElkbGUgbGluZSBkZXRlY3Rpb24gY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9UQ0YgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfVENCR1RGIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBjbGVhciBmbGFnICh3aGVuIGZsYWcgYXZhaWxhYmxlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9SVE9GICAgUmVjZWl2ZXIgdGltZW91dCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0VPQkYgICBFbmQgb2YgYmxvY2sgY2xlYXIgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSIHw9ICh1aW50MzJfdCkoX19JVF9DTEVBUl9fKSkKKworLyoqIEBicmllZiAgU2V0IGEgc3BlY2lmaWMgU01BUlRDQVJEIHJlcXVlc3QgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19SRVFfXyBzcGVjaWZpZXMgdGhlIHJlcXVlc3QgZmxhZyB0byBzZXQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9SWERBVEFfRkxVU0hfUkVRVUVTVCBSZWNlaXZlIGRhdGEgZmx1c2ggUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9UWERBVEFfRkxVU0hfUkVRVUVTVCBUcmFuc21pdCBkYXRhIGZsdXNoIFJlcXVlc3QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIgfD0gKHVpbnQxNl90KShfX1JFUV9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBTTUFSVENBUkQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSM3w9IFVTQVJUX0NSM19PTkVCSVQpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBvbmUgYml0IHNhbXBsZSBtZXRob2QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSAodWludDMyX3QpfigodWludDMyX3QpVVNBUlRfQ1IzX09ORUJJVCkpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgVVNBUlQgYXNzb2NpYXRlZCB0byB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAgVVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBVU0FSVCBhc3NvY2lhdGVkIHRvIHRoZSBTTUFSVENBUkQgSGFuZGxlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gIH5VU0FSVF9DUjFfVUUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUHJpdmF0ZV9NYWNyb3MgU01BUlRDQVJEIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBTTUFSVENBUkQgY2xvY2sgc291cmNlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0NMT0NLU09VUkNFX18gb3V0cHV0IHZhcmlhYmxlLgorICAqIEByZXR2YWwgdGhlIFNNQVJUQ0FSRCBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICAqLworI2lmIGRlZmluZWQgKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4QikgfHwgZGVmaW5lZCAoU1RNMzJMMDEweDgpCisjZGVmaW5lIFNNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLF9fQ0xPQ0tTT1VSQ0VfXykgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKyNlbHNlIC8qIChTVE0zMkwwMzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDQxeHgpIHx8IChTVE0zMkwwMTF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDIxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAxMHhCKSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4OCkqLworCisjZGVmaW5lIFNNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLF9fQ0xPQ0tTT1VSQ0VfXykgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMikgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZW5kaWYgLyogKFNUTTMyTDAzMXh4KSB8fCAoU1RNMzJMMDQxeHgpIHx8IChTVE0zMkwwMTF4eCkgfHwgKFNUTTMyTDAyMXh4KSB8fCAoU1RNMzJMMDEweEIpIHx8IChTVE0zMkwwMTB4OCkqLworCisKKy8qKiBAYnJpZWYgIENoZWNrIHRoZSBCYXVkIHJhdGUgcmFuZ2UuCisgICogQG5vdGUgICBUaGUgbWF4aW11bSBCYXVkIFJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIGNsb2NrIG9uIEwwICgzMiBNSHopCisgICogICAgICAgICBkaXZpZGVkIGJ5IHRoZSBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgU01BUlRDQVJEIChpLmUuIDE2KS4KKyAgKiBAcGFyYW0gIF9fQkFVRFJBVEVfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9CQVVEUkFURShfX0JBVURSQVRFX18pICgoX19CQVVEUkFURV9fKSA8IDIwMDAwMDFVKQorCisvKiogQGJyaWVmICBDaGVjayB0aGUgYmxvY2sgbGVuZ3RoIHJhbmdlLgorICAqIEBub3RlICAgVGhlIG1heGltdW0gU01BUlRDQVJEIGJsb2NrIGxlbmd0aCBpcyAweEZGLgorICAqIEBwYXJhbSAgX19MRU5HVEhfXyBibG9jayBsZW5ndGguCisgICogQHJldHZhbCBUZXN0IHJlc3VsdCAoVFJVRSBvciBGQUxTRSkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0JMT0NLTEVOR1RIKF9fTEVOR1RIX18pICgoX19MRU5HVEhfXykgPD0gMHhGRlUpCisKKy8qKiBAYnJpZWYgIENoZWNrIHRoZSByZWNlaXZlciB0aW1lb3V0IHZhbHVlLgorICAqIEBub3RlICAgVGhlIG1heGltdW0gU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgaXMgMHhGRkZGRkYuCisgICogQHBhcmFtICBfX1RJTUVPVVRWQUxVRV9fIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUuCisgICogQHJldHZhbCBUZXN0IHJlc3VsdCAoVFJVRSBvciBGQUxTRSkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1RJTUVPVVRfVkFMVUUoX19USU1FT1VUVkFMVUVfXykgICAgKChfX1RJTUVPVVRWQUxVRV9fKSA8PSAweEZGRkZGRlUpCisKKy8qKiBAYnJpZWYgIENoZWNrIHRoZSBTTUFSVENBUkQgYXV0b3JldHJ5IGNvdW50ZXIgdmFsdWUuCisgICogQG5vdGUgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGlzIDB4Ny4KKyAgKiBAcGFyYW0gIF9fQ09VTlRfXyBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BVVRPUkVUUllfQ09VTlQoX19DT1VOVF9fKSAgICAgICAgICgoX19DT1VOVF9fKSA8PSAweDdVKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBsZW5ndGggaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTEVOR1RIX18gU01BUlRDQVJEIGZyYW1lIGxlbmd0aC4KKyAgKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1dPUkRfTEVOR1RIKF9fTEVOR1RIX18pICgoX19MRU5HVEhfXykgPT0gU01BUlRDQVJEX1dPUkRMRU5HVEhfOUIpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUEJJVFNfXyBTTUFSVENBUkQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cy4KKyAgKiBAcmV0dmFsIFNFVCAoX19TVE9QQklUU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QQklUU19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9TVE9QQklUUyhfX1NUT1BCSVRTX18pICgoKF9fU1RPUEJJVFNfXykgPT0gU01BUlRDQVJEX1NUT1BCSVRTXzBfNSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gU01BUlRDQVJEX1NUT1BCSVRTXzFfNSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIHBhcml0eSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJJVFlfXyBTTUFSVENBUkQgZnJhbWUgcGFyaXR5LgorICAqIEByZXR2YWwgU0VUIChfX1BBUklUWV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJJVFlfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfUEFSSVRZKF9fUEFSSVRZX18pICgoKF9fUEFSSVRZX18pID09IFNNQVJUQ0FSRF9QQVJJVFlfRVZFTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSSVRZX18pID09IFNNQVJUQ0FSRF9QQVJJVFlfT0REKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgY29tbXVuaWNhdGlvbiBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBTTUFSVENBUkQgY29tbXVuaWNhdGlvbiBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9NT0RFKF9fTU9ERV9fKSAoKCgoX19NT0RFX18pICYgMHhGRkYzVSkgPT0gMHgwMFUpICYmICgoX19NT0RFX18pICE9IDB4MDBVKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgcG9sYXJpdHkgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQ1BPTF9fIFNNQVJUQ0FSRCBmcmFtZSBwb2xhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19DUE9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NQT0xfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfUE9MQVJJVFkoX19DUE9MX18pICgoKF9fQ1BPTF9fKSA9PSBTTUFSVENBUkRfUE9MQVJJVFlfTE9XKSB8fCAoKF9fQ1BPTF9fKSA9PSBTTUFSVENBUkRfUE9MQVJJVFlfSElHSCkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIHBoYXNlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NQSEFfXyBTTUFSVENBUkQgZnJhbWUgcGhhc2UuCisgICogQHJldHZhbCBTRVQgKF9fQ1BIQV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DUEhBX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1BIQVNFKF9fQ1BIQV9fKSAoKChfX0NQSEFfXykgPT0gU01BUlRDQVJEX1BIQVNFXzFFREdFKSB8fCAoKF9fQ1BIQV9fKSA9PSBTTUFSVENBUkRfUEhBU0VfMkVER0UpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBsYXN0IGJpdCBjbG9jayBwdWxzZSBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xBU1RCSVRfXyBTTUFSVENBUkQgZnJhbWUgbGFzdCBiaXQgY2xvY2sgcHVsc2Ugc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19MQVNUQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xBU1RCSVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfTEFTVEJJVChfX0xBU1RCSVRfXykgKCgoX19MQVNUQklUX18pID09IFNNQVJUQ0FSRF9MQVNUQklUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEFTVEJJVF9fKSA9PSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEUpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBzYW1wbGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19PTkVCSVRfXyBTTUFSVENBUkQgZnJhbWUgc2FtcGxpbmcuCisgICogQHJldHZhbCBTRVQgKF9fT05FQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09ORUJJVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRShfX09ORUJJVF9fKSAoKChfX09ORUJJVF9fKSA9PSBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PTkVCSVRfXykgPT0gU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIE5BQ0sgdHJhbnNtaXNzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTkFDS19fIFNNQVJUQ0FSRCBOQUNLIHRyYW5zbWlzc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX05BQ0tfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTkFDS19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9OQUNLKF9fTkFDS19fKSAoKChfX05BQ0tfXykgPT0gU01BUlRDQVJEX05BQ0tfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX05BQ0tfXykgPT0gU01BUlRDQVJEX05BQ0tfRElTQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19USU1FT1VUX18gU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19USU1FT1VUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RJTUVPVVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfVElNRU9VVChfX1RJTUVPVVRfXykgKCgoX19USU1FT1VUX18pID09IFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVElNRU9VVF9fKSA9PSBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEUpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlcyBpbml0aWFsaXphdGlvbiBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19JTklUX18gU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRpYWxpemF0aW9uLgorICAqIEByZXR2YWwgU0VUIChfX0lOSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSU5JVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0lOSVQoX19JTklUX18pICgoX19JTklUX18pIDw9IChTTUFSVENBUkRfQURWRkVBVFVSRV9OT19JTklUICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9JTklUICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIFRYIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RYSU5WX18gU01BUlRDQVJEIGZyYW1lIFRYIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX1RYSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RYSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlYoX19UWElOVl9fKSAoKChfX1RYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYSU5WX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIFJYIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1JYSU5WX18gU01BUlRDQVJEIGZyYW1lIFJYIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX1JYSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1JYSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlYoX19SWElOVl9fKSAoKChfX1JYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIGRhdGEgaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fREFUQUlOVl9fIFNNQVJUQ0FSRCBmcmFtZSBkYXRhIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX0RBVEFJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fREFUQUlOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlYoX19EQVRBSU5WX18pICgoKF9fREFUQUlOVl9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZfRU5BQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgUlgvVFggcGlucyBzd2FwIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1dBUF9fIFNNQVJUQ0FSRCBmcmFtZSBSWC9UWCBwaW5zIHN3YXAgc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19TV0FQX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NXQVBfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQURWRkVBVFVSRV9TV0FQKF9fU1dBUF9fKSAoKChfX1NXQVBfXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1dBUF9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9TV0FQX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIG92ZXJydW4gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19PVkVSUlVOX18gU01BUlRDQVJEIGZyYW1lIG92ZXJydW4gc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19PVkVSUlVOX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09WRVJSVU5fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfT1ZFUlJVTihfX09WRVJSVU5fXykgKCgoX19PVkVSUlVOX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09WRVJSVU5fXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgRE1BIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvbiBlcnJvciBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQV9fIFNNQVJUQ0FSRCBETUEgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIG9uIGVycm9yIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fRE1BX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUihfX0RNQV9fKSAoKChfX0RNQV9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRU5BQkxFT05SWEVSUk9SKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RNQV9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRElTQUJMRU9OUlhFUlJPUikpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01TQkZJUlNUX18gU01BUlRDQVJEIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX01TQkZJUlNUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01TQkZJUlNUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1QoX19NU0JGSVJTVF9fKSAoKChfX01TQkZJUlNUX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01TQkZJUlNUX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIHJlcXVlc3QgcGFyYW1ldGVyIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUkFNX18gU01BUlRDQVJEIHJlcXVlc3QgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgU0VUIChfX1BBUkFNX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUkFNX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1JFUVVFU1RfUEFSQU1FVEVSKF9fUEFSQU1fXykgKCgoX19QQVJBTV9fKSA9PSBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBTTUFSVENBUkRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFNNQVJUQ0FSRCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9zbWFydGNhcmRfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0RlSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfTXNwSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfTXNwRGVJbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlZ2lzdGVyQ2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIEhBTF9TTUFSVENBUkRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNNQVJUQ0FSRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVW5SZWdpc3RlckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlX0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKKwordm9pZCBIQUxfU01BUlRDQVJEX0lSUUhhbmRsZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3ZvaWQgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAeworICAqLworCitIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiBIQUxfU01BUlRDQVJEX0dldFN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3VpbnQzMl90ICAgICAgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRfR2V0RXJyb3IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9TTUFSVENBUkRfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfc21hcnRjYXJkX2V4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF9zbWFydGNhcmRfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGMyMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfc21hcnRjYXJkX2V4LmgKQEAgLTAsMCArMSwyNzkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3NtYXJ0Y2FyZF9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTTUFSVENBUkQgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkwweHhfSEFMX1NNQVJUQ0FSRF9FWF9ICisjZGVmaW5lIFNUTTMyTDB4eF9IQUxfU01BUlRDQVJEX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfQ29uc3RhbnRzICBTTUFSVENBUkQgRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeF9UcmFuc21pc3Npb25fQ29tcGxldGlvbl9JbmRpY2F0aW9uIFNNQVJUQ0FSRCBUcmFuc21pc3Npb24gQ29tcGxldGlvbiBJbmRpY2F0aW9uCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFVTQVJUX1RDQkdUX1NVUFBPUlQpCisjZGVmaW5lIFNNQVJUQ0FSRF9UQ0JHVCAgICAgIFNNQVJUQ0FSRF9JVF9UQ0JHVCAvKiE8IFNNQVJUQ0FSRCB0cmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgKi8KKyNlbmRpZiAvKiBVU0FSVF9UQ0JHVF9TVVBQT1JUICovCisjZGVmaW5lIFNNQVJUQ0FSRF9UQyAgICAgICAgIFNNQVJUQ0FSRF9JVF9UQyAgICAvKiE8IFNNQVJUQ0FSRCB0cmFuc21pc3Npb24gY29tcGxldGUgKGZsYWcgcmFpc2VkIHdoZW4gZ3VhcmQgdGltZSBoYXMgZWxhcHNlZCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfQWR2YW5jZWRfRmVhdHVyZXNfSW5pdGlhbGl6YXRpb25fVHlwZSBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZSBpbml0aWFsaXphdGlvbiB0eXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfTk9fSU5JVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgLyohPCBObyBhZHZhbmNlZCBmZWF0dXJlIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgLyohPCBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlZFUlRfSU5JVCAgICAgICAgICAgMHgwMDAwMDAwMlUgICAgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUICAgICAgICAgMHgwMDAwMDAwNFUgICAgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9JTklUICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhPVkVSUlVORElTQUJMRV9JTklUICAgMHgwMDAwMDAxMFUgICAgLyohPCBSWCBvdmVycnVuIGRpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCAgMHgwMDAwMDAyMFUgICAgLyohPCBETUEgZGlzYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCAgICAgICAgICAgMHgwMDAwMDA4MFUgICAgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIGZpcnN0ICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKFVTQVJUX1RDQkdUX1NVUFBPUlQpCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYQ09NUExFVElPTiAgICAgICAgICAgIDB4MDAwMDAxMDBVICAgIC8qITwgVFggY29tcGxldGlvbiBpbmRpY2F0aW9uIGJlZm9yZSBvZiBhZnRlciBndWFyZCB0aW1lICovCisjZW5kaWYgLyogVVNBUlRfVENCR1RfU1VQUE9SVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeF9GbGFncyBTTUFSVENBUkQgRmxhZ3MKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWAorICAqICAgICAgICAgICAtIDB4WFhYWCAgOiBGbGFnIG1hc2sgaW4gdGhlIElTUiByZWdpc3RlcgorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChVU0FSVF9UQ0JHVF9TVVBQT1JUKQorI2RlZmluZSBTTUFSVENBUkRfRkxBR19UQ0JHVCAgICAgICAgICBVU0FSVF9JU1JfVENCR1QgICAgICAgICAvKiE8IFNNQVJUQ0FSRCB0cmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgY29tcGxldGlvbiAqLworI2VuZGlmIC8qIFVTQVJUX1RDQkdUX1NVUFBPUlQgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfUkVBQ0sgICAgICAgICAgVVNBUlRfSVNSX1JFQUNLICAgICAgICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfVEVBQ0sgICAgICAgICAgVVNBUlRfSVNSX1RFQUNLICAgICAgICAgLyohPCBTTUFSVENBUkQgdHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfQlVTWSAgICAgICAgICAgVVNBUlRfSVNSX0JVU1kgICAgICAgICAgLyohPCBTTUFSVENBUkQgYnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfRU9CRiAgICAgICAgICAgVVNBUlRfSVNSX0VPQkYgICAgICAgICAgLyohPCBTTUFSVENBUkQgZW5kIG9mIGJsb2NrIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfUlRPRiAgICAgICAgICAgVVNBUlRfSVNSX1JUT0YgICAgICAgICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfVFhFICAgICAgICAgICAgVVNBUlRfSVNSX1RYRSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgdHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfVEMgICAgICAgICAgICAgVVNBUlRfSVNSX1RDICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfUlhORSAgICAgICAgICAgVVNBUlRfSVNSX1JYTkUgICAgICAgICAgLyohPCBTTUFSVENBUkQgcmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfSURMRSAgICAgICAgICAgVVNBUlRfSVNSX0lETEUgICAgICAgICAgLyohPCBTTUFSVENBUkQgaWRsZSBsaW5lIGRldGVjdGlvbiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfT1JFICAgICAgICAgICAgVVNBUlRfSVNSX09SRSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgb3ZlcnJ1biBlcnJvciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfTkUgICAgICAgICAgICAgVVNBUlRfSVNSX05FICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgbm9pc2UgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfRkUgICAgICAgICAgICAgVVNBUlRfSVNSX0ZFICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0ZMQUdfUEUgICAgICAgICAgICAgVVNBUlRfSVNSX1BFICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgcGFyaXR5IGVycm9yICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfSW50ZXJydXB0X2RlZmluaXRpb24gU01BUlRDQVJEIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwWlpaWlowWFhZWVlZWWIKKyAgKiAgICAgICAgICAgLSBZWVlZWSAgOiBJbnRlcnJ1cHQgc291cmNlIHBvc2l0aW9uIGluIHRoZSBYWCByZWdpc3RlciAoNSBiaXRzKQorICAqICAgICAgICAgICAtIFhYICA6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKDIgYml0cykKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBaWlpaWiAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBJU1IgcmVnaXN0ZXIoNSBiaXRzKQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9QRSAgICAgICAgICAgICAgICAgICAgIDB4MDAyOFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHBhcml0eSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9UWEUgICAgICAgICAgICAgICAgICAgIDB4MDcyN1UgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9UQyAgICAgICAgICAgICAgICAgICAgIDB4MDYyNlUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHRpb24gICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9SWE5FICAgICAgICAgICAgICAgICAgIDB4MDUyNVUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9JRExFICAgICAgICAgICAgICAgICAgIDB4MDQyNFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGlkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0aW9uICAgICAgICAgICovCisKKyNkZWZpbmUgU01BUlRDQVJEX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgMHgwMDYwVSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX09SRSAgICAgICAgICAgICAgICAgICAgMHgwMzAwVSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX05FICAgICAgICAgICAgICAgICAgICAgMHgwMjAwVSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgbm9pc2UgZXJyb3IgaW50ZXJydXB0aW9uICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX0ZFICAgICAgICAgICAgICAgICAgICAgMHgwMTAwVSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgZXJyb3IgaW50ZXJydXB0aW9uICAgKi8KKworI2RlZmluZSBTTUFSVENBUkRfSVRfRU9CICAgICAgICAgICAgICAgICAgICAweDBDM0JVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBlbmQgb2YgYmxvY2sgaW50ZXJydXB0aW9uICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfUlRPICAgICAgICAgICAgICAgICAgICAweDBCM0FVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IGludGVycnVwdGlvbiAqLworI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKKyNkZWZpbmUgU01BUlRDQVJEX0lUX1RDQkdUICAgICAgICAgICAgICAgICAgMHgxOTc4VSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGNvbXBsZXRpb24gaW50ZXJydXB0aW9uICovCisjZW5kaWYgLyogVVNBUlRfVENCR1RfU1VQUE9SVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0lUX0NMRUFSX0ZsYWdzIFNNQVJUQ0FSRCBJbnRlcnJ1cHRpb24gQ2xlYXIgRmxhZ3MKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQ0xFQVJfUEVGICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUEVDRiAgICAvKiE8IFNNQVJUQ0FSRCBwYXJpdHkgZXJyb3IgY2xlYXIgZmxhZyAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfQ0xFQVJfRkVGICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtaW5nIGVycm9yIGNsZWFyIGZsYWcgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfQ0xFQVJfTkVGICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkNGICAgICAvKiE8IFNNQVJUQ0FSRCBub2lzZSBlcnJvciBkZXRlY3RlZCBjbGVhciBmbGFnICAqLworI2RlZmluZSBTTUFSVENBUkRfQ0xFQVJfT1JFRiAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfT1JFQ0YgICAvKiE8IFNNQVJUQ0FSRCBvdmVycnVuIGVycm9yIGNsZWFyIGZsYWcgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfQ0xFQVJfSURMRUYgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAvKiE8IFNNQVJUQ0FSRCBpZGxlIGxpbmUgZGV0ZWN0ZWQgY2xlYXIgZmxhZyAgICAqLworI2RlZmluZSBTTUFSVENBUkRfQ0xFQVJfVENGICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAvKiE8IFNNQVJUQ0FSRCB0cmFuc21pc3Npb24gY29tcGxldGUgY2xlYXIgZmxhZyAqLworI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKKyNkZWZpbmUgU01BUlRDQVJEX0NMRUFSX1RDQkdURiAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQkdUQ0YgLyohPCBTTUFSVENBUkQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGNvbXBsZXRpb24gY2xlYXIgZmxhZyAqLworI2VuZGlmIC8qIFVTQVJUX1RDQkdUX1NVUFBPUlQgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0NMRUFSX1JUT0YgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1JUT0NGICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZSBvdXQgY2xlYXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0NMRUFSX0VPQkYgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0VPQkNGICAgLyohPCBTTUFSVENBUkQgZW5kIG9mIGJsb2NrIGNsZWFyIGZsYWcgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfUHJpdmF0ZV9NYWNyb3MgU01BUlRDQVJEIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgU2V0IHRoZSBUcmFuc21pc3Npb24gQ29tcGxldGlvbiBmbGFnCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAbm90ZSAgSWYgVENCR1QgKFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSkgZmxhZyBpcyBub3QgYXZhaWxhYmxlIG9yIGlmCisgICogICAgICAgIEFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uIGlzIG5vdCBhbHJlYWR5IGZpbGxlZCwgdGhlIGxhdHRlciBpcyBmb3JjZWQKKyAgKiAgICAgICAgdG8gU01BUlRDQVJEX1RDICh0cmFuc21pc3Npb24gY29tcGxldGlvbiBpbmRpY2F0aW9uIHdoZW4gZ3VhcmQgdGltZSBoYXMgZWxhcHNlZCkuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgZGVmaW5lZChVU0FSVF9UQ0JHVF9TVVBQT1JUKQorI2RlZmluZSBTTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT05fU0VUVElORyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEhBTF9JU19CSVRfQ0xSKChfX0hBTkRMRV9fKS0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9UWENPTVBMRVRJT04pKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKF9fSEFORExFX18pLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbiA9IFNNQVJUQ0FSRF9UQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1RSQU5TTUlTU0lPTl9DT01QTEVUSU9OKChfX0hBTkRMRV9fKS0+QWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24pKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKyNlbHNlCisjZGVmaW5lIFNNQVJUQ0FSRF9UUkFOU01JU1NJT05fQ09NUExFVElPTl9TRVRUSU5HKF9fSEFORExFX18pICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uID0gU01BUlRDQVJEX1RDOyBcCisgIH0gd2hpbGUoMFUpCisjZW5kaWYgLyogVVNBUlRfVENCR1RfU1VQUE9SVCAqLworCisvKiogQGJyaWVmICBSZXR1cm4gdGhlIHRyYW5zbWlzc2lvbiBjb21wbGV0aW9uIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAbm90ZSAgQmFzZWQgb24gQWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24gc2V0dGluZywgcmV0dXJuIFRDIG9yIFRDQkdUIGZsYWcuCisgICogICAgICAgIFdoZW4gVENCR1QgZmxhZyAoVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lKSBpcyBub3QgYXZhaWxhYmxlLCBUQyBmbGFnIGlzCisgICogICAgICAgIHJlcG9ydGVkLgorICAqIEByZXR2YWwgVHJhbnNtaXNzaW9uIGNvbXBsZXRpb24gZmxhZworICAqLworI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKKyNkZWZpbmUgU01BUlRDQVJEX1RSQU5TTUlTU0lPTl9DT01QTEVUSU9OX0ZMQUcoX19IQU5ETEVfXykgIFwKKyAgKCgoX19IQU5ETEVfXyktPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uID09IFNNQVJUQ0FSRF9UQykgPyAoU01BUlRDQVJEX0ZMQUdfVEMpIDogIChTTUFSVENBUkRfRkxBR19UQ0JHVCkpCisjZWxzZQorI2RlZmluZSBTTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT05fRkxBRyhfX0hBTkRMRV9fKSAgICAoU01BUlRDQVJEX0ZMQUdfVEMpCisjZW5kaWYgLyogVVNBUlRfVENCR1RfU1VQUE9SVCAqLworCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIHRyYW5zbWlzc2lvbiBjb21wbGV0aW9uIHVzZWQgZmxhZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19UWENPTVBMRVRFX18gU01BUlRDQVJEIGZyYW1lIHRyYW5zbWlzc2lvbiBjb21wbGV0aW9uIHVzZWQgZmxhZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19UWENPTVBMRVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RYQ09NUExFVEVfXyBpcyBpbnZhbGlkKQorICAqLworI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKKyNkZWZpbmUgSVNfU01BUlRDQVJEX1RSQU5TTUlTU0lPTl9DT01QTEVUSU9OKF9fVFhDT01QTEVURV9fKSAoKChfX1RYQ09NUExFVEVfXykgPT0gU01BUlRDQVJEX1RDQkdUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UWENPTVBMRVRFX18pID09IFNNQVJUQ0FSRF9UQykpCisjZWxzZQorI2RlZmluZSBJU19TTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT04oX19UWENPTVBMRVRFX18pICgoX19UWENPTVBMRVRFX18pID09IFNNQVJUQ0FSRF9UQykKKyNlbmRpZiAvKiBVU0FSVF9UQ0JHVF9TVVBQT1JUICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElPIG9wZXJhdGlvbiBtZXRob2RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRFeF9CbG9ja0xlbmd0aF9Db25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgQmxvY2tMZW5ndGgpOwordm9pZCAgICAgICAgICAgICAgSEFMX1NNQVJUQ0FSREV4X1RpbWVPdXRfQ29uZmlnKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBUaW1lT3V0VmFsdWUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0VuYWJsZVJlY2VpdmVyVGltZU91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfRGlzYWJsZVJlY2VpdmVyVGltZU91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfU01BUlRDQVJEX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX3NtYnVzLmggYi9JbmMvc3RtMzJsMHh4X2hhbF9zbWJ1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTk3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9zbWJ1cy5oCkBAIC0wLDAgKzEsNzQzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9zbWJ1cy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTTUJVUyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9IQUxfU01CVVNfSAorI2RlZmluZSBTVE0zMkwweHhfSEFMX1NNQlVTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUJVUworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQlVTX0V4cG9ydGVkX1R5cGVzIFNNQlVTIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19Db25maWd1cmF0aW9uX1N0cnVjdHVyZV9kZWZpbml0aW9uIFNNQlVTIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIFNNQlVTIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVGltaW5nOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNNQlVTX1RJTUlOR1JfcmVnaXN0ZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FsY3VsYXRlZCBieSByZWZlcnJpbmcgdG8gU01CVVMgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBSZWZlcmVuY2UgbWFudWFsICovCisgIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcjsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIEFuYWxvZyBGaWx0ZXIgaXMgZW5hYmxlIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX0FuYWxvZ19GaWx0ZXIgKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlyc3QgZGV2aWNlIG93biBhZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIDctYml0IG9yIDEwLWJpdCBhZGRyZXNzLiAqLworCisgIHVpbnQzMl90IEFkZHJlc3NpbmdNb2RlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIDctYml0IG9yIDEwLWJpdCBhZGRyZXNzaW5nIG1vZGUgZm9yIG1hc3RlciBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX2FkZHJlc3NpbmdfbW9kZSAqLworCisgIHVpbnQzMl90IER1YWxBZGRyZXNzTW9kZTsgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIGR1YWwgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01CVVNfZHVhbF9hZGRyZXNzaW5nX21vZGUgKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMjsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2Vjb25kIGRldmljZSBvd24gYWRkcmVzcyBpZiBkdWFsIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIDctYml0IGFkZHJlc3MuICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczJNYXNrczsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFja25vbGVkZ2UgbWFzayBhZGRyZXNzIHNlY29uZCBkZXZpY2Ugb3duIGFkZHJlc3MgaWYgZHVhbCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX293bl9hZGRyZXNzMl9tYXNrcy4gKi8KKworICB1aW50MzJfdCBHZW5lcmFsQ2FsbE1vZGU7ICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiBnZW5lcmFsIGNhbGwgbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX2dlbmVyYWxfY2FsbF9hZGRyZXNzaW5nX21vZGUuICovCisKKyAgdWludDMyX3QgTm9TdHJldGNoTW9kZTsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgbm9zdHJldGNoIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19ub3N0cmV0Y2hfbW9kZSAqLworCisgIHVpbnQzMl90IFBhY2tldEVycm9yQ2hlY2tNb2RlOyAgIC8qITwgU3BlY2lmaWVzIGlmIFBhY2tldCBFcnJvciBDaGVjayBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01CVVNfcGFja2V0X2Vycm9yX2NoZWNrX21vZGUgKi8KKworICB1aW50MzJfdCBQZXJpcGhlcmFsTW9kZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCBtb2RlIG9mIFBlcmlwaGFsIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01CVVNfcGVyaXBoZXJhbF9tb2RlICovCisKKyAgdWludDMyX3QgU01CdXNUaW1lb3V0OyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIDMyIEJpdHMgU01CVVNfVElNRU9VVF9yZWdpc3RlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVuYWJsZSBiaXRzIGFuZCBkaWZmZXJlbnQgdGltZW91dCB2YWx1ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FsY3VsYXRlZCBieSByZWZlcnJpbmcgdG8gU01CVVMgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBSZWZlcmVuY2UgbWFudWFsICovCit9IFNNQlVTX0luaXRUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfc3RhdGVfZGVmaW5pdGlvbiBIQUwgc3RhdGUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSEFMIFN0YXRlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfUkVTRVQgICAgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgU01CVVMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9SRUFEWSAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBTTUJVUyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX0JVU1kgICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAvKiE8IFNNQlVTIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFggICgweDAwMDAwMDEyVSkgIC8qITwgTWFzdGVyIERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCAgKDB4MDAwMDAwMjJVKSAgLyohPCBNYXN0ZXIgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFggICAoMHgwMDAwMDAzMlUpICAvKiE8IFNsYXZlIERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCAgICgweDAwMDAwMDQyVSkgIC8qITwgU2xhdmUgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9USU1FT1VUICAgICAgICAgKDB4MDAwMDAwMDNVKSAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX0VSUk9SICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAvKiE8IFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfTElTVEVOICAgICAgICAgICgweDAwMDAwMDA4VSkgICAvKiE8IEFkZHJlc3MgTGlzdGVuIE1vZGUgaXMgb25nb2luZyAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FcnJvcl9Db2RlX2RlZmluaXRpb24gU01CVVMgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBTTUJVUyBFcnJvciBDb2RlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfTk9ORSAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQkVSUiAgICAgICAgICAgICgweDAwMDAwMDAxVSkgICAgLyohPCBCRVJSIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQVJMTyAgICAgICAgICAgICgweDAwMDAwMDAyVSkgICAgLyohPCBBUkxPIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQUNLRiAgICAgICAgICAgICgweDAwMDAwMDA0VSkgICAgLyohPCBBQ0tGIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfT1ZSICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgICAgLyohPCBPVlIgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfSEFMVElNRU9VVCAgICAgICgweDAwMDAwMDEwVSkgICAgLyohPCBUaW1lb3V0IGVycm9yICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQlVTVElNRU9VVCAgICAgICgweDAwMDAwMDIwVSkgICAgLyohPCBCdXMgVGltZW91dCBlcnJvciAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQUxFUlQgICAgICAgICAgICgweDAwMDAwMDQwVSkgICAgLyohPCBBbGVydCBlcnJvciAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfUEVDRVJSICAgICAgICAgICgweDAwMDAwMDgwVSkgICAgLyohPCBQRUMgZXJyb3IgICAgICAgICAgICAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAgKDB4MDAwMDAxMDBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9QQVJBTSAgICAoMHgwMDAwMDIwMFUpICAgLyohPCBJbnZhbGlkIFBhcmFtZXRlcnMgZXJyb3IgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfaGFuZGxlX1N0cnVjdHVyZV9kZWZpbml0aW9uIFNNQlVTIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgU01CVVMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZgoreworICBJMkNfVHlwZURlZiAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgLyohPCBTTUJVUyByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICovCisKKyAgU01CVVNfSW5pdFR5cGVEZWYgICAgICAgICAgICBJbml0OyAgICAgICAgICAgIC8qITwgU01CVVMgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgKnBCdWZmUHRyOyAgICAgICAvKiE8IFBvaW50ZXIgdG8gU01CVVMgdHJhbnNmZXIgYnVmZmVyICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIFhmZXJTaXplOyAgICAgICAgLyohPCBTTUJVUyB0cmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICBYZmVyQ291bnQ7ICAgICAgIC8qITwgU01CVVMgdHJhbnNmZXIgY291bnRlciAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgWGZlck9wdGlvbnM7ICAgICAvKiE8IFNNQlVTIHRyYW5zZmVyIG9wdGlvbnMgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgIFByZXZpb3VzU3RhdGU7ICAgLyohPCBTTUJVUyBjb21tdW5pY2F0aW9uIFByZXZpb3VzIHN0YXRlICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgIC8qITwgU01CVVMgbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgU3RhdGU7ICAgICAgICAgICAvKiE8IFNNQlVTIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgLyohPCBTTUJVUyBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBNYXN0ZXJUeENwbHRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgIC8qITwgU01CVVMgTWFzdGVyIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqIE1hc3RlclJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOyAgICAgICAgICAgLyohPCBTTUJVUyBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCogU2xhdmVUeENwbHRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAvKiE8IFNNQlVTIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAgKi8KKyAgdm9pZCAoKiBTbGF2ZVJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOyAgICAgICAgICAgIC8qITwgU01CVVMgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICAqLworICB2b2lkICgqIExpc3RlbkNwbHRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAgLyohPCBTTUJVUyBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2sgICAgICAgICAgICAgICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAgICAgICAvKiE8IFNNQlVTIEVycm9yIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIEFkZHJDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsgIC8qITwgU01CVVMgU2xhdmUgQWRkcmVzcyBNYXRjaCBjYWxsYmFjayAqLworCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOyAgICAgICAgICAgICAgICAvKiE8IFNNQlVTIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAgIC8qITwgU01CVVMgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworCisjZW5kaWYgIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IFNNQlVTX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFNNQlVTIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfU01CVVNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgPSAweDAwVSwgICAgLyohPCBTTUJVUyBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAqLworICBIQUxfU01CVVNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgPSAweDAxVSwgICAgLyohPCBTTUJVUyBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAqLworICBIQUxfU01CVVNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgICAgICAgPSAweDAyVSwgICAgLyohPCBTTUJVUyBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAqLworICBIQUxfU01CVVNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgPSAweDAzVSwgICAgLyohPCBTTUJVUyBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAqLworICBIQUxfU01CVVNfTElTVEVOX0NPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDA0VSwgICAgLyohPCBTTUJVUyBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAqLworICBIQUxfU01CVVNfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA1VSwgICAgLyohPCBTTUJVUyBFcnJvciBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEhBTF9TTUJVU19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDZVLCAgICAvKiE8IFNNQlVTIE1zcCBJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9TTUJVU19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MDdVICAgICAvKiE8IFNNQlVTIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICovCisKK30gSEFMX1NNQlVTX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTTUJVUyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwU01CVVNfQ2FsbGJhY2tUeXBlRGVmKShTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOyAvKiE8IHBvaW50ZXIgdG8gYW4gU01CVVMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgIHZvaWQgKCpwU01CVVNfQWRkckNhbGxiYWNrVHlwZURlZikoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsgLyohPCBwb2ludGVyIHRvIGFuIFNNQlVTIEFkZHJlc3MgTWF0Y2ggY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9Db25zdGFudHMgU01CVVMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19BbmFsb2dfRmlsdGVyIFNNQlVTIEFuYWxvZyBGaWx0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19BTkFMT0dGSUxURVJfRU5BQkxFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19BTkFMT0dGSUxURVJfRElTQUJMRSAgICAgICAgICAgICAgSTJDX0NSMV9BTkZPRkYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfYWRkcmVzc2luZ19tb2RlIFNNQlVTIGFkZHJlc3NpbmcgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQlVTX0FERFJFU1NJTkdNT0RFXzdCSVQgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIFNNQlVTX0FERFJFU1NJTkdNT0RFXzEwQklUICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX2R1YWxfYWRkcmVzc2luZ19tb2RlIFNNQlVTIGR1YWwgYWRkcmVzc2luZyBtb2RlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19EVUFMQUREUkVTU19FTkFCTEUgICAgICAgICAgICAgICAgSTJDX09BUjJfT0EyRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfb3duX2FkZHJlc3MyX21hc2tzIFNNQlVTIG93bmFkZHJlc3MyIG1hc2tzCisgICogQHsKKyAgKi8KKworI2RlZmluZSBTTUJVU19PQTJfTk9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzAxICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzAyICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzAzICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzA0ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzA1ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzA2ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzA3ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFNNQlVTX2dlbmVyYWxfY2FsbF9hZGRyZXNzaW5nX21vZGUgU01CVVMgZ2VuZXJhbCBjYWxsIGFkZHJlc3NpbmcgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQlVTX0dFTkVSQUxDQUxMX0RJU0FCTEUgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNNQlVTX0dFTkVSQUxDQUxMX0VOQUJMRSAgICAgICAgICAgICAgICBJMkNfQ1IxX0dDRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfbm9zdHJldGNoX21vZGUgU01CVVMgbm9zdHJldGNoIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19OT1NUUkVUQ0hfRElTQUJMRSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19OT1NUUkVUQ0hfRU5BQkxFICAgICAgICAgICAgICAgICAgSTJDX0NSMV9OT1NUUkVUQ0gKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfcGFja2V0X2Vycm9yX2NoZWNrX21vZGUgU01CVVMgcGFja2V0IGVycm9yIGNoZWNrIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19QRUNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19QRUNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9QRUNFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19wZXJpcGhlcmFsX21vZGUgU01CVVMgcGVyaXBoZXJhbCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX0hPU1QgICAgICAgIEkyQ19DUjFfU01CSEVOCisjZGVmaW5lIFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRSAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRV9BUlAgICBJMkNfQ1IxX1NNQkRFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19SZWxvYWRFbmRNb2RlX2RlZmluaXRpb24gU01CVVMgUmVsb2FkRW5kTW9kZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSAgU01CVVNfU09GVEVORF9NT0RFICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSAgU01CVVNfUkVMT0FEX01PREUgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMl9SRUxPQUQKKyNkZWZpbmUgIFNNQlVTX0FVVE9FTkRfTU9ERSAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjJfQVVUT0VORAorI2RlZmluZSAgU01CVVNfU0VORFBFQ19NT0RFICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMl9QRUNCWVRFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX1N0YXJ0U3RvcE1vZGVfZGVmaW5pdGlvbiBTTUJVUyBTdGFydFN0b3BNb2RlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworCisjZGVmaW5lICBTTUJVU19OT19TVEFSVFNUT1AgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lICBTTUJVU19HRU5FUkFURV9TVE9QICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVE9QKQorI2RlZmluZSAgU01CVVNfR0VORVJBVEVfU1RBUlRfUkVBRCAgICAgICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1JEX1dSTikKKyNkZWZpbmUgIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFICAgICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19YZmVyT3B0aW9uc19kZWZpbml0aW9uIFNNQlVTIFhmZXJPcHRpb25zIGRlZmluaXRpb24KKyAgKiBAeworICAqLworCisvKiBMaXN0IG9mIFhmZXJPcHRpb25zIGluIHVzYWdlIG9mIDoKKyAqIDEtIFJlc3RhcnQgY29uZGl0aW9uIHdoZW4gZGlyZWN0aW9uIGNoYW5nZQorICogMi0gTm8gUmVzdGFydCBjb25kaXRpb24gaW4gb3RoZXIgdXNlIGNhc2VzCisgKi8KKyNkZWZpbmUgIFNNQlVTX0ZJUlNUX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgIFNNQlVTX1NPRlRFTkRfTU9ERQorI2RlZmluZSAgU01CVVNfTkVYVF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoU01CVVNfUkVMT0FEX01PREUgfCBTTUJVU19TT0ZURU5EX01PREUpKQorI2RlZmluZSAgU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfTk9fUEVDICAgICAgU01CVVNfQVVUT0VORF9NT0RFCisjZGVmaW5lICBTTUJVU19MQVNUX0ZSQU1FX05PX1BFQyAgICAgICAgICAgICAgICBTTUJVU19BVVRPRU5EX01PREUKKyNkZWZpbmUgIFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDICAgICgodWludDMyX3QpKFNNQlVTX0FVVE9FTkRfTU9ERSB8IFNNQlVTX1NFTkRQRUNfTU9ERSkpCisjZGVmaW5lICBTTUJVU19MQVNUX0ZSQU1FX1dJVEhfUEVDICAgICAgICAgICAgICAoKHVpbnQzMl90KShTTUJVU19BVVRPRU5EX01PREUgfCBTTUJVU19TRU5EUEVDX01PREUpKQorCisvKiBMaXN0IG9mIFhmZXJPcHRpb25zIGluIHVzYWdlIG9mIDoKKyAqIDEtIFJlc3RhcnQgY29uZGl0aW9uIGluIGFsbCB1c2UgY2FzZXMgKGRpcmVjdGlvbiBjaGFuZ2Ugb3Igbm90KQorICovCisjZGVmaW5lICBTTUJVU19PVEhFUl9GUkFNRV9OT19QRUMgICAgICAgICAgICAgICAoMHgwMDAwMDBBQVUpCisjZGVmaW5lICBTTUJVU19PVEhFUl9GUkFNRV9XSVRIX1BFQyAgICAgICAgICAgICAoMHgwMDAwQUEwMFUpCisjZGVmaW5lICBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9OT19QRUMgICAgICAoMHgwMEFBMDAwMFUpCisjZGVmaW5lICBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQyAgICAoMHhBQTAwMDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24gU01CVVMgSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqIEBicmllZiBTTUJVUyBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYWFhYWAorICAqICAgICAgICAgICAtIFhYWFhYWFhYICA6IEludGVycnVwdCBjb250cm9sIG1hc2sKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19JVF9FUlJJICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9FUlJJRQorI2RlZmluZSBTTUJVU19JVF9UQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9UQ0lFCisjZGVmaW5lIFNNQlVTX0lUX1NUT1BJICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1NUT1BJRQorI2RlZmluZSBTTUJVU19JVF9OQUNLSSAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9OQUNLSUUKKyNkZWZpbmUgU01CVVNfSVRfQUREUkkgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfQUREUklFCisjZGVmaW5lIFNNQlVTX0lUX1JYSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1JYSUUKKyNkZWZpbmUgU01CVVNfSVRfVFhJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVFhJRQorI2RlZmluZSBTTUJVU19JVF9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNNQlVTX0lUX0VSUkkgfCBTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfVFhJKQorI2RlZmluZSBTTUJVU19JVF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNNQlVTX0lUX0VSUkkgfCBTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9OQUNLSSB8IFNNQlVTX0lUX1JYSSkKKyNkZWZpbmUgU01CVVNfSVRfQUxFUlQgICAgICAgICAgICAgICAgICAgICAgICAgIChTTUJVU19JVF9FUlJJKQorI2RlZmluZSBTTUJVU19JVF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNNQlVTX0lUX0FERFJJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRmxhZ19kZWZpbml0aW9uIFNNQlVTIEZsYWcgZGVmaW5pdGlvbgorICAqIEBicmllZiBGbGFnIGRlZmluaXRpb24KKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWFlZWVkKKyAgKiAgICAgICAgICAgLSBYWFhYWFhYWCAgOiBGbGFnIG1hc2sKKyAgKiBAeworICAqLworCisjZGVmaW5lICBTTUJVU19GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RYRQorI2RlZmluZSAgU01CVVNfRkxBR19UWElTICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UWElTCisjZGVmaW5lICBTTUJVU19GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1JYTkUKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfQUREUiAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQUREUgorI2RlZmluZSAgU01CVVNfRkxBR19BRiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9OQUNLRgorI2RlZmluZSAgU01CVVNfRkxBR19TVE9QRiAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9TVE9QRgorI2RlZmluZSAgU01CVVNfRkxBR19UQyAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQworI2RlZmluZSAgU01CVVNfRkxBR19UQ1IgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQ1IKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfQkVSUiAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQkVSUgorI2RlZmluZSAgU01CVVNfRkxBR19BUkxPICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BUkxPCisjZGVmaW5lICBTTUJVU19GTEFHX09WUiAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX09WUgorI2RlZmluZSAgU01CVVNfRkxBR19QRUNFUlIgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9QRUNFUlIKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVElNRU9VVAorI2RlZmluZSAgU01CVVNfRkxBR19BTEVSVCAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BTEVSVAorI2RlZmluZSAgU01CVVNfRkxBR19CVVNZICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9CVVNZCisjZGVmaW5lICBTTUJVU19GTEFHX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0RJUgorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQlVTX0V4cG9ydGVkX01hY3JvcyBTTUJVUyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBTTUJVUyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9TTUJVU19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFU0VUOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1NNQlVTX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFU0VUKQorI2VuZGlmCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNNQlVTIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX0VSUkkgIEVycm9ycyBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9OQUNLSSBOQUNLIHJlY2VpdmVkIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVFhJICAgVFggaW50ZXJydXB0IGVuYWJsZQorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU01CVVMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX0VSUkkgIEVycm9ycyBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9OQUNLSSBOQUNLIHJlY2VpdmVkIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVFhJICAgVFggaW50ZXJydXB0IGVuYWJsZQorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKH4oX19JTlRFUlJVUFRfXykpKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU01CVVMgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU01CVVMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX0VSUkkgIEVycm9ycyBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9OQUNLSSBOQUNLIHJlY2VpdmVkIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVFhJICAgVFggaW50ZXJydXB0IGVuYWJsZQorICAqCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNNQlVTIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19UWEUgICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1RYSVMgICAgVHJhbnNtaXQgaW50ZXJydXB0IHN0YXR1cworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfUlhORSAgICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BRERSICAgIEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0FGICAgICAgTkFDSyByZWNlaXZlZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19TVE9QRiAgIFNUT1AgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1RDICAgICAgVHJhbnNmZXIgY29tcGxldGUgKG1hc3RlciBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfVENSICAgICBUcmFuc2ZlciBjb21wbGV0ZSByZWxvYWQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0JFUlIgICAgQnVzIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX09WUiAgICAgT3ZlcnJ1bi9VbmRlcnJ1bgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfUEVDRVJSICBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQUxFUlQgICBTTUJ1cyBhbGVydAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQlVTWSAgICBCdXMgYnVzeQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfRElSICAgICBUcmFuc2ZlciBkaXJlY3Rpb24gKHNsYXZlIG1vZGUpCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIFNNQlVTX0ZMQUdfTUFTSyAgKDB4MDAwMUZGRkZVKQorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoKF9fRkxBR19fKSAmIFNNQlVTX0ZMQUdfTUFTSykpID09ICgoX19GTEFHX18pICYgU01CVVNfRkxBR19NQVNLKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNNQlVTIHBlbmRpbmcgZmxhZ3Mgd2hpY2ggYXJlIGNsZWFyZWQgYnkgd3JpdGluZyAxIGluIGEgc3BlY2lmaWMgYml0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQUREUiAgICBBZGRyZXNzIG1hdGNoZWQgKHNsYXZlIG1vZGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BRiAgICAgIE5BQ0sgcmVjZWl2ZWQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfU1RPUEYgICBTVE9QIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19CRVJSICAgIEJ1cyBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQVJMTyAgICBBcmJpdHJhdGlvbiBsb3N0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19PVlIgICAgIE92ZXJydW4vVW5kZXJydW4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1BFQ0VSUiAgUEVDIGVycm9yIGluIHJlY2VwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfVElNRU9VVCBUaW1lb3V0IG9yIFRsb3cgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0FMRVJUICAgU01CdXMgYWxlcnQKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgU01CVVMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgSTJDX0NSMV9QRSkpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBTTUJVUyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgKENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIEkyQ19DUjFfUEUpKQorCisvKiogQGJyaWVmICBHZW5lcmF0ZSBhIE5vbi1BY2tub3dsZWRnZSBTTUJVUyBwZXJpcGhlcmFsIGluIFNsYXZlIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUJVU19HRU5FUkFURV9OQUNLKF9fSEFORExFX18pICAgICAgICAgICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIsIEkyQ19DUjJfTkFDSykpCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01CVVNfUHJpdmF0ZV9NYWNybyBTTUJVUyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfU01CVVNfQU5BTE9HX0ZJTFRFUihGSUxURVIpICAgICAgICAgICAgICAgICAgKCgoRklMVEVSKSA9PSBTTUJVU19BTkFMT0dGSUxURVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUxURVIpID09IFNNQlVTX0FOQUxPR0ZJTFRFUl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19TTUJVU19ESUdJVEFMX0ZJTFRFUihGSUxURVIpICAgICAgICAgICAgICAgICAoKEZJTFRFUikgPD0gMHgwMDAwMDAwRlUpCisKKyNkZWZpbmUgSVNfU01CVVNfQUREUkVTU0lOR19NT0RFKE1PREUpICAgICAgICAgICAgICAgICAgKCgoTU9ERSkgPT0gU01CVVNfQUREUkVTU0lOR01PREVfN0JJVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX0FERFJFU1NJTkdNT0RFXzEwQklUKSkKKworI2RlZmluZSBJU19TTUJVU19EVUFMX0FERFJFU1MoQUREUkVTUykgICAgICAgICAgICAgICAgICAoKChBRERSRVNTKSA9PSBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSRVNTKSA9PSBTTUJVU19EVUFMQUREUkVTU19FTkFCTEUpKQorCisjZGVmaW5lIElTX1NNQlVTX09XTl9BRERSRVNTMl9NQVNLKE1BU0spICAgICAgICAgICAgICAgICgoKE1BU0spID09IFNNQlVTX09BMl9OT01BU0spICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBTTUJVU19PQTJfTUFTSzAyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFNNQlVTX09BMl9NQVNLMDMpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBTTUJVU19PQTJfTUFTSzA1KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFNNQlVTX09BMl9NQVNLMDYpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swNykpCisKKyNkZWZpbmUgSVNfU01CVVNfR0VORVJBTF9DQUxMKENBTEwpICAgICAgICAgICAgICAgICAgICAgKCgoQ0FMTCkgPT0gU01CVVNfR0VORVJBTENBTExfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDQUxMKSA9PSBTTUJVU19HRU5FUkFMQ0FMTF9FTkFCTEUpKQorCisjZGVmaW5lIElTX1NNQlVTX05PX1NUUkVUQ0goU1RSRVRDSCkgICAgICAgICAgICAgICAgICAgICgoKFNUUkVUQ0gpID09IFNNQlVTX05PU1RSRVRDSF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUUkVUQ0gpID09IFNNQlVTX05PU1RSRVRDSF9FTkFCTEUpKQorCisjZGVmaW5lIElTX1NNQlVTX1BFQyhQRUMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFBFQykgPT0gU01CVVNfUEVDX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFQykgPT0gU01CVVNfUEVDX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfU01CVVNfUEVSSVBIRVJBTF9NT0RFKE1PREUpICAgICAgICAgICAgICAgICAgKCgoTU9ERSkgPT0gU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX0hPU1QpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRV9BUlApKQorCisjZGVmaW5lIElTX1NNQlVTX1RSQU5TRkVSX01PREUoTU9ERSkgICAgICAgICAgICAgICAgICAgICgoKE1PREUpID09IFNNQlVTX1JFTE9BRF9NT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX0FVVE9FTkRfTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU01CVVNfU09GVEVORF9NT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTTUJVU19TRU5EUEVDX01PREUpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IChTTUJVU19SRUxPQURfTU9ERSB8IFNNQlVTX1NFTkRQRUNfTU9ERSkpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gKFNNQlVTX0FVVE9FTkRfTU9ERSB8IFNNQlVTX1NFTkRQRUNfTU9ERSkpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSAoU01CVVNfQVVUT0VORF9NT0RFIHwgU01CVVNfUkVMT0FEX01PREUpKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IChTTUJVU19BVVRPRU5EX01PREUgfCBTTUJVU19TRU5EUEVDX01PREUgfCBTTUJVU19SRUxPQURfTU9ERSApKSkKKworCisjZGVmaW5lIElTX1NNQlVTX1RSQU5TRkVSX1JFUVVFU1QoUkVRVUVTVCkgICAgICAgICAgICAgICgoKFJFUVVFU1QpID09IFNNQlVTX0dFTkVSQVRFX1NUT1ApICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19HRU5FUkFURV9TVEFSVF9SRUFEKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19HRU5FUkFURV9TVEFSVF9XUklURSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19OT19TVEFSVFNUT1ApKQorCisKKyNkZWZpbmUgSVNfU01CVVNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFJFUVVFU1QpICAgICAgKElTX1NNQlVTX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19GSVJTVF9GUkFNRSkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX05FWFRfRlJBTUUpICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfTk9fUEVDKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19MQVNUX0ZSQU1FX05PX1BFQykgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfTEFTVF9GUkFNRV9XSVRIX1BFQykpCisKKyNkZWZpbmUgSVNfU01CVVNfVFJBTlNGRVJfT1RIRVJfT1BUSU9OU19SRVFVRVNUKFJFUVVFU1QpICgoKFJFUVVFU1QpID09IFNNQlVTX09USEVSX0ZSQU1FX05PX1BFQykgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfTk9fUEVDKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19PVEhFUl9GUkFNRV9XSVRIX1BFQykgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDKSkKKworI2RlZmluZSBTTUJVU19SRVNFVF9DUjEoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KShJMkNfQ1IxX1NNQkhFTiB8IEkyQ19DUjFfU01CREVOIHwgSTJDX0NSMV9QRUNFTikpKQorI2RlZmluZSBTTUJVU19SRVNFVF9DUjIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KShJMkNfQ1IyX1NBREQgfCBJMkNfQ1IyX0hFQUQxMFIgfCBJMkNfQ1IyX05CWVRFUyB8IEkyQ19DUjJfUkVMT0FEIHwgSTJDX0NSMl9SRF9XUk4pKSkKKworI2RlZmluZSBTTUJVU19HRU5FUkFURV9TVEFSVChfX0FERE1PREVfXyxfX0FERFJFU1NfXykgICAgICgoKF9fQURETU9ERV9fKSA9PSBTTUJVU19BRERSRVNTSU5HTU9ERV83QklUKSA/ICh1aW50MzJfdCkoKCgodWludDMyX3QpKF9fQUREUkVTU19fKSAmIChJMkNfQ1IyX1NBREQpKSB8IChJMkNfQ1IyX1NUQVJUKSB8IChJMkNfQ1IyX0FVVE9FTkQpKSAmICh+STJDX0NSMl9SRF9XUk4pKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKCgodWludDMyX3QpKF9fQUREUkVTU19fKSAmIChJMkNfQ1IyX1NBREQpKSB8IChJMkNfQ1IyX0FERDEwKSB8IChJMkNfQ1IyX1NUQVJUKSkgJiAofkkyQ19DUjJfUkRfV1JOKSkpCisKKyNkZWZpbmUgU01CVVNfR0VUX0FERFJfTUFUQ0goX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIEkyQ19JU1JfQUREQ09ERSkgPj4gMTdVKQorI2RlZmluZSBTTUJVU19HRVRfRElSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgSTJDX0lTUl9ESVIpID4+IDE2VSkKKyNkZWZpbmUgU01CVVNfR0VUX1NUT1BfTU9ERShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICYgSTJDX0NSMl9BVVRPRU5EKQorI2RlZmluZSBTTUJVU19HRVRfUEVDX01PREUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX1BFQ0JZVEUpCisjZGVmaW5lIFNNQlVTX0dFVF9BTEVSVF9FTkFCTEVEKF9fSEFORExFX18pICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX0FMRVJURU4pCisKKyNkZWZpbmUgU01CVVNfQ0hFQ0tfRkxBRyhfX0lTUl9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgKCgoKF9fSVNSX18pICYgKChfX0ZMQUdfXykgJiBTTUJVU19GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIFNNQlVTX0ZMQUdfTUFTSykpID8gU0VUIDogUkVTRVQpCisjZGVmaW5lIFNNQlVTX0NIRUNLX0lUX1NPVVJDRShfX0NSMV9fLCBfX0lUX18pICAgICAgICAgICgoKChfX0NSMV9fKSAmIChfX0lUX18pKSA9PSAoX19JVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworI2RlZmluZSBJU19TTUJVU19PV05fQUREUkVTUzEoQUREUkVTUzEpICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUkVTUzEpIDw9IDB4MDAwMDAzRkZVKQorI2RlZmluZSBJU19TTUJVU19PV05fQUREUkVTUzIoQUREUkVTUzIpICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUkVTUzIpIDw9ICh1aW50MTZfdCkweDAwRkZVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9ucyBTTUJVUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0RlSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfTXNwSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfTXNwRGVJbml0KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfQ29uZmlnQW5hbG9nRmlsdGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgQW5hbG9nRmlsdGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19Db25maWdEaWdpdGFsRmlsdGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgRGlnaXRhbEZpbHRlcik7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfUmVnaXN0ZXJDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIEhBTF9TTUJVU19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwU01CVVNfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgSEFMX1NNQlVTX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCBwU01CVVNfQWRkckNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1VuUmVnaXN0ZXJBZGRyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIEJsb2NraW5nX21vZGVfUG9sbGluZyBCbG9ja2luZyBtb2RlIFBvbGxpbmcKKyAqIEB7CisgKi8KKy8qKioqKioqIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19Jc0RldmljZVJlYWR5KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDMyX3QgVHJpYWxzLCB1aW50MzJfdCBUaW1lb3V0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBOb24tQmxvY2tpbmdfbW9kZV9JbnRlcnJ1cHQgTm9uLUJsb2NraW5nIG1vZGUgSW50ZXJydXB0CisgKiBAeworICovCisvKioqKioqKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfTWFzdGVyX1RyYW5zbWl0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19NYXN0ZXJfUmVjZWl2ZV9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfTWFzdGVyX0Fib3J0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfU2xhdmVfVHJhbnNtaXRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1NsYXZlX1JlY2VpdmVfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRW5hYmxlQWxlcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EaXNhYmxlQWxlcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EaXNhYmxlTGlzdGVuX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01CVVNfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisvKioqKioqKiBTTUJVUyBJUlFIYW5kbGVyIGFuZCBDYWxsYmFja3MgdXNlZCBpbiBub24gYmxvY2tpbmcgbW9kZXMgKEludGVycnVwdCkgKi8KK3ZvaWQgSEFMX1NNQlVTX0VWX0lSUUhhbmRsZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX0VSX0lSUUhhbmRsZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7Cit2b2lkIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfQWRkckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7Cit2b2lkIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICogIEB7CisgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBIQUxfU01CVVNfR2V0U3RhdGUoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3VpbnQzMl90IEhBTF9TTUJVU19HZXRFcnJvcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUJVU19Qcml2YXRlX0Z1bmN0aW9ucyBTTUJVUyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBzdG0zMmwweHhfaGFsX3NtYnVzLmMgZmlsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9TTUJVU19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF9zcGkuaCBiL0luYy9zdG0zMmwweHhfaGFsX3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYWE0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF9zcGkuaApAQCAtMCwwICsxLDczMCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfc3BpLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9IQUxfU1BJX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9TUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSQorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9UeXBlcyBTUEkgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNQSSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIG9wZXJhdGluZyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX01vZGUgKi8KKworICB1aW50MzJfdCBEaXJlY3Rpb247ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGJpZGlyZWN0aW9uYWwgbW9kZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9EaXJlY3Rpb24gKi8KKworICB1aW50MzJfdCBEYXRhU2l6ZTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGRhdGEgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9EYXRhX1NpemUgKi8KKworICB1aW50MzJfdCBDTEtQb2xhcml0eTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DbG9ja19Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IENMS1BoYXNlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBhY3RpdmUgZWRnZSBmb3IgdGhlIGJpdCBjYXB0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0Nsb2NrX1BoYXNlICovCisKKyAgdWludDMyX3QgTlNTOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgTlNTIHNpZ25hbCBpcyBtYW5hZ2VkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgKE5TUyBwaW4pIG9yIGJ5IHNvZnR3YXJlIHVzaW5nIHRoZSBTU0kgYml0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX1NsYXZlX1NlbGVjdF9tYW5hZ2VtZW50ICovCisKKyAgdWludDMyX3QgQmF1ZFJhdGVQcmVzY2FsZXI7ICAgLyohPCBTcGVjaWZpZXMgdGhlIEJhdWQgUmF0ZSBwcmVzY2FsZXIgdmFsdWUgd2hpY2ggd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBTQ0sgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQmF1ZFJhdGVfUHJlc2NhbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhlIGNvbW11bmljYXRpb24gY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay4gVGhlIHNsYXZlIGNsb2NrIGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0LiAqLworCisgIHVpbnQzMl90IEZpcnN0Qml0OyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSB0cmFuc2ZlcnMgc3RhcnQgZnJvbSBNU0Igb3IgTFNCIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9NU0JfTFNCX3RyYW5zbWlzc2lvbiAqLworCisgIHVpbnQzMl90IFRJTW9kZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBUSSBtb2RlIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX1RJX21vZGUgKi8KKworICB1aW50MzJfdCBDUkNDYWxjdWxhdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgQ1JDIGNhbGN1bGF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0NSQ19DYWxjdWxhdGlvbiAqLworCisgIHVpbnQzMl90IENSQ1BvbHlub21pYWw7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwb2x5bm9taWFsIHVzZWQgZm9yIHRoZSBDUkMgY2FsY3VsYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBvZGQgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDY1NTM1ICovCit9IFNQSV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgU1BJIFN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1NQSV9TVEFURV9SRVNFVCAgICAgID0gMHgwMFUsICAgIC8qITwgUGVyaXBoZXJhbCBub3QgSW5pdGlhbGl6ZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9SRUFEWSAgICAgID0gMHgwMVUsICAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZICAgICAgID0gMHgwMlUsICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1RYICAgID0gMHgwM1UsICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1JYICAgID0gMHgwNFUsICAgIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYID0gMHgwNVUsICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gYW5kIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgSEFMX1NQSV9TVEFURV9FUlJPUiAgICAgID0gMHgwNlUsICAgIC8qITwgU1BJIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9BQk9SVCAgICAgID0gMHgwN1UgICAgIC8qITwgU1BJIGFib3J0IGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gSEFMX1NQSV9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU1BJIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZgoreworICBTUElfVHlwZURlZiAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgLyohPCBTUEkgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICovCisKKyAgU1BJX0luaXRUeXBlRGVmICAgICAgICAgICAgSW5pdDsgICAgICAgICAgIC8qITwgU1BJIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgICAvKiE8IFBvaW50ZXIgdG8gU1BJIFR4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgLyohPCBTUEkgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgVHhYZmVyQ291bnQ7ICAgIC8qITwgU1BJIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgICAvKiE8IFBvaW50ZXIgdG8gU1BJIFJ4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgLyohPCBTUEkgUnggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgUnhYZmVyQ291bnQ7ICAgIC8qITwgU1BJIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCpSeElTUikoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAgIC8qITwgZnVuY3Rpb24gcG9pbnRlciBvbiBSeCBJU1IgICAgICAgKi8KKworICB2b2lkICgqVHhJU1IpKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAvKiE8IGZ1bmN0aW9uIHBvaW50ZXIgb24gVHggSVNSICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgKmhkbWF0eDsgICAgICAgIC8qITwgU1BJIFR4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hcng7ICAgICAgICAvKiE8IFNQSSBSeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfU1BJX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAgICAgIC8qITwgU1BJIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAvKiE8IFNQSSBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgICAgLyohPCBTUEkgVHggQ29tcGxldGVkIGNhbGxiYWNrICAgICAgICAgICovCisgIHZvaWQgKCogUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgICAgLyohPCBTUEkgUnggQ29tcGxldGVkIGNhbGxiYWNrICAgICAgICAgICovCisgIHZvaWQgKCogVHhSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAgICAgICAgICAgLyohPCBTUEkgVHhSeCBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICAgICovCisgIHZvaWQgKCogVHhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgLyohPCBTUEkgVHggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICovCisgIHZvaWQgKCogUnhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgLyohPCBTUEkgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICovCisgIHZvaWQgKCogVHhSeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgLyohPCBTUEkgVHhSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayAgICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAgICAgICAgICAgICAgLyohPCBTUEkgRXJyb3IgY2FsbGJhY2sgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogQWJvcnRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgLyohPCBTUEkgQWJvcnQgY2FsbGJhY2sgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgICAgLyohPCBTUEkgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgLyohPCBTUEkgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICAgICovCisKKyNlbmRpZiAgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IFNQSV9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKy8qKgorICAqIEBicmllZiAgSEFMIFNQSSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1NQSV9UWF9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFNQSSBUeCBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgICAgICAqLworICBIQUxfU1BJX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgU1BJIFJ4IENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAgICAgICovCisgIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBTUEkgVHhSeCBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgICAgKi8KKyAgSEFMX1NQSV9UWF9IQUxGX0NPTVBMRVRFX0NCX0lEICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFNQSSBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAqLworICBIQUxfU1BJX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgICAgICAgID0gMHgwNFUsICAgIC8qITwgU1BJIFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICovCisgIEhBTF9TUElfVFhfUlhfSEFMRl9DT01QTEVURV9DQl9JRCAgICAgPSAweDA1VSwgICAgLyohPCBTUEkgVHhSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX1NQSV9FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDZVLCAgICAvKiE8IFNQSSBFcnJvciBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAqLworICBIQUxfU1BJX0FCT1JUX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwN1UsICAgIC8qITwgU1BJIEFib3J0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICovCisgIEhBTF9TUElfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDA4VSwgICAgLyohPCBTUEkgTXNwIEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MDlVICAgICAvKiE8IFNQSSBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAqLworCit9IEhBTF9TUElfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFNQSSBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwU1BJX0NhbGxiYWNrVHlwZURlZikoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IHBvaW50ZXIgdG8gYW4gU1BJIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9Db25zdGFudHMgU1BJIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0Vycm9yX0NvZGUgU1BJIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX05PTkUgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfTU9ERiAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgIC8qITwgTU9ERiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9DUkMgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAgLyohPCBDUkMgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX09WUiAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkgICAvKiE8IE9WUiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfRlJFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAgIC8qITwgRlJFIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9ETUEgICAgICAgICAgICAgICAoMHgwMDAwMDAxMFUpICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX0ZMQUcgICAgICAgICAgICAgICgweDAwMDAwMDIwVSkgICAvKiE8IEVycm9yIG9uIFJYTkUvVFhFL0JTWSBGbGFnICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfQUJPUlQgICAgICAgICAgICAgKDB4MDAwMDAwNDBVKSAgIC8qITwgRXJyb3IgZHVyaW5nIFNQSSBBYm9ydCBwcm9jZWR1cmUgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorI2RlZmluZSBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgICgweDAwMDAwMDgwVSkgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICAgICAgICAgICAgICAgICovCisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9Nb2RlIFNQSSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX01PREVfU0xBVkUgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9NT0RFX01BU1RFUiAgICAgICAgICAgICAgICAgKFNQSV9DUjFfTVNUUiB8IFNQSV9DUjFfU1NJKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfRGlyZWN0aW9uIFNQSSBEaXJlY3Rpb24gTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9ESVJFQ1RJT05fMkxJTkVTICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkgICAgIFNQSV9DUjFfUlhPTkxZCisjZGVmaW5lIFNQSV9ESVJFQ1RJT05fMUxJTkUgICAgICAgICAgICAgU1BJX0NSMV9CSURJTU9ERQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfRGF0YV9TaXplIFNQSSBEYXRhIFNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfREFUQVNJWkVfOEJJVCAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzE2QklUICAgICAgICAgICAgICBTUElfQ1IxX0RGRgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfQ2xvY2tfUG9sYXJpdHkgU1BJIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9QT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgU1BJX0NSMV9DUE9MCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9DbG9ja19QaGFzZSBTUEkgQ2xvY2sgUGhhc2UKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfUEhBU0VfMUVER0UgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX1BIQVNFXzJFREdFICAgICAgICAgICAgICAgICBTUElfQ1IxX0NQSEEKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX1NsYXZlX1NlbGVjdF9tYW5hZ2VtZW50IFNQSSBTbGF2ZSBTZWxlY3QgTWFuYWdlbWVudAorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9OU1NfU09GVCAgICAgICAgICAgICAgICAgICAgU1BJX0NSMV9TU00KKyNkZWZpbmUgU1BJX05TU19IQVJEX0lOUFVUICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9OU1NfSEFSRF9PVVRQVVQgICAgICAgICAgICAgKFNQSV9DUjJfU1NPRSA8PCAxNlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9CYXVkUmF0ZV9QcmVzY2FsZXIgU1BJIEJhdWRSYXRlIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl8yICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfNCAgICAgICAgIChTUElfQ1IxX0JSXzApCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl84ICAgICAgICAgKFNQSV9DUjFfQlJfMSkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzE2ICAgICAgICAoU1BJX0NSMV9CUl8xIHwgU1BJX0NSMV9CUl8wKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMzIgICAgICAgIChTUElfQ1IxX0JSXzIpCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl82NCAgICAgICAgKFNQSV9DUjFfQlJfMiB8IFNQSV9DUjFfQlJfMCkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzEyOCAgICAgICAoU1BJX0NSMV9CUl8yIHwgU1BJX0NSMV9CUl8xKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMjU2ICAgICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9NU0JfTFNCX3RyYW5zbWlzc2lvbiBTUEkgTVNCIExTQiBUcmFuc21pc3Npb24KKyAgKiBAeworICAqLworI2RlZmluZSBTUElfRklSU1RCSVRfTVNCICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0ZJUlNUQklUX0xTQiAgICAgICAgICAgICAgICBTUElfQ1IxX0xTQkZJUlNUCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9USV9tb2RlIFNQSSBUSSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX1RJTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9USU1PREVfRU5BQkxFICAgICAgICAgICAgICAgU1BJX0NSMl9GUkYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0NSQ19DYWxjdWxhdGlvbiBTUEkgQ1JDIENhbGN1bGF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUgICAgICAgU1BJX0NSMV9DUkNFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfSW50ZXJydXB0X2RlZmluaXRpb24gU1BJIEludGVycnVwdCBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0lUX1RYRSAgICAgICAgICAgICAgICAgICAgICBTUElfQ1IyX1RYRUlFCisjZGVmaW5lIFNQSV9JVF9SWE5FICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9SWE5FSUUKKyNkZWZpbmUgU1BJX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgICBTUElfQ1IyX0VSUklFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9GbGFnc19kZWZpbml0aW9uIFNQSSBGbGFncyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICBTUElfU1JfUlhORSAgIC8qIFNQSSBzdGF0dXMgZmxhZzogUnggYnVmZmVyIG5vdCBlbXB0eSBmbGFnICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgU1BJX1NSX1RYRSAgICAvKiBTUEkgc3RhdHVzIGZsYWc6IFR4IGJ1ZmZlciBlbXB0eSBmbGFnICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19CU1kgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9CU1kgICAgLyogU1BJIHN0YXR1cyBmbGFnOiBCdXN5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfQ1JDRVJSICAgICAgICAgICAgICAgICBTUElfU1JfQ1JDRVJSIC8qIFNQSSBFcnJvciBmbGFnOiBDUkMgZXJyb3IgZmxhZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX01PREYgICAgICAgICAgICAgICAgICAgU1BJX1NSX01PREYgICAvKiBTUEkgRXJyb3IgZmxhZzogTW9kZSBmYXVsdCBmbGFnICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19PVlIgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9PVlIgICAgLyogU1BJIEVycm9yIGZsYWc6IE92ZXJydW4gZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfRlJFICAgICAgICAgICAgICAgICAgICBTUElfU1JfRlJFICAgIC8qIFNQSSBFcnJvciBmbGFnOiBUSSBtb2RlIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnICovCisjZGVmaW5lIFNQSV9GTEFHX01BU0sgICAgICAgICAgICAgICAgICAgKFNQSV9TUl9SWE5FIHwgU1BJX1NSX1RYRSB8IFNQSV9TUl9CU1kgfCBTUElfU1JfQ1JDRVJSIHwgU1BJX1NSX01PREYgfCBTUElfU1JfT1ZSIHwgU1BJX1NSX0ZSRSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9NYWNyb3MgU1BJIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IFNQSSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisjZGVmaW5lIF9fSEFMX1NQSV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFU0VUOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9TUElfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRVNFVCkKKyNlbmRpZgorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgaGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSXggd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiwgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1BJIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNQSSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9TUElfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfUlhORTogUmVjZWl2ZSBidWZmZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfVFhFOiBUcmFuc21pdCBidWZmZXIgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19DUkNFUlI6IENSQyBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX01PREY6IE1vZGUgZmF1bHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19PVlI6IE92ZXJydW4gZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19CU1k6IEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GUkU6IEZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU1BJIENSQ0VSUiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgPSAodWludDE2X3QpKH5TUElfRkxBR19DUkNFUlIpKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU1BJIE1PREYgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0NMRUFSX01PREZGTEFHKF9fSEFORExFX18pICAgICAgICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZ19tb2RmID0gMHgwMFU7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXByZWdfbW9kZiA9IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSOyAgICAgICAgICAgIFwKKyAgICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NQRSk7IFwKKyAgICBVTlVTRUQodG1wcmVnX21vZGYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNQSSBPVlIgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoX19IQU5ETEVfXykgICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0lPIHVpbnQzMl90IHRtcHJlZ19vdnIgPSAweDAwVTsgICAgICAgICAgICAgIFwKKyAgICB0bXByZWdfb3ZyID0gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RFI7ICAgICAgIFwKKyAgICB0bXByZWdfb3ZyID0gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1I7ICAgICAgIFwKKyAgICBVTlVTRUQodG1wcmVnX292cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNQSSBGUkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoX19IQU5ETEVfXykgICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19JTyB1aW50MzJfdCB0bXByZWdfZnJlID0gMHgwMFU7ICAgICAgICAgICAgICAgIFwKKyAgdG1wcmVnX2ZyZSA9IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSOyAgICAgICAgIFwKKyAgVU5VU0VEKHRtcHJlZ19mcmUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfXdoaWxlKDBVKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0VOQUJMRShfX0hBTkRMRV9fKSAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1BFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9ESVNBQkxFKF9fSEFORExFX18pIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1BFKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9NYWNyb3MgU1BJIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgU2V0IHRoZSBTUEkgdHJhbnNtaXQtb25seSBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgU1BJXzFMSU5FX1RYKF9fSEFORExFX18pICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9CSURJT0UpCisKKy8qKiBAYnJpZWYgIFNldCB0aGUgU1BJIHJlY2VpdmUtb25seSBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgU1BJXzFMSU5FX1JYKF9fSEFORExFX18pICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0JJRElPRSkKKworLyoqIEBicmllZiAgUmVzZXQgdGhlIENSQyBjYWxjdWxhdGlvbiBvZiB0aGUgU1BJLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgU1BJX1JFU0VUX0NSQyhfX0hBTkRMRV9fKSBkb3tDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ0VOKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNFTik7fXdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1BJIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fU1JfXyAgY29weSBvZiBTUEkgU1IgcmVnc2l0ZXIuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19SWE5FOiBSZWNlaXZlIGJ1ZmZlciBub3QgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19UWEU6IFRyYW5zbWl0IGJ1ZmZlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0NSQ0VSUjogQ1JDIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfTU9ERjogTW9kZSBmYXVsdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX09WUjogT3ZlcnJ1biBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0JTWTogQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZSRTogRnJhbWUgZm9ybWF0IGVycm9yIGZsYWcKKyAgKiBAcmV0dmFsIFNFVCBvciBSRVNFVC4KKyAgKi8KKyNkZWZpbmUgU1BJX0NIRUNLX0ZMQUcoX19TUl9fLCBfX0ZMQUdfXykgICAgICAgICAoKCgoX19TUl9fKSAmICgoX19GTEFHX18pICYgU1BJX0ZMQUdfTUFTSykpID09ICgoX19GTEFHX18pICYgU1BJX0ZMQUdfTUFTSykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgSW50ZXJydXB0IGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0NSMl9fICBjb3B5IG9mIFNQSSBDUjIgcmVnc2l0ZXIuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU1BJIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIFNFVCBvciBSRVNFVC4KKyAgKi8KKyNkZWZpbmUgU1BJX0NIRUNLX0lUX1NPVVJDRShfX0NSMl9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICgoKChfX0NSMl9fKSAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIE1vZGUgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIFNQSSBNb2RlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IFNQSV9NT0RFX1NMQVZFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gU1BJX01PREVfTUFTVEVSKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBEaXJlY3Rpb24gTW9kZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIERpcmVjdGlvbiBNb2RlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGlyZWN0aW9uCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9ESVJFQ1RJT04oX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8xTElORSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgRGlyZWN0aW9uIE1vZGUgcGFyYW1ldGVyIGlzIDIgbGluZXMuCisgICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIFNQSSBEaXJlY3Rpb24gTW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl8yTElORVMoX19NT0RFX18pICgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIERpcmVjdGlvbiBNb2RlIHBhcmFtZXRlciBpcyAxIG9yIDIgbGluZXMuCisgICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIFNQSSBEaXJlY3Rpb24gTW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIERhdGEgU2l6ZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fREFUQVNJWkVfXyBzcGVjaWZpZXMgdGhlIFNQSSBEYXRhIFNpemUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9EYXRhX1NpemUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0RBVEFTSVpFKF9fREFUQVNJWkVfXykgKCgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTZCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfOEJJVCkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgU2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fQ1BPTF9fIHNwZWNpZmllcyB0aGUgU1BJIHNlcmlhbCBjbG9jayBzdGVhZHkgc3RhdGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DbG9ja19Qb2xhcml0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfQ1BPTChfX0NQT0xfXykgKCgoX19DUE9MX18pID09IFNQSV9QT0xBUklUWV9MT1cpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ1BPTF9fKSA9PSBTUElfUE9MQVJJVFlfSElHSCkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgQ2xvY2sgUGhhc2UgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX0NQSEFfXyBzcGVjaWZpZXMgdGhlIFNQSSBDbG9jayBQaGFzZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0Nsb2NrX1BoYXNlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9DUEhBKF9fQ1BIQV9fKSAoKChfX0NQSEFfXykgPT0gU1BJX1BIQVNFXzFFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NQSEFfXykgPT0gU1BJX1BIQVNFXzJFREdFKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBTbGF2ZSBTZWxlY3QgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX05TU19fIHNwZWNpZmllcyB0aGUgU1BJIFNsYXZlIFNlbGVjdCBtYW5hZ2VtZW50IHBhcmFtZXRlci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX1NsYXZlX1NlbGVjdF9tYW5hZ2VtZW50CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9OU1MoX19OU1NfXykgKCgoX19OU1NfXykgPT0gU1BJX05TU19TT0ZUKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19OU1NfXykgPT0gU1BJX05TU19IQVJEX0lOUFVUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19OU1NfXykgPT0gU1BJX05TU19IQVJEX09VVFBVVCkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgQmF1ZHJhdGUgcHJlc2NhbGVyIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBzcGVjaWZpZXMgdGhlIFNQSSBCYXVkcmF0ZSBwcmVzY2FsZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9CYXVkUmF0ZV9QcmVzY2FsZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAoKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl84KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzMyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl82NCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzI1NikpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgTVNCIExTQiB0cmFuc21pc3Npb24gcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX0JJVF9fIHNwZWNpZmllcyB0aGUgU1BJIE1TQiBMU0IgdHJhbnNtaXNzaW9uICh3aGV0aGVyIGRhdGEgdHJhbnNmZXIgc3RhcnRzIGZyb20gTVNCIG9yIExTQiBiaXQpLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTVNCX0xTQl90cmFuc21pc3Npb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0ZJUlNUX0JJVChfX0JJVF9fKSAoKChfX0JJVF9fKSA9PSBTUElfRklSU1RCSVRfTVNCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CSVRfXykgPT0gU1BJX0ZJUlNUQklUX0xTQikpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgVEkgbW9kZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIFRJIG1vZGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9USV9tb2RlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9USU1PREUoX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBTUElfVElNT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFNQSV9USU1PREVfRU5BQkxFKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBDUkMgY2FsY3VsYXRpb24gZW5hYmxlZCBzdGF0ZSBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19DQUxDVUxBVElPTl9fIHNwZWNpZmllcyB0aGUgU1BJIENSQyBjYWxjdWxhdGlvbiBlbmFibGUgc3RhdGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DUkNfQ2FsY3VsYXRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0NSQ19DQUxDVUxBVElPTihfX0NBTENVTEFUSU9OX18pICgoKF9fQ0FMQ1VMQVRJT05fXykgPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0FMQ1VMQVRJT05fXykgPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgcG9seW5vbWlhbCB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgQ1JDIGNhbGN1bGF0aW9uLCBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19QT0xZTk9NSUFMX18gc3BlY2lmaWVzIHRoZSBTUEkgcG9seW5vbWlhbCB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgQ1JDIGNhbGN1bGF0aW9uLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA2NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfQ1JDX1BPTFlOT01JQUwoX19QT0xZTk9NSUFMX18pICgoKF9fUE9MWU5PTUlBTF9fKSA+PSAweDFVKSAmJiAoKF9fUE9MWU5PTUlBTF9fKSA8PSAweEZGRkZVKSAmJiAoKChfX1BPTFlOT01JQUxfXykmMHgxVSkgIT0gMFUpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgRE1BIGhhbmRsZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIGEgRE1BIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0RNQV9IQU5ETEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKSAhPSBOVUxMKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgYSBkYXRhIGFkZHJlc3MgaXMgMTZiaXQgYWxpZ25lZC4KKyAgKiBAcGFyYW0gIF9fREFUQV9fIHNwZWNpZmllcyBhIGRhdGEgYWRkcmVzcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJXzE2QklUX0FMSUdORURfQUREUkVTUyhfX0RBVEFfXykgKCgodWludDMyX3QpKF9fREFUQV9fKSAlIDJVKSA9PSAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0luaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9EZUluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX01zcEluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX01zcERlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwU1BJX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9VblJlZ2lzdGVyQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIEhBTF9TUElfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZV9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9ETUEoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVBhdXNlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BUmVzdW1lKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BU3RvcChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfQWJvcnQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9BYm9ydF9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisKK3ZvaWQgSEFMX1NQSV9JUlFIYW5kbGVyKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9UeENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9UeFJ4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfRXJyb3JDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU1BJX1N0YXRlVHlwZURlZiBIQUxfU1BJX0dldFN0YXRlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3VpbnQzMl90ICAgICAgICAgICAgIEhBTF9TUElfR2V0RXJyb3IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfU1BJX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX3RpbS5oIGIvSW5jL3N0bTMybDB4eF9oYWxfdGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlODc0OQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX3RpbS5oCkBAIC0wLDAgKzEsMTcwNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfdGltLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFRJTSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0hBTF9USU1fSAorI2RlZmluZSBTVE0zMkwweHhfSEFMX1RJTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX1R5cGVzIFRJTSBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVElNIFRpbWUgYmFzZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgVElNIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYgKi8KKworICB1aW50MzJfdCBDb3VudGVyTW9kZTsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvdW50ZXIgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ291bnRlcl9Nb2RlICovCisKKyAgdWludDMyX3QgUGVyaW9kOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwZXJpb2QgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvLVJlbG9hZCBSZWdpc3RlciBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4gICovCisKKyAgdWludDMyX3QgQ2xvY2tEaXZpc2lvbjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBkaXZpc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2xvY2tEaXZpc2lvbiAqLworCisgIHVpbnQzMl90IEF1dG9SZWxvYWRQcmVsb2FkOyAgLyohPCBTcGVjaWZpZXMgdGhlIGF1dG8tcmVsb2FkIHByZWxvYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0F1dG9SZWxvYWRQcmVsb2FkICovCit9IFRJTV9CYXNlX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBPdXRwdXQgQ29tcGFyZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBPQ01vZGU7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfYW5kX1BXTV9tb2RlcyAqLworCisgIHVpbnQzMl90IFB1bHNlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwdWxzZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRiAqLworCisgIHVpbnQzMl90IE9DUG9sYXJpdHk7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBPQ0Zhc3RNb2RlOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgRmFzdCBtb2RlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9GYXN0X1N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBpbiBQV00xIGFuZCBQV00yIG1vZGUuICovCit9IFRJTV9PQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gT25lIFB1bHNlIE1vZGUgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgT0NNb2RlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX2FuZF9QV01fbW9kZXMgKi8KKworICB1aW50MzJfdCBQdWxzZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHVsc2UgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYgKi8KKworICB1aW50MzJfdCBPQ1BvbGFyaXR5OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUNQb2xhcml0eTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IElDU2VsZWN0aW9uOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgSUNGaWx0ZXI7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCit9IFRJTV9PbmVQdWxzZV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gSW5wdXQgQ2FwdHVyZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCAgSUNQb2xhcml0eTsgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IElDU2VsZWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBJQ1ByZXNjYWxlcjsgIC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgSUNGaWx0ZXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KK30gVElNX0lDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBFbmNvZGVyIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEVuY29kZXJNb2RlOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0VuY29kZXJfTW9kZSAqLworCisgIHVpbnQzMl90IElDMVBvbGFyaXR5OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBJQzFTZWxlY3Rpb247ICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBJQzFQcmVzY2FsZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBJQzFGaWx0ZXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCisKKyAgdWludDMyX3QgSUMyUG9sYXJpdHk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IElDMlNlbGVjdGlvbjsgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgSUMyUHJlc2NhbGVyOyAgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgSUMyRmlsdGVyOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAqLworfSBUSU1fRW5jb2Rlcl9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBDbG9jayBDb25maWd1cmF0aW9uIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tTb3VyY2U7ICAgICAvKiE8IFRJTSBjbG9jayBzb3VyY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9DbG9ja19Tb3VyY2UgKi8KKyAgdWludDMyX3QgQ2xvY2tQb2xhcml0eTsgICAvKiE8IFRJTSBjbG9jayBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2xvY2tfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAvKiE8IFRJTSBjbG9jayBwcmVzY2FsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0Nsb2NrX1ByZXNjYWxlciAqLworICB1aW50MzJfdCBDbG9ja0ZpbHRlcjsgICAgIC8qITwgVElNIGNsb2NrIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCit9IFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIENsZWFyIElucHV0IENvbmZpZ3VyYXRpb24gSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDbGVhcklucHV0U3RhdGU7ICAgICAgLyohPCBUSU0gY2xlYXIgSW5wdXQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEVOQUJMRSBvciBESVNBQkxFICovCisgIHVpbnQzMl90IENsZWFySW5wdXRTb3VyY2U7ICAgICAvKiE8IFRJTSBjbGVhciBJbnB1dCBzb3VyY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0NsZWFySW5wdXRfU291cmNlICovCisgIHVpbnQzMl90IENsZWFySW5wdXRQb2xhcml0eTsgICAvKiE8IFRJTSBDbGVhciBJbnB1dCBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9DbGVhcklucHV0X1BvbGFyaXR5ICovCisgIHVpbnQzMl90IENsZWFySW5wdXRQcmVzY2FsZXI7ICAvKiE8IFRJTSBDbGVhciBJbnB1dCBwcmVzY2FsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSAwOiBXaGVuIE9DUmVmIGNsZWFyIGZlYXR1cmUgaXMgdXNlZCB3aXRoIEVUUiBzb3VyY2UsIEVUUiBwcmVzY2FsZXIgbXVzdCBiZSBvZmYgKi8KKyAgdWludDMyX3QgQ2xlYXJJbnB1dEZpbHRlcjsgICAgIC8qITwgVElNIENsZWFyIElucHV0IGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KK30gVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBNYXN0ZXIgY29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgIE1hc3Rlck91dHB1dFRyaWdnZXI7ICAgLyohPCBUcmlnZ2VyIG91dHB1dCAoVFJHTykgc2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTWFzdGVyX01vZGVfU2VsZWN0aW9uICovCisgIHVpbnQzMl90ICBNYXN0ZXJTbGF2ZU1vZGU7ICAgICAgIC8qITwgTWFzdGVyL3NsYXZlIG1vZGUgc2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTWFzdGVyX1NsYXZlX01vZGUgKi8KK30gVElNX01hc3RlckNvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIFNsYXZlIGNvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90ICBTbGF2ZU1vZGU7ICAgICAgICAgLyohPCBTbGF2ZSBtb2RlIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fU2xhdmVfTW9kZSAqLworICB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyOyAgICAgIC8qITwgSW5wdXQgVHJpZ2dlciBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX1RyaWdnZXJfU2VsZWN0aW9uICovCisgIHVpbnQzMl90ICBUcmlnZ2VyUG9sYXJpdHk7ICAgLyohPCBJbnB1dCBUcmlnZ2VyIHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9UcmlnZ2VyX1BvbGFyaXR5ICovCisgIHVpbnQzMl90ICBUcmlnZ2VyUHJlc2NhbGVyOyAgLyohPCBJbnB1dCB0cmlnZ2VyIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fVHJpZ2dlcl9QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgIFRyaWdnZXJGaWx0ZXI7ICAgICAvKiE8IElucHV0IHRyaWdnZXIgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgICovCisKK30gVElNX1NsYXZlQ29uZmlnVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1RJTV9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFBlcmlwaGVyYWwgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8KKyAgSEFMX1RJTV9TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgKi8KKyAgSEFMX1RJTV9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IEFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8KKyAgSEFMX1RJTV9TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1RJTV9TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDRVICAgICAvKiE8IFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgKi8KK30gSEFMX1RJTV9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIEFjdGl2ZSBjaGFubmVsIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMSAgICAgICAgPSAweDAxVSwgICAgLyohPCBUaGUgYWN0aXZlIGNoYW5uZWwgaXMgMSAgICAgKi8KKyAgSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yICAgICAgICA9IDB4MDJVLCAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyAyICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzMgICAgICAgID0gMHgwNFUsICAgIC8qITwgVGhlIGFjdGl2ZSBjaGFubmVsIGlzIDMgICAgICovCisgIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNCAgICAgICAgPSAweDA4VSwgICAgLyohPCBUaGUgYWN0aXZlIGNoYW5uZWwgaXMgNCAgICAgKi8KKyAgSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEICA9IDB4MDBVICAgICAvKiE8IEFsbCBhY3RpdmUgY2hhbm5lbHMgY2xlYXJlZCAqLworfSBIQUxfVElNX0FjdGl2ZUNoYW5uZWw7CisKKy8qKgorICAqIEBicmllZiAgVElNIFRpbWUgQmFzZSBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit0eXBlZGVmIHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK3sKKyAgVElNX1R5cGVEZWYgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICovCisgIFRJTV9CYXNlX0luaXRUeXBlRGVmICAgICAgICBJbml0OyAgICAgICAgICAvKiE8IFRJTSBUaW1lIEJhc2UgcmVxdWlyZWQgcGFyYW1ldGVycyAqLworICBIQUxfVElNX0FjdGl2ZUNoYW5uZWwgICAgICAgQ2hhbm5lbDsgICAgICAgLyohPCBBY3RpdmUgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgKi8KKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICpoZG1hWzddOyAgICAgIC8qITwgRE1BIEhhbmRsZXJzIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYXJyYXkgaXMgYWNjZXNzZWQgYnkgYSBAcmVmIERNQV9IYW5kbGVfaW5kZXggKi8KKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgIExvY2s7ICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICovCisgIF9fSU8gSEFMX1RJTV9TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgICAvKiE8IFRJTSBvcGVyYXRpb24gc3RhdGUgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIEJhc2VfTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAgICAvKiE8IFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBCYXNlX01zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAgLyohPCBUSU0gQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogSUNfTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAgICAgIC8qITwgVElNIElDIE1zcCBJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIElDX01zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAgICAvKiE8IFRJTSBJQyBNc3AgRGVJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBPQ19Nc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgICAgLyohPCBUSU0gT0MgTXNwIEluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogT0NfTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgIC8qITwgVElNIE9DIE1zcCBEZUluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIFBXTV9Nc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgICAvKiE8IFRJTSBQV00gTXNwIEluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBQV01fTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgLyohPCBUSU0gUFdNIE1zcCBEZUluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogT25lUHVsc2VfTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgIC8qITwgVElNIE9uZSBQdWxzZSBNc3AgSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIE9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAvKiE8IFRJTSBPbmUgUHVsc2UgTXNwIERlSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBFbmNvZGVyX01zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgLyohPCBUSU0gRW5jb2RlciBNc3AgSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogRW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgIC8qITwgVElNIEVuY29kZXIgTXNwIERlSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIFBlcmlvZEVsYXBzZWRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgICAvKiE8IFRJTSBQZXJpb2QgRWxhcHNlZCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBQZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogVHJpZ2dlckNhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAgICAgICAgIC8qITwgVElNIFRyaWdnZXIgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIFRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAvKiE8IFRJTSBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBJQ19DYXB0dXJlQ2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgICAgLyohPCBUSU0gSW5wdXQgQ2FwdHVyZSBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgIC8qITwgVElNIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIE9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAvKiE8IFRJTSBPdXRwdXQgQ29tcGFyZSBEZWxheSBFbGFwc2VkIENhbGxiYWNrICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBQV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgLyohPCBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7IC8qITwgVElNIFBXTSBQdWxzZSBGaW5pc2hlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICAqLworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTSBFcnJvciBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gVElNX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBUSU0gQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgICBIQUxfVElNX0JBU0VfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgID0gMHgwMFUgICAgLyohPCBUSU0gQmFzZSBNc3BJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fQkFTRV9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgPSAweDAxVSAgICAvKiE8IFRJTSBCYXNlIE1zcERlSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICA9IDB4MDJVICAgIC8qITwgVElNIElDIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgID0gMHgwM1UgICAgLyohPCBUSU0gSUMgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fT0NfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgPSAweDA0VSAgICAvKiE8IFRJTSBPQyBNc3BJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICA9IDB4MDVVICAgIC8qITwgVElNIE9DIE1zcERlSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEICAgICAgICAgICAgID0gMHgwNlUgICAgLyohPCBUSU0gUFdNIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fUFdNX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgPSAweDA3VSAgICAvKiE8IFRJTSBQV00gTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCAgICAgICA9IDB4MDhVICAgIC8qITwgVElNIE9uZSBQdWxzZSBNc3BJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgICAgID0gMHgwOVUgICAgLyohPCBUSU0gT25lIFB1bHNlIE1zcERlSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fRU5DT0RFUl9NU1BJTklUX0NCX0lEICAgICAgICAgPSAweDBBVSAgICAvKiE8IFRJTSBFbmNvZGVyIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCAgICAgICA9IDB4MEJVICAgIC8qITwgVElNIEVuY29kZXIgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1BFUklPRF9FTEFQU0VEX0NCX0lEICAgICAgICAgID0gMHgwRVUgICAgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgICAgID0gMHgwRlUgICAgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgxMFUgICAgLyohPCBUSU0gVHJpZ2dlciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1RSSUdHRVJfSEFMRl9DQl9JRCAgICAgICAgICAgID0gMHgxMVUgICAgLyohPCBUSU0gVHJpZ2dlciBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCAgICAgICAgICAgICAgPSAweDEyVSAgICAvKiE8IFRJTSBJbnB1dCBDYXB0dXJlIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEICAgICAgICAgPSAweDEzVSAgICAvKiE8IFRJTSBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCAgICAgICAgPSAweDE0VSAgICAvKiE8IFRJTSBPdXRwdXQgQ29tcGFyZSBEZWxheSBFbGFwc2VkIENhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEICAgICAgPSAweDE1VSAgICAvKiE8IFRJTSBQV00gUHVsc2UgRmluaXNoZWQgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisgICxIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9IQUxGX0NCX0lEID0gMHgxNlUgICAgLyohPCBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisgICxIQUxfVElNX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgxN1UgICAgLyohPCBUSU0gRXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFRJTSBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwVElNX0NhbGxiYWNrVHlwZURlZikoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgLyohPCBwb2ludGVyIHRvIHRoZSBUSU0gY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0NvbnN0YW50cyBUSU0gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xlYXJJbnB1dF9Tb3VyY2UgVElNIENsZWFyIElucHV0IFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgLyohPCBPQ1JFRl9DTFIgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAvKiE8IE9DUkVGX0NMUiBpcyBjb25uZWN0ZWQgdG8gRVRSRiBpbnB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRE1BX0Jhc2VfYWRkcmVzcyBUSU0gRE1BIEJhc2UgQWRkcmVzcworICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NSMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ1IyICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVQorI2RlZmluZSBUSU1fRE1BQkFTRV9TTUNSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0RJRVIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM1UKKyNkZWZpbmUgVElNX0RNQUJBU0VfU1IgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VQorI2RlZmluZSBUSU1fRE1BQkFTRV9FR1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDVVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDTVIxICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNlUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NNUjIgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3VQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ0VSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NOVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOVUKKyNkZWZpbmUgVElNX0RNQUJBU0VfUFNDICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBBVQorI2RlZmluZSBUSU1fRE1BQkFTRV9BUlIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEJVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjEgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSMiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFVQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ1IzICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEZVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfRENSICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEyVQorI2RlZmluZSBUSU1fRE1BQkFTRV9ETUFSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTNVCisjZGVmaW5lIFRJTV9ETUFCQVNFX09SICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNFUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V2ZW50X1NvdXJjZSBUSU0gRXZlbnQgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX1VQREFURSAgICAgICAgICAgICAgVElNX0VHUl9VRyAgICAgLyohPCBSZWluaXRpYWxpemUgdGhlIGNvdW50ZXIgYW5kIGdlbmVyYXRlcyBhbiB1cGRhdGUgb2YgdGhlIHJlZ2lzdGVycyAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ0MxICAgICAgICAgICAgICAgICBUSU1fRUdSX0NDMUcgICAvKiE8IEEgY2FwdHVyZS9jb21wYXJlIGV2ZW50IGlzIGdlbmVyYXRlZCBvbiBjaGFubmVsIDEgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0NDMiAgICAgICAgICAgICAgICAgVElNX0VHUl9DQzJHICAgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCAyICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzMgICAgICAgICAgICAgICAgIFRJTV9FR1JfQ0MzRyAgIC8qITwgQSBjYXB0dXJlL2NvbXBhcmUgZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIGNoYW5uZWwgMyAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ0M0ICAgICAgICAgICAgICAgICBUSU1fRUdSX0NDNEcgICAvKiE8IEEgY2FwdHVyZS9jb21wYXJlIGV2ZW50IGlzIGdlbmVyYXRlZCBvbiBjaGFubmVsIDQgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX1RSSUdHRVIgICAgICAgICAgICAgVElNX0VHUl9URyAgICAgLyohPCBBIHRyaWdnZXIgZXZlbnQgaXMgZ2VuZXJhdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9JbnB1dF9DaGFubmVsX1BvbGFyaXR5IFRJTSBJbnB1dCBDaGFubmVsIHBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb2xhcml0eSBmb3IgVEl4IHNvdXJjZSAqLworI2RlZmluZSAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0ZBTExJTkcgICAgIFRJTV9DQ0VSX0NDMVAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBUSXggc291cmNlICovCisjZGVmaW5lICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfQk9USEVER0UgICAgKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkgIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0VUUl9Qb2xhcml0eSBUSU0gRVRSIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0VUUlBPTEFSSVRZX0lOVkVSVEVEICAgICAgICAgICAgICBUSU1fU01DUl9FVFAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb2xhcml0eSBmb3IgRVRSIHNvdXJjZSAqLworI2RlZmluZSBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFIgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FVFJfUHJlc2NhbGVyIFRJTSBFVFIgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0VUUlBSRVNDQUxFUl9ESVYxICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBwcmVzY2FsZXIgaXMgdXNlZCAqLworI2RlZmluZSBUSU1fRVRSUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgICAgIFRJTV9TTUNSX0VUUFNfMCAgICAgICAgICAgICAgICAgICAvKiE8IEVUUiBpbnB1dCBzb3VyY2UgaXMgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgVElNX1NNQ1JfRVRQU18xICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgVElNX0VUUlBSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICAgICBUSU1fU01DUl9FVFBTICAgICAgICAgICAgICAgICAgICAgLyohPCBFVFIgaW5wdXQgc291cmNlIGlzIGRpdmlkZWQgYnkgOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ291bnRlcl9Nb2RlIFRJTSBDb3VudGVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ09VTlRFUk1PREVfVVAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgdXNlZCBhcyB1cC1jb3VudGVyICAgKi8KKyNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0RPV04gICAgICAgICAgICAgICBUSU1fQ1IxX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIHVzZWQgYXMgZG93bi1jb3VudGVyICovCisjZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMSAgICAgVElNX0NSMV9DTVNfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2VudGVyLWFsaWduZWQgbW9kZSAxICAgICAgICAqLworI2RlZmluZSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDIgICAgIFRJTV9DUjFfQ01TXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENlbnRlci1hbGlnbmVkIG1vZGUgMiAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQzICAgICBUSU1fQ1IxX0NNUyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDZW50ZXItYWxpZ25lZCBtb2RlIDMgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9DbG9ja0RpdmlzaW9uIFRJTSBDbG9jayBEaXZpc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTE9DS0RJVklTSU9OX0RJVjEgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2xvY2sgZGl2aXNpb246IHREVFM9dENLX0lOVCAgICovCisjZGVmaW5lIFRJTV9DTE9DS0RJVklTSU9OX0RJVjIgICAgICAgICAgICAgVElNX0NSMV9DS0RfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2xvY2sgZGl2aXNpb246IHREVFM9Mip0Q0tfSU5UICovCisjZGVmaW5lIFRJTV9DTE9DS0RJVklTSU9OX0RJVjQgICAgICAgICAgICAgVElNX0NSMV9DS0RfMSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2xvY2sgZGl2aXNpb246IHREVFM9NCp0Q0tfSU5UICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9TdGF0ZSBUSU0gT3V0cHV0IENvbXBhcmUgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT1VUUFVUU1RBVEVfRElTQUJMRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAxIG91dHB1dCBkaXNhYmxlZCAqLworI2RlZmluZSBUSU1fT1VUUFVUU1RBVEVfRU5BQkxFICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMUUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAxIG91dHB1dCBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9BdXRvUmVsb2FkUHJlbG9hZCBUSU0gQXV0by1SZWxvYWQgUHJlbG9hZAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9BVVRPUkVMT0FEX1BSRUxPQURfRElTQUJMRSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgVElNeF9BUlIgcmVnaXN0ZXIgaXMgbm90IGJ1ZmZlcmVkICovCisjZGVmaW5lIFRJTV9BVVRPUkVMT0FEX1BSRUxPQURfRU5BQkxFICAgICAgICAgICAgICAgICBUSU1fQ1IxX0FSUEUgICAgICAgICAgICAgIC8qITwgVElNeF9BUlIgcmVnaXN0ZXIgaXMgYnVmZmVyZWQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0Zhc3RfU3RhdGUgVElNIE91dHB1dCBGYXN0IFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09DRkFTVF9ESVNBQkxFICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgQ29tcGFyZSBmYXN0IGRpc2FibGUgKi8KKyNkZWZpbmUgVElNX09DRkFTVF9FTkFCTEUgICAgICAgICAgICAgICAgICBUSU1fQ0NNUjFfT0MxRkUgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgQ29tcGFyZSBmYXN0IGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX05fU3RhdGUgVElNIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT1VUUFVUTlNUQVRFX0RJU0FCTEUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DeE4gaXMgZGlzYWJsZWQgICovCisjZGVmaW5lIFRJTV9PVVRQVVROU1RBVEVfRU5BQkxFICAgICAgICAgICAgVElNX0NDRVJfQ0MxTkUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0N4TiBpcyBlbmFibGVkICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX1BvbGFyaXR5IFRJTSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PQ1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIG91dHB1dCBwb2xhcml0eSAgKi8KKyNkZWZpbmUgVElNX09DUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFQICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgb3V0cHV0IHBvbGFyaXR5ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSBUSU0gSW5wdXQgQ2FwdHVyZSBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lICBUSU1fSUNQT0xBUklUWV9SSVNJTkcgICAgICAgICAgICAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX1JJU0lORyAgICAgIC8qITwgQ2FwdHVyZSB0cmlnZ2VyZWQgYnkgcmlzaW5nIGVkZ2Ugb24gdGltZXIgaW5wdXQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgVElNX0lDUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HICAgICAvKiE8IENhcHR1cmUgdHJpZ2dlcmVkIGJ5IGZhbGxpbmcgZWRnZSBvbiB0aW1lciBpbnB1dCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfQk9USEVER0UgICAgLyohPCBDYXB0dXJlIHRyaWdnZXJlZCBieSBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyBvbiB0aW1lciBpbnB1dCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9JbnB1dF9DYXB0dXJlX1NlbGVjdGlvbiBUSU0gSW5wdXQgQ2FwdHVyZSBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEkgICAgICAgICAgIFRJTV9DQ01SMV9DQzFTXzAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTSBJbnB1dCAxLCAyLCAzIG9yIDQgaXMgc2VsZWN0ZWQgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gSUMxLCBJQzIsIElDMyBvciBJQzQsIHJlc3BlY3RpdmVseSAqLworI2RlZmluZSBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSSAgICAgICAgIFRJTV9DQ01SMV9DQzFTXzEgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTSBJbnB1dCAxLCAyLCAzIG9yIDQgaXMgc2VsZWN0ZWQgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gSUMyLCBJQzEsIElDNCBvciBJQzMsIHJlc3BlY3RpdmVseSAqLworI2RlZmluZSBUSU1fSUNTRUxFQ1RJT05fVFJDICAgICAgICAgICAgICAgIFRJTV9DQ01SMV9DQzFTICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTSBJbnB1dCAxLCAyLCAzIG9yIDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgVElNIElucHV0IENhcHR1cmUgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0lDUFNDX0RJVjEgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBlYWNoIHRpbWUgYW4gZWRnZSBpcyBkZXRlY3RlZCBvbiB0aGUgY2FwdHVyZSBpbnB1dCAqLworI2RlZmluZSBUSU1fSUNQU0NfRElWMiAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ01SMV9JQzFQU0NfMCAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgMiBldmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9JQ1BTQ19ESVY0ICAgICAgICAgICAgICAgICAgICAgVElNX0NDTVIxX0lDMVBTQ18xICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA0IGV2ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0lDUFNDX0RJVjggICAgICAgICAgICAgICAgICAgICBUSU1fQ0NNUjFfSUMxUFNDICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDggZXZlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT25lX1B1bHNlX01vZGUgVElNIE9uZSBQdWxzZSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09QTU9ERV9TSU5HTEUgICAgICAgICAgICAgICAgICBUSU1fQ1IxX09QTSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIHN0b3BzIGNvdW50aW5nIGF0IHRoZSBuZXh0IHVwZGF0ZSBldmVudCAqLworI2RlZmluZSBUSU1fT1BNT0RFX1JFUEVUSVRJVkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgaXMgbm90IHN0b3BwZWQgYXQgdXBkYXRlIGV2ZW50ICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FbmNvZGVyX01vZGUgVElNIEVuY29kZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9USTEgICAgICAgICAgICAgICAgICAgICAgVElNX1NNQ1JfU01TXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlIDEsIHgyIG1vZGUsIGNvdW50cyB1cC9kb3duIG9uIFRJMUZQMSBlZGdlIGRlcGVuZGluZyBvbiBUSTJGUDIgbGV2ZWwgICovCisjZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9USTIgICAgICAgICAgICAgICAgICAgICAgVElNX1NNQ1JfU01TXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlIDIsIHgyIG1vZGUsIGNvdW50cyB1cC9kb3duIG9uIFRJMkZQMiBlZGdlIGRlcGVuZGluZyBvbiBUSTFGUDEgbGV2ZWwuICovCisjZGVmaW5lIFRJTV9FTkNPREVSTU9ERV9USTEyICAgICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1NNU18xIHwgVElNX1NNQ1JfU01TXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlIDMsIHg0IG1vZGUsIGNvdW50cyB1cC9kb3duIG9uIGJvdGggVEkxRlAxIGFuZCBUSTJGUDIgZWRnZXMgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCBvZiB0aGUgb3RoZXIgaW5wdXQuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9JbnRlcnJ1cHRfZGVmaW5pdGlvbiBUSU0gaW50ZXJydXB0IERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fSVRfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX1VJRSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fSVRfQ0MxICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDMUlFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworI2RlZmluZSBUSU1fSVRfQ0MyICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDMklFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworI2RlZmluZSBUSU1fSVRfQ0MzICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDM0lFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworI2RlZmluZSBUSU1fSVRfQ0M0ICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDNElFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworI2RlZmluZSBUSU1fSVRfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX1RJRSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyaWdnZXIgaW50ZXJydXB0ICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRE1BX3NvdXJjZXMgVElNIERNQSBTb3VyY2VzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0RNQV9VUERBVEUgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9VREUgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVwZGF0ZSBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NDMSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDMURFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY2FwdHVyZS9jb21wYXJlIG1hY3RoIDEgZXZlbnQgKi8KKyNkZWZpbmUgVElNX0RNQV9DQzIgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzJERSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIGNhcHR1cmUvY29tcGFyZSBtYWN0aCAyIGV2ZW50IGV2ZW50ICovCisjZGVmaW5lIFRJTV9ETUFfQ0MzICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MzREUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBjYXB0dXJlL2NvbXBhcmUgbWFjdGggMyBldmVudCBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NDNCAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDNERFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY2FwdHVyZS9jb21wYXJlIG1hY3RoIDQgZXZlbnQgZXZlbnQgKi8KKyNkZWZpbmUgVElNX0RNQV9UUklHR0VSICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9UREUgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIHRyaWdnZXIgZXZlbnQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0ZsYWdfZGVmaW5pdGlvbiBUSU0gRmxhZyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfVVBEQVRFICAgICAgICAgICAgICAgICAgICBUSU1fU1JfVUlGICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgaW50ZXJydXB0IGZsYWcgICAgICAgICAqLworI2RlZmluZSBUSU1fRkxBR19DQzEgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzFJRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDMiAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDMklGICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0MzICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MzSUYgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBUSU1fRkxBR19DQzQgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzRJRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgVElNX1NSX1RJRiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAgICAgICAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0MxT0YgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MxT0YgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIDEgb3ZlcmNhcHR1cmUgZmxhZyAgICAqLworI2RlZmluZSBUSU1fRkxBR19DQzJPRiAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzJPRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUgMiBvdmVyY2FwdHVyZSBmbGFnICAgICovCisjZGVmaW5lIFRJTV9GTEFHX0NDM09GICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDM09GICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSAzIG92ZXJjYXB0dXJlIGZsYWcgICAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0M0T0YgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0M0T0YgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIDQgb3ZlcmNhcHR1cmUgZmxhZyAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2hhbm5lbCBUSU0gQ2hhbm5lbAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgMSBpZGVudGlmaWVyICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgY2hhbm5lbCAyIGlkZW50aWZpZXIgICAgICAqLworI2RlZmluZSBUSU1fQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSBjaGFubmVsIDMgaWRlbnRpZmllciAgICAgICovCisjZGVmaW5lIFRJTV9DSEFOTkVMXzQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQ1UgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgNCBpZGVudGlmaWVyICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfQUxMICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDNDVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHbG9iYWwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgaWRlbnRpZmllciAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrX1NvdXJjZSBUSU0gQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0VUUk1PREUyICAgIFRJTV9TTUNSX0VUUFNfMSAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMICAgIFRJTV9TTUNSX0VUUFNfMCAgICAgIC8qITwgSW50ZXJuYWwgY2xvY2sgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjAgICAgICAgIFRJTV9UU19JVFIwICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMCkgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjEgICAgICAgIFRJTV9UU19JVFIxICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMSkgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjIgICAgICAgIFRJTV9UU19JVFIyICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMikgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjMgICAgICAgIFRJTV9UU19JVFIzICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMykgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX1RJMUVEICAgICAgIFRJTV9UU19USTFGX0VEICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoVFRJMUZQMSArIGVkZ2UgZGV0ZWN0LikgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX1RJMSAgICAgICAgIFRJTV9UU19USTFGUDEgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoVFRJMUZQMSkgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX1RJMiAgICAgICAgIFRJTV9UU19USTJGUDIgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoVFRJMkZQMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0VUUk1PREUxICAgIFRJTV9UU19FVFJGICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoRVRSRikgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrX1BvbGFyaXR5IFRJTSBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX0lOVkVSVEVEICAgICAgICAgICBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggY2xvY2sgc291cmNlcyAqLworI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IGNsb2NrIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgICAgLyohPCBQb2xhcml0eSBmb3IgVEl4IGNsb2NrIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HICAgLyohPCBQb2xhcml0eSBmb3IgVEl4IGNsb2NrIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfQk9USEVER0UgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSAgLyohPCBQb2xhcml0eSBmb3IgVEl4IGNsb2NrIHNvdXJjZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrX1ByZXNjYWxlciBUSU0gQ2xvY2sgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAgICAgICAgICAgLyohPCBObyBwcmVzY2FsZXIgaXMgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSAyIGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA0IGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA4IGV2ZW50cy4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NsZWFySW5wdXRfUG9sYXJpdHkgVElNIENsZWFyIElucHV0IFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgVElNX0VUUlBPTEFSSVRZX0lOVkVSVEVEICAgICAgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBwaW4gKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEICAgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBwaW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NsZWFySW5wdXRfUHJlc2NhbGVyIFRJTSBDbGVhciBJbnB1dCBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYxICAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgICAgICAgICAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVYyICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgMiBldmVudHMuICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAgICAgICAgIC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgcGluOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjggICAgICAgICAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIHBpbjogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA4IGV2ZW50cy4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbiBUSU0gTWFzdGVyIE1vZGUgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RSR09fUkVTRVQgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0VHUi5VRyBiaXQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTykgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUkdPX0VOQUJMRSAgICAgICAgICAgVElNX0NSMl9NTVNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DUjEuQ0VOIGJpdCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHT19VUERBVEUgICAgICAgICAgIFRJTV9DUjJfTU1TXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwZGF0ZSBldmVudCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR09fT0MxICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCAxIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08pICovCisjZGVmaW5lIFRJTV9UUkdPX09DMVJFRiAgICAgICAgICAgVElNX0NSMl9NTVNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHT19PQzJSRUYgICAgICAgICAgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMCkgICAgICAgICAgICAgICAgICAvKiE8IE9DMlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dChUUkdPKSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR09fT0MzUkVGICAgICAgICAgICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzEpICAgICAgICAgICAgICAgICAgLyohPCBPQzNSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQoVFJHTykgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUkdPX09DNFJFRiAgICAgICAgICAgKFRJTV9DUjJfTU1TXzIgfCBUSU1fQ1IyX01NU18xIHwgVElNX0NSMl9NTVNfMCkgIC8qITwgT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0KFRSR08pICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTWFzdGVyX1NsYXZlX01vZGUgVElNIE1hc3Rlci9TbGF2ZSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX01BU1RFUlNMQVZFTU9ERV9FTkFCTEUgICAgICAgICBUSU1fU01DUl9NU00gICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBhY3Rpb24gKi8KKyNkZWZpbmUgVElNX01BU1RFUlNMQVZFTU9ERV9ESVNBQkxFICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIvc2xhdmUgbW9kZSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fU2xhdmVfTW9kZSBUSU0gU2xhdmUgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfRElTQUJMRSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNsYXZlIG1vZGUgZGlzYWJsZWQgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfUkVTRVQgICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlc2V0IE1vZGUgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfR0FURUQgICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMCkgICAgICAgICAgICAgICAgICAvKiE8IEdhdGVkIE1vZGUgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfVFJJR0dFUiAgICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSkgICAgICAgICAgICAgICAgICAvKiE8IFRyaWdnZXIgTW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfRVhURVJOQUwxICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSAvKiE8IEV4dGVybmFsIENsb2NrIE1vZGUgMSAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9hbmRfUFdNX21vZGVzIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgUFdNIE1vZGVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9USU1JTkcgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGcm96ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0FDVElWRSAgICAgICAgICAgICAgICAgICBUSU1fQ0NNUjFfT0MxTV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBjaGFubmVsIHRvIGFjdGl2ZSBsZXZlbCBvbiBtYXRjaCAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgIFRJTV9DQ01SMV9PQzFNXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IGNoYW5uZWwgdG8gaW5hY3RpdmUgbGV2ZWwgb24gbWF0Y2ggKi8KKyNkZWZpbmUgVElNX09DTU9ERV9UT0dHTEUgICAgICAgICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzEgfCBUSU1fQ0NNUjFfT0MxTV8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBUb2dnbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX1BXTTEgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IFBXTSBtb2RlIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfUFdNMiAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzApIC8qITwgUFdNIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9GT1JDRURfQUNUSVZFICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzIgfCBUSU1fQ0NNUjFfT0MxTV8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBGb3JjZSBhY3RpdmUgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRSAgICAgICAgICBUSU1fQ0NNUjFfT0MxTV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZvcmNlIGluYWN0aXZlIGxldmVsICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9UcmlnZ2VyX1NlbGVjdGlvbiBUSU0gVHJpZ2dlciBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVFNfSVRSMCAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMCAoSVRSMCkgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19JVFIxICAgICAgICAgIFRJTV9TTUNSX1RTXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAxIChJVFIxKSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RTX0lUUjIgICAgICAgICAgVElNX1NNQ1JfVFNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDIgKElUUjIpICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfSVRSMyAgICAgICAgICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMyAoSVRSMykgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19USTFGX0VEICAgICAgIFRJTV9TTUNSX1RTXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVEkxIEVkZ2UgRGV0ZWN0b3IgKFRJMUZfRUQpICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RTX1RJMUZQMSAgICAgICAgKFRJTV9TTUNSX1RTXzAgfCBUSU1fU01DUl9UU18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxIChUSTFGUDEpICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfVEkyRlAyICAgICAgICAoVElNX1NNQ1JfVFNfMSB8IFRJTV9TTUNSX1RTXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZpbHRlcmVkIFRpbWVyIElucHV0IDIgKFRJMkZQMikgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19FVFJGICAgICAgICAgIChUSU1fU01DUl9UU18wIHwgVElNX1NNQ1JfVFNfMSB8IFRJTV9TTUNSX1RTXzIpICAgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyZWQgRXh0ZXJuYWwgVHJpZ2dlciBpbnB1dCAoRVRSRikgKi8KKyNkZWZpbmUgVElNX1RTX05PTkUgICAgICAgICAgMHgwMDAwRkZGRlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyB0cmlnZ2VyIHNlbGVjdGVkICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fVHJpZ2dlcl9Qb2xhcml0eSBUSU0gVHJpZ2dlciBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggdHJpZ2dlciBzb3VyY2VzICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgIFRJTV9FVFJQT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggdHJpZ2dlciBzb3VyY2VzICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeEZQeCBvciBUSTFfRUQgdHJpZ2dlciBzb3VyY2VzICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeEZQeCBvciBUSTFfRUQgdHJpZ2dlciBzb3VyY2VzICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfQk9USEVER0UgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeEZQeCBvciBUSTFfRUQgdHJpZ2dlciBzb3VyY2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9UcmlnZ2VyX1ByZXNjYWxlciBUSU0gVHJpZ2dlciBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYxICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVYyICAgICAgICAgICAgIC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgVHJpZ2dlcjogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSAyIGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBUcmlnZ2VyOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIFRyaWdnZXI6IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgOCBldmVudHMuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9USTFfU2VsZWN0aW9uIFRJTSBUSTEgSW5wdXQgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RJMVNFTEVDVElPTl9DSDEgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgVElNeF9DSDEgcGluIGlzIGNvbm5lY3RlZCB0byBUSTEgaW5wdXQgKi8KKyNkZWZpbmUgVElNX1RJMVNFTEVDVElPTl9YT1JDT01CSU5BVElPTiAgICBUSU1fQ1IyX1RJMVMgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgYXJlIGNvbm5lY3RlZCB0byB0aGUgVEkxIGlucHV0IChYT1IgY29tYmluYXRpb24pICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9ETUFfQnVyc3RfTGVuZ3RoIFRJTSBETUEgQnVyc3QgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUiAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxIHJlZ2lzdGVyIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMlRSQU5TRkVSUyAgICAgIDB4MDAwMDAxMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDIgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8zVFJBTlNGRVJTICAgICAgMHgwMDAwMDIwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMyByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzRUUkFOU0ZFUlMgICAgICAweDAwMDAwMzAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA0IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfNVRSQU5TRkVSUyAgICAgIDB4MDAwMDA0MDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDUgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF82VFJBTlNGRVJTICAgICAgMHgwMDAwMDUwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gNiByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzdUUkFOU0ZFUlMgICAgICAweDAwMDAwNjAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA3IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfOFRSQU5TRkVSUyAgICAgIDB4MDAwMDA3MDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDggcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF85VFJBTlNGRVJTICAgICAgMHgwMDAwMDgwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gOSByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzEwVFJBTlNGRVJTICAgICAweDAwMDAwOTAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxMCByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTFUUkFOU0ZFUlMgICAgIDB4MDAwMDBBMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDExIHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xMlRSQU5TRkVSUyAgICAgMHgwMDAwMEIwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTIgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzEzVFJBTlNGRVJTICAgICAweDAwMDAwQzAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxMyByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTRUUkFOU0ZFUlMgICAgIDB4MDAwMDBEMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE0IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xNVRSQU5TRkVSUyAgICAgMHgwMDAwMEUwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTUgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE2VFJBTlNGRVJTICAgICAweDAwMDAwRjAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxNiByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTdUUkFOU0ZFUlMgICAgIDB4MDAwMDEwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE3IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xOFRSQU5TRkVSUyAgICAgMHgwMDAwMTEwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTggcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0hhbmRsZV9pbmRleCBUSU0gRE1BIEhhbmRsZSBJbmRleAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9ETUFfSURfVVBEQVRFICAgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwMCkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBVcGRhdGUgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ0MxICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwMSkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9DQzIgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDAyKSAgICAgICAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0cyAqLworI2RlZmluZSBUSU1fRE1BX0lEX0NDMyAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDAwMDMpICAgICAgIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ0M0ICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwNCkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgNCBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9UUklHR0VSICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDA2KSAgICAgICAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIFRyaWdnZXIgRE1BIHJlcXVlc3RzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENoYW5uZWxfQ0NfU3RhdGUgVElNIENhcHR1cmUvQ29tcGFyZSBDaGFubmVsIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NDeF9FTkFCTEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBvciBvdXRwdXQgY2hhbm5lbCBpcyBlbmFibGVkICovCisjZGVmaW5lIFRJTV9DQ3hfRElTQUJMRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgb3Igb3V0cHV0IGNoYW5uZWwgaXMgZGlzYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfTWFjcm9zIFRJTSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBUSU0gaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlICAgICAgICAgICAgID0gSEFMX1RJTV9TVEFURV9SRVNFVDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5CYXNlX01zcEluaXRDYWxsYmFjayAgICAgICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPklDX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+T0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk9DX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5QV01fTXNwSW5pdENhbGxiYWNrICAgICAgICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+UFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9USU1fUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjF8PShUSU1fQ1IxX0NFTikpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEUoX19IQU5ETEVfXykgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmIFRJTV9DQ0VSX0NDeEVfTUFTSykgPT0gMFVMKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+KFRJTV9DUjFfQ0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVVBEQVRFOiBVcGRhdGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzE6ICAgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMzogIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0M0OiAgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9UUklHR0VSOiBUcmlnZ2VyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFRJTSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMTogICBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMjogIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzQ6ICBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgRE1BIHJlcXVlc3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRE1BX18gc3BlY2lmaWVzIHRoZSBUSU0gRE1BIHJlcXVlc3QgdG8gZW5hYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBVcGRhdGUgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6ICAgQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0M0OiAgQ2FwdHVyZS9Db21wYXJlIDQgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9UUklHR0VSOiBUcmlnZ2VyIERNQSByZXF1ZXN0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9FTkFCTEVfRE1BKF9fSEFORExFX18sIF9fRE1BX18pICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgfD0gKF9fRE1BX18pKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIHJlcXVlc3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRE1BX18gc3BlY2lmaWVzIHRoZSBUSU0gRE1BIHJlcXVlc3QgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVXBkYXRlIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVHJpZ2dlciBETUEgcmVxdWVzdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRV9ETUEoX19IQU5ETEVfXywgX19ETUFfXykgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSICY9IH4oX19ETUFfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUSU0gSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1VQREFURTogVXBkYXRlIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMTogQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MyOiBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzM6IENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNDogQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogQ2FwdHVyZS9Db21wYXJlIDMgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0IGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzE6IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMjogQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MxT0Y6IENhcHR1cmUvQ29tcGFyZSAxIG92ZXJjYXB0dXJlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MyT0Y6IENhcHR1cmUvQ29tcGFyZSAyIG92ZXJjYXB0dXJlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzT0Y6IENhcHR1cmUvQ29tcGFyZSAzIG92ZXJjYXB0dXJlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0M0T0Y6IENhcHR1cmUvQ29tcGFyZSA0IG92ZXJjYXB0dXJlIGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9USU1fQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiA9IH4oX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMTogICBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMjogIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzQ6ICBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgVElNX0lUIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgQ2xlYXIgdGhlIFRJTSBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMTogICBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMjogIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzQ6ICBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiA9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBUSU0gQ291bnRlciBpcyB1c2VkIGFzIGRvd25jb3VudGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEByZXR2YWwgRmFsc2UgKENvdW50ZXIgdXNlZCBhcyB1cGNvdW50ZXIpIG9yIFRydWUgKENvdW50ZXIgdXNlZCBhcyBkb3duY291bnRlcikKKyAgKiBAbm90ZSBUaGlzIG1hY3JvIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgdG8gZ2V0IHRoZSBjb3VudGluZyBtb2RlIHdoZW4gdGhlIHRpbWVyIG9wZXJhdGVzIGluIENlbnRlci1hbGlnbmVkIG1vZGUgb3IgRW5jb2RlcgorbW9kZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0lTX1RJTV9DT1VOVElOR19ET1dOKF9fSEFORExFX18pICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYoVElNX0NSMV9ESVIpKSA9PSAoVElNX0NSMV9ESVIpKQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVElNIFByZXNjYWxlciBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19QUkVTQ19fIHNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIG5ldyB2YWx1ZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9QUkVTQ0FMRVIoX19IQU5ETEVfXywgX19QUkVTQ19fKSAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UFNDID0gKF9fUFJFU0NfXykpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ291bnRlciBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DT1VOVEVSX18gc3BlY2lmaWVzIHRoZSBDb3VudGVyIHJlZ2lzdGVyIG5ldyB2YWx1ZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9DT1VOVEVSKF9fSEFORExFX18sIF9fQ09VTlRFUl9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNOVCA9IChfX0NPVU5URVJfXykpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBUSU0gQ291bnRlciBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEByZXR2YWwgMTYtYml0IHZhbHVlIG9mIHRoZSB0aW1lciBjb3VudGVyIHJlZ2lzdGVyIChUSU14X0NOVCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9DT1VOVEVSKF9fSEFORExFX18pIFwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DTlQpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lIHdpdGhvdXQgY2FsbGluZyBhbm90aGVyIHRpbWUgYW55IEluaXQgZnVuY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0FVVE9SRUxPQURfXyBzcGVjaWZpZXMgdGhlIENvdW50ZXIgcmVnaXN0ZXIgbmV3IHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0FVVE9SRUxPQUQoX19IQU5ETEVfXywgX19BVVRPUkVMT0FEX18pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5BUlIgPSAoX19BVVRPUkVMT0FEX18pOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Jbml0LlBlcmlvZCA9IChfX0FVVE9SRUxPQURfXyk7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVElNIEF1dG9yZWxvYWQgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcmV0dmFsIDE2LWJpdCB2YWx1ZSBvZiB0aGUgdGltZXIgYXV0by1yZWxvYWQgcmVnaXN0ZXIoVElNeF9BUlIpCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfQVVUT1JFTE9BRChfX0hBTkRMRV9fKSBcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QVJSKQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVElNIENsb2NrIERpdmlzaW9uIHZhbHVlIG9uIHJ1bnRpbWUgd2l0aG91dCBjYWxsaW5nIGFub3RoZXIgdGltZSBhbnkgSW5pdCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0tEX18gc3BlY2lmaWVzIHRoZSBjbG9jayBkaXZpc2lvbiB2YWx1ZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWU6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjE6IHREVFM9dENLX0lOVAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyOiB0RFRTPTIqdENLX0lOVAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVY0OiB0RFRTPTQqdENLX0lOVAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0NMT0NLRElWSVNJT04oX19IQU5ETEVfXywgX19DS0RfXykgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICh+VElNX0NSMV9DS0QpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9IChfX0NLRF9fKTsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Jbml0LkNsb2NrRGl2aXNpb24gPSAoX19DS0RfXyk7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBUSU0gQ2xvY2sgRGl2aXNpb24gdmFsdWUgb24gcnVudGltZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBkaXZpc2lvbiBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxOiB0RFRTPXRDS19JTlQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMjogdERUUz0yKnRDS19JTlQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWNDogdERUUz00KnRDS19JTlQKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9DTE9DS0RJVklTSU9OKF9fSEFORExFX18pICBcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYgVElNX0NSMV9DS0QpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBwcmVzY2FsZXIgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgYW5vdGhlciB0aW1lIEhBTF9USU1fSUNfQ29uZmlnQ2hhbm5lbCgpIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEBwYXJhbSAgX19JQ1BTQ19fIHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZTQgcHJlc2NhbGVyIG5ldyB2YWx1ZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWMTogbm8gcHJlc2NhbGVyCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYyOiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWNDogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgNCBldmVudHMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjg6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDggZXZlbnRzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfSUNQUkVTQ0FMRVIoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fSUNQU0NfXykgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9SRVNFVF9JQ1BSRVNDQUxFUlZBTFVFKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU0VUX0lDUFJFU0NBTEVSVkFMVUUoKF9fSEFORExFX18pLCAoX19DSEFOTkVMX18pLCAoX19JQ1BTQ19fKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVElNIElucHV0IENhcHR1cmUgcHJlc2NhbGVyIG9uIHJ1bnRpbWUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBnZXQgaW5wdXQgY2FwdHVyZSAxIHByZXNjYWxlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBnZXQgaW5wdXQgY2FwdHVyZSAyIHByZXNjYWxlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBnZXQgaW5wdXQgY2FwdHVyZSAzIHByZXNjYWxlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBnZXQgaW5wdXQgY2FwdHVyZSA0IHByZXNjYWxlciB2YWx1ZQorICAqIEByZXR2YWwgVGhlIGlucHV0IGNhcHR1cmUgcHJlc2NhbGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9JQ1BSRVNDQUxFUihfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICYgVElNX0NDTVIxX0lDMVBTQykgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmIFRJTV9DQ01SMV9JQzJQU0MpID4+IDhVKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJiBUSU1fQ0NNUjJfSUMzUFNDKSA6XAorICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9JQzRQU0MpKSA+PiA4VSkKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgYW5vdGhlciB0aW1lIENvbmZpZ0NoYW5uZWwgZnVuY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHBhcmFtICBfX0NPTVBBUkVfXyBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZSByZWdpc3RlciBuZXcgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ09NUEFSRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19DT01QQVJFX18pIFwKKygoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IxID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IyID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IzID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNCA9IChfX0NPTVBBUkVfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYXB0dXJlIGNvbXBhcmUgcmVnaXN0ZXIKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBnZXQgY2FwdHVyZS9jb21wYXJlIDEgcmVnaXN0ZXIgdmFsdWUKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogZ2V0IGNhcHR1cmUvY29tcGFyZSAyIHJlZ2lzdGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IGdldCBjYXB0dXJlL2NvbXBhcmUgMyByZWdpc3RlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBnZXQgY2FwdHVyZS9jb21wYXJlIDQgcmVnaXN0ZXIgdmFsdWUKKyAgKiBAcmV0dmFsIDE2LWJpdCB2YWx1ZSBvZiB0aGUgY2FwdHVyZS9jb21wYXJlIHJlZ2lzdGVyIChUSU14X0NDUnkpCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfQ09NUEFSRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgXAorKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjEpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMikgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IzKSA6XAorICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I0KSkKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFRJTSBPdXRwdXQgY29tcGFyZSBwcmVsb2FkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFX09DeFBSRUxPQUQoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgIFwKKyAgICAgICAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzFQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzJQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzNQRSkgOlwKKyAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0M0UEUpKQorCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBUSU0gT3V0cHV0IGNvbXBhcmUgcHJlbG9hZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEVfT0N4UFJFTE9BRChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgXAorICAgICAgICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfT0MxUEUpIDpcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSAodWludDE2X3QpflRJTV9DQ01SMV9PQzJQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX09DM1BFKSA6XAorICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX09DNFBFKSkKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFVwZGF0ZSBSZXF1ZXN0IFNvdXJjZSAoVVJTKSBiaXQgb2YgdGhlIFRJTXhfQ1IxIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBub3RlICBXaGVuIHRoZSBVUlMgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3RlciBpcyBzZXQsIG9ubHkgY291bnRlcgorICAqICAgICAgICBvdmVyZmxvdy91bmRlcmZsb3cgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgKGlmCisgICogICAgICAgIGVuYWJsZWQpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9VUlNfRU5BQkxFKF9fSEFORExFX18pIFwKKyAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxfD0gVElNX0NSMV9VUlMpCisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgdGhlIFVwZGF0ZSBSZXF1ZXN0IFNvdXJjZSAoVVJTKSBiaXQgb2YgdGhlIFRJTXhfQ1IxIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBub3RlICBXaGVuIHRoZSBVUlMgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3RlciBpcyByZXNldCwgYW55IG9mIHRoZQorICAqICAgICAgICBmb2xsb3dpbmcgZXZlbnRzIGdlbmVyYXRlIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgKGlmCisgICogICAgICAgIGVuYWJsZWQpOgorICAqICAgICAgICAgICBfIENvdW50ZXIgb3ZlcmZsb3cgdW5kZXJmbG93CisgICogICAgICAgICAgIF8gU2V0dGluZyB0aGUgVUcgYml0CisgICogICAgICAgICAgIF8gVXBkYXRlIGdlbmVyYXRpb24gdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9VUlNfRElTQUJMRShfX0hBTkRMRV9fKSBcCisgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxJj1+VElNX0NSMV9VUlMpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ2FwdHVyZSB4IGlucHV0IHBvbGFyaXR5IG9uIHJ1bnRpbWUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHBhcmFtICBfX1BPTEFSSVRZX18gUG9sYXJpdHkgZm9yIFRJeCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX1JJU0lORzogUmlzaW5nIEVkZ2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0ZBTExJTkc6IEZhbGxpbmcgRWRnZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfQk9USEVER0U6IFJpc2luZyBhbmQgRmFsbGluZyBFZGdlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ0FQVFVSRVBPTEFSSVRZKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX1BPTEFSSVRZX18pICAgIFwKKyAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFRJTV9SRVNFVF9DQVBUVVJFUE9MQVJJVFkoKF9fSEFORExFX18pLCAoX19DSEFOTkVMX18pKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgVElNX1NFVF9DQVBUVVJFUE9MQVJJVFkoKF9fSEFORExFX18pLCAoX19DSEFOTkVMX18pLCAoX19QT0xBUklUWV9fKSk7IFwKKyAgICAgICAgfXdoaWxlKDApCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9Db25zdGFudHMgVElNIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIFRoZSBjb3VudGVyIG9mIGEgdGltZXIgaW5zdGFuY2UgaXMgZGlzYWJsZWQgb25seSBpZiBhbGwgdGhlIENDeCBhbmQgQ0N4TgorICAgY2hhbm5lbHMgaGF2ZSBiZWVuIGRpc2FibGVkICovCisjZGVmaW5lIFRJTV9DQ0VSX0NDeEVfTUFTSyAgKCh1aW50MzJfdCkoVElNX0NDRVJfQ0MxRSB8IFRJTV9DQ0VSX0NDMkUgfCBUSU1fQ0NFUl9DQzNFIHwgVElNX0NDRVJfQ0M0RSkpCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIHByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfTWFjcm9zIFRJTSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1NPVVJDRShfX01PREVfXykgICgoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0VUUikpCisKKyNkZWZpbmUgSVNfVElNX0RNQV9CQVNFKF9fQkFTRV9fKSAoKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ1IxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ1IyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfU01DUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfRElFUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfU1IpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfRUdSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NNUjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NNUjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NFUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ05UKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfUFNDKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQVJSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfT1IpKQorCisjZGVmaW5lIElTX1RJTV9FVkVOVF9TT1VSQ0UoX19TT1VSQ0VfXykgKCgoKF9fU09VUkNFX18pICYgMHhGRkZGRkZBMFUpID09IDB4MDAwMDAwMDBVKSAmJiAoKF9fU09VUkNFX18pICE9IDB4MDAwMDAwMDBVKSkKKworI2RlZmluZSBJU19USU1fQ09VTlRFUl9NT0RFKF9fTU9ERV9fKSAgICAgICgoKF9fTU9ERV9fKSA9PSBUSU1fQ09VTlRFUk1PREVfVVApICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DT1VOVEVSTU9ERV9ET1dOKSAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMykpCisKKyNkZWZpbmUgSVNfVElNX0NMT0NLRElWSVNJT05fRElWKF9fRElWX18pICAoKChfX0RJVl9fKSA9PSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gVElNX0NMT0NLRElWSVNJT05fRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFRJTV9DTE9DS0RJVklTSU9OX0RJVjQpKQorCisjZGVmaW5lIElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoUFJFTE9BRCkgKCgoUFJFTE9BRCkgPT0gVElNX0FVVE9SRUxPQURfUFJFTE9BRF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFTE9BRCkgPT0gVElNX0FVVE9SRUxPQURfUFJFTE9BRF9FTkFCTEUpKQorCisjZGVmaW5lIElTX1RJTV9GQVNUX1NUQVRFKF9fU1RBVEVfXykgICAgICAgKCgoX19TVEFURV9fKSA9PSBUSU1fT0NGQVNUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFRJTV9PQ0ZBU1RfRU5BQkxFKSkKKworI2RlZmluZSBJU19USU1fT0NfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DUE9MQVJJVFlfTE9XKSkKKworI2RlZmluZSBJU19USU1fSUNfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX0lDUE9MQVJJVFlfUklTSU5HKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fSUNQT0xBUklUWV9CT1RIRURHRSkpCisKKyNkZWZpbmUgSVNfVElNX0lDX1NFTEVDVElPTihfX1NFTEVDVElPTl9fKSAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9JQ1NFTEVDVElPTl9UUkMpKQorCisjZGVmaW5lIElTX1RJTV9JQ19QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0lDUFNDX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fSUNQU0NfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9JQ1BTQ19ESVY0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0lDUFNDX0RJVjgpKQorCisjZGVmaW5lIElTX1RJTV9PUE1fTU9ERShfX01PREVfXykgICAgICAgICAgKCgoX19NT0RFX18pID09IFRJTV9PUE1PREVfU0lOR0xFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9PUE1PREVfUkVQRVRJVElWRSkpCisKKyNkZWZpbmUgSVNfVElNX0VOQ09ERVJfTU9ERShfX01PREVfXykgICAgICAoKChfX01PREVfXykgPT0gVElNX0VOQ09ERVJNT0RFX1RJMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fRU5DT0RFUk1PREVfVEkyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9USTEyKSkKKworI2RlZmluZSBJU19USU1fRE1BX1NPVVJDRShfX1NPVVJDRV9fKSAoKCgoX19TT1VSQ0VfXykgJiAweEZGRkZBMEZGVSkgPT0gMHgwMDAwMDAwMFUpICYmICgoX19TT1VSQ0VfXykgIT0gMHgwMDAwMDAwMFUpKQorCisjZGVmaW5lIElTX1RJTV9DSEFOTkVMUyhfX0NIQU5ORUxfXykgICAgICAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfQUxMKSkKKworI2RlZmluZSBJU19USU1fT1BNX0NIQU5ORUxTKF9fQ0hBTk5FTF9fKSAgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpKQorCisjZGVmaW5lIElTX1RJTV9QRVJJT0QoX19QRVJJT0RfXykgICAgICAoKF9fUEVSSU9EX18pIDw9IDB4RkZGRlUpCisKKyNkZWZpbmUgSVNfVElNX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAgICAgICgoX19QUkVTQ0FMRVJfXykgPD0gMHhGRkZGVSkKKworI2RlZmluZSBJU19USU1fQ0xPQ0tTT1VSQ0UoX19DTE9DS19fKSAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkpCisKKyNkZWZpbmUgSVNfVElNX0NMT0NLUE9MQVJJVFkoX19QT0xBUklUWV9fKSAoKChfX1BPTEFSSVRZX18pID09IFRJTV9DTE9DS1BPTEFSSVRZX0lOVkVSVEVEKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9OT05JTlZFUlRFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9DTE9DS1BPTEFSSVRZX0ZBTExJTkcpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9CT1RIRURHRSkpCisKKyNkZWZpbmUgSVNfVElNX0NMT0NLUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICgoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTE9DS1BSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMT0NLUFJFU0NBTEVSX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTE9DS1BSRVNDQUxFUl9ESVY4KSkKKworI2RlZmluZSBJU19USU1fQ0xPQ0tGSUxURVIoX19JQ0ZJTFRFUl9fKSAgICAgICgoX19JQ0ZJTFRFUl9fKSA8PSAweEZVKQorCisjZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBPTEFSSVRZX0lOVkVSVEVEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBPTEFSSVRZX05PTklOVkVSVEVEKSkKKworI2RlZmluZSBJU19USU1fQ0xFQVJJTlBVVF9QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWOCkpCisKKyNkZWZpbmUgSVNfVElNX0NMRUFSSU5QVVRfRklMVEVSKF9fSUNGSUxURVJfXykgKChfX0lDRklMVEVSX18pIDw9IDB4RlUpCisKKyNkZWZpbmUgSVNfVElNX1RSR09fU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX1JFU0VUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19VUERBVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX09DMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fT0MxUkVGKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19PQzJSRUYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX09DM1JFRikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fT0M0UkVGKSkKKworI2RlZmluZSBJU19USU1fTVNNX1NUQVRFKF9fU1RBVEVfXykgICAgICAoKChfX1NUQVRFX18pID09IFRJTV9NQVNURVJTTEFWRU1PREVfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX01BU1RFUlNMQVZFTU9ERV9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fU0xBVkVfTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfRElTQUJMRSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9SRVNFVCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fU0xBVkVNT0RFX0dBVEVEKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfVFJJR0dFUikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9FWFRFUk5BTDEpKQorCisjZGVmaW5lIElTX1RJTV9QV01fTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IFRJTV9PQ01PREVfUFdNMSkgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfUFdNMikpCisKKyNkZWZpbmUgSVNfVElNX09DX01PREUoX19NT0RFX18pICAoKChfX01PREVfXykgPT0gVElNX09DTU9ERV9USU1JTkcpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9BQ1RJVkUpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9JTkFDVElWRSkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9UT0dHTEUpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9GT1JDRURfQUNUSVZFKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUpKQorCisjZGVmaW5lIElTX1RJTV9UUklHR0VSX1NFTEVDVElPTihfX1NFTEVDVElPTl9fKSAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSkKKworI2RlZmluZSBJU19USU1fSU5URVJOQUxfVFJJR0dFUkVWRU5UX1NFTEVDVElPTihfX1NFTEVDVElPTl9fKSAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJQT0xBUklUWShfX1BPTEFSSVRZX18pICAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX0lOVkVSVEVEICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9OT05JTlZFUlRFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9UUklHR0VSUE9MQVJJVFlfUklTSU5HICAgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX0ZBTExJTkcgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9CT1RIRURHRSAgICkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJQUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWOCkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJGSUxURVIoX19JQ0ZJTFRFUl9fKSAoKF9fSUNGSUxURVJfXykgPD0gMHhGVSkKKworI2RlZmluZSBJU19USU1fVEkxU0VMRUNUSU9OKF9fVEkxU0VMRUNUSU9OX18pICAoKChfX1RJMVNFTEVDVElPTl9fKSA9PSBUSU1fVEkxU0VMRUNUSU9OX0NIMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJMVNFTEVDVElPTl9fKSA9PSBUSU1fVEkxU0VMRUNUSU9OX1hPUkNPTUJJTkFUSU9OKSkKKworI2RlZmluZSBJU19USU1fRE1BX0xFTkdUSChfX0xFTkdUSF9fKSAgICAgICgoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMlRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8zVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzRUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfNVRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF82VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzdUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfOFRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF85VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEwVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzExVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEyVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEzVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE0VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE1VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE2VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE3VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTKSkKKworI2RlZmluZSBJU19USU1fSUNfRklMVEVSKF9fSUNGSUxURVJfXykgICAoKF9fSUNGSUxURVJfXykgPD0gMHhGVSkKKworI2RlZmluZSBJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRChfX1RSSUdHRVJfXykgKChfX1RSSUdHRVJfXykgPT0gVElNX1NMQVZFTU9ERV9UUklHR0VSKQorCisjZGVmaW5lIFRJTV9TRVRfSUNQUkVTQ0FMRVJWQUxVRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19JQ1BTQ19fKSBcCisoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gKF9fSUNQU0NfXykpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gKChfX0lDUFNDX18pIDw8IDhVKSkgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSAoX19JQ1BTQ19fKSkgOlwKKyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gKChfX0lDUFNDX18pIDw8IDhVKSkpCisKKyNkZWZpbmUgVElNX1JFU0VUX0lDUFJFU0NBTEVSVkFMVUUoX19IQU5ETEVfXywgX19DSEFOTkVMX18pIFwKKygoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSAodWludDE2X3QpflRJTV9DQ01SMV9JQzFQU0MpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfSUMyUFNDKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX0lDM1BTQykgOlwKKyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjJfSUM0UFNDKSkKKworI2RlZmluZSBUSU1fU0VUX0NBUFRVUkVQT0xBUklUWShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19QT0xBUklUWV9fKSBcCisoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoX19QT0xBUklUWV9fKSkgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSIHw9ICgoX19QT0xBUklUWV9fKSA8PCA0VSkpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoKF9fUE9MQVJJVFlfXykgPDwgOFUpKSA6XAorICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSIHw9ICgoKF9fUE9MQVJJVFlfXykgPDwgMTJVKSkpKQorCisjZGVmaW5lIFRJTV9SRVNFVF9DQVBUVVJFUE9MQVJJVFkoX19IQU5ETEVfXywgX19DSEFOTkVMX18pIFwKKygoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICY9ICh1aW50MTZfdCl+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmPSAodWludDE2X3QpfihUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gKHVpbnQxNl90KX4oVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKSkgOlwKKyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmPSAodWludDE2X3QpfihUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApKSkKKworLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBwcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEluY2x1ZGUgVElNIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3RpbV9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnMgVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBUSU0gVGltZSBCYXNlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUaW1lIEJhc2UgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFRpbWUgQmFzZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9CYXNlX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0Jhc2VfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBUSU0gT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogVGltZXIgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fT0NfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fT0NfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBUSU0gUFdNIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUSU0gUFdNIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBUaW1lciBQV00gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1BXTV9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9QV01fTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBUSU0gSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFRpbWVyIElucHV0IENhcHR1cmUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0lDX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0lDX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogVGltZXIgT25lIFB1bHNlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT25lUHVsc2VNb2RlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2IFRJTSBFbmNvZGVyIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUSU0gRW5jb2RlciBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogVGltZXIgRW5jb2RlciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCAgVElNX0VuY29kZXJfSW5pdFR5cGVEZWYgKnNDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fRW5jb2Rlcl9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YTEsIHVpbnQzMl90ICpwRGF0YTIsIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA3IFRJTSBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CisgICogIEBicmllZiAgIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyogSW50ZXJydXB0IEhhbmRsZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1RJTV9JUlFIYW5kbGVyKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDggVElNIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fT0NfSW5pdFR5cGVEZWYgKnNDb25maWcsIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX09DX0luaXRUeXBlRGVmICpzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0lDX0luaXRUeXBlRGVmICpzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX09uZVB1bHNlX0luaXRUeXBlRGVmICpzQ29uZmlnLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsLCAgdWludDMyX3QgSW5wdXRDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnT0NyZWZDbGVhcihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmICpzQ2xlYXJJbnB1dENvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQ2xvY2tDb25maWdUeXBlRGVmICpzQ2xvY2tTb3VyY2VDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdUSTFJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgVEkxX1NlbGVjdGlvbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hybyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgKkJ1cnN0QnVmZmVyLCB1aW50MzJfdCAgQnVyc3RMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnVyc3RCYXNlQWRkcmVzcywgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgKkJ1cnN0QnVmZmVyLCB1aW50MzJfdCAgQnVyc3RMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fR2VuZXJhdGVFdmVudChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgRXZlbnRTb3VyY2UpOwordWludDMyX3QgSEFMX1RJTV9SZWFkQ2FwdHVyZWRWYWx1ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA5IFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIENhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0IGFuZCBETUEpICoqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fRXJyb3JDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9SZWdpc3RlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBUSU1fQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgSEFMX1RJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMTAgVElNIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogIEBicmllZiAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fQmFzZV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09DX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fUFdNX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fSUNfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0VuY29kZXJfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX0Z1bmN0aW9ucyBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyogQHsKKyovCit2b2lkIFRJTV9ETUFEZWxheVB1bHNlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBUSU1fRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBUSU1fRE1BQ2FwdHVyZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgVElNX1Jlc2V0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyogQH0KKyovCisvKiBFbmQgb2YgcHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9USU1fSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfdGltX2V4LmggYi9JbmMvc3RtMzJsMHh4X2hhbF90aW1fZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg2YzkwCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfdGltX2V4LmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3RpbV9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUSU0gSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9IQUxfVElNX0VYX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9USU1fRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfVHlwZXMgVElNIEV4dGVuZGVkIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBleHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0NvbnN0YW50cyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9SZW1hcCBUSU0gRXh0ZW5kZWQgUmVtYXBwaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNMl9FVFJfR1BJTyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMiBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIE9SZWQgR1BJT3MgKi8KKyNpZiBkZWZpbmVkKFJDQ19IU0k0OF9TVVBQT1JUKQorI2RlZmluZSBUSU0yX0VUUl9IU0k0OCAgICAgICAgICAgICAgICAgICAgVElNMl9PUl9FVFJfUk1QXzIgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yIEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gSFNJNDggY2xvY2sgKi8KKyNlbmRpZiAvKiBSQ0NfSFNJNDhfU1VQUE9SVCAqLworI2RlZmluZSBUSU0yX0VUUl9IU0kxNiAgICAgICAgICAgICAgICAgICAgKFRJTTJfT1JfRVRSX1JNUF8xIHwgVElNMl9PUl9FVFJfUk1QXzApICAgLyohPCBUSU0yIEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gSFNJMTYgY2xvY2sgKi8KKyNkZWZpbmUgVElNMl9FVFJfTFNFICAgICAgICAgICAgICAgICAgICAgIChUSU0yX09SX0VUUl9STVBfMiB8IFRJTTJfT1JfRVRSX1JNUF8wKSAgIC8qITwgVElNMiBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIExTRSBjbG9jayAqLworI2lmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIFRJTTJfRVRSX0NPTVAyX09VVCAgICAgICAgICAgICAgICAoVElNMl9PUl9FVFJfUk1QXzIgfCBUSU0yX09SX0VUUl9STVBfMSkgICAvKiE8IFRJTTIgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgVElNMl9FVFJfQ09NUDFfT1VUICAgICAgICAgICAgICAgIFRJTTJfT1JfRVRSX1JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMiBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2VuZGlmIC8qIENPTVAxICYmIENPTVAyICovCisKKyNkZWZpbmUgVElNMl9USTRfR1BJTyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMiBUSTQgaW5wdXQgY29ubmVjdGVkIHRvIE9SZWQgR1BJT3MgKi8KKyNpZiBkZWZpbmVkKENPTVAxKSAmJiBkZWZpbmVkKENPTVAyKQorI2RlZmluZSBUSU0yX1RJNF9DT01QMiAgICAgICAgICAgICAgICAgICAgVElNMl9PUl9USTRfUk1QXzAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yIFRJNCBpbnB1dCBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIFRJTTJfVEk0X0NPTVAxICAgICAgICAgICAgICAgICAgICBUSU0yX09SX1RJNF9STVBfMSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIgVEk0IGlucHV0IGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNlbmRpZiAvKiBDT01QMSAmJiBDT01QMiAqLworCisjaWYgZGVmaW5lZChUSU0zKQorI2lmIGRlZmluZWQoVVNCKQorI2RlZmluZSBUSU0zX1RJNF9VU0JfTk9FICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0JfTk9FIHNlbGVjdGVkIHNlbGVjdGVkIGZvciBQQzkgKEFGMikgcmVtYXBwaW5nICovCisjZGVmaW5lIFRJTTNfVEk0X0dQSU9DOV9BRjIgICAgICAgICAgICAgICBUSU0zX09SX1RJNF9STVAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTNfQ0g0IHNlbGVjdGVkIGZvciBQQzkgKEFGMikgcmVtYXBwaW5nICovCisjZW5kaWYgLyogVVNCICovCisKKyNkZWZpbmUgVElNM19USTJfR1BJT19ERUYgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNM19DSDIgc2VsZWN0ZWQgZm9yIFBCNSAoQUY0KSByZW1hcHBpbmcgKi8KKyNkZWZpbmUgVElNM19USTJfR1BJT0I1X0FGNCAgICAgICAgICAgICAgIFRJTTNfT1JfVEkyX1JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjJfQ0gyIHNlbGVjdGVkIGZvciBQQjUgKEFGNCkgcmVtYXBwaW5nICovCisKKyNpZiBkZWZpbmVkKFVTQikKKyNkZWZpbmUgVElNM19USTFfVVNCX1NPRiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMyBUSTEgaW5wdXQgY29ubmVjdGVkIHRvIFVTQl9TT0YgKi8KKyNkZWZpbmUgVElNM19USTFfR1BJTyAgICAgICAgICAgICAgICAgICAgIFRJTTNfT1JfVEkxX1JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMyBUSTEgaW5wdXQgY29ubmVjdGVkIHRvIE9SZWQgR1BJT3MgKi8KKyNlbmRpZiAvKiBVU0IgKi8KKworI2RlZmluZSBUSU0zX0VUUl9HUElPICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0zIEVUUiBpbnB1dCBjb25uZWN0ZWQgdG8gT1JlZCBHUElPcyAqLworI2RlZmluZSBUSU0zX0VUUl9IU0kgICAgICAgICAgICAgICAgICAgICAgVElNM19PUl9FVFJfUk1QXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0zX0VUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gSFNJNDggY2xvY2sgKi8KKyNlbmRpZiAvKiBUSU0zICovCisKKyNkZWZpbmUgVElNMjFfRVRSX0dQSU8gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjEgRVRSIGlucHV0IGNvbm5lY3RlZCB0byBPUmVkIEdQSU9zICovCisjaWYgZGVmaW5lZChDT01QMSkgJiYgZGVmaW5lZChDT01QMikKKyNkZWZpbmUgVElNMjFfRVRSX0NPTVAyX09VVCAgICAgICAgICAgICAgIFRJTTIxX09SX0VUUl9STVBfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjEgRVRSIGlucHV0IGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgVElNMjFfRVRSX0NPTVAxX09VVCAgICAgICAgICAgICAgIFRJTTIxX09SX0VUUl9STVBfMSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjEgRVRSIGlucHV0IGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNlbmRpZiAvKiBDT01QMSAmJiBDT01QMiAqLworI2RlZmluZSBUSU0yMV9FVFJfTFNFICAgICAgICAgICAgICAgICAgICAgVElNMjFfT1JfRVRSX1JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMSBFVFIgaW5wdXQgY29ubmVjdGVkIHRvIExTRSBjbG9jayAqLworCisjZGVmaW5lIFRJTTIxX1RJMV9HUElPICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIxIFRJMSBpbnB1dCBjb25uZWN0ZWQgdG8gT1JlZCBHUElPcyAqLworI2RlZmluZSBUSU0yMV9USTFfTUNPICAgICAgICAgICAgICAgICAgICAgVElNMjFfT1JfVEkxX1JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMSBUSTEgaW5wdXQgY29ubmVjdGVkIHRvIE1DTyBjbG9jayAqLworI2RlZmluZSBUSU0yMV9USTFfUlRDX1dLVVRfSVQgICAgICAgICAgICAgVElNMjFfT1JfVEkxX1JNUF8wICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMSBUSTEgaW5wdXQgY29ubmVjdGVkIHRvIFJUQyBXQUtFVVAgaW50ZXJydXB0ICovCisjZGVmaW5lIFRJTTIxX1RJMV9IU0VfUlRDICAgICAgICAgICAgICAgICBUSU0yMV9PUl9USTFfUk1QXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIxIFRJMSBpbnB1dCBjb25uZWN0ZWQgdG8gSFNFX1JUQyBjbG9jayAqLworI2RlZmluZSBUSU0yMV9USTFfTVNJICAgICAgICAgICAgICAgICAgICAgKFRJTTIxX09SX1RJMV9STVBfMCB8IFRJTTIxX09SX1RJMV9STVBfMSkgLyohPCBUSU0yMSBUSTEgaW5wdXQgY29ubmVjdGVkIHRvIE1TSSBjbG9jayAqLworI2RlZmluZSBUSU0yMV9USTFfTFNFICAgICAgICAgICAgICAgICAgICAgVElNMjFfT1JfVEkxX1JNUF8yICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMSBUSTEgaW5wdXQgY29ubmVjdGVkIHRvIExTRSBjbG9jayAqLworI2RlZmluZSBUSU0yMV9USTFfTFNJICAgICAgICAgICAgICAgICAgICAgKFRJTTIxX09SX1RJMV9STVBfMiB8IFRJTTIxX09SX1RJMV9STVBfMCkgLyohPCBUSU0yMSBUSTEgaW5wdXQgY29ubmVjdGVkIHRvIExTSSBjbG9jayAqLworI2lmIGRlZmluZWQoQ09NUDEpCisjZGVmaW5lIFRJTTIxX1RJMV9DT01QMV9PVVQgICAgICAgICAgICAgICAoVElNMjFfT1JfVEkxX1JNUF8yIHwgVElNMjFfT1JfVEkxX1JNUF8xKSAvKiE8IFRJTTIxIFRJMSBpbnB1dCBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZW5kaWYgLyogQ09NUDEgKi8KKworI2RlZmluZSBUSU0yMV9USTJfR1BJTyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMSBUSTIgaW5wdXQgY29ubmVjdGVkIHRvIE9SZWQgR1BJT3MgKi8KKyNpZiBkZWZpbmVkKENPTVAyKQorI2RlZmluZSBUSU0yMV9USTJfQ09NUDJfT1VUICAgICAgICAgICAgICAgVElNMjFfT1JfVEkyX1JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMSBUSTIgaW5wdXQgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2VuZGlmIC8qIENPTVAyICovCisKKyNpZiBkZWZpbmVkKFRJTTIyKQorI2RlZmluZSBUSU0yMl9FVFJfR1BJTyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMiBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIE9SZWQgR1BJT3MgKi8KKyNpZiBkZWZpbmVkKENPTVAxKSAmJiBkZWZpbmVkKENPTVAyKQorI2RlZmluZSBUSU0yMl9FVFJfQ09NUDJfT1VUICAgICAgICAgICAgICAgVElNMjJfT1JfRVRSX1JNUF8wICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMiBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBUSU0yMl9FVFJfQ09NUDFfT1VUICAgICAgICAgICAgICAgVElNMjJfT1JfRVRSX1JNUF8xICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMiBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2VuZGlmIC8qIENPTVAxICYmIENPTVAyICovCisjZGVmaW5lIFRJTTIyX0VUUl9MU0UgICAgICAgICAgICAgICAgICAgICBUSU0yMl9PUl9FVFJfUk1QICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIyIEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gTFNFIGNsb2NrICovCisKKyNkZWZpbmUgVElNMjJfVEkxX0dQSU8gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjIgVEkxIGlucHV0IGlzIGNvbm5lY3RlZCB0byBPUmVkIEdQSU9zICovCisjaWYgZGVmaW5lZChDT01QMSkgJiYgZGVmaW5lZChDT01QMikKKyNkZWZpbmUgVElNMjJfVEkxX0NPTVAyX09VVCAgICAgICAgICAgICAgIFRJTTIyX09SX1RJMV9STVBfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjIgVEkxIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgVElNMjJfVEkxX0NPTVAxX09VVCAgICAgICAgICAgICAgIFRJTTIyX09SX1RJMV9STVBfMSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjIgVEkxIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNlbmRpZiAvKiBDT01QMSAmJiBDT01QMiAqLworI2VuZGlmIC8qIFRJTTIyICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfTWFjcm9zIFRJTSBFeHRlbmRlZCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNRXhfUHJpdmF0ZV9NYWNyb3MgVElNIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFRJTTMpICYmIGRlZmluZWQoVElNMjIpCisKKyNkZWZpbmUgSVNfVElNX1JFTUFQKF9fSU5TVEFOQ0VfXywgX19USU1fUkVNQVBfXykgICAgICAgICAgICAgICBcCisgICAgICAgICgoKChfX0lOU1RBTkNFX18pID09IFRJTTIpICAgJiYgICgoX19USU1fUkVNQVBfXykgPD0gIChUSU0yX09SX1RJNF9STVAgIHwgVElNMl9PUl9FVFJfUk1QKSkpIHx8IFwKKyAgICAgICAgICgoKF9fSU5TVEFOQ0VfXykgPT0gVElNMjIpICAmJiAgKChfX1RJTV9SRU1BUF9fKSA8PSAgKFRJTTIyX09SX1RJMV9STVAgfCBUSU0yMl9PUl9FVFJfUk1QKSkpIHx8IFwKKyAgICAgICAgICgoKF9fSU5TVEFOQ0VfXykgPT0gVElNMjEpICAmJiAgKChfX1RJTV9SRU1BUF9fKSA8PSAgKFRJTTIxX09SX0VUUl9STVAgfCBUSU0yMV9PUl9USTFfUk1QIHwgVElNMjFfT1JfVEkyX1JNUCkpKSB8fCBcCisgICAgICAgICAoKChfX0lOU1RBTkNFX18pID09IFRJTTMpICAgJiYgICgoX19USU1fUkVNQVBfXykgPD0gIChUSU0zX09SX0VUUl9STVAgIHwgVElNM19PUl9USTFfUk1QICB8IFRJTTNfT1JfVEkyX1JNUCB8IFRJTTNfT1JfVEk0X1JNUCkpKSkKKworI2RlZmluZSBJU19DSEFOTkVMX0FWQUlMQUJMRShfX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgICAgXAorICAgICAgICAoKCgoX19JTlNUQU5DRV9fKSA9PSBUSU0yKSAgICYmICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICB8fCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpICAgfHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgIHx8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkpKSB8fCAgIFwKKyAgICAgICAgICAoKChfX0lOU1RBTkNFX18pID09IFRJTTMpICYmICAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgfHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgIHx8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICB8fCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpKSkgfHwgICBcCisgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBUSU0yMSkgJiYgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgIHx8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikpKSB8fCAgIFwKKyAgICAgICAgICAoKChfX0lOU1RBTkNFX18pID09IFRJTTIyKSAmJiAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpICAgfHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSkpKQorCisjZWxpZiBkZWZpbmVkKFRJTTIyKQorCisjZGVmaW5lIElTX1RJTV9SRU1BUChfX0lOU1RBTkNFX18sIF9fVElNX1JFTUFQX18pICAgICAgICAgICAgICAgXAorICAgICAgICAoKCgoX19JTlNUQU5DRV9fKSA9PSBUSU0yKSAgICYmICAoKF9fVElNX1JFTUFQX18pIDw9ICAoVElNMl9PUl9USTRfUk1QICB8IFRJTTJfT1JfRVRSX1JNUCkpKSB8fCBcCisgICAgICAgICAoKChfX0lOU1RBTkNFX18pID09IFRJTTIyKSAgJiYgICgoX19USU1fUkVNQVBfXykgPD0gIChUSU0yMl9PUl9USTFfUk1QIHwgVElNMjJfT1JfRVRSX1JNUCkpKSB8fCBcCisgICAgICAgICAoKChfX0lOU1RBTkNFX18pID09IFRJTTIxKSAgJiYgICgoX19USU1fUkVNQVBfXykgPD0gIChUSU0yMV9PUl9FVFJfUk1QIHwgVElNMjFfT1JfVEkxX1JNUCB8IFRJTTIxX09SX1RJMl9STVApKSkpCisKKyNkZWZpbmUgSVNfQ0hBTk5FTF9BVkFJTEFCTEUoX19JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgICAgIFwKKyAgICAgICAgKCgoKF9fSU5TVEFOQ0VfXykgPT0gVElNMikgICAmJiAgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSkpIHx8IFwKKyAgICAgICAgICAoKChfX0lOU1RBTkNFX18pID09IFRJTTIxKSAgJiYgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSkpIHx8IFwKKyAgICAgICAgICAoKChfX0lOU1RBTkNFX18pID09IFRJTTIyKSAgJiYgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSkpKQorI2Vsc2UKKworI2RlZmluZSBJU19USU1fUkVNQVAoX19JTlNUQU5DRV9fLCBfX1RJTV9SRU1BUF9fKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgoKF9fSU5TVEFOQ0VfXykgPT0gVElNMikgICAmJiAgKChfX1RJTV9SRU1BUF9fKSA8PSAgKFRJTTJfT1JfVEk0X1JNUCAgfCBUSU0yX09SX0VUUl9STVApKSkgfHwgXAorICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBUSU0yMSkgICYmICAoKF9fVElNX1JFTUFQX18pIDw9ICAoVElNMjFfT1JfRVRSX1JNUCB8IFRJTTIxX09SX1RJMV9STVAgfCBUSU0yMV9PUl9USTJfUk1QKSkpKQorCisjZGVmaW5lIElTX0NIQU5ORUxfQVZBSUxBQkxFKF9fSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pICAgICBcCisgICAgICAgICgoKChfX0lOU1RBTkNFX18pID09IFRJTTIpICAgJiYgICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkpKSB8fCBcCisgICAgICAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBUSU0yMSkgICYmICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikpKSkKKyNlbmRpZiAvKiBUSU0zICYmIFRJTTIyICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBFeHRlbmRlZCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X01hc3RlckNvbmZpZ1N5bmNocm9uaXphdGlvbihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgKnNNYXN0ZXJDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1JlbWFwQ29uZmlnKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBSZW1hcCk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9USU1fRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfdHNjLmggYi9JbmMvc3RtMzJsMHh4X2hhbF90c2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZiZjNiCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfdHNjLmgKQEAgLTAsMCArMSw3NzcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3RzYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUU0MgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkwweHhfSEFMX1RTQ19ICisjZGVmaW5lIFNUTTMyTDB4eF9IQUxfVFNDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChUU0MpCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUU0MKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfVHlwZXMgVFNDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFRTQyBzdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9UU0NfU1RBVEVfUkVTRVQgID0gMHgwMFVMLCAvKiE8IFRTQyByZWdpc3RlcnMgaGF2ZSB0aGVpciByZXNldCB2YWx1ZSAqLworICBIQUxfVFNDX1NUQVRFX1JFQURZICA9IDB4MDFVTCwgLyohPCBUU0MgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZCBvciBhY3F1aXNpdGlvbiBpcyBjb21wbGV0ZWQgd2l0aCBzdWNjZXNzICovCisgIEhBTF9UU0NfU1RBVEVfQlVTWSAgID0gMHgwMlVMLCAvKiE8IFRTQyBpbml0aWFsaXphdGlvbiBvciBhY3F1aXNpdGlvbiBpcyBvbi1nb2luZyAqLworICBIQUxfVFNDX1NUQVRFX0VSUk9SICA9IDB4MDNVTCAgLyohPCBBY3F1aXNpdGlvbiBpcyBjb21wbGV0ZWQgd2l0aCBtYXggY291bnQgZXJyb3IgKi8KK30gSEFMX1RTQ19TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBUU0MgZ3JvdXAgc3RhdHVzIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgVFNDX0dST1VQX09OR09JTkcgICA9IDB4MDBVTCwgLyohPCBBY3F1aXNpdGlvbiBvbiBncm91cCBpcyBvbi1nb2luZyBvciBub3Qgc3RhcnRlZCAqLworICBUU0NfR1JPVVBfQ09NUExFVEVEID0gMHgwMVVMIC8qITwgQWNxdWlzaXRpb24gb24gZ3JvdXAgaXMgY29tcGxldGVkIHdpdGggc3VjY2VzcyAobm8gbWF4IGNvdW50IGVycm9yKSAqLworfSBUU0NfR3JvdXBTdGF0dXNUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgVFNDIGluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENUUHVsc2VIaWdoTGVuZ3RoOyAgICAgICAvKiE8IENoYXJnZS10cmFuc2ZlciBoaWdoIHB1bHNlIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19DVFB1bHNlSExfQ29uZmlnICAqLworICB1aW50MzJfdCBDVFB1bHNlTG93TGVuZ3RoOyAgICAgICAgLyohPCBDaGFyZ2UtdHJhbnNmZXIgbG93IHB1bHNlIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19DVFB1bHNlTExfQ29uZmlnICAqLworICB1aW50MzJfdCBTcHJlYWRTcGVjdHJ1bTsgICAgICAgICAgLyohPCBTcHJlYWQgc3BlY3RydW0gYWN0aXZhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19DVFB1bHNlTExfQ29uZmlnICAqLworICB1aW50MzJfdCBTcHJlYWRTcGVjdHJ1bURldmlhdGlvbjsgLyohPCBTcHJlYWQgc3BlY3RydW0gZGV2aWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTI3ICovCisgIHVpbnQzMl90IFNwcmVhZFNwZWN0cnVtUHJlc2NhbGVyOyAvKiE8IFNwcmVhZCBzcGVjdHJ1bSBwcmVzY2FsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUU0NfU3ByZWFkU3BlY19QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgUHVsc2VHZW5lcmF0b3JQcmVzY2FsZXI7IC8qITwgUHVsc2UgZ2VuZXJhdG9yIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19QdWxzZUdlbmVyYXRvcl9QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgTWF4Q291bnRWYWx1ZTsgICAgICAgICAgIC8qITwgTWF4IGNvdW50IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVFNDX01heENvdW50X1ZhbHVlICAqLworICB1aW50MzJfdCBJT0RlZmF1bHRNb2RlOyAgICAgICAgICAgLyohPCBJTyBkZWZhdWx0IG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUU0NfSU9fRGVmYXVsdF9Nb2RlICAqLworICB1aW50MzJfdCBTeW5jaHJvUGluUG9sYXJpdHk7ICAgICAgLyohPCBTeW5jaHJvIHBpbiBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19TeW5jaHJvX1Bpbl9Qb2xhcml0eSAqLworICB1aW50MzJfdCBBY3F1aXNpdGlvbk1vZGU7ICAgICAgICAgLyohPCBBY3F1aXNpdGlvbiBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVFNDX0FjcXVpc2l0aW9uX01vZGUgICovCisgIHVpbnQzMl90IE1heENvdW50SW50ZXJydXB0OyAgICAgICAvKiE8IE1heCBjb3VudCBpbnRlcnJ1cHQgYWN0aXZhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworICB1aW50MzJfdCBDaGFubmVsSU9zOyAgICAgICAgICAgICAgLyohPCBDaGFubmVsIElPcyBtYXNrICovCisgIHVpbnQzMl90IFNoaWVsZElPczsgICAgICAgICAgICAgICAvKiE8IFNoaWVsZCBJT3MgbWFzayAqLworICB1aW50MzJfdCBTYW1wbGluZ0lPczsgICAgICAgICAgICAgLyohPCBTYW1wbGluZyBJT3MgbWFzayAqLworfSBUU0NfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBUU0MgSU9zIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENoYW5uZWxJT3M7ICAvKiE8IENoYW5uZWwgSU9zIG1hc2sgKi8KKyAgdWludDMyX3QgU2hpZWxkSU9zOyAgIC8qITwgU2hpZWxkIElPcyBtYXNrICovCisgIHVpbnQzMl90IFNhbXBsaW5nSU9zOyAvKiE8IFNhbXBsaW5nIElPcyBtYXNrICovCit9IFRTQ19JT0NvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVFNDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgX19UU0NfSGFuZGxlVHlwZURlZgoreworICBUU0NfVHlwZURlZiAgICAgICAgICAgICAgICpJbnN0YW5jZTsgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgKi8KKyAgVFNDX0luaXRUeXBlRGVmICAgICAgICAgICBJbml0OyAgICAgICAvKiE8IEluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgICovCisgIF9fSU8gSEFMX1RTQ19TdGF0ZVR5cGVEZWYgU3RhdGU7ICAgICAgLyohPCBQZXJpcGhlcmFsIHN0YXRlICAgICAgICAgICAqLworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgIExvY2s7ICAgICAgIC8qITwgTG9jayBmZWF0dXJlICAgICAgICAgICAgICAgKi8KKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICBFcnJvckNvZGU7ICAvKiE8IEkyQyBFcnJvciBjb2RlICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogQ29udkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOyAgIC8qITwgVFNDIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOyAgICAgIC8qITwgVFNDIEVycm9yIGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsgICAgLyohPCBUU0MgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOyAgLyohPCBUU0MgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICAgKi8KKworI2VuZGlmICAvKiBVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gVFNDX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVFNDIEdyb3VwIEluZGV4IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgVFNDX0dST1VQMV9JRFggPSAweDAwVUwsCisgIFRTQ19HUk9VUDJfSURYLAorICBUU0NfR1JPVVAzX0lEWCwKKyAgVFNDX0dST1VQNF9JRFgsCisgIFRTQ19HUk9VUDVfSURYLAorICBUU0NfR1JPVVA2X0lEWCwKKyAgVFNDX0dST1VQN19JRFgsCisgIFRTQ19HUk9VUDhfSURYLAorICBUU0NfTkJfT0ZfR1JPVVBTCit9VFNDX0dyb3VwSW5kZXhUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgVFNDIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVFNDX0NPTlZfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgID0gMHgwMFVMLCAgLyohPCBUU0MgQ29udmVyc2lvbiBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICovCisgIEhBTF9UU0NfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDAxVUwsICAvKiE8IFRTQyBFcnJvciBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgKi8KKworICBIQUxfVFNDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwMlVMLCAgLyohPCBUU0MgTXNwIEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICovCisgIEhBTF9UU0NfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDAzVUwgICAvKiE8IFRTQyBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgKi8KKworfSBIQUxfVFNDX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBUU0MgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcFRTQ19DYWxsYmFja1R5cGVEZWYpKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsgLyohPCBwb2ludGVyIHRvIGFuIFRTQyBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgIC8qIFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfQ29uc3RhbnRzIFRTQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19FcnJvcl9Db2RlX2RlZmluaXRpb24gVFNDIEVycm9yIENvZGUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgVFNDIEVycm9yIENvZGUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9UU0NfRVJST1JfTk9ORSAgICAgIDB4MDAwMDAwMDBVTCAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAqLworI2lmIChVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX1RTQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAweDAwMDAwMDAxVUwgICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICovCisjZW5kaWYgLyogVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19DVFB1bHNlSExfQ29uZmlnIENUUHVsc2UgSGlnaCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBUU0NfQ1RQSF8xQ1lDTEUgICAgICAgICAweDAwMDAwMDAwVUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgMSBjeWNsZSAoUEdDTEspICAgKi8KKyNkZWZpbmUgVFNDX0NUUEhfMkNZQ0xFUyAgICAgICAgVFNDX0NSX0NUUEhfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDIgY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBIXzNDWUNMRVMgICAgICAgIFRTQ19DUl9DVFBIXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyAzIGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQSF80Q1lDTEVTICAgICAgICAoVFNDX0NSX0NUUEhfMSB8IFRTQ19DUl9DVFBIXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgNCBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUEhfNUNZQ0xFUyAgICAgICAgVFNDX0NSX0NUUEhfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDUgY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBIXzZDWUNMRVMgICAgICAgIChUU0NfQ1JfQ1RQSF8yIHwgVFNDX0NSX0NUUEhfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyA2IGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQSF83Q1lDTEVTICAgICAgICAoVFNDX0NSX0NUUEhfMiB8IFRTQ19DUl9DVFBIXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgNyBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUEhfOENZQ0xFUyAgICAgICAgKFRTQ19DUl9DVFBIXzIgfCBUU0NfQ1JfQ1RQSF8xIHwgVFNDX0NSX0NUUEhfMCkgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDggY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBIXzlDWUNMRVMgICAgICAgIFRTQ19DUl9DVFBIXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyA5IGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQSF8xMENZQ0xFUyAgICAgICAoVFNDX0NSX0NUUEhfMyB8IFRTQ19DUl9DVFBIXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgMTAgY3ljbGVzIChQR0NMSykgKi8KKyNkZWZpbmUgVFNDX0NUUEhfMTFDWUNMRVMgICAgICAgKFRTQ19DUl9DVFBIXzMgfCBUU0NfQ1JfQ1RQSF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDExIGN5Y2xlcyAoUEdDTEspICovCisjZGVmaW5lIFRTQ19DVFBIXzEyQ1lDTEVTICAgICAgIChUU0NfQ1JfQ1RQSF8zIHwgVFNDX0NSX0NUUEhfMSB8IFRTQ19DUl9DVFBIXzApICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyAxMiBjeWNsZXMgKFBHQ0xLKSAqLworI2RlZmluZSBUU0NfQ1RQSF8xM0NZQ0xFUyAgICAgICAoVFNDX0NSX0NUUEhfMyB8IFRTQ19DUl9DVFBIXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgMTMgY3ljbGVzIChQR0NMSykgKi8KKyNkZWZpbmUgVFNDX0NUUEhfMTRDWUNMRVMgICAgICAgKFRTQ19DUl9DVFBIXzMgfCBUU0NfQ1JfQ1RQSF8yIHwgVFNDX0NSX0NUUEhfMCkgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDE0IGN5Y2xlcyAoUEdDTEspICovCisjZGVmaW5lIFRTQ19DVFBIXzE1Q1lDTEVTICAgICAgIChUU0NfQ1JfQ1RQSF8zIHwgVFNDX0NSX0NUUEhfMiB8IFRTQ19DUl9DVFBIXzEpICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyAxNSBjeWNsZXMgKFBHQ0xLKSAqLworI2RlZmluZSBUU0NfQ1RQSF8xNkNZQ0xFUyAgICAgICAoVFNDX0NSX0NUUEhfMyB8IFRTQ19DUl9DVFBIXzIgfCBUU0NfQ1JfQ1RQSF8xIHwgVFNDX0NSX0NUUEhfMCkgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgMTYgY3ljbGVzIChQR0NMSykgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0NUUHVsc2VMTF9Db25maWcgQ1RQdWxzZSBMb3cgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVFNDX0NUUExfMUNZQ0xFICAgICAgICAgMHgwMDAwMDAwMFVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDEgY3ljbGUgKFBHQ0xLKSAgICovCisjZGVmaW5lIFRTQ19DVFBMXzJDWUNMRVMgICAgICAgIFRTQ19DUl9DVFBMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyAyIGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQTF8zQ1lDTEVTICAgICAgICBUU0NfQ1JfQ1RQTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgMyBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUExfNENZQ0xFUyAgICAgICAgKFRTQ19DUl9DVFBMXzEgfCBUU0NfQ1JfQ1RQTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDQgY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBMXzVDWUNMRVMgICAgICAgIFRTQ19DUl9DVFBMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyA1IGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQTF82Q1lDTEVTICAgICAgICAoVFNDX0NSX0NUUExfMiB8IFRTQ19DUl9DVFBMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgNiBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUExfN0NZQ0xFUyAgICAgICAgKFRTQ19DUl9DVFBMXzIgfCBUU0NfQ1JfQ1RQTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDcgY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBMXzhDWUNMRVMgICAgICAgIChUU0NfQ1JfQ1RQTF8yIHwgVFNDX0NSX0NUUExfMSB8IFRTQ19DUl9DVFBMXzApICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyA4IGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQTF85Q1lDTEVTICAgICAgICBUU0NfQ1JfQ1RQTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgOSBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUExfMTBDWUNMRVMgICAgICAgKFRTQ19DUl9DVFBMXzMgfCBUU0NfQ1JfQ1RQTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDEwIGN5Y2xlcyAoUEdDTEspICovCisjZGVmaW5lIFRTQ19DVFBMXzExQ1lDTEVTICAgICAgIChUU0NfQ1JfQ1RQTF8zIHwgVFNDX0NSX0NUUExfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyAxMSBjeWNsZXMgKFBHQ0xLKSAqLworI2RlZmluZSBUU0NfQ1RQTF8xMkNZQ0xFUyAgICAgICAoVFNDX0NSX0NUUExfMyB8IFRTQ19DUl9DVFBMXzEgfCBUU0NfQ1JfQ1RQTF8wKSAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgMTIgY3ljbGVzIChQR0NMSykgKi8KKyNkZWZpbmUgVFNDX0NUUExfMTNDWUNMRVMgICAgICAgKFRTQ19DUl9DVFBMXzMgfCBUU0NfQ1JfQ1RQTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDEzIGN5Y2xlcyAoUEdDTEspICovCisjZGVmaW5lIFRTQ19DVFBMXzE0Q1lDTEVTICAgICAgIChUU0NfQ1JfQ1RQTF8zIHwgVFNDX0NSX0NUUExfMiB8IFRTQ19DUl9DVFBMXzApICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyAxNCBjeWNsZXMgKFBHQ0xLKSAqLworI2RlZmluZSBUU0NfQ1RQTF8xNUNZQ0xFUyAgICAgICAoVFNDX0NSX0NUUExfMyB8IFRTQ19DUl9DVFBMXzIgfCBUU0NfQ1JfQ1RQTF8xKSAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgMTUgY3ljbGVzIChQR0NMSykgKi8KKyNkZWZpbmUgVFNDX0NUUExfMTZDWUNMRVMgICAgICAgKFRTQ19DUl9DVFBMXzMgfCBUU0NfQ1JfQ1RQTF8yIHwgVFNDX0NSX0NUUExfMSB8IFRTQ19DUl9DVFBMXzApICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDE2IGN5Y2xlcyAoUEdDTEspICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19TcHJlYWRTcGVjX1ByZXNjYWxlciBTcHJlYWQgU3BlY3RydW0gUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVFNDX1NTX1BSRVNDX0RJVjEgICAgICAgMHgwMDAwMDAwMFVMICAvKiE8IFNwcmVhZCBTcGVjdHJ1bSBQcmVzY2FsZXIgRGl2MSAqLworI2RlZmluZSBUU0NfU1NfUFJFU0NfRElWMiAgICAgICBUU0NfQ1JfU1NQU0MgIC8qITwgU3ByZWFkIFNwZWN0cnVtIFByZXNjYWxlciBEaXYyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19QdWxzZUdlbmVyYXRvcl9QcmVzY2FsZXIgUHVsc2UgR2VuZXJhdG9yIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19QR19QUkVTQ19ESVYxICAgICAgIDB4MDAwMDAwMDBVTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFB1bHNlIEdlbmVyYXRvciBIQ0xLIERpdjEgICAqLworI2RlZmluZSBUU0NfUEdfUFJFU0NfRElWMiAgICAgICBUU0NfQ1JfUEdQU0NfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBHZW5lcmF0b3IgSENMSyBEaXYyICAgKi8KKyNkZWZpbmUgVFNDX1BHX1BSRVNDX0RJVjQgICAgICAgVFNDX0NSX1BHUFNDXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUHVsc2UgR2VuZXJhdG9yIEhDTEsgRGl2NCAgICovCisjZGVmaW5lIFRTQ19QR19QUkVTQ19ESVY4ICAgICAgIChUU0NfQ1JfUEdQU0NfMSB8IFRTQ19DUl9QR1BTQ18wKSAgICAgICAgICAgICAgICAgICAvKiE8IFB1bHNlIEdlbmVyYXRvciBIQ0xLIERpdjggICAqLworI2RlZmluZSBUU0NfUEdfUFJFU0NfRElWMTYgICAgICBUU0NfQ1JfUEdQU0NfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBHZW5lcmF0b3IgSENMSyBEaXYxNiAgKi8KKyNkZWZpbmUgVFNDX1BHX1BSRVNDX0RJVjMyICAgICAgKFRTQ19DUl9QR1BTQ18yIHwgVFNDX0NSX1BHUFNDXzApICAgICAgICAgICAgICAgICAgIC8qITwgUHVsc2UgR2VuZXJhdG9yIEhDTEsgRGl2MzIgICovCisjZGVmaW5lIFRTQ19QR19QUkVTQ19ESVY2NCAgICAgIChUU0NfQ1JfUEdQU0NfMiB8IFRTQ19DUl9QR1BTQ18xKSAgICAgICAgICAgICAgICAgICAvKiE8IFB1bHNlIEdlbmVyYXRvciBIQ0xLIERpdjY0ICAqLworI2RlZmluZSBUU0NfUEdfUFJFU0NfRElWMTI4ICAgICAoVFNDX0NSX1BHUFNDXzIgfCBUU0NfQ1JfUEdQU0NfMSB8IFRTQ19DUl9QR1BTQ18wKSAgLyohPCBQdWxzZSBHZW5lcmF0b3IgSENMSyBEaXYxMjggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX01heENvdW50X1ZhbHVlIE1heCBDb3VudCBWYWx1ZQorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19NQ1ZfMjU1ICAgICAgICAgICAgIDB4MDAwMDAwMDBVTCAgICAgICAgICAgICAgICAgICAvKiE8IDI1NSBtYXhpbXVtIG51bWJlciBvZiBjaGFyZ2UgdHJhbnNmZXIgcHVsc2VzICAgKi8KKyNkZWZpbmUgVFNDX01DVl81MTEgICAgICAgICAgICAgVFNDX0NSX01DVl8wICAgICAgICAgICAgICAgICAgIC8qITwgNTExIG1heGltdW0gbnVtYmVyIG9mIGNoYXJnZSB0cmFuc2ZlciBwdWxzZXMgICAqLworI2RlZmluZSBUU0NfTUNWXzEwMjMgICAgICAgICAgICBUU0NfQ1JfTUNWXzEgICAgICAgICAgICAgICAgICAgLyohPCAxMDIzIG1heGltdW0gbnVtYmVyIG9mIGNoYXJnZSB0cmFuc2ZlciBwdWxzZXMgICovCisjZGVmaW5lIFRTQ19NQ1ZfMjA0NyAgICAgICAgICAgIChUU0NfQ1JfTUNWXzEgfCBUU0NfQ1JfTUNWXzApICAvKiE8IDIwNDcgbWF4aW11bSBudW1iZXIgb2YgY2hhcmdlIHRyYW5zZmVyIHB1bHNlcyAgKi8KKyNkZWZpbmUgVFNDX01DVl80MDk1ICAgICAgICAgICAgVFNDX0NSX01DVl8yICAgICAgICAgICAgICAgICAgIC8qITwgNDA5NSBtYXhpbXVtIG51bWJlciBvZiBjaGFyZ2UgdHJhbnNmZXIgcHVsc2VzICAqLworI2RlZmluZSBUU0NfTUNWXzgxOTEgICAgICAgICAgICAoVFNDX0NSX01DVl8yIHwgVFNDX0NSX01DVl8wKSAgLyohPCA4MTkxIG1heGltdW0gbnVtYmVyIG9mIGNoYXJnZSB0cmFuc2ZlciBwdWxzZXMgICovCisjZGVmaW5lIFRTQ19NQ1ZfMTYzODMgICAgICAgICAgIChUU0NfQ1JfTUNWXzIgfCBUU0NfQ1JfTUNWXzEpICAvKiE8IDE2MzgzIG1heGltdW0gbnVtYmVyIG9mIGNoYXJnZSB0cmFuc2ZlciBwdWxzZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0lPX0RlZmF1bHRfTW9kZSBJTyBEZWZhdWx0IE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUU0NfSU9ERUZfT1VUX1BQX0xPVyAgICAweDAwMDAwMDAwVUwgLyohPCBJL09zIGFyZSBmb3JjZWQgdG8gb3V0cHV0IHB1c2gtcHVsbCBsb3cgKi8KKyNkZWZpbmUgVFNDX0lPREVGX0lOX0ZMT0FUICAgICAgVFNDX0NSX0lPREVGIC8qITwgSS9PcyBhcmUgaW4gaW5wdXQgZmxvYXRpbmcgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19TeW5jaHJvX1Bpbl9Qb2xhcml0eSBTeW5jaHJvIFBpbiBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19TWU5DX1BPTEFSSVRZX0ZBTExJTkcgIDB4MDAwMDAwMDBVTCAgIC8qITwgRmFsbGluZyBlZGdlIG9ubHkgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19TWU5DX1BPTEFSSVRZX1JJU0lORyAgIFRTQ19DUl9TWU5DUE9MIC8qITwgUmlzaW5nIGVkZ2UgYW5kIGhpZ2ggbGV2ZWwgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19BY3F1aXNpdGlvbl9Nb2RlIEFjcXVpc2l0aW9uIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUU0NfQUNRX01PREVfTk9STUFMICAgICAweDAwMDAwMDAwVUwgIC8qITwgTm9ybWFsIGFjcXVpc2l0aW9uIG1vZGUgKGFjcXVpc2l0aW9uIHN0YXJ0cyBhcyBzb29uIGFzIFNUQVJUIGJpdCBpcyBzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfQUNRX01PREVfU1lOQ0hSTyAgICBUU0NfQ1JfQU0gICAgIC8qITwgU3luY2hyb25pemVkIGFjcXVpc2l0aW9uIG1vZGUgKGFjcXVpc2l0aW9uIHN0YXJ0cyBpZiBTVEFSVCBiaXQgaXMgc2V0IGFuZCB3aGVuIHRoZSBzZWxlY3RlZCBzaWduYWwgaXMgZGV0ZWN0ZWQgb24gdGhlIFNZTkMgaW5wdXQgcGluKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfaW50ZXJydXB0c19kZWZpbml0aW9uIEludGVycnVwdHMgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19JVF9FT0EgICAgICAgICAgICAgIFRTQ19JRVJfRU9BSUUgLyohPCBFbmQgb2YgYWNxdWlzaXRpb24gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBUU0NfSVRfTUNFICAgICAgICAgICAgICBUU0NfSUVSX01DRUlFIC8qITwgTWF4IGNvdW50IGVycm9yIGludGVycnVwdCBlbmFibGUgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX2ZsYWdzX2RlZmluaXRpb24gRmxhZ3MgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19GTEFHX0VPQSAgICAgICAgICAgIFRTQ19JU1JfRU9BRiAvKiE8IEVuZCBvZiBhY3F1aXNpdGlvbiBmbGFnICovCisjZGVmaW5lIFRTQ19GTEFHX01DRSAgICAgICAgICAgIFRTQ19JU1JfTUNFRiAvKiE8IE1heCBjb3VudCBlcnJvciBmbGFnICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19Hcm91cF9kZWZpbml0aW9uIEdyb3VwIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBUU0NfR1JPVVAxICAgICAgICAgICAgICAodWludDMyX3QpKDB4MVVMIDw8IFRTQ19HUk9VUDFfSURYKQorI2RlZmluZSBUU0NfR1JPVVAyICAgICAgICAgICAgICAodWludDMyX3QpKDB4MVVMIDw8IFRTQ19HUk9VUDJfSURYKQorI2RlZmluZSBUU0NfR1JPVVAzICAgICAgICAgICAgICAodWludDMyX3QpKDB4MVVMIDw8IFRTQ19HUk9VUDNfSURYKQorI2RlZmluZSBUU0NfR1JPVVA0ICAgICAgICAgICAgICAodWludDMyX3QpKDB4MVVMIDw8IFRTQ19HUk9VUDRfSURYKQorI2RlZmluZSBUU0NfR1JPVVA1ICAgICAgICAgICAgICAodWludDMyX3QpKDB4MVVMIDw8IFRTQ19HUk9VUDVfSURYKQorI2RlZmluZSBUU0NfR1JPVVA2ICAgICAgICAgICAgICAodWludDMyX3QpKDB4MVVMIDw8IFRTQ19HUk9VUDZfSURYKQorI2RlZmluZSBUU0NfR1JPVVA3ICAgICAgICAgICAgICAodWludDMyX3QpKDB4MVVMIDw8IFRTQ19HUk9VUDdfSURYKQorI2RlZmluZSBUU0NfR1JPVVA4ICAgICAgICAgICAgICAodWludDMyX3QpKDB4MVVMIDw8IFRTQ19HUk9VUDhfSURYKQorCisjZGVmaW5lIFRTQ19HUk9VUDFfSU8xICAgICAgICAgIFRTQ19JT0NDUl9HMV9JTzEgLyohPCBUU0MgR3JvdXAxIElPMSAqLworI2RlZmluZSBUU0NfR1JPVVAxX0lPMiAgICAgICAgICBUU0NfSU9DQ1JfRzFfSU8yIC8qITwgVFNDIEdyb3VwMSBJTzIgKi8KKyNkZWZpbmUgVFNDX0dST1VQMV9JTzMgICAgICAgICAgVFNDX0lPQ0NSX0cxX0lPMyAvKiE8IFRTQyBHcm91cDEgSU8zICovCisjZGVmaW5lIFRTQ19HUk9VUDFfSU80ICAgICAgICAgIFRTQ19JT0NDUl9HMV9JTzQgLyohPCBUU0MgR3JvdXAxIElPNCAqLworCisjZGVmaW5lIFRTQ19HUk9VUDJfSU8xICAgICAgICAgIFRTQ19JT0NDUl9HMl9JTzEgLyohPCBUU0MgR3JvdXAyIElPMSAqLworI2RlZmluZSBUU0NfR1JPVVAyX0lPMiAgICAgICAgICBUU0NfSU9DQ1JfRzJfSU8yIC8qITwgVFNDIEdyb3VwMiBJTzIgKi8KKyNkZWZpbmUgVFNDX0dST1VQMl9JTzMgICAgICAgICAgVFNDX0lPQ0NSX0cyX0lPMyAvKiE8IFRTQyBHcm91cDIgSU8zICovCisjZGVmaW5lIFRTQ19HUk9VUDJfSU80ICAgICAgICAgIFRTQ19JT0NDUl9HMl9JTzQgLyohPCBUU0MgR3JvdXAyIElPNCAqLworCisjZGVmaW5lIFRTQ19HUk9VUDNfSU8xICAgICAgICAgIFRTQ19JT0NDUl9HM19JTzEgLyohPCBUU0MgR3JvdXAzIElPMSAqLworI2RlZmluZSBUU0NfR1JPVVAzX0lPMiAgICAgICAgICBUU0NfSU9DQ1JfRzNfSU8yIC8qITwgVFNDIEdyb3VwMyBJTzIgKi8KKyNkZWZpbmUgVFNDX0dST1VQM19JTzMgICAgICAgICAgVFNDX0lPQ0NSX0czX0lPMyAvKiE8IFRTQyBHcm91cDMgSU8zICovCisjZGVmaW5lIFRTQ19HUk9VUDNfSU80ICAgICAgICAgIFRTQ19JT0NDUl9HM19JTzQgLyohPCBUU0MgR3JvdXAzIElPNCAqLworCisjZGVmaW5lIFRTQ19HUk9VUDRfSU8xICAgICAgICAgIFRTQ19JT0NDUl9HNF9JTzEgLyohPCBUU0MgR3JvdXA0IElPMSAqLworI2RlZmluZSBUU0NfR1JPVVA0X0lPMiAgICAgICAgICBUU0NfSU9DQ1JfRzRfSU8yIC8qITwgVFNDIEdyb3VwNCBJTzIgKi8KKyNkZWZpbmUgVFNDX0dST1VQNF9JTzMgICAgICAgICAgVFNDX0lPQ0NSX0c0X0lPMyAvKiE8IFRTQyBHcm91cDQgSU8zICovCisjZGVmaW5lIFRTQ19HUk9VUDRfSU80ICAgICAgICAgIFRTQ19JT0NDUl9HNF9JTzQgLyohPCBUU0MgR3JvdXA0IElPNCAqLworCisjZGVmaW5lIFRTQ19HUk9VUDVfSU8xICAgICAgICAgIFRTQ19JT0NDUl9HNV9JTzEgLyohPCBUU0MgR3JvdXA1IElPMSAqLworI2RlZmluZSBUU0NfR1JPVVA1X0lPMiAgICAgICAgICBUU0NfSU9DQ1JfRzVfSU8yIC8qITwgVFNDIEdyb3VwNSBJTzIgKi8KKyNkZWZpbmUgVFNDX0dST1VQNV9JTzMgICAgICAgICAgVFNDX0lPQ0NSX0c1X0lPMyAvKiE8IFRTQyBHcm91cDUgSU8zICovCisjZGVmaW5lIFRTQ19HUk9VUDVfSU80ICAgICAgICAgIFRTQ19JT0NDUl9HNV9JTzQgLyohPCBUU0MgR3JvdXA1IElPNCAqLworCisjZGVmaW5lIFRTQ19HUk9VUDZfSU8xICAgICAgICAgIFRTQ19JT0NDUl9HNl9JTzEgLyohPCBUU0MgR3JvdXA2IElPMSAqLworI2RlZmluZSBUU0NfR1JPVVA2X0lPMiAgICAgICAgICBUU0NfSU9DQ1JfRzZfSU8yIC8qITwgVFNDIEdyb3VwNiBJTzIgKi8KKyNkZWZpbmUgVFNDX0dST1VQNl9JTzMgICAgICAgICAgVFNDX0lPQ0NSX0c2X0lPMyAvKiE8IFRTQyBHcm91cDYgSU8zICovCisjZGVmaW5lIFRTQ19HUk9VUDZfSU80ICAgICAgICAgIFRTQ19JT0NDUl9HNl9JTzQgLyohPCBUU0MgR3JvdXA2IElPNCAqLworCisjZGVmaW5lIFRTQ19HUk9VUDdfSU8xICAgICAgICAgIFRTQ19JT0NDUl9HN19JTzEgLyohPCBUU0MgR3JvdXA3IElPMSAqLworI2RlZmluZSBUU0NfR1JPVVA3X0lPMiAgICAgICAgICBUU0NfSU9DQ1JfRzdfSU8yIC8qITwgVFNDIEdyb3VwNyBJTzIgKi8KKyNkZWZpbmUgVFNDX0dST1VQN19JTzMgICAgICAgICAgVFNDX0lPQ0NSX0c3X0lPMyAvKiE8IFRTQyBHcm91cDcgSU8zICovCisjZGVmaW5lIFRTQ19HUk9VUDdfSU80ICAgICAgICAgIFRTQ19JT0NDUl9HN19JTzQgLyohPCBUU0MgR3JvdXA3IElPNCAqLworCisjZGVmaW5lIFRTQ19HUk9VUDhfSU8xICAgICAgICAgIFRTQ19JT0NDUl9HOF9JTzEgLyohPCBUU0MgR3JvdXA4IElPMSAqLworI2RlZmluZSBUU0NfR1JPVVA4X0lPMiAgICAgICAgICBUU0NfSU9DQ1JfRzhfSU8yIC8qITwgVFNDIEdyb3VwOCBJTzIgKi8KKyNkZWZpbmUgVFNDX0dST1VQOF9JTzMgICAgICAgICAgVFNDX0lPQ0NSX0c4X0lPMyAvKiE8IFRTQyBHcm91cDggSU8zICovCisjZGVmaW5lIFRTQ19HUk9VUDhfSU80ICAgICAgICAgIFRTQ19JT0NDUl9HOF9JTzQgLyohPCBUU0MgR3JvdXA4IElPNCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfTWFjcm9zIFRTQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IFRTQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX1RTQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1RTQ19TVEFURV9SRVNFVDsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfVFNDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfUkVTRVQpCisjZW5kaWYKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgVFNDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gVFNDX0NSX1RTQ0UpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBUU0MgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpKH5UU0NfQ1JfVFNDRSkpCisKKy8qKgorICAqIEBicmllZiBTdGFydCBhY3F1aXNpdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfU1RBUlRfQUNRKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSBUU0NfQ1JfU1RBUlQpCisKKy8qKgorICAqIEBicmllZiBTdG9wIGFjcXVpc2l0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19TVE9QX0FDUShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCkoflRTQ19DUl9TVEFSVCkpCisKKy8qKgorICAqIEBicmllZiBTZXQgSU8gZGVmYXVsdCBtb2RlIHRvIG91dHB1dCBwdXNoLXB1bGwgbG93LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19TRVRfSU9ERUZfT1VUUFBMT1coX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCkoflRTQ19DUl9JT0RFRikpCisKKy8qKgorICAqIEBicmllZiBTZXQgSU8gZGVmYXVsdCBtb2RlIHRvIGlucHV0IGZsb2F0aW5nLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19TRVRfSU9ERUZfSU5GTE9BVChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IFRTQ19DUl9JT0RFRikKKworLyoqCisgICogQGJyaWVmIFNldCBzeW5jaHJvbml6YXRpb24gcG9sYXJpdHkgdG8gZmFsbGluZyBlZGdlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19TRVRfU1lOQ19QT0xfRkFMTChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCkoflRTQ19DUl9TWU5DUE9MKSkKKworLyoqCisgICogQGJyaWVmIFNldCBzeW5jaHJvbml6YXRpb24gcG9sYXJpdHkgdG8gcmlzaW5nIGVkZ2UgYW5kIGhpZ2ggbGV2ZWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX1NFVF9TWU5DX1BPTF9SSVNFX0hJR0goX19IQU5ETEVfXykgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gVFNDX0NSX1NZTkNQT0wpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgVFNDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBUU0MgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIFRTQyBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gVFNDIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgJj0gKHVpbnQzMl90KSh+KF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVFNDIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBIYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gVFNDIGludGVycnVwdAorICAqIEByZXR2YWwgU0VUIG9yIFJFU0VUCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVFNDIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gVFNDIGZsYWcKKyAgKiBAcmV0dmFsIFNFVCBvciBSRVNFVAorICAqLworI2RlZmluZSBfX0hBTF9UU0NfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEBicmllZiBDbGVhciB0aGUgVFNDJ3MgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBUU0MgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHNjaG1pdHQgdHJpZ2dlciBoeXN0ZXJlc2lzIG9uIGEgZ3JvdXAgb2YgSU9zLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX0lPWV9NQVNLX18gSU9zIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0VOQUJMRV9IWVNURVJFU0lTKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9IQ1IgfD0gKF9fR1hfSU9ZX01BU0tfXykpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHNjaG1pdHQgdHJpZ2dlciBoeXN0ZXJlc2lzIG9uIGEgZ3JvdXAgb2YgSU9zLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX0lPWV9NQVNLX18gSU9zIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0RJU0FCTEVfSFlTVEVSRVNJUyhfX0hBTkRMRV9fLCBfX0dYX0lPWV9NQVNLX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9IQ1IgJj0gKHVpbnQzMl90KSh+KF9fR1hfSU9ZX01BU0tfXykpKQorCisvKioKKyAgKiBAYnJpZWYgT3BlbiBhbmFsb2cgc3dpdGNoIG9uIGEgZ3JvdXAgb2YgSU9zLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX0lPWV9NQVNLX18gSU9zIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX09QRU5fQU5BTE9HX1NXSVRDSChfX0hBTkRMRV9fLCBfX0dYX0lPWV9NQVNLX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9BU0NSICY9ICh1aW50MzJfdCkofihfX0dYX0lPWV9NQVNLX18pKSkKKworLyoqCisgICogQGJyaWVmIENsb3NlIGFuYWxvZyBzd2l0Y2ggb24gYSBncm91cCBvZiBJT3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfSU9ZX01BU0tfXyBJT3MgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfQ0xPU0VfQU5BTE9HX1NXSVRDSChfX0hBTkRMRV9fLCBfX0dYX0lPWV9NQVNLX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0FTQ1IgfD0gKF9fR1hfSU9ZX01BU0tfXykpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgYSBncm91cCBvZiBJT3MgaW4gY2hhbm5lbCBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX0lPWV9NQVNLX18gSU9zIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0VOQUJMRV9DSEFOTkVMKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9DQ1IgfD0gKF9fR1hfSU9ZX01BU0tfXykpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIGEgZ3JvdXAgb2YgY2hhbm5lbCBJT3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfSU9ZX01BU0tfXyBJT3MgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRElTQUJMRV9DSEFOTkVMKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0NDUiAmPSAodWludDMyX3QpKH4oX19HWF9JT1lfTUFTS19fKSkpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgYSBncm91cCBvZiBJT3MgaW4gc2FtcGxpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9JT1lfTUFTS19fIElPcyBtYXNrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19FTkFCTEVfU0FNUExJTkcoX19IQU5ETEVfXywgX19HWF9JT1lfTUFTS19fKSAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklPU0NSIHw9IChfX0dYX0lPWV9NQVNLX18pKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBhIGdyb3VwIG9mIHNhbXBsaW5nIElPcy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9JT1lfTUFTS19fIElPcyBtYXNrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19ESVNBQkxFX1NBTVBMSU5HKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklPU0NSICY9ICh1aW50MzJfdCkofihfX0dYX0lPWV9NQVNLX18pKSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBhY3F1aXNpdGlvbiBncm91cHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfTUFTS19fIEdyb3VwcyBtYXNrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19FTkFCTEVfR1JPVVAoX19IQU5ETEVfXywgX19HWF9NQVNLX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0dDU1IgfD0gKF9fR1hfTUFTS19fKSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgYWNxdWlzaXRpb24gZ3JvdXBzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX01BU0tfXyBHcm91cHMgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRElTQUJMRV9HUk9VUChfX0hBTkRMRV9fLCBfX0dYX01BU0tfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklPR0NTUiAmPSAodWludDMyX3QpKH4oX19HWF9NQVNLX18pKSkKKworLyoqIEBicmllZiBHZXRzIGFjcXVpc2l0aW9uIGdyb3VwIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIEhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9JTkRFWF9fIEdyb3VwIGluZGV4CisgICogQHJldHZhbCBTRVQgb3IgUkVTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0dFVF9HUk9VUF9TVEFUVVMoX19IQU5ETEVfXywgX19HWF9JTkRFWF9fKSBcCisoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0dDU1IgJiAodWludDMyX3QpKDFVTCA8PCAoKChfX0dYX0lOREVYX18pICYgKHVpbnQzMl90KVRTQ19OQl9PRl9HUk9VUFMpICsgMTZVTCkpKSA9PSAodWludDMyX3QpKDFVTCA8PCAoKChfX0dYX0lOREVYX18pICYgKHVpbnQzMl90KVRTQ19OQl9PRl9HUk9VUFMpICsgMTZVTCkpKSA/IFRTQ19HUk9VUF9DT01QTEVURUQgOiBUU0NfR1JPVVBfT05HT0lORykKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBUU0NfUHJpdmF0ZV9NYWNyb3MgVFNDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19UU0NfQ1RQSChfX1ZBTFVFX18pICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfMUNZQ0xFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzJDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF8zQ1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfNENZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzVDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF82Q1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfN0NZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzhDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF85Q1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfMTBDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzExQ1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF8xMkNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfMTNDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzE0Q1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF8xNUNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfMTZDWUNMRVMpKQorCisjZGVmaW5lIElTX1RTQ19DVFBMKF9fVkFMVUVfXykgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF8xQ1lDTEUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfMkNZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzNDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF80Q1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfNUNZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzZDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF83Q1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfOENZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzlDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF8xMENZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfMTFDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzEyQ1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF8xM0NZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfMTRDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzE1Q1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF8xNkNZQ0xFUykpCisKKyNkZWZpbmUgSVNfVFNDX1NTKF9fVkFMVUVfXykgICAgICAgICAgICAoKChGdW5jdGlvbmFsU3RhdGUpKF9fVkFMVUVfXykgPT0gRElTQUJMRSkgfHwgKChGdW5jdGlvbmFsU3RhdGUpKF9fVkFMVUVfXykgPT0gRU5BQkxFKSkKKworI2RlZmluZSBJU19UU0NfU1NEKF9fVkFMVUVfXykgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gMFVMKSB8fCAoKChfX1ZBTFVFX18pID4gMFVMKSAmJiAoKF9fVkFMVUVfXykgPCAxMjhVTCkpKQorCisjZGVmaW5lIElTX1RTQ19TU19QUkVTQyhfX1ZBTFVFX18pICAgICAgKCgoX19WQUxVRV9fKSA9PSBUU0NfU1NfUFJFU0NfRElWMSkgfHwgKChfX1ZBTFVFX18pID09IFRTQ19TU19QUkVTQ19ESVYyKSkKKworI2RlZmluZSBJU19UU0NfUEdfUFJFU0MoX19WQUxVRV9fKSAgICAgICgoKF9fVkFMVUVfXykgPT0gVFNDX1BHX1BSRVNDX0RJVjEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfUEdfUFJFU0NfRElWMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19QR19QUkVTQ19ESVY0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX1BHX1BSRVNDX0RJVjgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfUEdfUFJFU0NfRElWMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19QR19QUkVTQ19ESVYzMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX1BHX1BSRVNDX0RJVjY0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfUEdfUFJFU0NfRElWMTI4KSkKKworI2RlZmluZSBJU19UU0NfTUNWKF9fVkFMVUVfXykgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gVFNDX01DVl8yNTUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfTUNWXzUxMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19NQ1ZfMTAyMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX01DVl8yMDQ3KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfTUNWXzQwOTUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19NQ1ZfODE5MSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19NQ1ZfMTYzODMpKQorCisjZGVmaW5lIElTX1RTQ19JT0RFRihfX1ZBTFVFX18pICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBUU0NfSU9ERUZfT1VUX1BQX0xPVykgfHwgKChfX1ZBTFVFX18pID09IFRTQ19JT0RFRl9JTl9GTE9BVCkpCisKKyNkZWZpbmUgSVNfVFNDX1NZTkNfUE9MKF9fVkFMVUVfXykgICAgICAoKChfX1ZBTFVFX18pID09IFRTQ19TWU5DX1BPTEFSSVRZX0ZBTExJTkcpIHx8ICgoX19WQUxVRV9fKSA9PSBUU0NfU1lOQ19QT0xBUklUWV9SSVNJTkcpKQorCisjZGVmaW5lIElTX1RTQ19BQ1FfTU9ERShfX1ZBTFVFX18pICAgICAgKCgoX19WQUxVRV9fKSA9PSBUU0NfQUNRX01PREVfTk9STUFMKSB8fCAoKF9fVkFMVUVfXykgPT0gVFNDX0FDUV9NT0RFX1NZTkNIUk8pKQorCisjZGVmaW5lIElTX1RTQ19NQ0VfSVQoX19WQUxVRV9fKSAgICAgICAgKCgoRnVuY3Rpb25hbFN0YXRlKShfX1ZBTFVFX18pID09IERJU0FCTEUpIHx8ICgoRnVuY3Rpb25hbFN0YXRlKShfX1ZBTFVFX18pID09IEVOQUJMRSkpCisKKyNkZWZpbmUgSVNfVFNDX0dST1VQX0lOREVYKF9fVkFMVUVfXykgICAoKChfX1ZBTFVFX18pID09IDBVTCkgfHwgKCgoX19WQUxVRV9fKSA+IDBVTCkgJiYgKChfX1ZBTFVFX18pIDwgKHVpbnQzMl90KVRTQ19OQl9PRl9HUk9VUFMpKSkKKworI2RlZmluZSBJU19UU0NfR1JPVVAoX19WQUxVRV9fKSAgICAgICAgICgoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQMV9JTzEpID09IFRTQ19HUk9VUDFfSU8xKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDFfSU8yKSA9PSBUU0NfR1JPVVAxX0lPMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVAxX0lPMykgPT0gVFNDX0dST1VQMV9JTzMpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQMV9JTzQpID09IFRTQ19HUk9VUDFfSU80KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDJfSU8xKSA9PSBUU0NfR1JPVVAyX0lPMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVAyX0lPMikgPT0gVFNDX0dST1VQMl9JTzIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQMl9JTzMpID09IFRTQ19HUk9VUDJfSU8zKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDJfSU80KSA9PSBUU0NfR1JPVVAyX0lPNCkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVAzX0lPMSkgPT0gVFNDX0dST1VQM19JTzEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQM19JTzIpID09IFRTQ19HUk9VUDNfSU8yKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDNfSU8zKSA9PSBUU0NfR1JPVVAzX0lPMykgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVAzX0lPNCkgPT0gVFNDX0dST1VQM19JTzQpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQNF9JTzEpID09IFRTQ19HUk9VUDRfSU8xKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDRfSU8yKSA9PSBUU0NfR1JPVVA0X0lPMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA0X0lPMykgPT0gVFNDX0dST1VQNF9JTzMpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQNF9JTzQpID09IFRTQ19HUk9VUDRfSU80KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDVfSU8xKSA9PSBUU0NfR1JPVVA1X0lPMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA1X0lPMikgPT0gVFNDX0dST1VQNV9JTzIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQNV9JTzMpID09IFRTQ19HUk9VUDVfSU8zKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDVfSU80KSA9PSBUU0NfR1JPVVA1X0lPNCkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA2X0lPMSkgPT0gVFNDX0dST1VQNl9JTzEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQNl9JTzIpID09IFRTQ19HUk9VUDZfSU8yKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDZfSU8zKSA9PSBUU0NfR1JPVVA2X0lPMykgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA2X0lPNCkgPT0gVFNDX0dST1VQNl9JTzQpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQN19JTzEpID09IFRTQ19HUk9VUDdfSU8xKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDdfSU8yKSA9PSBUU0NfR1JPVVA3X0lPMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA3X0lPMykgPT0gVFNDX0dST1VQN19JTzMpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQN19JTzQpID09IFRTQ19HUk9VUDdfSU80KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDhfSU8xKSA9PSBUU0NfR1JPVVA4X0lPMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA4X0lPMikgPT0gVFNDX0dST1VQOF9JTzIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQOF9JTzMpID09IFRTQ19HUk9VUDhfSU8zKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDhfSU80KSA9PSBUU0NfR1JPVVA4X0lPNCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRTQ19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19Jbml0KFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfRGVJbml0KFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsKK3ZvaWQgSEFMX1RTQ19Nc3BJbml0KFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsKK3ZvaWQgSEFMX1RTQ19Nc3BEZUluaXQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOworCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfUmVnaXN0ZXJDYWxsYmFjayhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgSEFMX1RTQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVFNDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19VblJlZ2lzdGVyQ2FsbGJhY2soVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MsIEhBTF9UU0NfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1N0YXJ0KFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfU3RhcnRfSVQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19TdG9wKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfU3RvcF9JVChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1BvbGxGb3JBY3F1aXNpdGlvbihUU0NfSGFuZGxlVHlwZURlZiAqaHRzYyk7CitUU0NfR3JvdXBTdGF0dXNUeXBlRGVmIEhBTF9UU0NfR3JvdXBHZXRTdGF0dXMoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MsIHVpbnQzMl90IGd4X2luZGV4KTsKK3VpbnQzMl90IEhBTF9UU0NfR3JvdXBHZXRWYWx1ZShUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgdWludDMyX3QgZ3hfaW5kZXgpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRTQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfSU9Db25maWcoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MsIFRTQ19JT0NvbmZpZ1R5cGVEZWYgKmNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0lPRGlzY2hhcmdlKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjLCB1aW50MzJfdCBjaG9pY2UpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRTQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9UU0NfU3RhdGVUeXBlRGVmIEhBTF9UU0NfR2V0U3RhdGUoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRTQ19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzIElSUSBIYW5kbGVyIGFuZCBDYWxsYmFja3MKKyAqIEB7CisgKi8KKy8qKioqKioqIFRTQyBJUlFIYW5kbGVyIGFuZCBDYWxsYmFja3MgdXNlZCBpbiBJbnRlcnJ1cHQgbW9kZSAqLwordm9pZCBIQUxfVFNDX0lSUUhhbmRsZXIoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOwordm9pZCBIQUxfVFNDX0NvbnZDcGx0Q2FsbGJhY2soVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOwordm9pZCBIQUxfVFNDX0Vycm9yQ2FsbGJhY2soVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBUU0MgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfVFNDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfaGFsX3VhcnQuaCBiL0luYy9zdG0zMmwweHhfaGFsX3VhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmM4YzRjCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfdWFydC5oCkBAIC0wLDAgKzEsMTQ5OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfdWFydC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVQVJUIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkwweHhfSEFMX1VBUlRfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfVUFSVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfVHlwZXMgVUFSVCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBVQVJUIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEJhdWRSYXRlOyAgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBtZW1iZXIgY29uZmlndXJlcyB0aGUgVUFSVCBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmF1ZCByYXRlIHJlZ2lzdGVyIGlzIGNvbXB1dGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFVBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlciA9ICgoMjU2ICogbHB1YXJ0X2tlcl9jaykgLyAoKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgbHB1YXJ0X2tlcl9jayBpcyB0aGUgVUFSVCBpbnB1dCBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElmIG92ZXJzYW1wbGluZyBpcyAxNiBvciBpbiBMSU4gbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXIgPSAoKHVhcnRfa2VyX2NrKSAvICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElmIG92ZXJzYW1wbGluZyBpcyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclsxNTo0XSA9ICgoMiAqIHVhcnRfa2VyX2NrKSAvICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSlbMTU6NF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXJbM10gPSAgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclsyOjBdID0gICgoKDIgKiB1YXJ0X2tlcl9jaykgLyAoKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpWzM6MF0pID4+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB1YXJ0X2tlcl9jayBpcyB0aGUgVUFSVCBpbnB1dCBjbG9jayAqLworCisgIHVpbnQzMl90IFdvcmRMZW5ndGg7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIGluIGEgZnJhbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJURXhfV29yZF9MZW5ndGguICovCisKKyAgdWludDMyX3QgU3RvcEJpdHM7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1N0b3BfQml0cy4gKi8KKworICB1aW50MzJfdCBQYXJpdHk7ICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1Bhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFdoZW4gcGFyaXR5IGlzIGVuYWJsZWQsIHRoZSBjb21wdXRlZCBwYXJpdHkgaXMgaW5zZXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgTVNCIHBvc2l0aW9uIG9mIHRoZSB0cmFuc21pdHRlZCBkYXRhICg5dGggYml0IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgd29yZCBsZW5ndGggaXMgc2V0IHRvIDkgZGF0YSBiaXRzOyA4dGggYml0IHdoZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZCBsZW5ndGggaXMgc2V0IHRvIDggZGF0YSBiaXRzKS4gKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSZWNlaXZlIG9yIFRyYW5zbWl0IG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfTW9kZS4gKi8KKworICB1aW50MzJfdCBId0Zsb3dDdGw7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgbW9kZSBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX0hhcmR3YXJlX0Zsb3dfQ29udHJvbC4gKi8KKworICB1aW50MzJfdCBPdmVyU2FtcGxpbmc7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBPdmVyIHNhbXBsaW5nIDggaXMgZW5hYmxlZCBvciBkaXNhYmxlZCwgdG8gYWNoaWV2ZSBoaWdoZXIgc3BlZWQgKHVwIHRvIGZfUENMSy84KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfT3Zlcl9TYW1wbGluZy4gKi8KKworICB1aW50MzJfdCBPbmVCaXRTYW1wbGluZzsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGEgc2luZ2xlIHNhbXBsZSBvciB0aHJlZSBzYW1wbGVzJyBtYWpvcml0eSB2b3RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGluZyB0aGUgc2luZ2xlIHNhbXBsZSBtZXRob2QgaW5jcmVhc2VzIHRoZSByZWNlaXZlciB0b2xlcmFuY2UgdG8gY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpYXRpb25zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfT25lQml0X1NhbXBsaW5nLiAqLworCisKK30gVUFSVF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBVQVJUIEFkdmFuY2VkIEZlYXR1cmVzIGluaXRpYWxpemF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBBZHZGZWF0dXJlSW5pdDsgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoaWNoIGFkdmFuY2VkIFVBUlQgZmVhdHVyZXMgaXMgaW5pdGlhbGl6ZWQuIFNldmVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2VkIEZlYXR1cmVzIG1heSBiZSBpbml0aWFsaXplZCBhdCB0aGUgc2FtZSB0aW1lIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9BZHZhbmNlZF9GZWF0dXJlc19Jbml0aWFsaXphdGlvbl9UeXBlLiAqLworCisgIHVpbnQzMl90IFR4UGluTGV2ZWxJbnZlcnQ7ICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVFggcGluIGFjdGl2ZSBsZXZlbCBpcyBpbnZlcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9UeF9JbnYuICovCisKKyAgdWludDMyX3QgUnhQaW5MZXZlbEludmVydDsgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSWCBwaW4gYWN0aXZlIGxldmVsIGlzIGludmVydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1J4X0ludi4gKi8KKworICB1aW50MzJfdCBEYXRhSW52ZXJ0OyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSBhcmUgaW52ZXJ0ZWQgKHBvc2l0aXZlL2RpcmVjdCBsb2dpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMgbmVnYXRpdmUvaW52ZXJ0ZWQgbG9naWMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX0RhdGFfSW52LiAqLworCisgIHVpbnQzMl90IFN3YXA7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBUWCBhbmQgUlggcGlucyBhcmUgc3dhcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9SeF9UeF9Td2FwLiAqLworCisgIHVpbnQzMl90IE92ZXJydW5EaXNhYmxlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZXB0aW9uIG92ZXJydW4gZGV0ZWN0aW9uIGlzIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX092ZXJydW5fRGlzYWJsZS4gKi8KKworICB1aW50MzJfdCBETUFEaXNhYmxlb25SeEVycm9yOyAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIERNQSBpcyBkaXNhYmxlZCBpbiBjYXNlIG9mIHJlY2VwdGlvbiBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9ETUFfRGlzYWJsZV9vbl9SeF9FcnJvci4gKi8KKworICB1aW50MzJfdCBBdXRvQmF1ZFJhdGVFbmFibGU7ICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfQXV0b0JhdWRSYXRlX0VuYWJsZS4gKi8KKworICB1aW50MzJfdCBBdXRvQmF1ZFJhdGVNb2RlOyAgICAgIC8qITwgSWYgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQsIHNwZWNpZmllcyBob3cgdGhlIHJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGlvbiBpcyBjYXJyaWVkIG91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9BdXRvQmF1ZF9SYXRlX01vZGUuICovCisKKyAgdWludDMyX3QgTVNCRmlyc3Q7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIE1TQiBpcyBzZW50IGZpcnN0IG9uIFVBUlQgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9NU0JfRmlyc3QuICovCit9IFVBUlRfQWR2RmVhdHVyZUluaXRUeXBlRGVmOworCisKKworLyoqCisgICogQGJyaWVmIEhBTCBVQVJUIFN0YXRlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgSEFMIFVBUlQgU3RhdGUgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGRpZmZlcmVudCBzdWJzdGF0ZXM6IGdTdGF0ZSBhbmQgUnhTdGF0ZSAoc2VlIEByZWYgVUFSVF9TdGF0ZV9EZWZpbml0aW9uKS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudAorICAqICAgICAgICAgIGFuZCBhbHNvIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBnU3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgRXJyb3IgaW5mb3JtYXRpb24KKyAgKiAgICAgICAgICAgICAwMCA6IE5vIEVycm9yCisgICogICAgICAgICAgICAgMDEgOiAoTm90IFVzZWQpCisgICogICAgICAgICAgICAgMTAgOiBUaW1lb3V0CisgICogICAgICAgICAgICAgMTEgOiBFcnJvcgorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZC4gSEFMIFVBUlQgSW5pdCBmdW5jdGlvbiBhbHJlYWR5IGNhbGxlZCkKKyAgKiAgICAgICAgICBiNC1iMyAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGIyICAgICBJbnRyaW5zaWMgcHJvY2VzcyBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFBlcmlwaGVyYWwgYnVzeSB3aXRoIHNvbWUgY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBvcGVyYXRpb25zKQorICAqICAgICAgICAgIGIxICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAKKyAgKiAgICAgICAgICBiMCAgICAgVHggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAtIFJ4U3RhdGUgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAqICAgICAgICAgIFJ4U3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICBiNC1iMiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgeHh4IDogU2hvdWxkIGJlIHNldCB0byAwMDAKKyAgKiAgICAgICAgICBiMSAgICAgUnggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgIGIwICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAuCisgICovCit0eXBlZGVmIHVpbnQzMl90IEhBTF9VQVJUX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIFVBUlQgY2xvY2sgc291cmNlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMSAgICAgID0gMHgwMFUsICAgIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAqLworICBVQVJUX0NMT0NLU09VUkNFX1BDTEsyICAgICAgPSAweDAxVSwgICAgLyohPCBQQ0xLMiBjbG9jayBzb3VyY2UgICovCisgIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJICAgICAgICA9IDB4MDJVLCAgICAvKiE8IEhTSSBjbG9jayBzb3VyY2UgICAgKi8KKyAgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEsgICAgID0gMHgwNFUsICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAqLworICBVQVJUX0NMT0NLU09VUkNFX0xTRSAgICAgICAgPSAweDA4VSwgICAgLyohPCBMU0UgY2xvY2sgc291cmNlICAgICAgICovCisgIFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEICA9IDB4MTBVICAgICAvKiE8IFVuZGVmaW5lZCBjbG9jayBzb3VyY2UgKi8KK30gVUFSVF9DbG9ja1NvdXJjZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmCit7CisgIFVTQVJUX1R5cGVEZWYgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgICAgIC8qITwgVUFSVCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAqLworCisgIFVBUlRfSW5pdFR5cGVEZWYgICAgICAgICBJbml0OyAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAqLworCisgIFVBUlRfQWR2RmVhdHVyZUluaXRUeXBlRGVmIEFkdmFuY2VkSW5pdDsgICAgICAgICAgIC8qITwgVUFSVCBBZHZhbmNlZCBGZWF0dXJlcyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIFVBUlQgVHggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgICAgICAgICAgICAgLyohPCBVQVJUIFR4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgIFR4WGZlckNvdW50OyAgICAgICAgICAgICAgLyohPCBVQVJUIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIFVBUlQgUnggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIFJ4WGZlclNpemU7ICAgICAgICAgICAgICAgLyohPCBVQVJUIFJ4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgIFJ4WGZlckNvdW50OyAgICAgICAgICAgICAgLyohPCBVQVJUIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIE1hc2s7ICAgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIFJ4IFJEUiByZWdpc3RlciBtYXNrICAgICAgICAgICovCisKKworICB2b2lkICgqUnhJU1IpKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gUnggSVJRIGhhbmRsZXIgICAqLworCisgIHZvaWQgKCpUeElTUikoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7IC8qITwgRnVuY3Rpb24gcG9pbnRlciBvbiBUeCBJUlEgaGFuZGxlciAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hdHg7ICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIFR4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hcng7ICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIFJ4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgICAgZ1N0YXRlOyAgICAgICAgICAgICAgLyohPCBVQVJUIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1VBUlRfU3RhdGVUeXBlRGVmICovCisKKyAgX19JTyBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgICAgUnhTdGF0ZTsgICAgICAgICAgICAgLyohPCBVQVJUIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gUnggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9VQVJUX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAgIC8qITwgVUFSVCBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBUeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgICAgICAgLyohPCBVQVJUIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICovCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgICAgICAgICAgIC8qITwgVUFSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworICB2b2lkICgqIFJ4SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAvKiE8IFVBUlQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgKi8KKyAgdm9pZCAoKiBSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgICAgLyohPCBVQVJUIFJ4IENvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICAgICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgICAgIC8qITwgVUFSVCBFcnJvciBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIEFib3J0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgICAgICAgICAvKiE8IFVBUlQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAoKiBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgIHZvaWQgKCogQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgIC8qITwgVUFSVCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICAqLworICB2b2lkICgqIFdha2V1cENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgICAgICAgICAgICAvKiE8IFVBUlQgV2FrZXVwIENhbGxiYWNrICAgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgICAvKiE8IFVBUlQgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgLyohPCBVQVJUIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisjZW5kaWYgIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworfSBVQVJUX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgVUFSVCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1VBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDAwVSwgICAgLyohPCBVQVJUIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9VQVJUX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgVUFSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IFVBUlQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgKi8KKyAgSEFMX1VBUlRfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBVQVJUIFJ4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9VQVJUX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwNFUsICAgIC8qITwgVUFSVCBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAqLworICBIQUxfVUFSVF9BQk9SVF9DT01QTEVURV9DQl9JRCAgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IFVBUlQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgKi8KKyAgSEFMX1VBUlRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgPSAweDA2VSwgICAgLyohPCBVQVJUIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElEICovCisgIEhBTF9VQVJUX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgID0gMHgwN1UsICAgIC8qITwgVUFSVCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElEICAqLworICBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgICAgICAgICAgICAgICAgICA9IDB4MDhVLCAgICAvKiE8IFVBUlQgV2FrZXVwIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgKi8KKworICBIQUxfVUFSVF9NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MEJVLCAgICAvKiE8IFVBUlQgTXNwSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDBDVSAgICAgLyohPCBVQVJUIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisKK30gSEFMX1VBUlRfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFVBUlQgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcFVBUlRfQ2FsbGJhY2tUeXBlRGVmKShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgIC8qITwgcG9pbnRlciB0byBhbiBVQVJUIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfQ29uc3RhbnRzIFVBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1N0YXRlX0RlZmluaXRpb24gVUFSVCBTdGF0ZSBDb2RlIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSAgSEFMX1VBUlRfU1RBVEVfUkVTRVQgICAgICAgICAweDAwMDAwMDAwVSAgICAvKiE8IFBlcmlwaGVyYWwgaXMgbm90IGluaXRpYWxpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisjZGVmaW5lICBIQUxfVUFSVF9TVEFURV9SRUFEWSAgICAgICAgIDB4MDAwMDAwMjBVICAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBhbmQgUnhTdGF0ZSAqLworI2RlZmluZSAgSEFMX1VBUlRfU1RBVEVfQlVTWSAgICAgICAgICAweDAwMDAwMDI0VSAgICAvKiE8IGFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisjZGVmaW5lICBIQUxfVUFSVF9TVEFURV9CVVNZX1RYICAgICAgIDB4MDAwMDAwMjFVICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX1NUQVRFX0JVU1lfUlggICAgICAgMHgwMDAwMDAyMlUgICAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBSeFN0YXRlIG9ubHkgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX1NUQVRFX0JVU1lfVFhfUlggICAgMHgwMDAwMDAyM1UgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB0byBiZSB1c2VkIGZvciBuZWl0aGVyIGdTdGF0ZSBub3IgUnhTdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyByZXN1bHQgb2YgY29tYmluYXRpb24gKE9yKSBiZXR3ZWVuIGdTdGF0ZSBhbmQgUnhTdGF0ZSB2YWx1ZXMgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX1NUQVRFX1RJTUVPVVQgICAgICAgMHgwMDAwMDBBMFUgICAgLyohPCBUaW1lb3V0IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX1NUQVRFX0VSUk9SICAgICAgICAgMHgwMDAwMDBFMFUgICAgLyohPCBFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXJyb3JfRGVmaW5pdGlvbiAgIFVBUlQgRXJyb3IgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lICBIQUxfVUFSVF9FUlJPUl9OT05FICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX1BFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgICAgLyohPCBQYXJpdHkgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSAgSEFMX1VBUlRfRVJST1JfTkUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAgICAvKiE8IE5vaXNlIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lICBIQUxfVUFSVF9FUlJPUl9GRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpICAgIC8qITwgRnJhbWUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX09SRSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgICAgLyohPCBPdmVycnVuIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSAgSEFMX1VBUlRfRVJST1JfRE1BICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgKCh1aW50MzJfdCkweDAwMDAwMDIwVSkgICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAqLworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9TdG9wX0JpdHMgICBVQVJUIE51bWJlciBvZiBTdG9wIEJpdHMKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1NUT1BCSVRTXzBfNSAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX1NUT1BfMCAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBmcmFtZSB3aXRoIDAuNSBzdG9wIGJpdCAgKi8KKyNkZWZpbmUgVUFSVF9TVE9QQklUU18xICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgZnJhbWUgd2l0aCAxIHN0b3AgYml0ICAgICovCisjZGVmaW5lIFVBUlRfU1RPUEJJVFNfMV81ICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjJfU1RPUF8wIHwgVVNBUlRfQ1IyX1NUT1BfMSkgLyohPCBVQVJUIGZyYW1lIHdpdGggMS41IHN0b3AgYml0cyAqLworI2RlZmluZSBVQVJUX1NUT1BCSVRTXzIgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX1NUT1BfMSAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBmcmFtZSB3aXRoIDIgc3RvcCBiaXRzICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9QYXJpdHkgIFVBUlQgUGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9QQVJJVFlfTk9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHBhcml0eSAgICovCisjZGVmaW5lIFVBUlRfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9QQ0UgICAgICAgICAgICAgICAgICAgICAgLyohPCBFdmVuIHBhcml0eSAqLworI2RlZmluZSBVQVJUX1BBUklUWV9PREQgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAgIC8qITwgT2RkIHBhcml0eSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9IYXJkd2FyZV9GbG93X0NvbnRyb2wgVUFSVCBIYXJkd2FyZSBGbG93IENvbnRyb2wKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9OT05FICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gaGFyZHdhcmUgY29udHJvbCAgICAgICAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9SVFMgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX1JUU0UgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBUbyBTZW5kICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9DVFMgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0NUU0UgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2xlYXIgVG8gU2VuZCAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTICAgICAgICAgICAgICAgKFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UpICAgIC8qITwgUmVxdWVzdCBhbmQgQ2xlYXIgVG8gU2VuZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX01vZGUgVUFSVCBUcmFuc2ZlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9NT0RFX1JYICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAvKiE8IFJYIG1vZGUgICAgICAgICovCisjZGVmaW5lIFVBUlRfTU9ERV9UWCAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSAgICAgICAgICAgICAgICAgICAgLyohPCBUWCBtb2RlICAgICAgICAqLworI2RlZmluZSBVQVJUX01PREVfVFhfUlggICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1RFIHxVU0FSVF9DUjFfUkUpICAgIC8qITwgUlggYW5kIFRYIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9TdGF0ZSAgVUFSVCBTdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgLyohPCBVQVJUIGRpc2FibGVkICAqLworI2RlZmluZSBVQVJUX1NUQVRFX0VOQUJMRSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVUUgICAgICAgIC8qITwgVUFSVCBlbmFibGVkICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9PdmVyX1NhbXBsaW5nIFVBUlQgT3ZlciBTYW1wbGluZworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfT1ZFUlNBTVBMSU5HXzE2ICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgLyohPCBPdmVyc2FtcGxpbmcgYnkgMTYgKi8KKyNkZWZpbmUgVUFSVF9PVkVSU0FNUExJTkdfOCAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX09WRVI4ICAgICAvKiE8IE92ZXJzYW1wbGluZyBieSA4ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX09uZUJpdF9TYW1wbGluZyBVQVJUIE9uZSBCaXQgU2FtcGxpbmcgTWV0aG9kCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAvKiE8IE9uZS1iaXQgc2FtcGxpbmcgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRSAgICAgICAgICBVU0FSVF9DUjNfT05FQklUICAgIC8qITwgT25lLWJpdCBzYW1wbGluZyBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfQXV0b0JhdWRfUmF0ZV9Nb2RlICAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBBdXRvQmF1ZCBSYXRlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09OU1RBUlRCSVQgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG9uIHN0YXJ0IGJpdCAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT05GQUxMSU5HRURHRSBVU0FSVF9DUjJfQUJSTU9ERV8wICAgLyohPCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gb24gZmFsbGluZyBlZGdlICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTjBYN0ZGUkFNRSAgIFVTQVJUX0NSMl9BQlJNT0RFXzEgICAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBvbiAweDdGIGZyYW1lIGRldGVjdGlvbiAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09OMFg1NUZSQU1FICAgVVNBUlRfQ1IyX0FCUk1PREUgICAgIC8qITwgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG9uIDB4NTUgZnJhbWUgZGV0ZWN0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUmVjZWl2ZXJfVGltZU91dCBVQVJUIFJlY2VpdmVyIFRpbWVPdXQKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRElTQUJMRSAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRU5BQkxFICAgICAgICBVU0FSVF9DUjJfUlRPRU4gICAgICAgICAgICAgLyohPCBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0xJTiAgICBVQVJUIExvY2FsIEludGVyY29ubmVjdGlvbiBOZXR3b3JrIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0xJTl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAvKiE8IExvY2FsIEludGVyY29ubmVjdCBOZXR3b3JrIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9MSU5fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0xJTkVOICAgICAgICAgICAgLyohPCBMb2NhbCBJbnRlcmNvbm5lY3QgTmV0d29yayBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfTElOX0JyZWFrX0RldGVjdGlvbiAgVUFSVCBMSU4gQnJlYWsgRGV0ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMEIgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBMSU4gMTAtYml0IGJyZWFrIGRldGVjdGlvbiBsZW5ndGggKi8KKyNkZWZpbmUgVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMUIgICAgICAgVVNBUlRfQ1IyX0xCREwgICAgICAgICAgICAgLyohPCBMSU4gMTEtYml0IGJyZWFrIGRldGVjdGlvbiBsZW5ndGggICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRE1BX1R4ICAgIFVBUlQgRE1BIFR4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9ETUFfVFhfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBVQVJUIERNQSBUWCBkaXNhYmxlZCAqLworI2RlZmluZSBVQVJUX0RNQV9UWF9FTkFCTEUgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfRE1BVCAgICAgICAgICAgICAvKiE8IFVBUlQgRE1BIFRYIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRE1BX1J4ICAgVUFSVCBETUEgUngKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0RNQV9SWF9ESVNBQkxFICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBVQVJUIERNQSBSWCBkaXNhYmxlZCAqLworI2RlZmluZSBVQVJUX0RNQV9SWF9FTkFCTEUgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfRE1BUiAgICAgICAgICAgICAgLyohPCBVQVJUIERNQSBSWCBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0hhbGZfRHVwbGV4X1NlbGVjdGlvbiAgVUFSVCBIYWxmIER1cGxleCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0hBTEZfRFVQTEVYX0RJU0FCTEUgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGhhbGYtZHVwbGV4IGRpc2FibGVkICovCisjZGVmaW5lIFVBUlRfSEFMRl9EVVBMRVhfRU5BQkxFICAgICAgICAgICAgIFVTQVJUX0NSM19IRFNFTCAgICAgICAgICAgICAvKiE8IFVBUlQgaGFsZi1kdXBsZXggZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9XYWtlVXBfTWV0aG9kcyAgIFVBUlQgV2FrZVVwIE1ldGhvZHMKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1dBS0VVUE1FVEhPRF9JRExFTElORSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgb24gaWRsZSBsaW5lICAgICovCisjZGVmaW5lIFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLICAgICAgIFVTQVJUX0NSMV9XQUtFICAgICAgICAgICAgICAvKiE8IFVBUlQgd2FrZS11cCBvbiBhZGRyZXNzIG1hcmsgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9SZXF1ZXN0X1BhcmFtZXRlcnMgVUFSVCBSZXF1ZXN0IFBhcmFtZXRlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FVVE9CQVVEX1JFUVVFU1QgICAgICAgICAgICAgICBVU0FSVF9SUVJfQUJSUlEgICAgICAgIC8qITwgQXV0by1CYXVkIFJhdGUgUmVxdWVzdCAgICAgICovCisjZGVmaW5lIFVBUlRfU0VOREJSRUFLX1JFUVVFU1QgICAgICAgICAgICAgIFVTQVJUX1JRUl9TQktSUSAgICAgICAgLyohPCBTZW5kIEJyZWFrIFJlcXVlc3QgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9NVVRFX01PREVfUkVRVUVTVCAgICAgICAgICAgICAgVVNBUlRfUlFSX01NUlEgICAgICAgICAvKiE8IE11dGUgTW9kZSBSZXF1ZXN0ICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgICAgICBVU0FSVF9SUVJfUlhGUlEgICAgICAgIC8qITwgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QgICovCisjZGVmaW5lIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICAgICAgIFVTQVJUX1JRUl9UWEZSUSAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIGZsdXNoIFJlcXVlc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9BZHZhbmNlZF9GZWF0dXJlc19Jbml0aWFsaXphdGlvbl9UeXBlICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgSW5pdGlhbGl6YXRpb24gVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9OT19JTklUICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IE5vIGFkdmFuY2VkIGZlYXR1cmUgaW5pdGlhbGl6YXRpb24gICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1RYSU5WRVJUX0lOSVQgICAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZFUlRfSU5JVCAgICAgICAgICAgMHgwMDAwMDAwMlUgICAgICAgICAgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQgICAgICAgICAweDAwMDAwMDA0VSAgICAgICAgICAvKiE8IEJpbmFyeSBkYXRhIGludmVyc2lvbiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1NXQVBfSU5JVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVICAgICAgICAgIC8qITwgVFgvUlggcGlucyBzd2FwICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfUlhPVkVSUlVORElTQUJMRV9JTklUICAgMHgwMDAwMDAxMFUgICAgICAgICAgLyohPCBSWCBvdmVycnVuIGRpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUICAweDAwMDAwMDIwVSAgICAgICAgICAvKiE8IERNQSBkaXNhYmxlIG9uIFJlY2VwdGlvbiBFcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9JTklUICAgICAgIDB4MDAwMDAwNDBVICAgICAgICAgIC8qITwgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGluaXRpYWxpemF0aW9uICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCAgICAgICAgICAgMHgwMDAwMDA4MFUgICAgICAgICAgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIGZpcnN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfVHhfSW52IFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBUWCBQaW4gQWN0aXZlIExldmVsIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9UWElOVl9ESVNBQkxFICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZfRU5BQkxFICAgICAgICBVU0FSVF9DUjJfVFhJTlYgICAgICAgICAvKiE8IFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9SeF9JbnYgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIFJYIFBpbiBBY3RpdmUgTGV2ZWwgSW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1JYSU5WX0RJU0FCTEUgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9SWElOVl9FTkFCTEUgICAgICAgIFVTQVJUX0NSMl9SWElOViAgICAgICAgIC8qITwgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0RhdGFfSW52ICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgQmluYXJ5IERhdGEgSW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZfRElTQUJMRSAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVl9FTkFCTEUgICAgICBVU0FSVF9DUjJfREFUQUlOViAgICAgICAvKiE8IEJpbmFyeSBkYXRhIGludmVyc2lvbiBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUnhfVHhfU3dhcCBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgUlggVFggUGlucyBTd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1NXQVBfRElTQUJMRSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9FTkFCTEUgICAgICAgICBVU0FSVF9DUjJfU1dBUCAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgc3dhcCBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfT3ZlcnJ1bl9EaXNhYmxlICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgT3ZlcnJ1biBEaXNhYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBSWCBvdmVycnVuIGVuYWJsZSAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRElTQUJMRSAgICAgVVNBUlRfQ1IzX09WUkRJUyAgICAgICAgLyohPCBSWCBvdmVycnVuIGRpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9BdXRvQmF1ZFJhdGVfRW5hYmxlICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgQXV0byBCYXVkUmF0ZSBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0RJU0FCTEUgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IFJYIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBlbmFibGUgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRU5BQkxFICAgIFVTQVJUX0NSMl9BQlJFTiAgICAgIC8qITwgUlggQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGRpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9ETUFfRGlzYWJsZV9vbl9SeF9FcnJvciAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBETUEgRGlzYWJsZSBPbiBSeCBFcnJvcgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9ETUFfRU5BQkxFT05SWEVSUk9SICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgRE1BIGVuYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9ETUFfRElTQUJMRU9OUlhFUlJPUiAgIFVTQVJUX0NSM19ERFJFICAgICAgIC8qITwgRE1BIGRpc2FibGUgb24gUmVjZXB0aW9uIEVycm9yICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfTVNCX0ZpcnN0ICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIE1TQiBGaXJzdAorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9ESVNBQkxFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTW9zdCBzaWduaWZpY2FudCBiaXQgc2VudC9yZWNlaXZlZCBmaXJzdCBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9FTkFCTEUgICAgIFVTQVJUX0NSMl9NU0JGSVJTVCAgICAgIC8qITwgTW9zdCBzaWduaWZpY2FudCBiaXQgc2VudC9yZWNlaXZlZCBmaXJzdCBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfU3RvcF9Nb2RlX0VuYWJsZSAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBTdG9wIE1vZGUgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFX0RJU0FCTEUgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBVQVJUIHN0b3AgbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TVE9QTU9ERV9FTkFCTEUgICAgIFVTQVJUX0NSMV9VRVNNICAgICAgICAgIC8qITwgVUFSVCBzdG9wIG1vZGUgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX011dGVfTW9kZSAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBNdXRlIE1vZGUgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01VVEVNT0RFX0RJU0FCTEUgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBVQVJUIG11dGUgbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9FTkFCTEUgICAgIFVTQVJUX0NSMV9NTUUgICAgICAgICAgIC8qITwgVUFSVCBtdXRlIG1vZGUgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0NSMl9BRERSRVNTX0xTQl9QT1MgICAgVUFSVCBBZGRyZXNzLW1hdGNoaW5nIExTQiBQb3NpdGlvbiBJbiBDUjIgUmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0NSMl9BRERSRVNTX0xTQl9QT1MgICAgICAgICAgICAgMjRVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgYWRkcmVzcy1tYXRjaGluZyBMU0IgcG9zaXRpb24gaW4gQ1IyIHJlZ2lzdGVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfV2FrZVVwX2Zyb21fU3RvcF9TZWxlY3Rpb24gICBVQVJUIFdha2VVcCBGcm9tIFN0b3AgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9XQUtFVVBfT05fQUREUkVTUyAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgb24gYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCAgICAgICAgICAgICBVU0FSVF9DUjNfV1VTXzEgICAgICAgICAvKiE8IFVBUlQgd2FrZS11cCBvbiBzdGFydCBiaXQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfV0FLRVVQX09OX1JFQUREQVRBX05PTkVNUFRZICAgIFVTQVJUX0NSM19XVVMgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIG9uIHJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgb3IgUlhGSUZPIGlzIG5vdCBlbXB0eSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0RyaXZlckVuYWJsZV9Qb2xhcml0eSAgICAgIFVBUlQgRHJpdmVyRW5hYmxlIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9ERV9QT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBEcml2ZXIgZW5hYmxlIHNpZ25hbCBpcyBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBVQVJUX0RFX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICBVU0FSVF9DUjNfREVQICAgICAgICAgICAvKiE8IERyaXZlciBlbmFibGUgc2lnbmFsIGlzIGFjdGl2ZSBsb3cgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfQ1IxX0RFQVRfQUREUkVTU19MU0JfUE9TICAgIFVBUlQgRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSBMU0IgUG9zaXRpb24gSW4gQ1IxIFJlZ2lzdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9DUjFfREVBVF9BRERSRVNTX0xTQl9QT1MgICAgICAgMjFVICAgICAgLyohPCBVQVJUIERyaXZlciBFbmFibGUgYXNzZXJ0aW9uIHRpbWUgTFNCIHBvc2l0aW9uIGluIENSMSByZWdpc3RlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0NSMV9ERURUX0FERFJFU1NfTFNCX1BPUyAgICBVQVJUIERyaXZlciBFbmFibGUgRGVBc3NlcnRpb24gVGltZSBMU0IgUG9zaXRpb24gSW4gQ1IxIFJlZ2lzdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9DUjFfREVEVF9BRERSRVNTX0xTQl9QT1MgICAgICAgMTZVICAgICAgLyohPCBVQVJUIERyaXZlciBFbmFibGUgZGUtYXNzZXJ0aW9uIHRpbWUgTFNCIHBvc2l0aW9uIGluIENSMSByZWdpc3RlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0ludGVycnVwdGlvbl9NYXNrICAgIFVBUlQgSW50ZXJydXB0aW9ucyBGbGFnIE1hc2sKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0lUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMUZVICAvKiE8IFVBUlQgaW50ZXJydXB0aW9ucyBmbGFncyBtYXNrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfVGltZU91dF9WYWx1ZSAgICBVQVJUIHBvbGxpbmctYmFzZWQgY29tbXVuaWNhdGlvbnMgdGltZS1vdXQgdmFsdWUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFICAgICAgICAgICAgICAweDFGRkZGRkZVICAvKiE8IFVBUlQgcG9sbGluZy1iYXNlZCBjb21tdW5pY2F0aW9ucyB0aW1lLW91dCB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0ZsYWdzICAgICBVQVJUIFN0YXR1cyBGbGFncworICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYCisgICogICAgICAgICAgIC0gMHhYWFhYICA6IEZsYWcgbWFzayBpbiB0aGUgSVNSIHJlZ2lzdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JFQUNLICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JFQUNLICAgICAgICAgLyohPCBVQVJUIHJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVEVBQ0sgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEVBQ0sgICAgICAgICAvKiE8IFVBUlQgdHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19XVUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9XVUYgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIGZsYWcgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JXVSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JXVSAgICAgICAgICAgLyohPCBVQVJUIHJlY2VpdmVyIHdha2UtdXAgZnJvbSBtdXRlIG1vZGUgZmxhZyAqLworI2RlZmluZSBVQVJUX0ZMQUdfU0JLRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfU0JLRiAgICAgICAgICAvKiE8IFVBUlQgc2VuZCBicmVhayBmbGFnICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19DTUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DTUYgICAgICAgICAgIC8qITwgVUFSVCBjaGFyYWN0ZXIgbWF0Y2ggZmxhZyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0JVU1kgICAgICAgICAgLyohPCBVQVJUIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQUJSRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQUJSRiAgICAgICAgICAvKiE8IFVBUlQgYXV0byBCYXVkIHJhdGUgZmxhZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19BQlJFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9BQlJFICAgICAgICAgIC8qITwgVUFSVCBhdXRvIEJhdWQgcmF0ZSBlcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0NUUyAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NUUyAgICAgICAgICAgLyohPCBVQVJUIGNsZWFyIHRvIHNlbmQgZmxhZyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQ1RTSUYgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQ1RTSUYgICAgICAgICAvKiE8IFVBUlQgY2xlYXIgdG8gc2VuZCBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19MQkRGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9MQkRGICAgICAgICAgIC8qITwgVUFSVCBMSU4gYnJlYWsgZGV0ZWN0aW9uIGZsYWcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRSAgICAgICAgICAgLyohPCBVQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEMgICAgICAgICAgICAvKiE8IFVBUlQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FICAgICAgICAgIC8qITwgVUFSVCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0lETEUgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0lETEUgICAgICAgICAgLyohPCBVQVJUIGlkbGUgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfT1JFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfT1JFICAgICAgICAgICAvKiE8IFVBUlQgb3ZlcnJ1biBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19ORSAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9ORSAgICAgICAgICAgIC8qITwgVUFSVCBub2lzZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0ZFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0ZFICAgICAgICAgICAgLyohPCBVQVJUIGZyYW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUEUgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUEUgICAgICAgICAgICAvKiE8IFVBUlQgcGFyaXR5IGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfSW50ZXJydXB0X2RlZmluaXRpb24gICBVQVJUIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwWlpaWlowWFhZWVlZWWIKKyAgKiAgICAgICAgICAgLSBZWVlZWSAgOiBJbnRlcnJ1cHQgc291cmNlIHBvc2l0aW9uIGluIHRoZSBYWCByZWdpc3RlciAoNWJpdHMpCisgICogICAgICAgICAgIC0gWFggIDogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAoMmJpdHMpCisgICogICAgICAgICAgICAgICAgIC0gMDE6IENSMSByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDEwOiBDUjIgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMTogQ1IzIHJlZ2lzdGVyCisgICogICAgICAgICAgIC0gWlpaWlogIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgSVNSIHJlZ2lzdGVyKDViaXRzKQorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwMDAwMDAwWFhZWVlZWWIKKyAgKiAgICAgICAgICAgLSBZWVlZWSAgOiBJbnRlcnJ1cHQgc291cmNlIHBvc2l0aW9uIGluIHRoZSBYWCByZWdpc3RlciAoNWJpdHMpCisgICogICAgICAgICAgIC0gWFggIDogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAoMmJpdHMpCisgICogICAgICAgICAgICAgICAgIC0gMDE6IENSMSByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDEwOiBDUjIgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMTogQ1IzIHJlZ2lzdGVyCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwWlpaWjAwMDAwMDAwYgorICAqICAgICAgICAgICAtIFpaWlogIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgSVNSIHJlZ2lzdGVyKDRiaXRzKQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfSVRfUEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyOFUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgcGFyaXR5IGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzI3VSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCB0cmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBVQVJUX0lUX1RDICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjZVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHRpb24gICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUyNVUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgcmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgVUFSVF9JVF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI0VSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBpZGxlIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX0xCRCAgICAgICAgICAgICAgICAgICAgICAgICAweDA4NDZVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIExJTiBicmVhayBkZXRlY3Rpb24gaW50ZXJydXB0aW9uICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfQ1RTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDk2QVUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgQ1RTIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9DTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTJFVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBjaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0aW9uICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1dVRiAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NzZVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0aW9uICAgICAgICovCisKKyNkZWZpbmUgVUFSVF9JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAqLworCisjZGVmaW5lIFVBUlRfSVRfT1JFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMFUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgVUFSVF9JVF9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBub2lzZSBlcnJvciBpbnRlcnJ1cHRpb24gICAqLworI2RlZmluZSBVQVJUX0lUX0ZFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDBVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGZyYW1lIGVycm9yIGludGVycnVwdGlvbiAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfSVRfQ0xFQVJfRmxhZ3MgIFVBUlQgSW50ZXJydXB0aW9uIENsZWFyIEZsYWdzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9QRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgLyohPCBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9GRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgLyohPCBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9ORUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgLyohPCBOb2lzZSBFcnJvciBkZXRlY3RlZCBDbGVhciBGbGFnICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9PUkVGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgLyohPCBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9JRExFRiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgLyohPCBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9UQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0NGICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZyAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9MQkRGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9MQkRDRiAgICAgICAgICAgLyohPCBMSU4gQnJlYWsgRGV0ZWN0aW9uIENsZWFyIEZsYWcgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9DVFNGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9DVFNDRiAgICAgICAgICAgLyohPCBDVFMgSW50ZXJydXB0IENsZWFyIEZsYWcgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9DTUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9DTUNGICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgTWF0Y2ggQ2xlYXIgRmxhZyAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9XVUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9XVUNGICAgICAgICAgICAgLyohPCBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIENsZWFyIEZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9NYWNyb3MgVUFSVCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBVQVJUIGhhbmRsZSBzdGF0ZXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX1VBUlRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZWxzZQorI2RlZmluZSBfX0hBTF9VQVJUX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFU0VUOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2VuZGlmIC8qVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKiogQGJyaWVmICBGbHVzaCB0aGUgVUFSVCBEYXRhIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9GTFVTSF9EUlJFR0lTVEVSKF9fSEFORExFX18pICBcCisgIGRveyAgICAgICAgICAgICAgICBcCisgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgIH0gIHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIFVBUlQgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9QRUYgICAgICBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfRkVGICAgICAgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9ORUYgICAgICBOb2lzZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9PUkVGICAgICBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0lETEVGICAgIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UQ0YgICAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfTEJERiAgICAgTElOIEJyZWFrIERldGVjdGlvbiBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DVFNGICAgICBDVFMgSW50ZXJydXB0IENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0NNRiAgICAgIENoYXJhY3RlciBNYXRjaCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9XVUYgICAgICBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIENsZWFyIEZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVBUlQgUEUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX1BFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfUEVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBGRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfRkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9GRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIE5FIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9ORUZMQUcoX19IQU5ETEVfXykgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfTkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBPUkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX09SRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX09SRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIElETEUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX0lETEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9JRExFRikKKworCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVUFSVCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVEVBQ0sgVHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfV1VGICAgV2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JXVSAgIFJlY2VpdmVyIHdha2UgdXAgZmxhZyAoaWYgdGhlIFVBUlQgaW4gbXV0ZSBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19TQktGICBTZW5kIEJyZWFrIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQ01GICAgQ2hhcmFjdGVyIG1hdGNoIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQlVTWSAgQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0FCUkYgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0FCUkUgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0NUUyAgIENUUyBDaGFuZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19MQkRGICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RDICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JYTkUgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19JRExFICBJZGxlIExpbmUgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfT1JFICAgT3ZlcnJ1biBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX05FICAgIE5vaXNlIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfRkUgICAgRnJhbWluZyBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1BFICAgIFBhcml0eSBFcnJvciBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVQVJUIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWE5FICBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdCAoZnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAxVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIHw9ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVUFSVF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgfD0gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSkpCisKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWE5FICBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdCAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAxVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gfiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJj0gfiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9IH4gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSkpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWE5FICBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdCAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKT4+IDhVKSkpICE9IFJFU0VUKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfV1VGICAgV2FrZXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ00gICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0xCRCAgIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9QRSAgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9FUlIgICBFcnJvciBpbnRlcnJ1cHQgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKCgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAxVSkgPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMlUpID8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzKSkgJiAoMVUgPDwgKCgodWludDE2X3QpKF9fSU5URVJSVVBUX18pKSAmIFVBUlRfSVRfTUFTSykpKSAgIT0gUkVTRVQpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVUFSVCBJU1IgZmxhZywgaW4gc2V0dGluZyB0aGUgcHJvcGVyIElDUiByZWdpc3RlciBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JVF9DTEVBUl9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyIGZsYWcgdGhhdCBuZWVkcyB0byBiZSBzZXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgdG8gY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1BFRiAgICBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfRkVGICAgIEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfTkVGICAgIE5vaXNlIGRldGVjdGVkIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX09SRUYgICBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0lETEVGICBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfVENGICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9MQkRGICAgTElOIEJyZWFrIERldGVjdGlvbiBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DVFNGICAgQ1RTIEludGVycnVwdCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9DTUYgICAgQ2hhcmFjdGVyIE1hdGNoIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1dVRiAgICBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIENsZWFyIEZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lUX0NMRUFSX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAodWludDMyX3QpKF9fSVRfQ0xFQVJfXykpCisKKy8qKiBAYnJpZWYgIFNldCBhIHNwZWNpZmljIFVBUlQgcmVxdWVzdCBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19SRVFfXyBzcGVjaWZpZXMgdGhlIHJlcXVlc3QgZmxhZyB0byBzZXQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQVVUT0JBVURfUkVRVUVTVCBBdXRvLUJhdWQgUmF0ZSBSZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCBTZW5kIEJyZWFrIFJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX01VVEVfTU9ERV9SRVFVRVNUIE11dGUgTW9kZSBSZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfU0VORF9SRVEoX19IQU5ETEVfXywgX19SRVFfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiB8PSAodWludDE2X3QpKF9fUkVRX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzfD0gVVNBUlRfQ1IzX09ORUJJVCkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgVUFSVCBvbmUgYml0IHNhbXBsZSBtZXRob2QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9IH5VU0FSVF9DUjNfT05FQklUKQorCisvKiogQGJyaWVmICBFbmFibGUgVUFSVC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSBVU0FSVF9DUjFfVUUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgVUFSVC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+VVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBFbmFibGUgQ1RTIGZsb3cgY29udHJvbC4KKyAgKiBAbm90ZSAgIFRoaXMgbWFjcm8gYWxsb3dzIHRvIGVuYWJsZSBDVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sIGZvciBhIGdpdmVuIFVBUlQgaW5zdGFuY2UsCisgICogICAgICAgICB3aXRob3V0IG5lZWQgdG8gY2FsbCBIQUxfVUFSVF9Jbml0KCkgZnVuY3Rpb24uCisgICogICAgICAgICBBcyBpbnZvbHZpbmcgZGlyZWN0IGFjY2VzcyB0byBVQVJUIHJlZ2lzdGVycywgdXNhZ2Ugb2YgdGhpcyBtYWNybyBzaG91bGQgYmUgZnVsbHkgZW5kb3JzZWQgYnkgdXNlci4KKyAgKiBAbm90ZSAgIEFzIG1hY3JvIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIG1vZGlmeWluZyBDVFMgSHcgZmxvdyBjb250cm9sIGZlYXR1cmUgYWN0aXZhdGlvbiwgd2l0aG91dCBuZWVkCisgICogICAgICAgICBmb3IgVVNBUlQgaW5zdGFuY2UgRGVpbml0L0luaXQsIGZvbGxvd2luZyBjb25kaXRpb25zIGZvciBtYWNybyBjYWxsIHNob3VsZCBiZSBmdWxmaWxsZWQgOgorICAqICAgICAgICAgICAtIFVBUlQgaW5zdGFuY2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkICh0aHJvdWdoIGNhbGwgb2YgSEFMX1VBUlRfSW5pdCgpICkKKyAgKiAgICAgICAgICAgLSBtYWNybyBjb3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNvcnJlc3BvbmRpbmcgVUFSVCBpbnN0YW5jZSBpcyBkaXNhYmxlZCAoaS5lLiBfX0hBTF9VQVJUX0RJU0FCTEUoX19IQU5ETEVfXykpCisgICogICAgICAgICAgICAgYW5kIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbiBFbmFibGUgbWFjcm8gKGkuZS4gX19IQUxfVUFSVF9FTkFCTEUoX19IQU5ETEVfXykpLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0hXQ09OVFJPTF9DVFNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOyAgXAorICAgIChfX0hBTkRMRV9fKS0+SW5pdC5Id0Zsb3dDdGwgfD0gVVNBUlRfQ1IzX0NUU0U7ICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgQ1RTIGZsb3cgY29udHJvbC4KKyAgKiBAbm90ZSAgIFRoaXMgbWFjcm8gYWxsb3dzIHRvIGRpc2FibGUgQ1RTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbiBVQVJUIGluc3RhbmNlLAorICAqICAgICAgICAgd2l0aG91dCBuZWVkIHRvIGNhbGwgSEFMX1VBUlRfSW5pdCgpIGZ1bmN0aW9uLgorICAqICAgICAgICAgQXMgaW52b2x2aW5nIGRpcmVjdCBhY2Nlc3MgdG8gVUFSVCByZWdpc3RlcnMsIHVzYWdlIG9mIHRoaXMgbWFjcm8gc2hvdWxkIGJlIGZ1bGx5IGVuZG9yc2VkIGJ5IHVzZXIuCisgICogQG5vdGUgICBBcyBtYWNybyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBtb2RpZnlpbmcgQ1RTIEh3IGZsb3cgY29udHJvbCBmZWF0dXJlIGFjdGl2YXRpb24sIHdpdGhvdXQgbmVlZAorICAqICAgICAgICAgZm9yIFVTQVJUIGluc3RhbmNlIERlaW5pdC9Jbml0LCBmb2xsb3dpbmcgY29uZGl0aW9ucyBmb3IgbWFjcm8gY2FsbCBzaG91bGQgYmUgZnVsZmlsbGVkIDoKKyAgKiAgICAgICAgICAgLSBVQVJUIGluc3RhbmNlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCAodGhyb3VnaCBjYWxsIG9mIEhBTF9VQVJUX0luaXQoKSApCisgICogICAgICAgICAgIC0gbWFjcm8gY291bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb3JyZXNwb25kaW5nIFVBUlQgaW5zdGFuY2UgaXMgZGlzYWJsZWQgKGkuZS4gX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pKQorICAqICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gRW5hYmxlIG1hY3JvIChpLmUuIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pKS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9IV0NPTlRST0xfQ1RTX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7IFwKKyAgICAoX19IQU5ETEVfXyktPkluaXQuSHdGbG93Q3RsICY9IH4oVVNBUlRfQ1IzX0NUU0UpOyAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgRW5hYmxlIFJUUyBmbG93IGNvbnRyb2wuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBlbmFibGUgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbiBVQVJUIGluc3RhbmNlLAorICAqICAgICAgICAgd2l0aG91dCBuZWVkIHRvIGNhbGwgSEFMX1VBUlRfSW5pdCgpIGZ1bmN0aW9uLgorICAqICAgICAgICAgQXMgaW52b2x2aW5nIGRpcmVjdCBhY2Nlc3MgdG8gVUFSVCByZWdpc3RlcnMsIHVzYWdlIG9mIHRoaXMgbWFjcm8gc2hvdWxkIGJlIGZ1bGx5IGVuZG9yc2VkIGJ5IHVzZXIuCisgICogQG5vdGUgICBBcyBtYWNybyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBtb2RpZnlpbmcgUlRTIEh3IGZsb3cgY29udHJvbCBmZWF0dXJlIGFjdGl2YXRpb24sIHdpdGhvdXQgbmVlZAorICAqICAgICAgICAgZm9yIFVTQVJUIGluc3RhbmNlIERlaW5pdC9Jbml0LCBmb2xsb3dpbmcgY29uZGl0aW9ucyBmb3IgbWFjcm8gY2FsbCBzaG91bGQgYmUgZnVsZmlsbGVkIDoKKyAgKiAgICAgICAgICAgLSBVQVJUIGluc3RhbmNlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCAodGhyb3VnaCBjYWxsIG9mIEhBTF9VQVJUX0luaXQoKSApCisgICogICAgICAgICAgIC0gbWFjcm8gY291bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb3JyZXNwb25kaW5nIFVBUlQgaW5zdGFuY2UgaXMgZGlzYWJsZWQgKGkuZS4gX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pKQorICAqICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gRW5hYmxlIG1hY3JvIChpLmUuIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pKS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9IV0NPTlRST0xfUlRTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7IFwKKyAgICAoX19IQU5ETEVfXyktPkluaXQuSHdGbG93Q3RsIHw9IFVTQVJUX0NSM19SVFNFOyAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgUlRTIGZsb3cgY29udHJvbC4KKyAgKiBAbm90ZSAgIFRoaXMgbWFjcm8gYWxsb3dzIHRvIGRpc2FibGUgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbiBVQVJUIGluc3RhbmNlLAorICAqICAgICAgICAgd2l0aG91dCBuZWVkIHRvIGNhbGwgSEFMX1VBUlRfSW5pdCgpIGZ1bmN0aW9uLgorICAqICAgICAgICAgQXMgaW52b2x2aW5nIGRpcmVjdCBhY2Nlc3MgdG8gVUFSVCByZWdpc3RlcnMsIHVzYWdlIG9mIHRoaXMgbWFjcm8gc2hvdWxkIGJlIGZ1bGx5IGVuZG9yc2VkIGJ5IHVzZXIuCisgICogQG5vdGUgICBBcyBtYWNybyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBtb2RpZnlpbmcgUlRTIEh3IGZsb3cgY29udHJvbCBmZWF0dXJlIGFjdGl2YXRpb24sIHdpdGhvdXQgbmVlZAorICAqICAgICAgICAgZm9yIFVTQVJUIGluc3RhbmNlIERlaW5pdC9Jbml0LCBmb2xsb3dpbmcgY29uZGl0aW9ucyBmb3IgbWFjcm8gY2FsbCBzaG91bGQgYmUgZnVsZmlsbGVkIDoKKyAgKiAgICAgICAgICAgLSBVQVJUIGluc3RhbmNlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCAodGhyb3VnaCBjYWxsIG9mIEhBTF9VQVJUX0luaXQoKSApCisgICogICAgICAgICAgIC0gbWFjcm8gY291bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb3JyZXNwb25kaW5nIFVBUlQgaW5zdGFuY2UgaXMgZGlzYWJsZWQgKGkuZS4gX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pKQorICAqICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gRW5hYmxlIG1hY3JvIChpLmUuIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pKS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9IV0NPTlRST0xfUlRTX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JUU0UpO1wKKyAgICAoX19IQU5ETEVfXyktPkluaXQuSHdGbG93Q3RsICY9IH4oVVNBUlRfQ1IzX1JUU0UpOyAgICAgXAorICB9IHdoaWxlKDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJUX1ByaXZhdGVfTWFjcm9zICAgVUFSVCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIEJSUiBkaXZpc2lvbiBvcGVyYXRpb24gdG8gc2V0IEJSUiByZWdpc3RlciB3aXRoIExQVUFSVC4KKyAgKiBAcGFyYW0gIF9fUENMS19fIExQVUFSVCBjbG9jay4KKyAgKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHJldHZhbCBEaXZpc2lvbiByZXN1bHQKKyAgKi8KKyNkZWZpbmUgVUFSVF9ESVZfTFBVQVJUKF9fUENMS19fLCBfX0JBVURfXykgICAgICAoKCgoKHVpbnQ2NF90KShfX1BDTEtfXykqMjU2VSkpICsgKChfX0JBVURfXykvMlUpKSAvIChfX0JBVURfXykpCisKKy8qKiBAYnJpZWYgIEJSUiBkaXZpc2lvbiBvcGVyYXRpb24gdG8gc2V0IEJSUiByZWdpc3RlciBpbiA4LWJpdCBvdmVyc2FtcGxpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIF9fUENMS19fIFVBUlQgY2xvY2suCisgICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEByZXR2YWwgRGl2aXNpb24gcmVzdWx0CisgICovCisjZGVmaW5lIFVBUlRfRElWX1NBTVBMSU5HOChfX1BDTEtfXywgX19CQVVEX18pICAgKCgoKF9fUENMS19fKSoyVSkgKyAoKF9fQkFVRF9fKS8yVSkpIC8gKF9fQkFVRF9fKSkKKworLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIGluIDE2LWJpdCBvdmVyc2FtcGxpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIF9fUENMS19fIFVBUlQgY2xvY2suCisgICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEByZXR2YWwgRGl2aXNpb24gcmVzdWx0CisgICovCisjZGVmaW5lIFVBUlRfRElWX1NBTVBMSU5HMTYoX19QQ0xLX18sIF9fQkFVRF9fKSAgKCgoX19QQ0xLX18pICsgKChfX0JBVURfXykvMlUpKSAvIChfX0JBVURfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgb3Igbm90IFVBUlQgaW5zdGFuY2UgaXMgTG93IFBvd2VyIFVBUlQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBTRVQgKGluc3RhbmNlIGlzIExQVUFSVCkgb3IgUkVTRVQgKGluc3RhbmNlIGlzbid0IExQVUFSVCkKKyAgKi8KKyNkZWZpbmUgVUFSVF9JTlNUQU5DRV9MT1dQT1dFUihfX0hBTkRMRV9fKSAoSVNfTFBVQVJUX0lOU1RBTkNFKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpKQorCisvKiogQGJyaWVmICBDaGVjayBVQVJUIEJhdWQgcmF0ZS4KKyAgKiBAcGFyYW0gIF9fQkFVRFJBVEVfXyBCYXVkcmF0ZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgICogICAgICAgICBUaGUgbWF4aW11bSBCYXVkIFJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIGNsb2NrIG9uIEwwIChpLmUuIDMyIE1IeikKKyAgKiAgICAgICAgIGRpdmlkZWQgYnkgdGhlIHNtYWxsZXN0IG92ZXJzYW1wbGluZyB1c2VkIG9uIHRoZSBVU0FSVCAoaS5lLiA4KQorICAqIEByZXR2YWwgU0VUIChfX0JBVURSQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0JBVURSQVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9CQVVEUkFURShfX0JBVURSQVRFX18pICgoX19CQVVEUkFURV9fKSA8IDQwMDAwMDFVKQorCisvKiogQGJyaWVmICBDaGVjayBVQVJUIGFzc2VydGlvbiB0aW1lLgorICAqIEBwYXJhbSAgX19USU1FX18gNS1iaXQgdmFsdWUgYXNzZXJ0aW9uIHRpbWUuCisgICogQHJldHZhbCBUZXN0IHJlc3VsdCAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIElTX1VBUlRfQVNTRVJUSU9OVElNRShfX1RJTUVfXykgICAgKChfX1RJTUVfXykgPD0gMHgxRlUpCisKKy8qKiBAYnJpZWYgIENoZWNrIFVBUlQgZGVhc3NlcnRpb24gdGltZS4KKyAgKiBAcGFyYW0gIF9fVElNRV9fIDUtYml0IHZhbHVlIGRlYXNzZXJ0aW9uIHRpbWUuCisgICogQHJldHZhbCBUZXN0IHJlc3VsdCAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIElTX1VBUlRfREVBU1NFUlRJT05USU1FKF9fVElNRV9fKSAoKF9fVElNRV9fKSA8PSAweDFGVSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVE9QQklUU19fIFVBUlQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cy4KKyAgKiBAcmV0dmFsIFNFVCAoX19TVE9QQklUU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QQklUU19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfU1RPUEJJVFMoX19TVE9QQklUU19fKSAoKChfX1NUT1BCSVRTX18pID09IFVBUlRfU1RPUEJJVFNfMF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BCSVRTX18pID09IFVBUlRfU1RPUEJJVFNfMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BCSVRTX18pID09IFVBUlRfU1RPUEJJVFNfMV81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BCSVRTX18pID09IFVBUlRfU1RPUEJJVFNfMikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBMUFVBUlQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVE9QQklUU19fIExQVUFSVCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzLgorICAqIEByZXR2YWwgU0VUIChfX1NUT1BCSVRTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUT1BCSVRTX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfTFBVQVJUX1NUT1BCSVRTKF9fU1RPUEJJVFNfXykgKCgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBwYXJpdHkgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUEFSSVRZX18gVUFSVCBmcmFtZSBwYXJpdHkuCisgICogQHJldHZhbCBTRVQgKF9fUEFSSVRZX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUklUWV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfUEFSSVRZKF9fUEFSSVRZX18pICgoKF9fUEFSSVRZX18pID09IFVBUlRfUEFSSVRZX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gVUFSVF9QQVJJVFlfRVZFTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBVQVJUX1BBUklUWV9PREQpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQ09OVFJPTF9fIFVBUlQgaGFyZHdhcmUgZmxvdyBjb250cm9sLgorICAqIEByZXR2YWwgU0VUIChfX0NPTlRST0xfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ09OVFJPTF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfSEFSRFdBUkVfRkxPV19DT05UUk9MKF9fQ09OVFJPTF9fKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05UUk9MX18pID09IFVBUlRfSFdDT05UUk9MX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05UUk9MX18pID09IFVBUlRfSFdDT05UUk9MX1JUUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05UUk9MX18pID09IFVBUlRfSFdDT05UUk9MX0NUUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05UUk9MX18pID09IFVBUlRfSFdDT05UUk9MX1JUU19DVFMpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBjb21tdW5pY2F0aW9uIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIFVBUlQgY29tbXVuaWNhdGlvbiBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfTU9ERShfX01PREVfXykgKCgoKF9fTU9ERV9fKSAmICh+KCh1aW50MzJfdCkoVUFSVF9NT0RFX1RYX1JYKSkpKSA9PSAweDAwVSkgJiYgKChfX01PREVfXykgIT0gMHgwMFUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVEFURV9fIFVBUlQgc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fU1RBVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RBVEVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1NUQVRFKF9fU1RBVEVfXykgKCgoX19TVEFURV9fKSA9PSBVQVJUX1NUQVRFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVUFSVF9TVEFURV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBvdmVyc2FtcGxpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU0FNUExJTkdfXyBVQVJUIG92ZXJzYW1wbGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19TQU1QTElOR19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TQU1QTElOR19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfT1ZFUlNBTVBMSU5HKF9fU0FNUExJTkdfXykgKCgoX19TQU1QTElOR19fKSA9PSBVQVJUX09WRVJTQU1QTElOR18xNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0FNUExJTkdfXykgPT0gVUFSVF9PVkVSU0FNUExJTkdfOCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIHNhbXBsaW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX09ORUJJVF9fIFVBUlQgZnJhbWUgc2FtcGxpbmcuCisgICogQHJldHZhbCBTRVQgKF9fT05FQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09ORUJJVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfT05FX0JJVF9TQU1QTEUoX19PTkVCSVRfXykgKCgoX19PTkVCSVRfXykgPT0gVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PTkVCSVRfXykgPT0gVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gbW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19NT0RFX18gVUFSVCBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFTU9ERShfX01PREVfXykgICgoKF9fTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09OU1RBUlRCSVQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTkZBTExJTkdFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDdGRlJBTUUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09OMFg1NUZSQU1FKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgcmVjZWl2ZXIgdGltZW91dCBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RJTUVPVVRfXyBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19USU1FT1VUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RJTUVPVVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1JFQ0VJVkVSX1RJTUVPVVQoX19USU1FT1VUX18pICgoKF9fVElNRU9VVF9fKSA9PSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVElNRU9VVF9fKSA9PSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgTElOIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xJTl9fIFVBUlQgTElOIHN0YXRlLgorICAqIEByZXR2YWwgU0VUIChfX0xJTl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MSU5fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0xJTihfX0xJTl9fKSAgICAgICAgKCgoX19MSU5fXykgPT0gVUFSVF9MSU5fRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MSU5fXykgPT0gVUFSVF9MSU5fRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBsZW5ndGggaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTEVOR1RIX18gVUFSVCBMSU4gYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aC4KKyAgKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9MSU5fQlJFQUtfREVURUNUX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzEwQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTFCKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgRE1BIFRYIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQVRYX18gVUFSVCBETUEgVFggc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fRE1BVFhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BVFhfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0RNQV9UWChfX0RNQVRYX18pICAgICAoKChfX0RNQVRYX18pID09IFVBUlRfRE1BX1RYX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ETUFUWF9fKSA9PSBVQVJUX0RNQV9UWF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBETUEgUlggc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fRE1BUlhfXyBVQVJUIERNQSBSWCBzdGF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19ETUFSWF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19ETUFSWF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfRE1BX1JYKF9fRE1BUlhfXykgICAgICgoKF9fRE1BUlhfXykgPT0gVUFSVF9ETUFfUlhfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RNQVJYX18pID09IFVBUlRfRE1BX1JYX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGhhbGYtZHVwbGV4IHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0hEU0VMX18gVUFSVCBoYWxmLWR1cGxleCBzdGF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19IRFNFTF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19IRFNFTF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfSEFMRl9EVVBMRVgoX19IRFNFTF9fKSAgICAgKCgoX19IRFNFTF9fKSA9PSBVQVJUX0hBTEZfRFVQTEVYX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hEU0VMX18pID09IFVBUlRfSEFMRl9EVVBMRVhfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgd2FrZS11cCBtZXRob2QgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fV0FLRVVQX18gVUFSVCB3YWtlLXVwIG1ldGhvZCAuCisgICogQHJldHZhbCBTRVQgKF9fV0FLRVVQX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1dBS0VVUF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfV0FLRVVQTUVUSE9EKF9fV0FLRVVQX18pICgoKF9fV0FLRVVQX18pID09IFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fV0FLRVVQX18pID09IFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUEFSQU1fXyBVQVJUIHJlcXVlc3QgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgU0VUIChfX1BBUkFNX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUkFNX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9SRVFVRVNUX1BBUkFNRVRFUihfX1BBUkFNX18pICgoKF9fUEFSQU1fXykgPT0gVUFSVF9BVVRPQkFVRF9SRVFVRVNUKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBVQVJUX1NFTkRCUkVBS19SRVFVRVNUKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUkFNX18pID09IFVBUlRfTVVURV9NT0RFX1JFUVVFU1QpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24gaXMgdmFsaWQuCisgICogQHBhcmFtIF9fSU5JVF9fIFVBUlQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24uCisgICogQHJldHZhbCBTRVQgKF9fSU5JVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19JTklUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0lOSVQoX19JTklUX18pICAgKChfX0lOSVRfXykgPD0gKFVBUlRfQURWRkVBVFVSRV9OT19JTklUICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1RYSU5WRVJUX0lOSVQgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfUlhJTlZFUlRfSU5JVCAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1NXQVBfSU5JVCAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfUlhPVkVSUlVORElTQUJMRV9JTklUICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9JTklUICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIFRYIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RYSU5WX18gVUFSVCBmcmFtZSBUWCBpbnZlcnNpb24gc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19UWElOVl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19UWElOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9UWElOVihfX1RYSU5WX18pICgoKF9fVFhJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1RYSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UWElOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgUlggaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUlhJTlZfXyBVQVJUIGZyYW1lIFJYIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX1JYSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1JYSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1JYSU5WKF9fUlhJTlZfXykgKCgoX19SWElOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9SWElOVl9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBkYXRhIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RBVEFJTlZfXyBVQVJUIGZyYW1lIGRhdGEgaW52ZXJzaW9uIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fREFUQUlOVl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19EQVRBSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlYoX19EQVRBSU5WX18pICgoKF9fREFUQUlOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgUlgvVFggcGlucyBzd2FwIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1dBUF9fIFVBUlQgZnJhbWUgUlgvVFggcGlucyBzd2FwIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fU1dBUF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TV0FQX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1NXQVAoX19TV0FQX18pICgoKF9fU1dBUF9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NXQVBfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1NXQVBfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgb3ZlcnJ1biBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX09WRVJSVU5fXyBVQVJUIGZyYW1lIG92ZXJydW4gc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19PVkVSUlVOX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09WRVJSVU5fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX09WRVJSVU4oX19PVkVSUlVOX18pICAgICAoKChfX09WRVJSVU5fXykgPT0gVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fT1ZFUlJVTl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYXV0byBCYXVkIHJhdGUgc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQVVUT0JBVURSQVRFX18gVUFSVCBhdXRvIEJhdWQgcmF0ZSBzdGF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19BVVRPQkFVRFJBVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQVVUT0JBVURSQVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURShfX0FVVE9CQVVEUkFURV9fKSAgKCgoX19BVVRPQkFVRFJBVEVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQVVUT0JBVURSQVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgRE1BIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvbiBlcnJvciBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQV9fIFVBUlQgRE1BIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvbiBlcnJvciBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX0RNQV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19ETUFfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfRE1BT05SWEVSUk9SKF9fRE1BX18pICAoKChfX0RNQV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfRE1BX0VOQUJMRU9OUlhFUlJPUikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RNQV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfRE1BX0RJU0FCTEVPTlJYRVJST1IpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBNU0IgZmlyc3Qgc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19NU0JGSVJTVF9fIFVBUlQgZnJhbWUgTVNCIGZpcnN0IHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fTVNCRklSU1RfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTVNCRklSU1RfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfTVNCRklSU1QoX19NU0JGSVJTVF9fKSAoKChfX01TQkZJUlNUX18pID09IFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTVNCRklSU1RfXykgPT0gVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHN0b3AgbW9kZSBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVE9QTU9ERV9fIFVBUlQgc3RvcCBtb2RlIHN0YXRlLgorICAqIEByZXR2YWwgU0VUIChfX1NUT1BNT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUT1BNT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFKF9fU1RPUE1PREVfXykgKCgoX19TVE9QTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BNT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9TVE9QTU9ERV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBtdXRlIG1vZGUgc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTVVURV9fIFVBUlQgbXV0ZSBtb2RlIHN0YXRlLgorICAqIEByZXR2YWwgU0VUIChfX01VVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTVVURV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfTVVURV9NT0RFKF9fTVVURV9fKSAgICAgICAoKChfX01VVEVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX01VVEVNT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTVVURV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfTVVURU1PREVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgd2FrZS11cCBzZWxlY3Rpb24gaXMgdmFsaWQuCisgICogQHBhcmFtIF9fV0FLRV9fIFVBUlQgd2FrZS11cCBzZWxlY3Rpb24uCisgICogQHJldHZhbCBTRVQgKF9fV0FLRV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQUtFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9XQUtFVVBfU0VMRUNUSU9OKF9fV0FLRV9fKSAoKChfX1dBS0VfXykgPT0gVUFSVF9XQUtFVVBfT05fQUREUkVTUykgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dBS0VfXykgPT0gVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dBS0VfXykgPT0gVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBkcml2ZXIgZW5hYmxlIHBvbGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BPTEFSSVRZX18gVUFSVCBkcml2ZXIgZW5hYmxlIHBvbGFyaXR5LgorICAqIEByZXR2YWwgU0VUIChfX1BPTEFSSVRZX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BPTEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9ERV9QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICgoKF9fUE9MQVJJVFlfXykgPT0gVUFSVF9ERV9QT0xBUklUWV9ISUdIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFVBUlRfREVfUE9MQVJJVFlfTE9XKSkKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFVBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWxfdWFydF9leC5oIgorCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVUFSVCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQnJlYWtEZXRlY3RMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCBBZGRyZXNzLCB1aW50MzJfdCBXYWtlVXBNZXRob2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRGVJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9Nc3BJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9Nc3BEZUluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgSEFMX1VBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFVBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9VblJlZ2lzdGVyQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgSEFMX1VBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0X0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFQYXVzZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVJlc3VtZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVN0b3AoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKwordm9pZCBIQUxfVUFSVF9JUlFIYW5kbGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX1NlbmRCcmVhayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbmFibGVNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlVHJhbnNtaXR0ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3VpbnQzMl90ICAgICAgICAgICAgICBIQUxfVUFSVF9HZXRFcnJvcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVBUlRfUHJpdmF0ZV9GdW5jdGlvbnMgVUFSVCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfU2V0Q29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9DaGVja0lkbGVTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfSEFMX1VBUlRfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfdWFydF9leC5oIGIvSW5jL3N0bTMybDB4eF9oYWxfdWFydF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMmI4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2hhbF91YXJ0X2V4LmgKQEAgLTAsMCArMSw0NDYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3VhcnRfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVUFSVCBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0hBTF9VQVJUX0VYX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfSEFMX1VBUlRfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9UeXBlcyBVQVJURXggRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgd2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBwYXJhbWV0ZXJzCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBXYWtlVXBFdmVudDsgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoaWNoIGV2ZW50IHdpbGwgYWN0aXZhdGUgdGhlIFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnIChXVUYpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1dha2VVcF9mcm9tX1N0b3BfU2VsZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIFVBUlRfV0FLRVVQX09OX0FERFJFU1MsIHRoZSB0d28gb3RoZXIgZmllbGRzIGJlbG93IG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCB1cC4gKi8KKworICB1aW50MTZfdCBBZGRyZXNzTGVuZ3RoOyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgNCBvciA3LWJpdCBsb25nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJURXhfV2FrZVVwX0FkZHJlc3NfTGVuZ3RoLiAgKi8KKworICB1aW50OF90IEFkZHJlc3M7ICAgICAgICAgICAgIC8qITwgVUFSVC9VU0FSVCBub2RlIGFkZHJlc3MgKDctYml0IGxvbmcgbWF4KS4gKi8KK30gVUFSVF9XYWtlVXBUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfQ29uc3RhbnRzIFVBUlRFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9Xb3JkX0xlbmd0aCBVQVJURXggV29yZCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfN0IgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTEgICAvKiE8IDctYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAvKiE8IDgtYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOUIgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTAgICAvKiE8IDktYml0IGxvbmcgVUFSVCBmcmFtZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfV2FrZVVwX0FkZHJlc3NfTGVuZ3RoIFVBUlRFeCBXYWtlVXAgQWRkcmVzcyBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FERFJFU1NfREVURUNUXzRCICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgIC8qITwgNC1iaXQgbG9uZyB3YWtlLXVwIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVF9BRERSRVNTX0RFVEVDVF83QiAgICAgICAgICAgICAgVVNBUlRfQ1IyX0FERE03ICAvKiE8IDctYml0IGxvbmcgd2FrZS11cCBhZGRyZXNzICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JTNDg1RXhfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBQb2xhcml0eSwgdWludDMyX3QgQXNzZXJ0aW9uVGltZSwgdWludDMyX3QgRGVhc3NlcnRpb25UaW1lKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKwordm9pZCBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRGlzYWJsZVN0b3BNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVDbG9ja1N0b3BNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlQ2xvY2tTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3NvckV4X0FkZHJlc3NMZW5ndGhfU2V0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IEFkZHJlc3NMZW5ndGgpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJURXhfUHJpdmF0ZV9NYWNyb3MgVUFSVEV4IFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBVQVJUIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tTT1VSQ0VfXyBvdXRwdXQgdmFyaWFibGUuCisgICogQHJldHZhbCBVQVJUIGNsb2NraW5nIHNvdXJjZSwgd3JpdHRlbiBpbiBfX0NMT0NLU09VUkNFX18uCisgICovCisjaWYgZGVmaW5lZCAoU1RNMzJMMDMxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA0MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMTF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDIxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAxMHhCKSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4OCkgfHwgZGVmaW5lZCAoU1RNMzJMMDEweDYpIHx8IGRlZmluZWQgKFNUTTMyTDAxMHg0KQorI2RlZmluZSBVQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMikgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gTFBVQVJUMSkgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDApCisKKyNlbGlmIGRlZmluZWQgKFNUTTMyTDA1MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNTJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDUzeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2MXh4KSAgfHwgZGVmaW5lZCAoU1RNMzJMMDYyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2M3h4KQorCisjZGVmaW5lIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBMUFVBUlQxKSAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9MUFVBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMCkKKworI2Vsc2UKKworI2RlZmluZSBVQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsyOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQ0KSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDUpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IExQVUFSVDEpICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX0xQVUFSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwKQorI2VuZGlmIC8qIChTVE0zMkwwMzF4eCkgfHwgKFNUTTMyTDA0MXh4KSB8fCAoU1RNMzJMMDExeHgpIHx8IChTVE0zMkwwMjF4eCkgfHwgKFNUTTMyTDAxMHhCKSB8fCAoU1RNMzJMMDEweDgpIHx8IChTVE0zMkwwMTB4NikgfHwgKFNUTTMyTDAxMHg0KSovCisKKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBVQVJUIG1hc2sgdG8gYXBwbHkgdG8gcmV0cmlldmUgdGhlIHJlY2VpdmVkIGRhdGEKKyAgKiAgICAgICAgIGFjY29yZGluZyB0byB0aGUgd29yZCBsZW5ndGggYW5kIHRvIHRoZSBwYXJpdHkgYml0cyBhY3RpdmF0aW9uLgorICAqIEBub3RlICAgSWYgUENFID0gMSwgdGhlIHBhcml0eSBiaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBkYXRhIGV4dHJhY3RlZAorICAqICAgICAgICAgYnkgdGhlIHJlY2VwdGlvbiBBUEkoKS4KKyAgKiAgICAgICAgIFRoaXMgbWFza2luZyBvcGVyYXRpb24gaXMgbm90IGNhcnJpZWQgb3V0IGluIHRoZSBjYXNlIG9mCisgICogICAgICAgICBETUEgdHJhbnNmZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZSwgdGhlIG1hc2sgdG8gYXBwbHkgdG8gVUFSVCBSRFIgcmVnaXN0ZXIgaXMgc3RvcmVkIGluIChfX0hBTkRMRV9fKS0+TWFzayBmaWVsZC4KKyAgKi8KKyNkZWZpbmUgVUFSVF9NQVNLX0NPTVBVVEFUSU9OKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMUZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF84QikgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzdCKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwM0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDAwVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIGxlbmd0aCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MRU5HVEhfXyBVQVJUIGZyYW1lIGxlbmd0aC4KKyAgKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfN0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCB3YWtlLXVwIGFkZHJlc3MgbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0FERFJFU1NfXyBVQVJUIHdha2UtdXAgYWRkcmVzcyBsZW5ndGguCisgICogQHJldHZhbCBTRVQgKF9fQUREUkVTU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19BRERSRVNTX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRERSRVNTTEVOR1RIX0RFVEVDVChfX0FERFJFU1NfXykgKCgoX19BRERSRVNTX18pID09IFVBUlRfQUREUkVTU19ERVRFQ1RfNEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRERSRVNTX18pID09IFVBUlRfQUREUkVTU19ERVRFQ1RfN0IpKQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfVUFSVF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF91c2FydC5oIGIvSW5jL3N0bTMybDB4eF9oYWxfdXNhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTVkMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9oYWxfdXNhcnQuaApAQCAtMCwwICsxLDc3OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfdXNhcnQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVVNBUlQgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkwweHhfSEFMX1VTQVJUX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9VU0FSVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVNBUlQKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9UeXBlcyBVU0FSVCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBVU0FSVCBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBCYXVkUmF0ZTsgICAgICAgICAgICAgICAgICAvKiE8IFRoaXMgbWVtYmVyIGNvbmZpZ3VyZXMgdGhlIFVzYXJ0IGNvbW11bmljYXRpb24gYmF1ZCByYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXVkIHJhdGUgaXMgY29tcHV0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclsxNTo0XSA9ICgoMiAqIGZjbGtfcHJlcykgLyAoKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpWzE1OjRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyWzNdICAgID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclsyOjBdICA9ICAoKCgyICogZmNsa19wcmVzKSAvICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSlbMzowXSkgPj4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGZjbGtfcHJlcyBpcyB0aGUgVVNBUlQgaW5wdXQgY2xvY2sgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgIE92ZXJzYW1wbGluZyBieSA4IGlzIHN5c3RlbWF0aWNhbGx5IGFwcGxpZWQgdG8gYWNoaWV2ZSBoaWdoIGJhdWQgcmF0ZXMuICovCisKKyAgdWludDMyX3QgV29yZExlbmd0aDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgaW4gYSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJURXhfV29yZF9MZW5ndGguICovCisKKyAgdWludDMyX3QgU3RvcEJpdHM7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9TdG9wX0JpdHMuICovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9QYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBXaGVuIHBhcml0eSBpcyBlbmFibGVkLCB0aGUgY29tcHV0ZWQgcGFyaXR5IGlzIGluc2VydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIE1TQiBwb3NpdGlvbiBvZiB0aGUgdHJhbnNtaXR0ZWQgZGF0YSAoOXRoIGJpdCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA4IGRhdGEgYml0cykuICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9Nb2RlLiAqLworCisgIHVpbnQzMl90IENMS1BvbGFyaXR5OyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0Nsb2NrX1BvbGFyaXR5LiAqLworCisgIHVpbnQzMl90IENMS1BoYXNlOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfQ2xvY2tfUGhhc2UuICovCisKKyAgdWludDMyX3QgQ0xLTGFzdEJpdDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MYXN0X0JpdC4gKi8KKworfSBVU0FSVF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIEhBTCBVU0FSVCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVVNBUlRfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCBpbml0aWFsaXplZCAgICAgICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgICAgKi8KKyAgSEFMX1VTQVJUX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCAgICAgICAgICAgPSAweDEyVSwgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYICAgICAgICAgICA9IDB4MjJVLCAgICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8KKyAgSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlggICAgICAgID0gMHgzMlUsICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAqLworICBIQUxfVVNBUlRfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDRVICAgICAvKiE8IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gSEFMX1VTQVJUX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBVU0FSVCBjbG9jayBzb3VyY2VzIGRlZmluaXRpb25zCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzEgICAgICA9IDB4MDBVLCAgICAvKiE8IFBDTEsxIGNsb2NrIHNvdXJjZSAgICAgKi8KKyAgVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzIgICAgICA9IDB4MDFVLCAgICAvKiE8IFBDTEsyIGNsb2NrIHNvdXJjZSAgICAgKi8KKyAgVVNBUlRfQ0xPQ0tTT1VSQ0VfSFNJICAgICAgICA9IDB4MDJVLCAgICAvKiE8IEhTSSBjbG9jayBzb3VyY2UgICAgICAgKi8KKyAgVVNBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLICAgICA9IDB4MDRVLCAgICAvKiE8IFNZU0NMSyBjbG9jayBzb3VyY2UgICAgKi8KKyAgVVNBUlRfQ0xPQ0tTT1VSQ0VfTFNFICAgICAgICA9IDB4MDhVLCAgICAvKiE8IExTRSBjbG9jayBzb3VyY2UgICAgICAgKi8KKyAgVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEICA9IDB4MTBVICAgICAvKiE8IFVuZGVmaW5lZCBjbG9jayBzb3VyY2UgKi8KK30gVVNBUlRfQ2xvY2tTb3VyY2VUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgX19VU0FSVF9IYW5kbGVUeXBlRGVmCit7CisgIFVTQVJUX1R5cGVEZWYgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAgICAgICAvKiE8IFVTQVJUIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgICovCisKKyAgVVNBUlRfSW5pdFR5cGVEZWYgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIFVTQVJUIFR4IHRyYW5zZmVyIEJ1ZmZlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgICAgICAgICAgICAvKiE8IFVTQVJUIFR4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgVHhYZmVyQ291bnQ7ICAgICAgICAgICAgIC8qITwgVVNBUlQgVHggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAqcFJ4QnVmZlB0cjsgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIFVTQVJUIFJ4IHRyYW5zZmVyIEJ1ZmZlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgIFJ4WGZlclNpemU7ICAgICAgICAgICAgICAvKiE8IFVTQVJUIFJ4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgUnhYZmVyQ291bnQ7ICAgICAgICAgICAgIC8qITwgVVNBUlQgUnggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICBNYXNrOyAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBSeCBSRFIgcmVnaXN0ZXIgbWFzayAgICAgICAgICAqLworCisgIHZvaWQgKCpSeElTUikoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gUnggSVJRIGhhbmRsZXIgICovCisKKyAgdm9pZCAoKlR4SVNSKShzdHJ1Y3QgX19VU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOyAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBvbiBUeCBJUlEgaGFuZGxlciAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAqaGRtYXR4OyAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICpoZG1hcng7ICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIFJ4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICAgTG9jazsgICAgICAgICAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAgICAgICAvKiE8IFVTQVJUIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBUeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAvKiE8IFVTQVJUIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICovCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgICAgLyohPCBVU0FSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworICB2b2lkICgqIFJ4SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgIC8qITwgVVNBUlQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgKi8KKyAgdm9pZCAoKiBSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgICAgICAvKiE8IFVTQVJUIFJ4IENvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICAgICovCisgIHZvaWQgKCogVHhSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgICAgLyohPCBVU0FSVCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAqLworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgICAgIC8qITwgVVNBUlQgRXJyb3IgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBBYm9ydENwbHRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgICAvKiE8IFVTQVJUIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICovCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgICAvKiE8IFVTQVJUIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgLyohPCBVU0FSVCBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAqLworI2VuZGlmICAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCit9IFVTQVJUX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFVTQVJUIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVVNBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDAwVSwgICAgLyohPCBVU0FSVCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfVVNBUlRfVFhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBVU0FSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfUlhfSEFMRkNPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDAyVSwgICAgLyohPCBVU0FSVCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfVVNBUlRfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBVU0FSVCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfVFhfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBVU0FSVCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAqLworICBIQUxfVVNBUlRfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA1VSwgICAgLyohPCBVU0FSVCBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgPSAweDA2VSwgICAgLyohPCBVU0FSVCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAqLworCisgIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDlVLCAgICAvKiE8IFVTQVJUIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MEFVICAgICAvKiE8IFVTQVJUIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisKK30gSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBVU0FSVCBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwVVNBUlRfQ2FsbGJhY2tUeXBlRGVmKShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOyAgLyohPCBwb2ludGVyIHRvIGFuIFVTQVJUIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9Db25zdGFudHMgVVNBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9FcnJvcl9EZWZpbml0aW9uICAgVVNBUlQgRXJyb3IgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9OT05FICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfUEUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAgICAvKiE8IFBhcml0eSBlcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1VTQVJUX0VSUk9SX05FICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgICAgLyohPCBOb2lzZSBlcnJvciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9GRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpICAgIC8qITwgRnJhbWUgZXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfT1JFICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAgICAvKiE8IE92ZXJydW4gZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1VTQVJUX0VSUk9SX0RNQSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAgICovCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLICgodWludDMyX3QpMHgwMDAwMDA0MFUpICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgICAqLworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX1N0b3BfQml0cyAgVVNBUlQgTnVtYmVyIG9mIFN0b3AgQml0cworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1NUT1BCSVRTXzBfNSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBmcmFtZSB3aXRoIDAuNSBzdG9wIGJpdCAgKi8KKyNkZWZpbmUgVVNBUlRfU1RPUEJJVFNfMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIGZyYW1lIHdpdGggMSBzdG9wIGJpdCAgICAqLworI2RlZmluZSBVU0FSVF9TVE9QQklUU18xXzUgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IyX1NUT1BfMCB8IFVTQVJUX0NSMl9TVE9QXzEpIC8qITwgVVNBUlQgZnJhbWUgd2l0aCAxLjUgc3RvcCBiaXRzICovCisjZGVmaW5lIFVTQVJUX1NUT1BCSVRTXzIgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8xICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBmcmFtZSB3aXRoIDIgc3RvcCBiaXRzICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfUGFyaXR5ICAgIFVTQVJUIFBhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1BBUklUWV9OT05FICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gcGFyaXR5ICAgKi8KKyNkZWZpbmUgVVNBUlRfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BDRSAgICAgICAgICAgICAgICAgICAgLyohPCBFdmVuIHBhcml0eSAqLworI2RlZmluZSBVU0FSVF9QQVJJVFlfT0REICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAvKiE8IE9kZCBwYXJpdHkgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX01vZGUgICBVU0FSVCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfTU9ERV9SWCAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAvKiE8IFJYIG1vZGUgICAgICAgICovCisjZGVmaW5lIFVTQVJUX01PREVfVFggICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSAgICAgICAgICAgICAgICAgICAgLyohPCBUWCBtb2RlICAgICAgICAqLworI2RlZmluZSBVU0FSVF9NT0RFX1RYX1JYICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1RFIHxVU0FSVF9DUjFfUkUpICAgIC8qITwgUlggYW5kIFRYIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfT3Zlcl9TYW1wbGluZyBVU0FSVCBPdmVyIFNhbXBsaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfT1ZFUlNBTVBMSU5HXzE2ICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAvKiE8IE92ZXJzYW1wbGluZyBieSAxNiAqLworI2RlZmluZSBVU0FSVF9PVkVSU0FNUExJTkdfOCAgICAgICAgICAgICAgICBVU0FSVF9DUjFfT1ZFUjggICAgIC8qITwgT3ZlcnNhbXBsaW5nIGJ5IDggICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0Nsb2NrICBVU0FSVCBDbG9jaworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX0NMT0NLX0RJU0FCTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgIC8qITwgVVNBUlQgY2xvY2sgZGlzYWJsZSAqLworI2RlZmluZSBVU0FSVF9DTE9DS19FTkFCTEUgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ0xLRU4gICAvKiE8IFVTQVJUIGNsb2NrIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfQ2xvY2tfUG9sYXJpdHkgIFVTQVJUIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAvKiE8IERyaXZlciBlbmFibGUgc2lnbmFsIGlzIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIFVTQVJUX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DUE9MICAgLyohPCBEcml2ZXIgZW5hYmxlIHNpZ25hbCBpcyBhY3RpdmUgbG93ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9DbG9ja19QaGFzZSAgIFVTQVJUIENsb2NrIFBoYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfUEhBU0VfMUVER0UgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAvKiE8IFVTQVJUIGZyYW1lIHBoYXNlIG9uIGZpcnN0IGNsb2NrIHRyYW5zaXRpb24gICovCisjZGVmaW5lIFVTQVJUX1BIQVNFXzJFREdFICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DUEhBICAgLyohPCBVU0FSVCBmcmFtZSBwaGFzZSBvbiBzZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MYXN0X0JpdCAgVVNBUlQgTGFzdCBCaXQKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9MQVNUQklUX0RJU0FCTEUgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgIC8qITwgVVNBUlQgZnJhbWUgbGFzdCBkYXRhIGJpdCBjbG9jayBwdWxzZSBub3Qgb3V0cHV0IHRvIFNDTEsgcGluICovCisjZGVmaW5lIFVTQVJUX0xBU1RCSVRfRU5BQkxFICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9MQkNMICAgLyohPCBVU0FSVCBmcmFtZSBsYXN0IGRhdGEgYml0IGNsb2NrIHB1bHNlIG91dHB1dCB0byBTQ0xLIHBpbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBVU0FSVF9SZXF1ZXN0X1BhcmFtZXRlcnMgIFVTQVJUIFJlcXVlc3QgUGFyYW1ldGVycworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgICBVU0FSVF9SUVJfUlhGUlEgICAgICAgIC8qITwgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QgICovCisjZGVmaW5lIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgICBVU0FSVF9SUVJfVFhGUlEgICAgICAgIC8qITwgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0ZsYWdzICAgICAgVVNBUlQgRmxhZ3MKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWAorICAqICAgICAgICAgICAtIDB4WFhYWCAgOiBGbGFnIG1hc2sgaW4gdGhlIElTUiByZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfUkVBQ0sgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SRUFDSyAgICAgICAgIC8qITwgVVNBUlQgcmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfVEVBQ0sgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9URUFDSyAgICAgICAgIC8qITwgVVNBUlQgdHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfQlVTWSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9CVVNZICAgICAgICAgIC8qITwgVVNBUlQgYnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfVFhFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9UWEUgICAgICAgICAgIC8qITwgVVNBUlQgdHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9UQyAgICAgICAgICAgIC8qITwgVVNBUlQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FICAgICAgICAgIC8qITwgVVNBUlQgcmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfSURMRSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9JRExFICAgICAgICAgIC8qITwgVVNBUlQgaWRsZSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfT1JFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9PUkUgICAgICAgICAgIC8qITwgVVNBUlQgb3ZlcnJ1biBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfTkUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9ORSAgICAgICAgICAgIC8qITwgVVNBUlQgbm9pc2UgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfRkUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgICAgIC8qITwgVVNBUlQgZnJhbWUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0ZMQUdfUEUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9QRSAgICAgICAgICAgIC8qITwgVVNBUlQgcGFyaXR5IGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0ludGVycnVwdF9kZWZpbml0aW9uIFVTQVJUIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwMFpaWlowWFhZWVlZWWIKKyAgKiAgICAgICAgICAgLSBZWVlZWSAgOiBJbnRlcnJ1cHQgc291cmNlIHBvc2l0aW9uIGluIHRoZSBYWCByZWdpc3RlciAoNWJpdHMpCisgICogICAgICAgICAgIC0gWFggIDogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAoMmJpdHMpCisgICogICAgICAgICAgICAgICAgIC0gMDE6IENSMSByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDEwOiBDUjIgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMTogQ1IzIHJlZ2lzdGVyCisgICogICAgICAgICAgIC0gWlpaWiAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBJU1IgcmVnaXN0ZXIoNGJpdHMpCisgICogQHsKKyAgKi8KKworI2RlZmluZSBVU0FSVF9JVF9QRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI4VSAgICAgLyohPCBVU0FSVCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzI3VSAgICAgLyohPCBVU0FSVCB0cmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBVU0FSVF9JVF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI2VSAgICAgLyohPCBVU0FSVCB0cmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0aW9uICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9SWE5FICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTI1VSAgICAgLyohPCBVU0FSVCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBVU0FSVF9JVF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI0VSAgICAgLyohPCBVU0FSVCBpZGxlIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwVSAgICAgLyohPCBVU0FSVCBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9PUkUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwVSAgICAgLyohPCBVU0FSVCBvdmVycnVuIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwVSAgICAgLyohPCBVU0FSVCBub2lzZSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JVF9GRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwVSAgICAgLyohPCBVU0FSVCBmcmFtZSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0lUX0NMRUFSX0ZsYWdzICAgIFVTQVJUIEludGVycnVwdGlvbiBDbGVhciBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX0NMRUFSX1BFRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1BFQ0YgICAgICAgICAgICAvKiE8IFBhcml0eSBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0NMRUFSX0ZFRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0ZFQ0YgICAgICAgICAgICAvKiE8IEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0NMRUFSX05FRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX05DRiAgICAgICAgICAgICAvKiE8IE5vaXNlIEVycm9yIGRldGVjdGVkIENsZWFyIEZsYWcgICAgICovCisjZGVmaW5lIFVTQVJUX0NMRUFSX09SRUYgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX09SRUNGICAgICAgICAgICAvKiE8IE92ZXJSdW4gRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0NMRUFSX0lETEVGICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0lETEVDRiAgICAgICAgICAvKiE8IElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnICAgICAgICovCisjZGVmaW5lIFVTQVJUX0NMRUFSX1RDRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQ0YgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0ludGVycnVwdGlvbl9NYXNrICAgIFVTQVJUIEludGVycnVwdGlvbiBGbGFncyBNYXNrCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFGVSAgICAgLyohPCBVU0FSVCBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgKi8KKyNkZWZpbmUgVVNBUlRfQ1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEUwVSAgICAgLyohPCBVU0FSVCBjb250cm9sIHJlZ2lzdGVyIG1hc2sgKi8KKyNkZWZpbmUgVVNBUlRfQ1JfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNVUgICAgICAgICAgLyohPCBVU0FSVCBjb250cm9sIHJlZ2lzdGVyIHBvc2l0aW9uICovCisjZGVmaW5lIFVTQVJUX0lTUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMFUgICAgIC8qITwgVVNBUlQgSVNSIHJlZ2lzdGVyIG1hc2sgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9JU1JfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4VSAgICAgICAgICAvKiE8IFVTQVJUIElTUiByZWdpc3RlciBwb3NpdGlvbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX01hY3JvcyBVU0FSVCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IFVTQVJUIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9VU0FSVF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRVNFVDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZWxzZQorI2RlZmluZSBfX0hBTF9VU0FSVF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFU0VUKQorI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKiBAYnJpZWYgIEZsdXNoIHRoZSBVU0FSVCBEYXRhIHJlZ2lzdGVycworICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfRkxVU0hfRFJSRUdJU1RFUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVNBUlQgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfUkVBQ0sgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfVEVBQ0sgVHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX0JVU1kgIEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19UQyAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfUlhORSAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19JRExFICBJZGxlIExpbmUgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX09SRSAgIE92ZXJSdW4gRXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfTkUgICAgTm9pc2UgRXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfRkUgICAgRnJhbWluZyBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19QRSAgICBQYXJpdHkgRXJyb3IgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVVNBUlQgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX1BFRiAgICAgIFBhcml0eSBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfRkVGICAgICAgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfTkVGICAgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX09SRUYgICAgIE92ZXJydW4gRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX0lETEVGICAgIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfVENGICAgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVU0FSVCBQRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9QRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVVNBUlRfQ0xFQVJfUEVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVVNBUlQgRkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfRkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX0ZFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVTQVJUIE5FIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0NMRUFSX05FRkxBRyhfX0hBTkRMRV9fKSAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX05FRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVTQVJUIE9SRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9PUkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX09SRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVU0FSVCBJRExFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0NMRUFSX0lETEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX0lETEVGKQorCisKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgVVNBUlQgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9QRSAgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0KEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKCgoKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0NSX01BU0spID4+IFVTQVJUX0NSX1BPUykgPT0gMVUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0NSX01BU0spID4+IFVTQVJUX0NSX1BPUykgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIHw9ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFVTQVJUIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVVNBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhFICAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9FUlIgICBFcnJvciBpbnRlcnJ1cHQoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAoKCgoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfQ1JfTUFTSykgPj4gVVNBUlRfQ1JfUE9TKSA9PSAxVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gfiAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVU0FSVF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19JTlRFUlJVUFRfXykgJiBVU0FSVF9DUl9NQVNLKSA+PiBVU0FSVF9DUl9QT1MpID09IDJVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmPSB+ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gfiAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVU0FSVF9JVF9NQVNLKSkpKQorCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVVNBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9PUkUgICBPdmVyUnVuIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX05FICAgIE5vaXNlIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0ZFICAgIEZyYW1pbmcgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKCh1aW50MzJfdCkweDAxVSA8PCAoKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lTUl9NQVNLKT4+IFVTQVJUX0lTUl9QT1MpKSkgIT0gMFUpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhFICAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX09SRSAgIE92ZXJSdW4gRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfTkUgICAgTm9pc2UgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfRkUgICAgRnJhbWluZyBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9QRSAgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gMHgwNVUpID09IDB4MDFVKSA/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiAweDA1VSkgPT0gMHgwMlUpID8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMykpICYgKDB4MDFVIDw8ICgoKHVpbnQxNl90KShfX0lOVEVSUlVQVF9fKSkgJiBVU0FSVF9JVF9NQVNLKSkpICAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIFVTQVJUIElTUiBmbGFnLCBpbiBzZXR0aW5nIHRoZSBwcm9wZXIgSUNSIHJlZ2lzdGVyIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JVF9DTEVBUl9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyIGZsYWcgdGhhdCBuZWVkcyB0byBiZSBzZXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgdG8gY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfUEVGICAgICAgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9GRUYgICAgICBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9ORUYgICAgICBOb2lzZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfT1JFRiAgICAgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfSURMRUYgICAgSURMRSBsaW5lIGRldGVjdGVkIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9UQ0YgICAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lUX0NMRUFSX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAodWludDMyX3QpKF9fSVRfQ0xFQVJfXykpCisKKy8qKiBAYnJpZWYgIFNldCBhIHNwZWNpZmljIFVTQVJUIHJlcXVlc3QgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX1JFUV9fIHNwZWNpZmllcyB0aGUgcmVxdWVzdCBmbGFnIHRvIHNldC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUIFJlY2VpdmUgRGF0YSBmbHVzaCBSZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0CisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfU0VORF9SRVEoX19IQU5ETEVfXywgX19SRVFfXykgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSIHw9IChfX1JFUV9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBVU0FSVCBvbmUgYml0IHNhbXBsZSBtZXRob2QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSM3w9IFVTQVJUX0NSM19PTkVCSVQpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIFVTQVJUIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+VVNBUlRfQ1IzX09ORUJJVCkKKworLyoqIEBicmllZiAgRW5hYmxlIFVTQVJULgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9IFVTQVJUX0NSMV9VRSkKKworLyoqIEBicmllZiAgRGlzYWJsZSBVU0FSVC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+VVNBUlRfQ1IxX1VFKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfTWFjcm9zICAgVVNBUlQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBCUlIgZGl2aXNpb24gb3BlcmF0aW9uIHRvIHNldCBCUlIgcmVnaXN0ZXIgaW4gOC1iaXQgb3ZlcnNhbXBsaW5nIG1vZGUuCisgICogQHBhcmFtICBfX1BDTEtfXyBVU0FSVCBjbG9jay4KKyAgKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHJldHZhbCBEaXZpc2lvbiByZXN1bHQKKyAgKi8KKyNkZWZpbmUgVVNBUlRfRElWX1NBTVBMSU5HOChfX1BDTEtfXywgX19CQVVEX18pICAgKCgoKF9fUENMS19fKSoyVSkgKyAoKF9fQkFVRF9fKS8yVSkpIC8gKF9fQkFVRF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgVVNBUlQgQmF1ZCByYXRlLgorICAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWRyYXRlIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAgKiAgICAgICAgIFRoZSBtYXhpbXVtIEJhdWQgUmF0ZSBpcyBkZXJpdmVkIGZyb20gdGhlIG1heGltdW0gY2xvY2sgb24gTDAgKGkuZS4gMzIgTUh6KQorICAqICAgICAgICAgZGl2aWRlZCBieSB0aGUgc21hbGxlc3Qgb3ZlcnNhbXBsaW5nIHVzZWQgb24gdGhlIFVTQVJUIChpLmUuIDgpCisgICogQHJldHZhbCBTRVQgKF9fQkFVRFJBVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQkFVRFJBVEVfXyBpcyBpbnZhbGlkKSAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKF9fQkFVRFJBVEVfXykgPD0gNDAwMDAwMFUpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NUT1BCSVRTX18gVVNBUlQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cy4KKyAgKiBAcmV0dmFsIFNFVCAoX19TVE9QQklUU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QQklUU19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX1NUT1BCSVRTKF9fU1RPUEJJVFNfXykgKCgoX19TVE9QQklUU19fKSA9PSBVU0FSVF9TVE9QQklUU18wXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BCSVRTX18pID09IFVTQVJUX1NUT1BCSVRTXzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gVVNBUlRfU1RPUEJJVFNfMV81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVU0FSVF9TVE9QQklUU18yKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIHBhcml0eSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJJVFlfXyBVU0FSVCBmcmFtZSBwYXJpdHkuCisgICogQHJldHZhbCBTRVQgKF9fUEFSSVRZX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUklUWV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX1BBUklUWShfX1BBUklUWV9fKSAoKChfX1BBUklUWV9fKSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gVVNBUlRfUEFSSVRZX0VWRU4pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSSVRZX18pID09IFVTQVJUX1BBUklUWV9PREQpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgY29tbXVuaWNhdGlvbiBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBVU0FSVCBjb21tdW5pY2F0aW9uIG1vZGUuCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfTU9ERShfX01PREVfXykgKCgoKF9fTU9ERV9fKSAmIDB4RkZGRkZGRjNVKSA9PSAweDAwVSkgJiYgKChfX01PREVfXykgIT0gMHgwMFUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgb3ZlcnNhbXBsaW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NBTVBMSU5HX18gVVNBUlQgb3ZlcnNhbXBsaW5nLgorICAqIEByZXR2YWwgU0VUIChfX1NBTVBMSU5HX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NBTVBMSU5HX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfT1ZFUlNBTVBMSU5HKF9fU0FNUExJTkdfXykgKCgoX19TQU1QTElOR19fKSA9PSBVU0FSVF9PVkVSU0FNUExJTkdfMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TQU1QTElOR19fKSA9PSBVU0FSVF9PVkVSU0FNUExJTkdfOCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBjbG9jayBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DTE9DS19fIFVTQVJUIGNsb2NrIHN0YXRlLgorICAqIEByZXR2YWwgU0VUIChfX0NMT0NLX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NMT0NLX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfQ0xPQ0soX19DTE9DS19fKSAoKChfX0NMT0NLX18pID09IFVTQVJUX0NMT0NLX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFVTQVJUX0NMT0NLX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBmcmFtZSBwb2xhcml0eSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DUE9MX18gVVNBUlQgZnJhbWUgcG9sYXJpdHkuCisgICogQHJldHZhbCBTRVQgKF9fQ1BPTF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DUE9MX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfUE9MQVJJVFkoX19DUE9MX18pICgoKF9fQ1BPTF9fKSA9PSBVU0FSVF9QT0xBUklUWV9MT1cpIHx8ICgoX19DUE9MX18pID09IFVTQVJUX1BPTEFSSVRZX0hJR0gpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgZnJhbWUgcGhhc2UgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQ1BIQV9fIFVTQVJUIGZyYW1lIHBoYXNlLgorICAqIEByZXR2YWwgU0VUIChfX0NQSEFfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ1BIQV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX1BIQVNFKF9fQ1BIQV9fKSAoKChfX0NQSEFfXykgPT0gVVNBUlRfUEhBU0VfMUVER0UpIHx8ICgoX19DUEhBX18pID09IFVTQVJUX1BIQVNFXzJFREdFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIGxhc3QgYml0IGNsb2NrIHB1bHNlIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTEFTVEJJVF9fIFVTQVJUIGZyYW1lIGxhc3QgYml0IGNsb2NrIHB1bHNlIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fTEFTVEJJVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MQVNUQklUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfTEFTVEJJVChfX0xBU1RCSVRfXykgKCgoX19MQVNUQklUX18pID09IFVTQVJUX0xBU1RCSVRfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xBU1RCSVRfXykgPT0gVVNBUlRfTEFTVEJJVF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUEFSQU1fXyBVU0FSVCByZXF1ZXN0IHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJBTV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJBTV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX1JFUVVFU1RfUEFSQU1FVEVSKF9fUEFSQU1fXykgKCgoX19QQVJBTV9fKSA9PSBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gVVNBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFVTQVJUIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX3VzYXJ0X2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVNBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zIFVTQVJUIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0luaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9EZUluaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX01zcEluaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX01zcERlSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1JlZ2lzdGVyQ2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCBIQUxfVVNBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFVTQVJUX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1VuUmVnaXN0ZXJDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIEhBTF9VU0FSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVNBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1JlY2VpdmUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1JlY2VpdmVfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCAgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRfRE1BKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZV9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfRE1BKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BUGF1c2UoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9ETUFSZXN1bWUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9ETUFTdG9wKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9BYm9ydChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0Fib3J0X0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisKK3ZvaWQgSEFMX1VTQVJUX0lSUUhhbmRsZXIoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7Cit2b2lkIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIEhBTF9VU0FSVF9HZXRTdGF0ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordWludDMyX3QgICAgICAgICAgICAgICBIQUxfVVNBUlRfR2V0RXJyb3IoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9IQUxfVVNBUlRfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9oYWxfdXNhcnRfZXguaCBiL0luYy9zdG0zMmwweHhfaGFsX3VzYXJ0X2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwNWYzNAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX3VzYXJ0X2V4LmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3VzYXJ0X2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVTQVJUIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0hBTF9VU0FSVF9FWF9ICisjZGVmaW5lIFNUTTMyTDB4eF9IQUxfVVNBUlRfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJURXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9FeHBvcnRlZF9Db25zdGFudHMgVVNBUlRFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJURXhfV29yZF9MZW5ndGggVVNBUlRFeCBXb3JkIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1dPUkRMRU5HVEhfN0IgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9NMSkgICAvKiE8IDctYml0IGxvbmcgVVNBUlQgZnJhbWUgKi8KKyNkZWZpbmUgVVNBUlRfV09SRExFTkdUSF84QiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgIC8qITwgOC1iaXQgbG9uZyBVU0FSVCBmcmFtZSAqLworI2RlZmluZSBVU0FSVF9XT1JETEVOR1RIXzlCICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfTTApICAgLyohPCA5LWJpdCBsb25nIFVTQVJUIGZyYW1lICovCisvKioKKyAgKiBAfQorICAqLworCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9Qcml2YXRlX01hY3JvcyBVU0FSVEV4IFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBVU0FSVCBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19DTE9DS1NPVVJDRV9fIG91dHB1dCB2YXJpYWJsZS4KKyAgKiBAcmV0dmFsIHRoZSBVU0FSVCBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICAqLworI2lmIGRlZmluZWQgKFNUTTMyTDA1MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNTJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDUzeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYzeHgpCisKKyNkZWZpbmUgVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1BDTEsyOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKworI2VsaWYgZGVmaW5lZChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKworI2RlZmluZSBVU0FSVF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLF9fQ0xPQ0tTT1VSQ0VfXykgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDQpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDUpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisjZWxzZQorCisjZGVmaW5lIFVTQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKyNlbmRpZgorCisvKiogQGJyaWVmICBDb21wdXRlIHRoZSBVU0FSVCBtYXNrIHRvIGFwcGx5IHRvIHJldHJpZXZlIHRoZSByZWNlaXZlZCBkYXRhCisgICogICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHdvcmQgbGVuZ3RoIGFuZCB0byB0aGUgcGFyaXR5IGJpdHMgYWN0aXZhdGlvbi4KKyAgKiBAbm90ZSAgIElmIFBDRSA9IDEsIHRoZSBwYXJpdHkgYml0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGF0YSBleHRyYWN0ZWQKKyAgKiAgICAgICAgIGJ5IHRoZSByZWNlcHRpb24gQVBJKCkuCisgICogICAgICAgICBUaGlzIG1hc2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBjYXJyaWVkIG91dCBpbiB0aGUgY2FzZSBvZgorICAqICAgICAgICAgRE1BIHRyYW5zZmVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lLCB0aGUgbWFzayB0byBhcHBseSB0byBVU0FSVCBSRFIgcmVnaXN0ZXIgaXMgc3RvcmVkIGluIChfX0hBTkRMRV9fKS0+TWFzayBmaWVsZC4KKyAgKi8KKyNkZWZpbmUgVVNBUlRfTUFTS19DT01QVVRBVElPTihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMUZGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOEIpICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF83QikgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwM0ZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDAwVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMFUpCisKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIGxlbmd0aCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MRU5HVEhfXyBVU0FSVCBmcmFtZSBsZW5ndGguCisgICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xFTkdUSF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX1dPUkRfTEVOR1RIKF9fTEVOR1RIX18pICgoKF9fTEVOR1RIX18pID09IFVTQVJUX1dPUkRMRU5HVEhfN0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVVNBUlRfV09SRExFTkdUSF84QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSkKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0hBTF9VU0FSVF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2hhbF93d2RnLmggYi9JbmMvc3RtMzJsMHh4X2hhbF93d2RnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxNmNlYQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfaGFsX3d3ZGcuaApAQCAtMCwwICsxLDI5OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfd3dkZy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBXV0RHIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0hBTF9XV0RHX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0hBTF9XV0RHX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgV1dERworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9UeXBlcyBXV0RHIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXV0RHIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFByZXNjYWxlcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgdmFsdWUgb2YgdGhlIFdXREcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBXV0RHX1ByZXNjYWxlciAqLworCisgIHVpbnQzMl90IFdpbmRvdzsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBXV0RHIHdpbmRvdyB2YWx1ZSB0byBiZSBjb21wYXJlZCB0byB0aGUgZG93bmNvdW50ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBNaW5fRGF0YSA9IDB4NDAgYW5kIE1heF9EYXRhID0gMHg3RiAqLworCisgIHVpbnQzMl90IENvdW50ZXI7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBXV0RHIGZyZWUtcnVubmluZyBkb3duY291bnRlciAgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHg0MCBhbmQgTWF4X0RhdGEgPSAweDdGICovCisKKyAgdWludDMyX3QgRVdJTW9kZSA7ICAgICAgLyohPCBTcGVjaWZpZXMgaWYgV1dERyBFYXJseSBXYWtldXAgSW50ZXJ1cHQgaXMgZW5hYmxlIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFdXREdfRVdJX01vZGUgKi8KKworfSBXV0RHX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFdXREcgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisjaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fV1dER19IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZgoreworICBXV0RHX1R5cGVEZWYgICAgICAqSW5zdGFuY2U7ICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworCisgIFdXREdfSW5pdFR5cGVEZWYgIEluaXQ7ICAgICAgIC8qITwgV1dERyByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisKKyNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICAgICAgICAgICAgICAoKiBFd2lDYWxsYmFjaykoc3RydWN0IF9fV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7ICAgICAvKiE8IFdXREcgRWFybHkgV2FrZVVwIEludGVycnVwdCBjYWxsYmFjayAqLworCisgIHZvaWQgICAgICAgICAgICAgICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7IC8qITwgV1dERyBNc3AgSW5pdCBjYWxsYmFjayAqLworI2VuZGlmCit9IFdXREdfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBXV0RHIGNvbW1vbiBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1dXREdfRVdJX0NCX0lEICAgICAgICAgID0gMHgwMHUsICAgIC8qITwgV1dERyBFV0kgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCAgICAgID0gMHgwMXUsICAgIC8qITwgV1dERyBNc3BJbml0IGNhbGxiYWNrIElEICovCit9SEFMX1dXREdfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFdXREcgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHZvaWQgKCpwV1dER19DYWxsYmFja1R5cGVEZWYpKFdXREdfSGFuZGxlVHlwZURlZiAqIGhwcHApOyAvKiE8IHBvaW50ZXIgdG8gYSBXV0RHIGNvbW1vbiBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfQ29uc3RhbnRzIFdXREcgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0ludGVycnVwdF9kZWZpbml0aW9uIFdXREcgSW50ZXJydXB0IGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBXV0RHX0lUX0VXSSAgICAgICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9FV0kgIC8qITwgRWFybHkgd2FrZXVwIGludGVycnVwdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0ZsYWdfZGVmaW5pdGlvbiBXV0RHIEZsYWcgZGVmaW5pdGlvbgorICAqIEBicmllZiBXV0RHIEZsYWcgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFdXREdfRkxBR19FV0lGICAgICAgICAgICAgICAgICAgICAgIFdXREdfU1JfRVdJRiAgLyohPCBFYXJseSB3YWtldXAgaW50ZXJydXB0IGZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19QcmVzY2FsZXIgV1dERyBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBXV0RHX1BSRVNDQUxFUl8xICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzEgKi8KKyNkZWZpbmUgV1dER19QUkVTQ0FMRVJfMiAgICAgICAgICAgICAgICAgICAgV1dER19DRlJfV0RHVEJfMCAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8yICovCisjZGVmaW5lIFdXREdfUFJFU0NBTEVSXzQgICAgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvNCAqLworI2RlZmluZSBXV0RHX1BSRVNDQUxFUl84ICAgICAgICAgICAgICAgICAgICAoV1dER19DRlJfV0RHVEJfMSB8IFdXREdfQ0ZSX1dER1RCXzApICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19FV0lfTW9kZSBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFdXREdfRVdJX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB1ICAgICAgIC8qITwgRVdJIERpc2FibGUgKi8KKyNkZWZpbmUgV1dER19FV0lfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgV1dER19DRlJfRVdJICAgICAgLyohPCBFV0kgRW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFdXREdfUHJpdmF0ZV9NYWNyb3MgV1dERyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX1dXREdfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICAgICgoKF9fUFJFU0NBTEVSX18pID09IFdXREdfUFJFU0NBTEVSXzEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFdXREdfUFJFU0NBTEVSXzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFdXREdfUFJFU0NBTEVSXzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFdXREdfUFJFU0NBTEVSXzgpKQorCisjZGVmaW5lIElTX1dXREdfV0lORE9XKF9fV0lORE9XX18pICAgICAgICAgICgoKF9fV0lORE9XX18pID49IFdXREdfQ0ZSX1dfNikgJiYgKChfX1dJTkRPV19fKSA8PSBXV0RHX0NGUl9XKSkKKworI2RlZmluZSBJU19XV0RHX0NPVU5URVIoX19DT1VOVEVSX18pICAgICAgICAoKChfX0NPVU5URVJfXykgPj0gV1dER19DUl9UXzYpICYmICgoX19DT1VOVEVSX18pIDw9IFdXREdfQ1JfVCkpCisKKyNkZWZpbmUgSVNfV1dER19FV0lfTU9ERShfX01PREVfXykgICAgICAgICAgKCgoX19NT0RFX18pID09IFdXREdfRVdJX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gV1dER19FV0lfRElTQUJMRSkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfTWFjcm9zIFdXREcgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFdXREcgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIFdXREdfQ1JfV0RHQSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFdXREcgZWFybHkgd2FrZXVwIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX186IFdXREcgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBzcGVjaWZpZXMgdGhlIGludGVycnVwdCB0byBlbmFibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBXV0RHX0lUX0VXSTogRWFybHkgd2FrZXVwIGludGVycnVwdAorICAqIEBub3RlICAgT25jZSBlbmFibGVkIHRoaXMgaW50ZXJydXB0IGNhbm5vdCBiZSBkaXNhYmxlZCBleGNlcHQgYnkgYSBzeXN0ZW0gcmVzZXQuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZSLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc2VsZWN0ZWQgV1dERyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBzcGVjaWZpZXMgdGhlIGl0IHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBXV0RHX0ZMQUdfRVdJRjogRWFybHkgd2FrZXVwIGludGVycnVwdCBJVAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBXV0RHX0ZMQUcgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICBfX0hBTF9XV0RHX0dFVF9GTEFHKChfX0hBTkRMRV9fKSwoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBXV0RHIGludGVycnVwdCBwZW5kaW5nIGJpdHMuCisgICogICAgICAgICBiaXRzIHRvIGNsZWFyIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgV1dERyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgV1dER19GTEFHX0VXSUY6IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQgZmxhZworICAqLworI2RlZmluZSBfX0hBTF9XV0RHX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgX19IQUxfV1dER19DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBXV0RHIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgaGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyAgc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgV1dER19GTEFHX0VXSUY6IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBXV0RHX0ZMQUcgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgV1dERydzIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFdXREdfRkxBR19FV0lGOiBFYXJseSB3YWtldXAgaW50ZXJydXB0IGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfV1dER19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiA9IH4oX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgV1dERyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgV1dERyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBzcGVjaWZpZXMgdGhlIFdXREcgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFdXREdfSVRfRVdJOiBFYXJseSBXYWtldXAgSW50ZXJydXB0CisgICogQHJldHZhbCBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfV1dER19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9XV0RHX0luaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1dXREdfTXNwSW5pdChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKTsKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcsIEhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBXV0RHX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnLCBIQUxfV1dER19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfV1dER19SZWZyZXNoKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpOwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9XV0RHX0lSUUhhbmRsZXIoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9IQUxfV1dER19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2xsX2FkYy5oIGIvSW5jL3N0bTMybDB4eF9sbF9hZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjZiMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9sbF9hZGMuaApAQCAtMCwwICsxLDQwNzEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfYWRjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEFEQyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9MTF9BRENfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9MTF9BRENfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKEFEQzEpCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMIEFEQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENfTExfUHJpdmF0ZV9Db25zdGFudHMgQURDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfQURDX1JFR19UUklHX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICovCisvKiAtIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSByZWd1bGFyIHRyaWdnZXIgZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQgICAgICAgKEFEQ19DRkdSMV9FWFRFTl8wKSAvKiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbiBvdGhlciBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKSAqLworCisvKiBNYXNrIGNvbnRhaW5pbmcgdHJpZ2dlciBzb3VyY2UgbWFza3MgZm9yIGVhY2ggb2YgcG9zc2libGUgICAgICAgICAgICAgICAgICAqLworLyogdHJpZ2dlciBlZGdlIHNlbGVjdGlvbiBkdXBsaWNhdGVkIHdpdGggc2hpZnRzIFswOyA0OyA4OyAxMl0gICAgICAgICAgICAgICAgKi8KKy8qIGNvcnJlc3BvbmRpbmcgdG8ge1NXIHN0YXJ0OyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyfS4gICAgICAgICovCisjZGVmaW5lIEFEQ19SRUdfVFJJR19TT1VSQ0VfTUFTSyAgICAgICAgICAgICgoKExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSAmIEFEQ19DRkdSMV9FWFRTRUwpIDw8ICg0VSAqIDBVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DRkdSMV9FWFRTRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg0VSAqIDFVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DRkdSMV9FWFRTRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg0VSAqIDJVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DRkdSMV9FWFRTRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg0VSAqIDNVKSkgICkKKworLyogTWFzayBjb250YWluaW5nIHRyaWdnZXIgZWRnZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRyaWdnZXIgZWRnZSBzZWxlY3Rpb24gZHVwbGljYXRlZCB3aXRoIHNoaWZ0cyBbMDsgNDsgODsgMTJdICAgICAgICAgICAgICAgICovCisvKiBjb3JyZXNwb25kaW5nIHRvIHtTVyBzdGFydDsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcn0uICAgICAgICAqLworI2RlZmluZSBBRENfUkVHX1RSSUdfRURHRV9NQVNLICAgICAgICAgICAgICAoKChMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgJiBBRENfQ0ZHUjFfRVhURU4pIDw8ICg0VSAqIDBVKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgPDwgKDRVICogMVUpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICA8PCAoNFUgKiAyVSkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgIDw8ICg0VSAqIDNVKSkgICkKKworLyogRGVmaW5pdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIGJpdHMgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VYVFNFTF9CSVRPRkZTRVRfUE9TICAoKHVpbnQzMl90KSA2VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NGR1IxX0VYVFNFTCkgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VYVEVOX0JJVE9GRlNFVF9QT1MgICAoKHVpbnQzMl90KTEwVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NGR1IxX0VYVEVOKSAqLworCisKKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGNoYW5uZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgaWRlbnRpZmllciBkZWZpbmVkIGJ5IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIGlkZW50aWZpZXIgZGVmaW5lZCBieSBiaXRmaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBleHRlcm5hbCBjaGFubmVscyAoY29ubmVjdGVkIHRvICAgICAgICAgICovCisvKiAgIEdQSU8gcGlucykgYW5kIGludGVybmFsIGNoYW5uZWxzIChjb25uZWN0ZWQgdG8gaW50ZXJuYWwgcGF0aHMpICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyAgICAgICAgIChBRENfQ0ZHUjFfQVdEQ0gpCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0sgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUwpCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpMjZVKS8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9NQVNLICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyB8IEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0sgfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKQorLyogRXF1aXZhbGVudCBtYXNrIG9mIEFEQ19DSEFOTkVMX05VTUJFUl9NQVNLIGFsaWduZWQgb24gcmVnaXN0ZXIgTFNCIChiaXQgMCkgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMCAoKHVpbnQzMl90KTB4MDAwMDAwMUZVKSAvKiBFcXVpdmFsZW50IHRvIHNoaWZ0OiAoQURDX0NIQU5ORUxfTlVNQkVSX01BU0sgPj4gUE9TSVRJT05fVkFMKEFEQ19DSEFOTkVMX05VTUJFUl9NQVNLKSkgKi8KKworLyogQ2hhbm5lbCBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBleHRlcm5hbCBhbmQgaW50ZXJuYWwgY2hhbm5lbHMgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggICAgICAgICAoKHVpbnQzMl90KTB4ODAwMDAwMDBVKSAvKiBNYXJrZXIgb2YgaW50ZXJuYWwgY2hhbm5lbCAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLICAgIChBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkKKworLyogRGVmaW5pdGlvbiBvZiBjaGFubmVscyBJRCBudW1iZXIgaW5mb3JtYXRpb24gdG8gYmUgaW5zZXJ0ZWQgaW50byAgICAgICAgICAgKi8KKy8qIGNoYW5uZWxzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzBfTlVNQkVSICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMV9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMl9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FXRENIXzEgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfM19OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FXRENIXzEgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNF9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BV0RDSF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNV9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BV0RDSF8yICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNl9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BV0RDSF8yIHwgQURDX0NGR1IxX0FXRENIXzEgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfN19OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BV0RDSF8yIHwgQURDX0NGR1IxX0FXRENIXzEgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfOF9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEQ0hfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfOV9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEQ0hfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTBfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEQ0hfMyAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0FXRENIXzEgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTFfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEQ0hfMyAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0FXRENIXzEgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTJfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEQ0hfMyB8IEFEQ19DRkdSMV9BV0RDSF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTNfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEQ0hfMyB8IEFEQ19DRkdSMV9BV0RDSF8yICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTRfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEQ0hfMyB8IEFEQ19DRkdSMV9BV0RDSF8yIHwgQURDX0NGR1IxX0FXRENIXzEgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTVfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEQ0hfMyB8IEFEQ19DRkdSMV9BV0RDSF8yIHwgQURDX0NGR1IxX0FXRENIXzEgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTZfTlVNQkVSICAgICAgICAgICAgICAoQURDX0NGR1IxX0FXRENIXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTdfTlVNQkVSICAgICAgICAgICAgICAoQURDX0NGR1IxX0FXRENIXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMThfTlVNQkVSICAgICAgICAgICAgICAoQURDX0NGR1IxX0FXRENIXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0FXRENIXzEgICAgICAgICAgICAgICAgICAgICkKKworLyogRGVmaW5pdGlvbiBvZiBjaGFubmVscyBJRCBiaXRmaWVsZCBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCBpbnRvICAgICAgICAgKi8KKy8qIGNoYW5uZWxzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzBfQklURklFTEQgICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUwwKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xX0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMMSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMl9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDIpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzNfQklURklFTEQgICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUwzKQorI2RlZmluZSBBRENfQ0hBTk5FTF80X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMNCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNV9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDUpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzZfQklURklFTEQgICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUw2KQorI2RlZmluZSBBRENfQ0hBTk5FTF83X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMNykKKyNkZWZpbmUgQURDX0NIQU5ORUxfOF9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDgpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzlfQklURklFTEQgICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUw5KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMF9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMMTApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzExX0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUwxMSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTJfQklURklFTEQgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDEyKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xM19CSVRGSUVMRCAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMMTMpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE0X0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUwxNCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTVfQklURklFTEQgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDE1KQorI2lmICBkZWZpbmVkKEFEQ19DQ1JfVkxDREVOKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMMTYpCisjZW5kaWYKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTdfQklURklFTEQgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDE3KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xOF9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMMTgpCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBhbmFsb2cgd2F0Y2hkb2c6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFscyBMTF9BRENfQVdEX0NIQU5ORUx4X3h4eCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAqLworLyogKGNvbmNhdGVuYXRpb24gb2YgbXVsdGlwbGUgYml0cyB1c2VkIGluIGRpZmZlcmVudCBhbmFsb2cgd2F0Y2hkb2dzLCAgICAgICAgKi8KKy8qIChmZWF0dXJlIG9mIHNldmVyYWwgd2F0Y2hkb2dzIG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIGZhbWlsaWVzKSkuICAgICAgICovCisvKiAtIGFuYWxvZyB3YXRjaGRvZyAxOiBtb25pdG9yZWQgY2hhbm5lbCBkZWZpbmVkIGJ5IG51bWJlciwgICAgICAgICAgICAgICAgICAqLworLyogICBzZWxlY3Rpb24gb2YgQURDIGdyb3VwIChBREMgZ3JvdXAgcmVndWxhcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogSW50ZXJuYWwgcmVnaXN0ZXIgb2Zmc2V0IGZvciBBREMgYW5hbG9nIHdhdGNoZG9nIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBRENfQVdEX0NSMV9SRUdPRkZTRVQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisKKyNkZWZpbmUgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0sgICAgICAgICAoQURDX0FXRF9DUjFfUkVHT0ZGU0VUKQorCisjZGVmaW5lIEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSyAgICAgICAgICAgKEFEQ19DRkdSMV9BV0RDSCB8IEFEQ19DRkdSMV9BV0RFTiB8IEFEQ19DRkdSMV9BV0RTR0wpCisjZGVmaW5lIEFEQ19BV0RfQ1JfQUxMX0NIQU5ORUxfTUFTSyAgICAgICAgKEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSykKKworLyogSW50ZXJuYWwgcmVnaXN0ZXIgb2Zmc2V0IGZvciBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFEQ19BV0RfVFIxX1JFR09GRlNFVCAgICAgICAgICAgICAgKEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX0FXRF9UUlhfUkVHT0ZGU0VUX01BU0sgICAgICAgICAoQURDX0FXRF9UUjFfUkVHT0ZGU0VUKQorCisKKy8qIEFEQyByZWdpc3RlcnMgYml0cyBwb3NpdGlvbnMgKi8KKyNkZWZpbmUgQURDX0NGR1IxX1JFU19CSVRPRkZTRVRfUE9TICAgICAgICAoKHVpbnQzMl90KSAzVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NGR1IxX1JFUykgKi8KKyNkZWZpbmUgQURDX0NGR1IxX0FXRFNHTF9CSVRPRkZTRVRfUE9TICAgICAoKHVpbnQzMl90KTIyVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NGR1IxX0FXRFNHTCkgKi8KKyNkZWZpbmUgQURDX1RSX0hUX0JJVE9GRlNFVF9QT1MgICAgICAgICAgICAoKHVpbnQzMl90KTE2VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX1RSX0hUKSAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMMF9CSVRPRkZTRVRfUE9TICAgICgodWludDMyX3QpIDBVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0hTRUxSX0NIU0VMMCkgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDFfQklUT0ZGU0VUX1BPUyAgICAoKHVpbnQzMl90KSAxVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NIU0VMUl9DSFNFTDEpICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUwyX0JJVE9GRlNFVF9QT1MgICAgKCh1aW50MzJfdCkgMlUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19DSFNFTFJfQ0hTRUwyKSAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMM19CSVRPRkZTRVRfUE9TICAgICgodWludDMyX3QpIDNVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0hTRUxSX0NIU0VMMykgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDRfQklUT0ZGU0VUX1BPUyAgICAoKHVpbnQzMl90KSA0VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NIU0VMUl9DSFNFTDQpICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUw1X0JJVE9GRlNFVF9QT1MgICAgKCh1aW50MzJfdCkgNVUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19DSFNFTFJfQ0hTRUw1KSAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMNl9CSVRPRkZTRVRfUE9TICAgICgodWludDMyX3QpIDZVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0hTRUxSX0NIU0VMNikgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDdfQklUT0ZGU0VUX1BPUyAgICAoKHVpbnQzMl90KSA3VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NIU0VMUl9DSFNFTDcpICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUw4X0JJVE9GRlNFVF9QT1MgICAgKCh1aW50MzJfdCkgOFUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19DSFNFTFJfQ0hTRUw4KSAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMOV9CSVRPRkZTRVRfUE9TICAgICgodWludDMyX3QpIDlVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0hTRUxSX0NIU0VMOSkgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDEwX0JJVE9GRlNFVF9QT1MgICAoKHVpbnQzMl90KTEwVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NIU0VMUl9DSFNFTDEwKSAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMMTFfQklUT0ZGU0VUX1BPUyAgICgodWludDMyX3QpMTFVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0hTRUxSX0NIU0VMMTEpICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUwxMl9CSVRPRkZTRVRfUE9TICAgKCh1aW50MzJfdCkxMlUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19DSFNFTFJfQ0hTRUwxMikgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDEzX0JJVE9GRlNFVF9QT1MgICAoKHVpbnQzMl90KTEzVSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NIU0VMUl9DSFNFTDEzKSAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMMTRfQklUT0ZGU0VUX1BPUyAgICgodWludDMyX3QpMTRVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfQ0hTRUxSX0NIU0VMMTQpICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUwxNV9CSVRPRkZTRVRfUE9TICAgKCh1aW50MzJfdCkxNVUpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19DSFNFTFJfQ0hTRUwxNSkgKi8KKyNpZiAgZGVmaW5lZChBRENfQ0NSX1ZMQ0RFTikKKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDE2X0JJVE9GRlNFVF9QT1MgICAoKHVpbnQzMl90KTE2VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NIU0VMUl9DSFNFTDE2KSAqLworI2VuZGlmCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUwxN19CSVRPRkZTRVRfUE9TICAgKCh1aW50MzJfdCkxN1UpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKEFEQ19DSFNFTFJfQ0hTRUwxNykgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDE4X0JJVE9GRlNFVF9QT1MgICAoKHVpbnQzMl90KTE4VSkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoQURDX0NIU0VMUl9DSFNFTDE4KSAqLworCisKKy8qIEFEQyByZWdpc3RlcnMgYml0cyBncm91cHMgKi8KKyNkZWZpbmUgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMgICAgICAgICAgICAoQURDX0NSX0FEQ0FMIHwgQURDX0NSX0FEU1RQIHwgQURDX0NSX0FEU1RBUlQgfCBBRENfQ1JfQURESVMgfCBBRENfQ1JfQURFTikgLyogQURDIHJlZ2lzdGVyIENSIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiOiBTb2Z0d2FyZSBjYW4gcmVhZCBhcyB3ZWxsIGFzIHNldCB0aGlzIGJpdC4gV3JpdGluZyAnMCcgaGFzIG5vIGVmZmVjdCBvbiB0aGUgYml0IHZhbHVlLiAqLworCisKKy8qIEFEQyBpbnRlcm5hbCBjaGFubmVscyByZWxhdGVkIGRlZmluaXRpb25zICovCisvKiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50ICovCisjZGVmaW5lIFZSRUZJTlRfQ0FMX0FERFIgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCopICgodWludDMyX3QpMHgxRkY4MDA3OFUpKSAvKiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSwgYWRkcmVzcyBvZiBwYXJhbWV0ZXIgVlJFRklOVF9DQUw6IFZyZWZJbnQgQURDIHJhdyBkYXRhIGFjcXVpcmVkIGF0IHRlbXBlcmF0dXJlIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMCBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBWUkVGSU5UX0NBTF9WUkVGICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpIDMwMDBVKSAgICAgICAgICAgICAgICAgICAgLyogQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykgdmFsdWUgd2l0aCB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3IgaGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uICh0b2xlcmFuY2U6ICstMTAgbVYpICh1bml0OiBtVikuICovCisvKiBUZW1wZXJhdHVyZSBzZW5zb3IgKi8KKy8qIE5vdGU6IE9uIGRldmljZSBTVE0zMkwwMTEsIGNhbGlicmF0aW9uIHBhcmFtZXRlciBUU19DQUwxIGlzIG5vdCBhdmFpbGFibGUuICovCisjaWYgIWRlZmluZWQoU1RNMzJMMDExeHgpCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMV9BRERSICAgICAgICAgICAgICAgKCh1aW50MTZfdCopICgodWludDMyX3QpMHgxRkY4MDA3QVUpKSAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFRTX0NBTDE6IE9uIFNUTTMyTDAsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMCBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2VuZGlmCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMl9BRERSICAgICAgICAgICAgICAgKCh1aW50MTZfdCopICgodWludDMyX3QpMHgxRkY4MDA3RVUpKSAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFRTX0NBTDI6IE9uIFNUTTMyTDAsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgMTMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMCBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2lmICFkZWZpbmVkKFNUTTMyTDAxMXh4KQorI2RlZmluZSBURU1QU0VOU09SX0NBTDFfVEVNUCAgICAgICAgICAgICAgICgoIGludDMyX3QpICAgMzApICAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCB0ZW1wZXJhdHVyZSBhdCB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3IgaGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uIGZvciBkYXRhIGludG8gVEVNUFNFTlNPUl9DQUwxX0FERFIgKHRvbGVyYW5jZTogKy01IERlZ0MpICh1bml0OiBEZWdDKS4gKi8KKyNlbmRpZgorI2RlZmluZSBURU1QU0VOU09SX0NBTDJfVEVNUCAgICAgICAgICAgICAgICgoIGludDMyX3QpICAxMzApICAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCB0ZW1wZXJhdHVyZSBhdCB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3IgaGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uIGZvciBkYXRhIGludG8gVEVNUFNFTlNPUl9DQUwyX0FERFIgKHRvbGVyYW5jZTogKy01IERlZ0MpICh1bml0OiBEZWdDKS4gKi8KKyNkZWZpbmUgVEVNUFNFTlNPUl9DQUxfVlJFRkFOQUxPRyAgICAgICAgICAoKHVpbnQzMl90KSAzMDAwVSkgICAgICAgICAgICAgICAgICAgIC8qIEFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAoVnJlZispIHZvbHRhZ2Ugd2l0aCB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3IgaGFzIGJlZW4gY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uICgrLTEwIG1WKSAodW5pdDogbVYpLiAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKworI2lmICBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9Qcml2YXRlX01hY3JvcyBBREMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZgorCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBBRENfTExfRVNfSU5JVCBBREMgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzCisgICogICAgICAgICBhbmQgbXVsdGltb2RlCisgICogICAgICAgICAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db21tb25Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBpbnN0YW5jZXMgc3RhdGUgKGFsbCBBREMgaW5zdGFuY2VzCisgICogICAgICAgICBzaGFyaW5nIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlIG11c3QgYmUKKyAgKiAgICAgICAgIGRpc2FibGVkLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ29tbW9uQ2xvY2s7ICAgICAgICAgICAgICAgICAvKiE8IFNldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBDbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0NPTU1PTl9DTE9DS19TT1VSQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q29tbW9uQ2xvY2soKS4gKi8KKworfSBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19JbnN0YW5jZSAuCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDbG9jazsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBpbnN0YW5jZSBjbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0NMT0NLX1NPVVJDRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhpcyBwYXJhbWV0ZXIgaGFzIHNvbWUgY2xvY2sgcmF0aW8gY29uc3RyYWludHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREMgY2xvY2sgc3luY2hyb25vdXMgKGZyb20gUENMSykgd2l0aCBwcmVzY2FsZXIgMSBtdXN0IGJlIGVuYWJsZWQgb25seSBpZiBQQ0xLIGhhcyBhIDUwJSBkdXR5IGNsb2NrIGN5Y2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVBCIHByZXNjYWxlciBjb25maWd1cmVkIGluc2lkZSB0aGUgUkNDIG11c3QgYmUgYnlwYXNzZWQgYW5kIHRoZSBzeXN0ZW0gY2xvY2sgbXVzdCBieSA1MCUgZHV0eSBjeWNsZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24uICovCisKKyAgdWludDMyX3QgUmVzb2x1dGlvbjsgICAgICAgICAgICAgICAgICAvKiE8IFNldCBBREMgcmVzb2x1dGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFU09MVVRJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0UmVzb2x1dGlvbigpLiAqLworCisgIHVpbnQzMl90IERhdGFBbGlnbm1lbnQ7ICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19EQVRBX0FMSUdOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldERhdGFBbGlnbm1lbnQoKS4gKi8KKworICB1aW50MzJfdCBMb3dQb3dlck1vZGU7ICAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBsb3cgcG93ZXIgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0xQX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0TG93UG93ZXJNb2RlKCkuICovCisKK30gTExfQURDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIHJlZ3VsYXIuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIlJFRyIpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRyaWdnZXJTb3VyY2U7ICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZTogaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LCBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfVFJJR0dFUl9TT1VSQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgdHJpZ2dlciBzb3VyY2UgdG8gZXh0ZXJuYWwgdHJpZ2dlciBhbHNvIHNldCB0cmlnZ2VyIHBvbGFyaXR5IHRvIHJpc2luZyBlZGdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBzZXR0aW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBBREMgb24gb3RoZXIgU1RNMzIgZmFtaWxpZXMgaGF2aW5nIHRoaXMgc2V0dGluZyBzZXQgYnkgSFcgZGVmYXVsdCB2YWx1ZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBjYXNlIG9mIG5lZWQgdG8gbW9kaWZ5IHRyaWdnZXIgZWRnZSwgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRUcmlnZ2VyRWRnZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZSgpLiAqLworCisgIHVpbnQzMl90IFNlcXVlbmNlckRpc2NvbnQ7ICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZTogc2VxdWVuY2Ugc3ViZGl2aWRlZCBhbmQgc2NhbiBjb252ZXJzaW9ucyBpbnRlcnJ1cHRlZCBldmVyeSBzZWxlY3RlZCBudW1iZXIgb2YgcmFua3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaGFzIGFuIGVmZmVjdCBvbmx5IGlmIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXZlcmFsIEFEQyBjaGFubmVscyBlbmFibGVkIGluIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckRpc2NvbnQoKS4gKi8KKworICB1aW50MzJfdCBDb250aW51b3VzTW9kZTsgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSBvbiBBREMgZ3JvdXAgcmVndWxhciwgd2hldGhlciBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBzaW5nbGUgbW9kZSAob25lIGNvbnZlcnNpb24gcGVyIHRyaWdnZXIpIG9yIGluIGNvbnRpbnVvdXMgbW9kZSAoYWZ0ZXIgdGhlIGZpcnN0IHRyaWdnZXIsIGZvbGxvd2luZyBjb252ZXJzaW9ucyBsYXVuY2hlZCBzdWNjZXNzaXZlbHkgYXV0b21hdGljYWxseSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfQ09OVElOVU9VU19NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIHJlZ3VsYXIgY29udGludW91cyBtb2RlIGFuZCBkaXNjb250aW51b3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRDb250aW51b3VzTW9kZSgpLiAqLworCisgIHVpbnQzMl90IERNQVRyYW5zZmVyOyAgICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvciB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19ETUFfVFJBTlNGRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyKCkuICovCisKKyAgdWludDMyX3QgT3ZlcnJ1bjsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHByZXNlcnZlZCBvciBvdmVyd3JpdHRlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19PVlJfREFUQV9CRUhBVklPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0T3ZlcnJ1bigpLiAqLworCit9IExMX0FEQ19SRUdfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgQURDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0ZMQUcgQURDIGZsYWdzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9BRENfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0FEUkRZICAgICAgICAgICAgICAgICAgQURDX0lTUl9BRFJEWSAgICAgIC8qITwgQURDIGZsYWcgQURDIGluc3RhbmNlIHJlYWR5ICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0VPQyAgICAgICAgICAgICAgICAgICAgQURDX0lTUl9FT0MgICAgICAgIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19FT1MgICAgICAgICAgICAgICAgICAgIEFEQ19JU1JfRU9TICAgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLworI2RlZmluZSBMTF9BRENfRkxBR19PVlIgICAgICAgICAgICAgICAgICAgIEFEQ19JU1JfT1ZSICAgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9TTVAgICAgICAgICAgICAgICAgICBBRENfSVNSX0VPU01QICAgICAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcgcGhhc2UgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMSAgICAgICAgICAgICAgICAgICBBRENfSVNSX0FXRCAgICAgICAgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9DQUwgICAgICAgICAgICAgICAgICBBRENfSVNSX0VPQ0FMICAgICAgLyohPCBBREMgZmxhZyBlbmQgb2YgY2FsaWJyYXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lUIEFEQyBpbnRlcnJ1cHRpb25zIGZvciBjb25maWd1cmF0aW9uIChpbnRlcnJ1cHRpb24gZW5hYmxlIG9yIGRpc2FibGUpCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9BRENfUmVhZFJlZyBhbmQgIExMX0FEQ19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfSVRfQURSRFkgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfQURSRFlJRSAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGluc3RhbmNlIHJlYWR5ICovCisjZGVmaW5lIExMX0FEQ19JVF9FT0MgICAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9FT0NJRSAgICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uICovCisjZGVmaW5lIExMX0FEQ19JVF9FT1MgICAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9FT1NJRSAgICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTExfQURDX0lUX09WUiAgICAgICAgICAgICAgICAgICAgICBBRENfSUVSX09WUklFICAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gKi8KKyNkZWZpbmUgTExfQURDX0lUX0VPU01QICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0VPU01QSUUgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZyBwaGFzZSAqLworI2RlZmluZSBMTF9BRENfSVRfQVdEMSAgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfQVdESUUgICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxICovCisjZGVmaW5lIExMX0FEQ19JVF9FT0NBTCAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9FT0NBTElFICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdJU1RFUlMgIEFEQyByZWdpc3RlcnMgY29tcGxpYW50IHdpdGggc3BlY2lmaWMgcHVycG9zZQorICAqIEB7CisgICovCisvKiBMaXN0IG9mIEFEQyByZWdpc3RlcnMgaW50ZW5kZWQgdG8gYmUgdXNlZCAobW9zdCBjb21tb25seSkgd2l0aCAgICAgICAgICAgICAqLworLyogRE1BIHRyYW5zZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19ETUFfUkVHX1JFR1VMQVJfREFUQSAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgcmVnaXN0ZXIgKGNvcnJlc3BvbmRpbmcgdG8gcmVnaXN0ZXIgRFIpIHRvIGJlIHVzZWQgd2l0aCBBREMgY29uZmlndXJlZCBpbiBpbmRlcGVuZGVudCBtb2RlLiBXaXRob3V0IERNQSB0cmFuc2ZlciwgcmVnaXN0ZXIgYWNjZXNzZWQgYnkgTEwgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyKCkgYW5kIG90aGVyIGZ1bmN0aW9ucyBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRheCgpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFICBBREMgY29tbW9uIC0gQ2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aG91dCBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjIgICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMi4gQURDIGNvbW1vbiBjbG9jayBhc3luY2hyb25vdXMgcHJlc2NhbGVyIGlzIGFwcGxpZWQgdG8gZWFjaCBBREMgaW5zdGFuY2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcgQURDIGluc3RhbmNlIGNsb2NrIGlzIHNldCB0byBjbG9jayBzb3VyY2UgYXN5bmNocm9ub3VzIChyZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDbG9jaygpICkuICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0ICAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMSAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDQuIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNiAgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzEgfCBBRENfQ0NSX1BSRVNDXzApICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA2LiBBREMgY29tbW9uIGNsb2NrIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgaXMgYXBwbGllZCB0byBlYWNoIEFEQyBpbnN0YW5jZSBpZiB0aGUgY29ycmVzcG9uZGluZyBBREMgaW5zdGFuY2UgY2xvY2sgaXMgc2V0IHRvIGNsb2NrIHNvdXJjZSBhc3luY2hyb25vdXMgKHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENsb2NrKCkgKS4gKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjggICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgOC4gQURDIGNvbW1vbiBjbG9jayBhc3luY2hyb25vdXMgcHJlc2NhbGVyIGlzIGFwcGxpZWQgdG8gZWFjaCBBREMgaW5zdGFuY2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcgQURDIGluc3RhbmNlIGNsb2NrIGlzIHNldCB0byBjbG9jayBzb3VyY2UgYXN5bmNocm9ub3VzIChyZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDbG9jaygpICkuICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMCAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMiAgICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfUFJFU0NfMCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDEwLiBBREMgY29tbW9uIGNsb2NrIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgaXMgYXBwbGllZCB0byBlYWNoIEFEQyBpbnN0YW5jZSBpZiB0aGUgY29ycmVzcG9uZGluZyBBREMgaW5zdGFuY2UgY2xvY2sgaXMgc2V0IHRvIGNsb2NrIHNvdXJjZSBhc3luY2hyb25vdXMgKHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENsb2NrKCkgKS4gKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18yIHwgQURDX0NDUl9QUkVTQ18xICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTIuIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzIgfCBBRENfQ0NSX1BSRVNDXzEgfCBBRENfQ0NSX1BSRVNDXzApIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxNi4gQURDIGNvbW1vbiBjbG9jayBhc3luY2hyb25vdXMgcHJlc2NhbGVyIGlzIGFwcGxpZWQgdG8gZWFjaCBBREMgaW5zdGFuY2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcgQURDIGluc3RhbmNlIGNsb2NrIGlzIHNldCB0byBjbG9jayBzb3VyY2UgYXN5bmNocm9ub3VzIChyZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDbG9jaygpICkuICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMiAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDMyLiBBREMgY29tbW9uIGNsb2NrIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgaXMgYXBwbGllZCB0byBlYWNoIEFEQyBpbnN0YW5jZSBpZiB0aGUgY29ycmVzcG9uZGluZyBBREMgaW5zdGFuY2UgY2xvY2sgaXMgc2V0IHRvIGNsb2NrIHNvdXJjZSBhc3luY2hyb25vdXMgKHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENsb2NrKCkgKS4gKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0ICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18zIHwgQURDX0NDUl9QUkVTQ18wKSAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgNjQuIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4ICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzMgfCBBRENfQ0NSX1BSRVNDXzEpICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxMjguIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMjU2ICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzMgfCBBRENfQ0NSX1BSRVNDXzEgfCBBRENfQ0NSX1BSRVNDXzApIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAyNTYuIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ09NTU9OX0NMT0NLX0ZSRVFfTU9ERSAgQURDIGNvbW1vbiAtIENsb2NrIGZyZXF1ZW5jeSBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0ZSRVFfTU9ERV9ISUdIICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKS8qITwgQURDIGNsb2NrIG1vZGUgdG8gaGlnaCBmcmVxdWVuY3kuIE9uIFNUTTMyTDAsIEFEQyBjbG9jayBmcmVxdWVuY3kgYWJvdmUgMi44TUh6LiAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0ZSRVFfTU9ERV9MT1cgICAgICAgICAoQURDX0NDUl9MRk1FTikgICAgICAgIC8qITwgQURDIGNsb2NrIG1vZGUgdG8gbG93IGZyZXF1ZW5jeS4gT24gU1RNMzJMMCwgQURDIGNsb2NrIGZyZXF1ZW5jeSBiZWxvdyAyLjhNSHouICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ09NTU9OX1BBVEhfSU5URVJOQUwgIEFEQyBjb21tb24gLSBNZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWxzCisgICogQHsKKyAgKi8KKy8qIE5vdGU6IE90aGVyIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG1heSBiZSBhdmFpbGFibGUgICAgICAgICovCisvKiAgICAgICAoY29ubmVjdGlvbnMgdG8gb3RoZXIgcGVyaXBoZXJhbHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSWYgdGhleSBhcmUgbm90IGxpc3RlZCBiZWxvdywgdGhleSBkbyBub3QgcmVxdWlyZSBhbnkgc3BlY2lmaWMgICAgICAgKi8KKy8qICAgICAgIHBhdGggZW5hYmxlLiBJbiB0aGlzIGNhc2UsIEFjY2VzcyB0byBtZWFzdXJlbWVudCBwYXRoIGlzIGRvbmUgICAgICAgICovCisvKiAgICAgICBvbmx5IGJ5IHNlbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBBREMgaW50ZXJuYWwgY2hhbm5lbC4gICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aGVzIGFsbCBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UICAgICAgIChBRENfQ0NSX1ZSRUZFTikgICAgICAgLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbCBjaGFubmVsIFZyZWZJbnQgKi8KKyNpZiBkZWZpbmVkKEFEQ19DQ1JfVFNFTikKKyNkZWZpbmUgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUiAgICAoQURDX0NDUl9UU0VOKSAgICAgICAgIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbCB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQURDX0NDUl9WTENERU4pCisjZGVmaW5lIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZMQ0QgICAgICAgICAgKEFEQ19DQ1JfVkxDREVOKSAgICAgICAvKiE8IEFEQyBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWwgVmxjZCAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DTE9DS19TT1VSQ0UgIEFEQyBpbnN0YW5jZSAtIENsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWNCAgICAgICAgKEFEQ19DRkdSMl9DS01PREVfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyICAgICAgICAoQURDX0NGR1IyX0NLTU9ERV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEgICAgICAgIChBRENfQ0ZHUjJfQ0tNT0RFXzEgfCBBRENfQ0ZHUjJfQ0tNT0RFXzApICAgICAgICAgICAgIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xvY2sgbm90IGRpdmlkZWQgICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrLiBBc3luY2hyb25vdXMgY2xvY2sgcHJlc2NhbGVyIGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENvbW1vbkNsb2NrKCkuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRVNPTFVUSU9OICBBREMgaW5zdGFuY2UgLSBSZXNvbHV0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fMTJCICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAvKiE8IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fMTBCICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX1JFU18wKSAvKiE8IEFEQyByZXNvbHV0aW9uIDEwIGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fOEIgICAgICAgICAgICAgICAoQURDX0NGR1IxX1JFU18xICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyByZXNvbHV0aW9uICA4IGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fNkIgICAgICAgICAgICAgICAoQURDX0NGR1IxX1JFU18xIHwgQURDX0NGR1IxX1JFU18wKSAvKiE8IEFEQyByZXNvbHV0aW9uICA2IGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0RBVEFfQUxJR04gIEFEQyBpbnN0YW5jZSAtIERhdGEgYWxpZ25tZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0RBVEFfQUxJR05fUklHSFQgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKS8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQ6IHJpZ2h0IGFsaWduZWQgKGFsaWdubWVudCBvbiBkYXRhIHJlZ2lzdGVyIExTQiBiaXQgMCkqLworI2RlZmluZSBMTF9BRENfREFUQV9BTElHTl9MRUZUICAgICAgICAgICAgIChBRENfQ0ZHUjFfQUxJR04pICAgICAgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogbGVmdCBhbGlnbmVkIChhbGlnbWVudCBvbiBkYXRhIHJlZ2lzdGVyIE1TQiBiaXQgMTUpKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0xQX01PREUgIEFEQyBpbnN0YW5jZSAtIExvdyBwb3dlciBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0xQX01PREVfTk9ORSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAvKiE8IE5vIEFEQyBsb3cgcG93ZXIgbW9kZSBhY3RpdmF0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0xQX0FVVE9XQUlUICAgICAgICAgICAgICAgICAoQURDX0NGR1IxX1dBSVQpICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBsb3cgcG93ZXIgbW9kZSBhdXRvIGRlbGF5OiBEeW5hbWljIGxvdyBwb3dlciBtb2RlLCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBvbmx5IHdoZW4gbmVjZXNzYXJ5ICh3aGVuIHByZXZpb3VzIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgcmVhZCkuIFNlZSBkZXNjcmlwdGlvbiB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLworI2RlZmluZSBMTF9BRENfTFBfQVVUT1BPV0VST0ZGICAgICAgICAgICAgIChBRENfQ0ZHUjFfQVVUT0ZGKSAgICAgICAgICAgICAgICAgIC8qITwgQURDIGxvdyBwb3dlciBtb2RlIGF1dG8gcG93ZXItb2ZmOiB0aGUgQURDIGF1dG9tYXRpY2FsbHkgcG93ZXJzLW9mZiBhZnRlciBhIEFEQyBjb252ZXJzaW9uIGFuZCBhdXRvbWF0aWNhbGx5IHdha2VzIHVwIHdoZW4gYSBuZXcgQURDIGNvbnZlcnNpb24gaXMgdHJpZ2dlcmVkICh3aXRoIHN0YXJ0dXAgdGltZSBiZXR3ZWVuIHRyaWdnZXIgYW5kIHN0YXJ0IG9mIHNhbXBsaW5nKS4gU2VlIGRlc2NyaXB0aW9uIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0TG93UG93ZXJNb2RlKCkuICovCisjZGVmaW5lIExMX0FEQ19MUF9BVVRPV0FJVF9BVVRPUE9XRVJPRkYgICAgKEFEQ19DRkdSMV9XQUlUIHwgQURDX0NGR1IxX0FVVE9GRikgLyohPCBBREMgbG93IHBvd2VyIG1vZGVzIGF1dG8gd2FpdCBhbmQgYXV0byBwb3dlci1vZmYgY29tYmluZWQuIFNlZSBkZXNjcmlwdGlvbiB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfR1JPVVBTICBBREMgaW5zdGFuY2UgLSBHcm91cHMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfR1JPVVBfUkVHVUxBUiAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgKGF2YWlsYWJsZSBvbiBhbGwgU1RNMzIgZGV2aWNlcykgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NIQU5ORUwgIEFEQyBpbnN0YW5jZSAtIENoYW5uZWwgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMCAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMF9OVU1CRVIgIHwgQURDX0NIQU5ORUxfMF9CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMCAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMV9OVU1CRVIgIHwgQURDX0NIQU5ORUxfMV9CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMl9OVU1CRVIgIHwgQURDX0NIQU5ORUxfMl9CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfM19OVU1CRVIgIHwgQURDX0NIQU5ORUxfM19CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMyAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfNF9OVU1CRVIgIHwgQURDX0NIQU5ORUxfNF9CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfNV9OVU1CRVIgIHwgQURDX0NIQU5ORUxfNV9CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfNiAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfNl9OVU1CRVIgIHwgQURDX0NIQU5ORUxfNl9CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONiAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfNyAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfN19OVU1CRVIgIHwgQURDX0NIQU5ORUxfN19CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONyAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfOCAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfOF9OVU1CRVIgIHwgQURDX0NIQU5ORUxfOF9CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfOSAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfOV9OVU1CRVIgIHwgQURDX0NIQU5ORUxfOV9CSVRGSUVMRCApIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOSAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMTBfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTBfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTAgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTEgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMTFfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTFfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTEgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTIgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMTJfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTJfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTIgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTMgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMTNfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTNfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTMgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTQgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMTRfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTRfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTQgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMTVfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTVfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTUgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTcgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMTdfTlVNQkVSIHwgQURDX0NIQU5ORUxfMTdfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTcgKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfMTggICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfMThfTlVNQkVSIHwgQURDX0NIQU5ORUxfMThfQklURklFTEQpIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTggKi8KKyNkZWZpbmUgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMTcgfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCkgIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xOCB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVGVtcGVyYXR1cmUgc2Vuc29yLiAqLworI2lmIGRlZmluZWQoQURDX0NDUl9WTENERU4pCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMXzE2ICAgICAgICAgICAgICAgICAgKEFEQ19DSEFOTkVMXzE2X05VTUJFUiB8IEFEQ19DSEFOTkVMXzE2X0JJVEZJRUxEKSAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE2ICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZMQ0QgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE2IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0gpICAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWbGNkOiBWbGNkIHZvbHRhZ2UgdGhyb3VnaCBhIGRpdmlkZXIgbGFkZGVyIG9mIGZhY3RvciAxLzQsIDEvMyBvciAxLzIgKHNldCBieSBMQ0Qgdm9sdGFnZSBnZW5lcmF0b3IgYmlhc2luZyksICB0byBoYXZlIFZsY2QgYWx3YXlzIGJlbG93IFZkZGEuICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19UUklHR0VSX1NPVVJDRSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBUcmlnZ2VyIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBpbnRlcm5hbDogU1cgc3RhcnQuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPICAgICAgKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTYgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yMV9DSDIgICAgICAoQURDX0NGR1IxX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMjEgY2hhbm5lbCAyIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTyAgICAgIChBRENfQ0ZHUjFfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDQgICAgICAgKEFEQ19DRkdSMV9FWFRTRUxfMSB8IEFEQ19DRkdSMV9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIyX1RSR08gICAgIChBRENfQ0ZHUjFfRVhUU0VMXzIgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yMiBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgIChBRENfQ0ZHUjFfRVhUU0VMXzIgfCBBRENfQ0ZHUjFfRVhUU0VMXzEgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0zIFRSRzAuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEgICAgKEFEQ19DRkdSMV9FWFRTRUxfMiB8IEFEQ19DRkdSMV9FWFRTRUxfMSB8IEFEQ19DRkdSMV9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IGV4dGVybmFsIGludGVycnVwdCBsaW5lIDExLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworCisvKiBBREMgZ3JvdXAgcmVndWxhciBleHRlcm5hbCB0cmlnZ2VyIFRJTTJfQ0MzIGF2YWlsYWJsZSBvbmx5IG9uICAgICAgICAgICAgICAqLworLyogU1RNMzJMMCBkZXZpY2VzIGNhdGVnb3JpZXM6IENhdC4xLCBDYXQuMiwgQ2F0LjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwMTF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDIxeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwMzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDQxeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBcCisgICAgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDAxMHg2KSB8fCBkZWZpbmVkIChTVE0zMkwwMTB4OCkgfHwgZGVmaW5lZCAoU1RNMzJMMDEweEIpCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMgICAgICAgKEFEQ19DRkdSMV9FWFRTRUxfMiB8IEFEQ19DRkdSMV9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2VuZGlmCisKKy8qIEFEQyBncm91cCByZWd1bGFyIGV4dGVybmFsIHRyaWdnZXIgVElNMjFfVFJHTyBhdmFpbGFibGUgb25seSBvbiAgICAgICAgICAgICovCisvKiBTVE0zMkwwIGRldmljZXMgY2F0ZWdvcmllczogQ2F0LjIsIENhdC4zLCBDYXQuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQgKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDA1MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNTJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDUzeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwNjF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2M3h4KSB8fCBcCisgICAgZGVmaW5lZCAoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwMTB4NikgfHwgZGVmaW5lZCAoU1RNMzJMMDEweDgpIHx8IGRlZmluZWQgKFNUTTMyTDAxMHhCKQorI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIxX1RSR08gICAgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIyX1RSR08pCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1RSSUdHRVJfRURHRSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBUcmlnZ2VyIGVkZ2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lORyAgICAgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9FWFRFTl8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9GQUxMSU5HICAgICAgICAoQURDX0NGR1IxX0VYVEVOXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcgIChBRENfQ0ZHUjFfRVhURU5fMSB8IEFEQ19DRkdSMV9FWFRFTl8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19DT05USU5VT1VTX01PREUgIEFEQyBncm91cCByZWd1bGFyIC0gQ29udGludW91cyBtb2RlCisqIEB7CisqLworI2RlZmluZSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gc2luZ2xlIG1vZGU6IG9uZSBjb252ZXJzaW9uIHBlciB0cmlnZ2VyICovCisjZGVmaW5lIExMX0FEQ19SRUdfQ09OVl9DT05USU5VT1VTICAgICAgICAgKEFEQ19DRkdSMV9DT05UKSAgICAgICAgLyohPCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBjb250aW51b3VzIG1vZGU6IGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19ETUFfVFJBTlNGRVIgIEFEQyBncm91cCByZWd1bGFyIC0gRE1BIHRyYW5zZmVyIG9mIEFEQyBjb252ZXJzaW9uIGRhdGEKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAvKiE8IEFEQyBjb252ZXJzaW9ucyBhcmUgbm90IHRyYW5zZmVycmVkIGJ5IERNQSAqLworI2RlZmluZSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVEICAgICggICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0RNQUVOKSAvKiE8IEFEQyBjb252ZXJzaW9uIGRhdGEgYXJlIHRyYW5zZmVycmVkIGJ5IERNQSwgaW4gbGltaXRlZCBtb2RlIChvbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkIHdoZW4gbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykgaXMgcmVhY2hlZC4gVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLiAqLworI2RlZmluZSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9VTkxJTUlURUQgIChBRENfQ0ZHUjFfRE1BQ0ZHIHwgQURDX0NGR1IxX0RNQUVOKSAvKiE8IEFEQyBjb252ZXJzaW9uIGRhdGEgYXJlIHRyYW5zZmVycmVkIGJ5IERNQSwgaW4gdW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLCB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJyZWQgKG51bWJlciBvZiBBREMgY29udmVyc2lvbnMpLiBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19PVlJfREFUQV9CRUhBVklPUiAgQURDIGdyb3VwIHJlZ3VsYXIgLSBPdmVycnVuIGJlaGF2aW9yIG9uIGNvbnZlcnNpb24gZGF0YQorKiBAeworKi8KKyNkZWZpbmUgTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKS8qITwgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOiBkYXRhIHByZXNlcnZlZCAqLworI2RlZmluZSBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOICAgIChBRENfQ0ZHUjFfT1ZSTU9EKSAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46IGRhdGEgb3ZlcndyaXR0ZW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19TRVFfU0NBTl9ESVJFQ1RJT04gIEFEQyBncm91cCByZWd1bGFyIC0gU2VxdWVuY2VyIHNjYW4gZGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9ESVJfRk9SV0FSRCAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKS8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHNjYW4gZGlyZWN0aW9uIGZvcndhcmQ6IGZyb20gbG93ZXN0IGNoYW5uZWwgbnVtYmVyIHRvIGhpZ2hlc3QgY2hhbm5lbCBudW1iZXIgKHNjYW4gb2YgYWxsIHJhbmtzLCBBREMgY29udmVyc2lvbiBvZiByYW5rcyB3aXRoIGNoYW5uZWxzIGVuYWJsZWQgaW4gc2VxdWVuY2VyKS4gT24gc29tZSBvdGhlciBTVE0zMiBmYW1pbGllcywgdGhpcyBzZXR0aW5nIGlzIG5vdCBhdmFpbGFibGUgYW5kIHRoZSBkZWZhdWx0IHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQuICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRElSX0JBQ0tXQVJEICAgKEFEQ19DRkdSMV9TQ0FORElSKSAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBzY2FuIGRpcmVjdGlvbiBiYWNrd2FyZDogZnJvbSBoaWdoZXN0IGNoYW5uZWwgbnVtYmVyIHRvIGxvd2VzdCBjaGFubmVsIG51bWJlciAoc2NhbiBvZiBhbGwgcmFua3MsIEFEQyBjb252ZXJzaW9uIG9mIHJhbmtzIHdpdGggY2hhbm5lbHMgZW5hYmxlZCBpbiBzZXF1ZW5jZXIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LICAgICAgIChBRENfQ0ZHUjFfRElTQ0VOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgcmFuayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUgIENoYW5uZWwgLSBTYW1wbGluZyB0aW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8xQ1lDTEVfNSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgMS41IEFEQyBjbG9jayBjeWNsZSAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzNDWUNMRVNfNSAgICAgIChBRENfU01QUl9TTVBfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSAzLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzdDWUNMRVNfNSAgICAgIChBRENfU01QUl9TTVBfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSA3LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzEyQ1lDTEVTXzUgICAgIChBRENfU01QUl9TTVBfMSB8IEFEQ19TTVBSX1NNUF8wKSAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSAxMi41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8xOUNZQ0xFU181ICAgICAoQURDX1NNUFJfU01QXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgMTkuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfMzlDWUNMRVNfNSAgICAgKEFEQ19TTVBSX1NNUF8yIHwgQURDX1NNUFJfU01QXzApICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIDM5LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzc5Q1lDTEVTXzUgICAgIChBRENfU01QUl9TTVBfMiB8IEFEQ19TTVBSX1NNUF8xKSAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSA3OS41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8xNjBDWUNMRVNfNSAgICAoQURDX1NNUFJfU01QXzIgfCBBRENfU01QUl9TTVBfMSB8IEFEQ19TTVBSX1NNUF8wKSAgICAvKiE8IFNhbXBsaW5nIHRpbWUgMTYwLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX05VTUJFUiBBbmFsb2cgd2F0Y2hkb2cgLSBBbmFsb2cgd2F0Y2hkb2cgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0FXRDEgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0FXRF9DUjFfQ0hBTk5FTF9NQVNLICB8IEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAxICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19BV0RfQ0hBTk5FTFMgIEFuYWxvZyB3YXRjaGRvZyAtIE1vbml0b3JlZCBjaGFubmVscworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19BV0RfRElTQUJMRSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIGRpc2FibGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRyAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdERU4gICAgICAgICAgICAgICAgICAgKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIGFsbCBjaGFubmVscywgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUcgICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfMCAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgIHwgQURDX0NGR1IxX0FXREVOIHwgQURDX0NGR1IxX0FXRFNHTCkgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4wLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzIgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0RFTiB8IEFEQ19DRkdSMV9BV0RTR0wpICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUcgICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfMyAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgIHwgQURDX0NGR1IxX0FXREVOIHwgQURDX0NGR1IxX0FXRFNHTCkgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4zLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF80ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjQsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzUgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0RFTiB8IEFEQ19DRkdSMV9BV0RTR0wpICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUcgICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfNiAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgIHwgQURDX0NGR1IxX0FXREVOIHwgQURDX0NGR1IxX0FXRFNHTCkgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU42LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF83ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjcsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzggICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0RFTiB8IEFEQ19DRkdSMV9BV0RTR0wpICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUcgICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfOSAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgIHwgQURDX0NGR1IxX0FXREVOIHwgQURDX0NGR1IxX0FXRFNHTCkgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU45LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEwLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNyAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xOCAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE4LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUjFfQVdERU4gfCBBRENfQ0ZHUjFfQVdEU0dMKSAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWcmVmSW50OiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfUkVHICAgICAgICgoTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1IxX0FXREVOIHwgQURDX0NGR1IxX0FXRFNHTCkgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVGVtcGVyYXR1cmUgc2Vuc29yLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjaWYgZGVmaW5lZChBRENfQ0NSX1ZMQ0RFTikKKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE2ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0RFTiB8IEFEQ19DRkdSMV9BV0RTR0wpICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTYsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WTENEX1JFRyAgICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMX1ZMQ0QgICAgICAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSMV9BV0RFTiB8IEFEQ19DRkdSMV9BV0RTR0wpICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZiYXQvMzogVmJhdCB2b2x0YWdlIHRocm91Z2ggYSBkaXZpZGVyIGxhZGRlciBvZiBmYWN0b3IgMS8zIHRvIGhhdmUgVmJhdCBhbHdheXMgYmVsb3cgVmRkYSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19BV0RfVEhSRVNIT0xEUyAgQW5hbG9nIHdhdGNoZG9nIC0gVGhyZXNob2xkcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0ggICAgICAgICAgKEFEQ19UUl9IVCAgICAgICAgICAgICkgICAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCAqLworI2RlZmluZSBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cgICAgICAgICAgICggICAgICAgICAgICBBRENfVFJfTFQpICAgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGxvdyAqLworI2RlZmluZSBMTF9BRENfQVdEX1RIUkVTSE9MRFNfSElHSF9MT1cgICAgIChBRENfVFJfSFQgfCBBRENfVFJfTFQpICAgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgYm90aCB0aHJlc2hvbGRzIGhpZ2ggYW5kIGxvdyBjb25jYXRlbmF0ZWQgaW50byB0aGUgc2FtZSBkYXRhICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PVlNfU0NPUEUgIE92ZXJzYW1wbGluZyAtIE92ZXJzYW1wbGluZyBzY29wZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19PVlNfRElTQUJMRSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgb3ZlcnNhbXBsaW5nIGRpc2FibGVkLiAqLworI2RlZmluZSBMTF9BRENfT1ZTX0dSUF9SRUdVTEFSX0NPTlRJTlVFRCAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTRSkgIC8qITwgQURDIG92ZXJzYW1wbGluZyBvbiBjb252ZXJzaW9ucyBvZiBBREMgZ3JvdXAgcmVndWxhci4gTGl0ZXJhbCBzdWZmaXggImNvbnRpbnVlZCIgaXMga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFNUTTMyIGRldmljZXMgZmVhdHVyaW5nIEFEQyBncm91cCBpbmplY3RlZCwgaW4gdGhpcyBjYXNlIG90aGVyIG92ZXJzYW1wbGluZyBzY29wZSBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PVlNfRElTQ09OVF9NT0RFICBPdmVyc2FtcGxpbmcgLSBEaXNjb250aW51b3VzIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JFR19DT05UICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpLyohPCBBREMgb3ZlcnNhbXBsaW5nIGRpc2NvbnRpbnVvdXMgbW9kZTogY29udGludW91cyBtb2RlIChhbGwgY29udmVyc2lvbnMgb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvIGFyZSBkb25lIGZyb20gMSB0cmlnZ2VyKSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JFR19ESVNDT05UICAgICAgICAgICAgIChBRENfQ0ZHUjJfVE9WUykgICAgICAgLyohPCBBREMgb3ZlcnNhbXBsaW5nIGRpc2NvbnRpbnVvdXMgbW9kZTogZGlzY29udGludW91cyBtb2RlIChlYWNoIGNvbnZlcnNpb24gb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvIG5lZWRzIGEgdHJpZ2dlcikgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX09WU19SQVRJTyAgT3ZlcnNhbXBsaW5nIC0gUmF0aW8KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzIgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAyICgyIEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzQgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNSXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiA0ICg0IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzggICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1JfMSAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiA4ICg4IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzE2ICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1JfMSB8IEFEQ19DRkdSMl9PVlNSXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAxNiAoMTYgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fMzIgICAgICAgICAgICAgICAgKEFEQ19DRkdSMl9PVlNSXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDMyICgzMiBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT182NCAgICAgICAgICAgICAgICAoQURDX0NGR1IyX09WU1JfMiAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgNjQgKDY0IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzEyOCAgICAgICAgICAgICAgIChBRENfQ0ZHUjJfT1ZTUl8yIHwgQURDX0NGR1IyX09WU1JfMSAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAxMjggKDEyOCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT18yNTYgICAgICAgICAgICAgICAoQURDX0NGR1IyX09WU1JfMiB8IEFEQ19DRkdSMl9PVlNSXzEgfCBBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMjU2ICgyNTYgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PVlNfU0hJRlQgIE92ZXJzYW1wbGluZyAtIERhdGEgc2hpZnQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX05PTkUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgbm8gc2hpZnQgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgbm90IGRpdmlkZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF8xICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDEgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAyIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMiAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1NfMSAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAyIChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgNCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzMgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTXzEgfCBBRENfQ0ZHUjJfT1ZTU18wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgMyAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDggdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF80ICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDQgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAxNiB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzUgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1NfMiAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjJfT1ZTU18wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNSAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDMyIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNiAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTU18yIHwgQURDX0NGR1IyX09WU1NfMSAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA2IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgNjQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF83ICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTXzIgfCBBRENfQ0ZHUjJfT1ZTU18xIHwgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDcgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAxMjggdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF84ICAgICAgICAgICAoQURDX0NGR1IyX09WU1NfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDggKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAyNTYgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSFdfREVMQVlTICBEZWZpbml0aW9ucyBvZiBBREMgaGFyZHdhcmUgY29uc3RyYWludHMgZGVsYXlzCisgICogQG5vdGUgICBPbmx5IEFEQyBwZXJpcGhlcmFsIEhXIGRlbGF5cyBhcmUgZGVmaW5lZCBpbiBBREMgTEwgZHJpdmVyIGRyaXZlciwKKyAgKiAgICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlcy4KKyAgKiAgICAgICAgIEZvciBkZXRhaWxzIG9uIGRlbGF5cyB2YWx1ZXMsIHJlZmVyIHRvIGRlc2NyaXB0aW9ucyBpbiBzb3VyY2UgY29kZQorICAqICAgICAgICAgYWJvdmUgZWFjaCBsaXRlcmFsIGRlZmluaXRpb24uCisgICogQHsKKyAgKi8KKyAgCisvKiBOb3RlOiBPbmx5IEFEQyBwZXJpcGhlcmFsIEhXIGRlbGF5cyBhcmUgZGVmaW5lZCBpbiBBREMgTEwgZHJpdmVyIGRyaXZlciwgICAqLworLyogICAgICAgbm90IHRpbWVvdXQgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFRpbWVvdXQgdmFsdWVzIGZvciBBREMgb3BlcmF0aW9ucyBhcmUgZGVwZW5kZW50IHRvIGRldmljZSBjbG9jayAgICAgICovCisvKiAgICAgICBjb25maWd1cmF0aW9uIChzeXN0ZW0gY2xvY2sgdmVyc3VzIEFEQyBjbG9jayksICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGRlZmluZWQgaW4gdXNlciBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEluZGljYXRpb25zIGZvciBlc3RpbWF0aW9uIG9mIEFEQyB0aW1lb3V0IGRlbGF5cywgZm9yIHRoaXMgICAgICAgICAgICovCisvKiAgICAgICBTVE0zMiBzZXJpZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgLSBBREMgY2FsaWJyYXRpb24gdGltZTogbWF4aW11bSBkZWxheSBpcyA4My9mQURDLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAidENBTCIpICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIEFEQyBlbmFibGUgdGltZTogbWF4aW11bSBkZWxheSBpcyAxIGNvbnZlcnNpb24gY3ljbGUuICAgICAgICAgICAgICAqLworLyogICAgICAgICAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U1RBQiIpICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIC0gQURDIGRpc2FibGUgdGltZTogbWF4aW11bSBkZWxheSBzaG91bGQgYmUgYSBmZXcgQURDIGNsb2NrIGN5Y2xlcyAgICovCisvKiAgICAgICAtIEFEQyBzdG9wIGNvbnZlcnNpb24gdGltZTogbWF4aW11bSBkZWxheSBzaG91bGQgYmUgYSBmZXcgQURDIGNsb2NrICAqLworLyogICAgICAgICBjeWNsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIC0gQURDIGNvbnZlcnNpb24gdGltZTogZHVyYXRpb24gZGVwZW5kaW5nIG9uIEFEQyBjbG9jayBhbmQgQURDICAgICAgICovCisvKiAgICAgICAgIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAocmVmZXIgdG8gZGV2aWNlIHJlZmVyZW5jZSBtYW51YWwsIHNlY3Rpb24gIlRpbWluZyIpICAgICAgICAgICAgICAgKi8KKworLyogRGVsYXkgZm9yIEFEQyBzdGFiaWxpemF0aW9uIHRpbWUgKEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBzdGFydC11cCB0aW1lKSAgICAgKi8KKy8qIERlbGF5IHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRVUF9MRE8iKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfREVMQVlfSU5URVJOQUxfUkVHVUxfU1RBQl9VUyAoKHVpbnQzMl90KSAgMTBVKSAgLyohPCBEZWxheSBmb3IgQURDIHN0YWJpbGl6YXRpb24gdGltZSAoQURDIHZvbHRhZ2UgcmVndWxhdG9yIHN0YXJ0LXVwIHRpbWUpICovCisKKy8qIERlbGF5IGZvciBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBzdGFiaWxpemF0aW9uIHRpbWUuICAgICAgICAgICAgICAgICAgICovCisvKiBEZWxheSBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJUQURDX0JVRiIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19ERUxBWV9WUkVGSU5UX1NUQUJfVVMgICAgICAgKCh1aW50MzJfdCkgIDEwVSkgIC8qITwgRGVsYXkgZm9yIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIHN0YWJpbGl6YXRpb24gdGltZSAqLworCisvKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidFNUQVJUIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTICAgICgodWludDMyX3QpICAxMFUpICAvKiE8IERlbGF5IGZvciB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lICovCisKKy8qIERlbGF5IHJlcXVpcmVkIGJldHdlZW4gQURDIGVuZCBvZiBjYWxpYnJhdGlvbiBhbmQgQURDIGVuYWJsZS4gICAgICAgICAgICAgICovCisvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBhIG1pbmltdW0gbnVtYmVyIG9mIEFEQyBjbG9jayBjeWNsZXMgICAgICAgICAgICAqLworLyogICAgICAgYXJlIHJlcXVpcmVkIGJldHdlZW4gQURDIGVuZCBvZiBjYWxpYnJhdGlvbiBhbmQgQURDIGVuYWJsZS4gICAgICAgICAgKi8KKy8qICAgICAgIFdhaXQgdGltZSBjYW4gYmUgY29tcHV0ZWQgaW4gdXNlciBhcHBsaWNhdGlvbiBieSB3YWl0aW5nIGZvciB0aGUgICAgICovCisvKiAgICAgICBlcXVpdmFsZW50IG51bWJlciBvZiBDUFUgY3ljbGVzLCBieSB0YWtpbmcgaW50byBhY2NvdW50ICAgICAgICAgICAgICAqLworLyogICAgICAgcmF0aW8gb2YgQ1BVIGNsb2NrIHZlcnN1cyBBREMgY2xvY2sgcHJlc2NhbGVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19ERUxBWV9DQUxJQl9FTkFCTEVfQURDX0NZQ0xFUyAoKHVpbnQzMl90KSAyVSkgIC8qITwgRGVsYXkgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0V4cG9ydGVkX01hY3JvcyBBREMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gd3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBBREMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBBREMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0FEQ19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEFEQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEFEQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9BRENfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VNX0hFTFBFUl9NQUNSTyBBREMgaGVscGVyIG1hY3JvCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IEFEQyBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdAorICAqICAgICAgICAgZnJvbSBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LgorICAqIEBub3RlICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKExMX0FEQ19DSEFOTkVMXzQpCisgICogICAgICAgICAgIHdpbGwgcmV0dXJuIGRlY2ltYWwgbnVtYmVyICI0Ii4KKyAgKiBAbm90ZSAgIFRoZSBpbnB1dCBjYW4gYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwKKyAgKiAgICAgICAgIG51bWJlciBpcyByZXR1cm5lZCwgZWl0aGVyIGRlZmluZWQgd2l0aCBudW1iZXIKKyAgKiAgICAgICAgIG9yIHdpdGggYml0ZmllbGQgKG9ubHkgb25lIGJpdCBtdXN0IGJlIHNldCkuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZMQ0QgICAgICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkwwLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogb25seSBvbiBTVE0zMkwwNTN4eCwgU1RNMzJMMDYzeHgsIFNUTTMyTDA3M3h4LCBTVE0zMkwwODN4eC4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MTgKKyAgKi8KKyNpZiBkZWZpbmVkKEFEQ19DQ1JfVkxDREVOKQorI2RlZmluZSBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSykgPT0gMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spID4+IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwwKSA9PSBBRENfQ0hTRUxSX0NIU0VMMCkgPyAoMFUpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDEpID09IEFEQ19DSFNFTFJfQ0hTRUwxKSA/ICgxVSkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMikgPT0gQURDX0NIU0VMUl9DSFNFTDIpID8gKDJVKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwzKSA9PSBBRENfQ0hTRUxSX0NIU0VMMykgPyAoM1UpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDQpID09IEFEQ19DSFNFTFJfQ0hTRUw0KSA/ICg0VSkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMNSkgPT0gQURDX0NIU0VMUl9DSFNFTDUpID8gKDVVKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUw2KSA9PSBBRENfQ0hTRUxSX0NIU0VMNikgPyAoNlUpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDcpID09IEFEQ19DSFNFTFJfQ0hTRUw3KSA/ICg3VSkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMOCkgPT0gQURDX0NIU0VMUl9DSFNFTDgpID8gKDhVKSA6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUw5KSA9PSBBRENfQ0hTRUxSX0NIU0VMOSkgPyAoOVUpIDogICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDEwKSA9PSBBRENfQ0hTRUxSX0NIU0VMMTApID8gKDEwVSkgOiAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMTEpID09IEFEQ19DSFNFTFJfQ0hTRUwxMSkgPyAoMTFVKSA6ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxMikgPT0gQURDX0NIU0VMUl9DSFNFTDEyKSA/ICgxMlUpIDogICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDEzKSA9PSBBRENfQ0hTRUxSX0NIU0VMMTMpID8gKDEzVSkgOiAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMTQpID09IEFEQ19DSFNFTFJfQ0hTRUwxNCkgPyAoMTRVKSA6ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxNSkgPT0gQURDX0NIU0VMUl9DSFNFTDE1KSA/ICgxNVUpIDogICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDE2KSA9PSBBRENfQ0hTRUxSX0NIU0VMMTYpID8gKDE2VSkgOiAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMTcpID09IEFEQ19DSFNFTFJfQ0hTRUwxNykgPyAoMTdVKSA6ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxOCkgPT0gQURDX0NIU0VMUl9DSFNFTDE4KSA/ICgxOFUpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2Vsc2UKKyNkZWZpbmUgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0spID09IDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMCkgPT0gQURDX0NIU0VMUl9DSFNFTDApID8gKDBVKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxKSA9PSBBRENfQ0hTRUxSX0NIU0VMMSkgPyAoMVUpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDIpID09IEFEQ19DSFNFTFJfQ0hTRUwyKSA/ICgyVSkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMykgPT0gQURDX0NIU0VMUl9DSFNFTDMpID8gKDNVKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUw0KSA9PSBBRENfQ0hTRUxSX0NIU0VMNCkgPyAoNFUpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDUpID09IEFEQ19DSFNFTFJfQ0hTRUw1KSA/ICg1VSkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMNikgPT0gQURDX0NIU0VMUl9DSFNFTDYpID8gKDZVKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUw3KSA9PSBBRENfQ0hTRUxSX0NIU0VMNykgPyAoN1UpIDogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDgpID09IEFEQ19DSFNFTFJfQ0hTRUw4KSA/ICg4VSkgOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMOSkgPT0gQURDX0NIU0VMUl9DSFNFTDkpID8gKDlVKSA6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxMCkgPT0gQURDX0NIU0VMUl9DSFNFTDEwKSA/ICgxMFUpIDogICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDExKSA9PSBBRENfQ0hTRUxSX0NIU0VMMTEpID8gKDExVSkgOiAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMTIpID09IEFEQ19DSFNFTFJfQ0hTRUwxMikgPyAoMTJVKSA6ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxMykgPT0gQURDX0NIU0VMUl9DSFNFTDEzKSA/ICgxM1UpIDogICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDE0KSA9PSBBRENfQ0hTRUxSX0NIU0VMMTQpID8gKDE0VSkgOiAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMTUpID09IEFEQ19DSFNFTFJfQ0hTRUwxNSkgPyAoMTVVKSA6ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxNykgPT0gQURDX0NIU0VMUl9DSFNFTDE3KSA/ICgxN1UpIDogICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDE4KSA9PSBBRENfQ0hTRUxSX0NIU0VMMTgpID8gKDE4VSkgOiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgQURDIGNoYW5uZWwgaW4gbGl0ZXJhbCBmb3JtYXQgTExfQURDX0NIQU5ORUxfeAorICAqICAgICAgICAgZnJvbSBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQuCisgICogQG5vdGUgICBFeGFtcGxlOgorICAqICAgICAgICAgICBfX0xMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoNCkKKyAgKiAgICAgICAgICAgd2lsbCByZXR1cm4gYSBkYXRhIGVxdWl2YWxlbnQgdG8gIkxMX0FEQ19DSEFOTkVMXzQiLgorICAqIEBwYXJhbSAgX19ERUNJTUFMX05CX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZMQ0QgICAgICAgKDEpKDIpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkwwLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogb25seSBvbiBTVE0zMkwwNTN4eCwgU1RNMzJMMDYzeHgsIFNUTTMyTDA3M3h4LCBTVE0zMkwwODN4eC5cbgorICAqICAgICAgICAgKDIpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sgZnJvbSBBREMgcmVnaXN0ZXIsCisgICogICAgICAgICAgICAgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUKKyAgKiAgICAgICAgICAgICB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuCisgICovCisjZGVmaW5lIF9fTExfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTChfX0RFQ0lNQUxfTkJfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoX19ERUNJTUFMX05CX18pIDw8IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSB8ICAgICAgICAgICAgICAgICBcCisgICAoQURDX0NIU0VMUl9DSFNFTDAgPDwgKF9fREVDSU1BTF9OQl9fKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzZWxlY3RlZCBjaGFubmVsCisgICogICAgICAgICBjb3JyZXNwb25kcyB0byBsaXRlcmFsIGRlZmluaXRpb25zIG9mIGRyaXZlci4KKyAgKiBAbm90ZSAgIFRoZSBkaWZmZXJlbnQgbGl0ZXJhbCBkZWZpbml0aW9ucyBvZiBBREMgY2hhbm5lbHMgYXJlOgorICAqICAgICAgICAgLSBBREMgaW50ZXJuYWwgY2hhbm5lbDoKKyAgKiAgICAgICAgICAgTExfQURDX0NIQU5ORUxfVlJFRklOVCwgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uCisgICogICAgICAgICAtIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluKToKKyAgKiAgICAgICAgICAgTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uCisgICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBsaXRlcmFsCisgICogICAgICAgICBkZWZpbml0aW9uIG9mIGEgQURDIGludGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQsCisgICogICAgICAgICBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SLCAuLi4pLAorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLiksCisgICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbCBudW1iZXIgaXMKKyAgKiAgICAgICAgIHJldHVybmVkIGZyb20gQURDIHJlZ2lzdGVycywKKyAgKiAgICAgICAgIGJlY2F1c2UgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGNoYW5uZWxzIHNoYXJlIHRoZSBzYW1lIGNoYW5uZWwKKyAgKiAgICAgICAgIG51bWJlciBpbiBBREMgcmVnaXN0ZXJzLiBUaGUgZGlmZmVyZW50aWF0aW9uIGlzIG1hZGUgb25seSB3aXRoCisgICogICAgICAgICBwYXJhbWV0ZXJzIGRlZmluaXRpb25zIG9mIGRyaXZlci4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkxDRCAgICAgICAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyTDAsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBvbmx5IG9uIFNUTTMyTDA1M3h4LCBTVE0zMkwwNjN4eCwgU1RNMzJMMDczeHgsIFNUTTMyTDA4M3h4LgorICAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRoZSBjaGFubmVsIGNvcnJlc3BvbmRzIHRvIGEgcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYSBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gYSBHUElPIHBpbikuCisgICogICAgICAgICBWYWx1ZSAiMSIgaWYgdGhlIGNoYW5uZWwgY29ycmVzcG9uZHMgdG8gYSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsLgorICAqLworI2RlZmluZSBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMKF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfTUFTSykgIT0gMFUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgYSBjaGFubmVsIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICB0byBpdHMgZXF1aXZhbGVudCBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBleHRlcm5hbCBjaGFubmVsCisgICogICAgICAgICAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKS4KKyAgKiBAbm90ZSAgIFRoZSBjaGFubmVsIHBhcmFtZXRlciBjYW4gYmUsIGFkZGl0aW9uYWxseSB0byBhIHZhbHVlCisgICogICAgICAgICBkZWZpbmVkIGZyb20gcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbAorICAqICAgICAgICAgKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQsIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLikKKyAgKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcyByZXR1cm5lZAorICAqICAgICAgICAgZnJvbSBBREMgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WTENEICAgICAgICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJMMCwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IG9ubHkgb24gU1RNMzJMMDUzeHgsIFNUTTMyTDA2M3h4LCBTVE0zMkwwNzN4eCwgU1RNMzJMMDgzeHguCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTChfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICBcCisgICgoX19DSEFOTkVMX18pICYgfkFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIX01BU0spCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBpbnRlcm5hbCBjaGFubmVsCisgICogICAgICAgICBzZWxlY3RlZCBpcyBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4KKyAgKiBAbm90ZSAgIFRoZSBjaGFubmVsIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlcgorICAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULAorICAqICAgICAgICAgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIG11c3Qgbm90IGJlIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mCisgICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKQorICAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzCisgICogICAgICAgICByZXR1cm5lZCBmcm9tIEFEQyByZWdpc3RlcnMsCisgICogICAgICAgICBiZWNhdXNlIGludGVybmFsIGFuZCBleHRlcm5hbCBjaGFubmVscyBzaGFyZSB0aGUgc2FtZSBjaGFubmVsCisgICogICAgICAgICBudW1iZXIgaW4gQURDIHJlZ2lzdGVycy4gVGhlIGRpZmZlcmVudGlhdGlvbiBpcyBtYWRlIG9ubHkgd2l0aAorICAqICAgICAgICAgcGFyYW1ldGVycyBkZWZpbml0aW9ucyBvZiBkcml2ZXIuCisgICogQHBhcmFtICBfX0FEQ19JTlNUQU5DRV9fIEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZMQ0QgICAgICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkwwLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogb25seSBvbiBTVE0zMkwwNTN4eCwgU1RNMzJMMDYzeHgsIFNUTTMyTDA3M3h4LCBTVE0zMkwwODN4eC4KKworICAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRoZSBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiB0aGUgaW50ZXJuYWwgY2hhbm5lbCBzZWxlY3RlZCBpcyBhdmFpbGFibGUgb24gdGhlIEFEQyBpbnN0YW5jZSBzZWxlY3RlZC4KKyAgKi8KKyNpZiBkZWZpbmVkKEFEQ19DQ1JfVkxDREVOKQorI2RlZmluZSBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMX0FWQUlMQUJMRShfX0FEQ19JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgIFwKKyAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WTENEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbHNlCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUxfQVZBSUxBQkxFKF9fQURDX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgXAorICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIEFEQyBhbmFsb2cgd2F0Y2hkb2cgcGFyYW1ldGVyOgorICAqICAgICAgICAgZGVmaW5lIGEgc2luZ2xlIGNoYW5uZWwgdG8gbW9uaXRvciB3aXRoIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgZnJvbSBzZXF1ZW5jZXIgY2hhbm5lbCBhbmQgZ3JvdXBzIGRlZmluaXRpb24uCisgICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKCkuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKAorICAqICAgICAgICAgICAgIEFEQzEsIExMX0FEQ19BV0QxLAorICAqICAgICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoTExfQURDX0NIQU5ORUw0LCBMTF9BRENfR1JPVVBfUkVHVUxBUikpCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkxDRCAgICAgICAoMSkoMikKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyTDAsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBvbmx5IG9uIFNUTTMyTDA1M3h4LCBTVE0zMkwwNjN4eCwgU1RNMzJMMDczeHgsIFNUTTMyTDA4M3h4LlxuCisgICogICAgICAgICAoMikgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgICBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICAqICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAgKiBAcGFyYW0gIF9fR1JPVVBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19HUk9VUF9SRUdVTEFSCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHICAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZMQ0RfUkVHICAgICAgICAgICAgICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJMMCwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IG9ubHkgb24gU1RNMzJMMDUzeHgsIFNUTTMyTDA2M3h4LCBTVE0zMkwwNzN4eCwgU1RNMzJMMDgzeHguCisgICovCisjZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoX19DSEFOTkVMX18sIF9fR1JPVVBfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSMV9BV0RFTiB8IEFEQ19DRkdSMV9BV0RTR0wpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNldCB0aGUgdmFsdWUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICAqICAgICAgICAgb3IgbG93IGluIGZ1bmN0aW9uIG9mIEFEQyByZXNvbHV0aW9uLCB3aGVuIEFEQyByZXNvbHV0aW9uIGlzCisgICogICAgICAgICBkaWZmZXJlbnQgb2YgMTIgYml0cy4KKyAgKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoKQorICAqICAgICAgICAgb3IgQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgICogICAgICAgICBFeGFtcGxlLCB3aXRoIGEgQURDIHJlc29sdXRpb24gb2YgOCBiaXRzLCB0byBzZXQgdGhlIHZhbHVlIG9mCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKG9uIDggYml0cyk6CisgICogICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMKKyAgKiAgICAgICAgICAgICg8IEFEQ3ggcGFyYW0gPiwKKyAgKiAgICAgICAgICAgICBfX0xMX0FEQ19BTkFMT0dXRF9TRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oTExfQURDX1JFU09MVVRJT05fOEIsIDx0aHJlc2hvbGRfdmFsdWVfOF9iaXRzPikKKyAgKiAgICAgICAgICAgICk7CisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHBhcmFtICBfX0FXRF9USFJFU0hPTERfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQU5BTE9HV0RfU0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKF9fQURDX1JFU09MVVRJT05fXywgX19BV0RfVEhSRVNIT0xEX18pIFwKKyAgKChfX0FXRF9USFJFU0hPTERfXykgPDwgKChfX0FEQ19SRVNPTFVUSU9OX18pID4+IChBRENfQ0ZHUjFfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVSApKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IHRoZSB2YWx1ZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBoaWdoCisgICogICAgICAgICBvciBsb3cgaW4gZnVuY3Rpb24gb2YgQURDIHJlc29sdXRpb24sIHdoZW4gQURDIHJlc29sdXRpb24gaXMgCisgICogICAgICAgICBkaWZmZXJlbnQgb2YgMTIgYml0cy4KKyAgKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAgKiAgICAgICAgIEV4YW1wbGUsIHdpdGggYSBBREMgcmVzb2x1dGlvbiBvZiA4IGJpdHMsIHRvIGdldCB0aGUgdmFsdWUgb2YKKyAgKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCAob24gOCBiaXRzKToKKyAgKiAgICAgICAgICAgPCB0aHJlc2hvbGRfdmFsdWVfNl9iaXRzID4gPSBfX0xMX0FEQ19BTkFMT0dXRF9HRVRfVEhSRVNIT0xEX1JFU09MVVRJT04KKyAgKiAgICAgICAgICAgIChMTF9BRENfUkVTT0xVVElPTl84QiwKKyAgKiAgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzKDxBREN4IHBhcmFtPiwgTExfQURDX0FXRF9USFJFU0hPTERfSElHSCkKKyAgKiAgICAgICAgICAgICk7CisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHBhcmFtICBfX0FXRF9USFJFU0hPTERfMTJfQklUU19fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworI2RlZmluZSBfX0xMX0FEQ19BTkFMT0dXRF9HRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oX19BRENfUkVTT0xVVElPTl9fLCBfX0FXRF9USFJFU0hPTERfMTJfQklUU19fKSBcCisgICgoX19BV0RfVEhSRVNIT0xEXzEyX0JJVFNfXykgPj4gKChfX0FEQ19SRVNPTFVUSU9OX18pID4+IChBRENfQ0ZHUjFfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVSApKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBoaWdoCisgICogICAgICAgICBvciBsb3cgZnJvbSByYXcgdmFsdWUgY29udGFpbmluZyBib3RoIHRocmVzaG9sZHMgY29uY2F0ZW5hdGVkLgorICAqIEBub3RlICAgVG8gYmUgdXNlZCB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcygpLgorICAqICAgICAgICAgRXhhbXBsZSwgdG8gZ2V0IGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaCBmcm9tIHRoZSByZWdpc3RlciByYXcgdmFsdWU6CisgICogICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX1RIUkVTSE9MRFNfSElHSF9MT1coTExfQURDX0FXRF9USFJFU0hPTERfSElHSCwgPHJhd192YWx1ZV93aXRoX2JvdGhfdGhyZXNob2xkcz4pOworICAqIEBwYXJhbSAgX19BV0RfVEhSRVNIT0xEX1RZUEVfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cKKyAgKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRFNfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCisjZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX1RIUkVTSE9MRFNfSElHSF9MT1coX19BV0RfVEhSRVNIT0xEX1RZUEVfXywgX19BV0RfVEhSRVNIT0xEU19fKSBcCisgICgoKF9fQVdEX1RIUkVTSE9MRF9UWVBFX18pID09IExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKF9fQVdEX1RIUkVTSE9MRFNfXykgJiBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0FXRF9USFJFU0hPTERTX18pID4+IEFEQ19UUl9IVF9CSVRPRkZTRVRfUE9TKSAmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVyAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gc2VsZWN0IHRoZSBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICB0byB3aGljaCBpcyBiZWxvbmdpbmcgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UgY2FuIGJlIHVzZWQgZm9yOgorICAqICAgICAgICAgLSBTZXQgcGFyYW1ldGVycyBjb21tb24gdG8gc2V2ZXJhbCBBREMgaW5zdGFuY2VzCisgICogICAgICAgICAtIE11bHRpbW9kZSAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMpCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAcGFyYW0gIF9fQURDeF9fIEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgQURDIGNvbW1vbiByZWdpc3RlciBpbnN0YW5jZQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoX19BREN4X18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQzFfQ09NTU9OKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjaGVjayBpZiBhbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lCisgICogICAgICAgICBBREMgY29tbW9uIGluc3RhbmNlIGFyZSBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIFRoaXMgY2hlY2sgaXMgcmVxdWlyZWQgYnkgZnVuY3Rpb25zIHdpdGggc2V0dGluZyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9ucyBoYXZpbmcgYXJndW1lbnQgIkFEQ3h5X0NPTU1PTiIgYXMgcGFyYW1ldGVyLgorICAqIEBub3RlICAgT24gZGV2aWNlcyB3aXRoIG9ubHkgMSBBREMgY29tbW9uIGluc3RhbmNlLCBwYXJhbWV0ZXIgb2YgdGhpcyBtYWNybworICAqICAgICAgICAgaXMgdXNlbGVzcyBhbmQgY2FuIGJlIGlnbm9yZWQgKHBhcmFtZXRlciBrZXB0IGZvciBjb21wYXRpYmlsaXR5CisgICogICAgICAgICB3aXRoIGRldmljZXMgZmVhdHVyaW5nIHNldmVyYWwgQURDIGNvbW1vbiBpbnN0YW5jZXMpLgorICAqIEBwYXJhbSAgX19BRENYWV9DT01NT05fXyBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIGFsbCBBREMgaW5zdGFuY2VzIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgYXJlIGRpc2FibGVkLgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIGF0IGxlYXN0IG9uZSBBREMgaW5zdGFuY2Ugc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICBpcyBlbmFibGVkLgorICAqLworI2RlZmluZSBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoX19BRENYWV9DT01NT05fXykgICAgICAgICAgICAgIFwKKyAgTExfQURDX0lzRW5hYmxlZChBREMxKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZWZpbmUgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBkaWdpdGFsCisgICogICAgICAgICB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbi4KKyAgKiBAbm90ZSAgIEFEQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBjb3JyZXNwb25kcyB0byB2b2x0YWdlIHJhbmdlCisgICogICAgICAgICBkZXRlcm1pbmVkIGJ5IGFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZXMgVnJlZisgYW5kIFZyZWYtCisgICogICAgICAgICAocmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHJldHZhbCBBREMgY29udmVyc2lvbiBkYXRhIGVxdWl2YWxlbnQgdm9sdGFnZSB2YWx1ZSAodW5pdDogbVZvbHQpCisgICovCisjZGVmaW5lIF9fTExfQURDX0RJR0lUQUxfU0NBTEUoX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdCkweEZGRlUpID4+ICgoX19BRENfUkVTT0xVVElPTl9fKSA+PiAoQURDX0NGR1IxX1JFU19CSVRPRkZTRVRfUE9TIC0gMVUpKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBmcm9tCisgICogICAgICAgICBhIHJlc29sdXRpb24gdG8gYW5vdGhlciByZXNvbHV0aW9uLgorICAqIEBwYXJhbSAgX19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSB0byBiZSBjb252ZXJ0ZWQgCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXyBSZXNvbHV0aW9uIG9mIHRvIHRoZSBkYXRhIHRvIGJlIGNvbnZlcnRlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX1RBUkdFVF9fIFJlc29sdXRpb24gb2YgdGhlIGRhdGEgYWZ0ZXIgY29udmVyc2lvbgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHJldHZhbCBBREMgY29udmVyc2lvbiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb2x1dGlvbgorICAqLworI2RlZmluZSBfX0xMX0FEQ19DT05WRVJUX0RBVEFfUkVTT0xVVElPTihfX0RBVEFfXywgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18sIF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18pIFwKKyAgKCgoX19EQVRBX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPDwgKChfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXykgPj4gKEFEQ19DRkdSMV9SRVNfQklUT0ZGU0VUX1BPUyAtIDFVKSkpICAgXAorICAgPj4gKChfX0FEQ19SRVNPTFVUSU9OX1RBUkdFVF9fKSA+PiAoQURDX0NGR1IxX1JFU19CSVRPRkZTRVRfUE9TIC0gMVUpKSAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHZvbHRhZ2UgKHVuaXQ6IG1Wb2x0KQorICAqICAgICAgICAgY29ycmVzcG9uZGluZyB0byBhIEFEQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIChyZXNvbHV0aW9uIDEyIGJpdHMpCisgICogICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0FMQ19EQVRBX1RPX1ZPTFRBR0UoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fQURDX0RBVEFfXykgKiAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIC8gX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIGFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispCisgICogICAgICAgICAodW5pdDogbVZvbHQpIGZyb20gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB2b2x0YWdlCisgICogICAgICAgICByZWZlcmVuY2UgVnJlZkludC4KKyAgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIFZyZWZJbnQgY2FsaWJyYXRpb24gdmFsdWUKKyAgKiAgICAgICAgIHN0b3JlZCBpbiBzeXN0ZW0gbWVtb3J5IGZvciBlYWNoIGRldmljZSBkdXJpbmcgcHJvZHVjdGlvbi4KKyAgKiBAbm90ZSAgIFRoaXMgdm9sdGFnZSBkZXBlbmRzIG9uIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQ6IHZvbHRhZ2UgbGV2ZWwKKyAgKiAgICAgICAgIGNvbm5lY3RlZCB0byBwaW4gVnJlZisuCisgICogICAgICAgICBPbiBkZXZpY2VzIHdpdGggc21hbGwgcGFja2FnZSwgdGhlIHBpbiBWcmVmKyBpcyBub3QgcHJlc2VudAorICAqICAgICAgICAgYW5kIGludGVybmFsbHkgYm9uZGVkIHRvIHBpbiBWZGRhLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgY2FsaWJyYXRpb24gZGF0YSBvZiBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZQorICAqICAgICAgICAgVnJlZkludCBjb3JyZXNwb25kcyB0byBhIHJlc29sdXRpb24gb2YgMTIgYml0cywKKyAgKiAgICAgICAgIHRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIEFEQyByZXNvbHV0aW9uIHRvIGNvbnZlcnQgdm9sdGFnZSBvZgorICAqICAgICAgICAgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludC4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBtYWNybyBwZXJmb3JtcyB0aGUgcHJvY2Vzc2luZyB0byBzY2FsZQorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gZGF0YSB0byAxMiBiaXRzLgorICAqIEBwYXJhbSAgX19WUkVGSU5UX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSAocmVzb2x1dGlvbiAxMiBiaXRzKQorICAqICAgICAgICAgb2YgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludCAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHJldHZhbCBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRShfX1ZSRUZJTlRfQURDX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdCkoKlZSRUZJTlRfQ0FMX0FERFIpICogVlJFRklOVF9DQUxfVlJFRikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvIF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKChfX1ZSRUZJTlRfQURDX0RBVEFfXyksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19BRENfUkVTT0xVVElPTl9fKSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1JFU09MVVRJT05fMTJCKSAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBOb3RlOiBPbiBkZXZpY2UgU1RNMzJMMDExLCBjYWxpYnJhdGlvbiBwYXJhbWV0ZXIgVFNfQ0FMMSBpcyBub3QgYXZhaWxhYmxlLiAqLworLyogICAgICAgVGhlcmVmb3JlLCBoZWxwZXIgbWFjcm8gX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRSgpIGlzIG5vdCBhdmFpbGFibGUuKi8KKy8qICAgICAgIFVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoKS4gICAgICAgICovCisvKiBOb3RlOiBPbiBkZXZpY2UgU1RNMzJMMDEweHgsIHRlbXBlcmF0dXJlIHNlbnNvciBpcyBub3QgYXZhaWxhYmxlLiAgICAgICAgICAqLworLyogICAgICAgVGhlcmVmb3JlLCBoZWxwZXIgbWFjcm8gcmVsYXRlZCB0byB0ZW1wZXJhdHVyZSBzZW5zb3IgYXJlICAgICAgICAgICAgKi8KKy8qICAgICAgIG5vdCBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgIWRlZmluZWQoU1RNMzJMMDExeHgpICYmICFkZWZpbmVkKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkKFNUTTMyTDAxMHg0KQorLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSB0ZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpCisgICogICAgICAgICBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLgorICAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgdGVtcGVyYXR1cmUgc2Vuc29yIGNhbGlicmF0aW9uIHZhbHVlcworICAqICAgICAgICAgc3RvcmVkIGluIHN5c3RlbSBtZW1vcnkgZm9yIGVhY2ggZGV2aWNlIGR1cmluZyBwcm9kdWN0aW9uLgorICAqIEBub3RlICAgQ2FsY3VsYXRpb24gZm9ybXVsYToKKyAgKiAgICAgICAgICAgVGVtcGVyYXR1cmUgPSAoKFRTX0FEQ19EQVRBIC0gVFNfQ0FMMSkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICogKFRTX0NBTDJfVEVNUCAtIFRTX0NBTDFfVEVNUCkpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgLyAoVFNfQ0FMMiAtIFRTX0NBTDEpICsgVFNfQ0FMMV9URU1QCisgICogICAgICAgICAgIHdpdGggVFNfQURDX0RBVEEgPSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmF3IGRhdGEgbWVhc3VyZWQgYnkgQURDCisgICogICAgICAgICAgICAgICAgQXZnX1Nsb3BlID0gKFRTX0NBTDIgLSBUU19DQUwxKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKFRTX0NBTDJfVEVNUCAtIFRTX0NBTDFfVEVNUCkKKyAgKiAgICAgICAgICAgICAgICBUU19DQUwxICAgPSBlcXVpdmFsZW50IFRTX0FEQ19EQVRBIGF0IHRlbXBlcmF0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUF9ERUdDX0NBTDEgKGNhbGlicmF0ZWQgaW4gZmFjdG9yeSkKKyAgKiAgICAgICAgICAgICAgICBUU19DQUwyICAgPSBlcXVpdmFsZW50IFRTX0FEQ19EQVRBIGF0IHRlbXBlcmF0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUF9ERUdDX0NBTDIgKGNhbGlicmF0ZWQgaW4gZmFjdG9yeSkKKyAgKiAgICAgICAgIENhdXRpb246IENhbGN1bGF0aW9uIHJlbGV2YW5jeSB1bmRlciByZXNlcnZlIHRoYXQgY2FsaWJyYXRpb24KKyAgKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QgKGFkZHJlc3MgYW5kIGRhdGEpLgorICAqICAgICAgICAgICAgICAgICAgVG8gY2FsY3VsYXRlIHRlbXBlcmF0dXJlIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvcgorICAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzIChnZW5lcmljIHZhbHVlcyBsZXNzLCB0aGVyZWZvcmUKKyAgKiAgICAgICAgICAgICAgICAgIGxlc3MgYWNjdXJhdGUgdGhhbiBjYWxpYnJhdGVkIHZhbHVlcyksCisgICogICAgICAgICAgICAgICAgICB1c2UgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKCkuCisgICogQG5vdGUgICBBcyBjYWxjdWxhdGlvbiBpbnB1dCwgdGhlIGFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUKKyAgKiAgICAgICAgIGRlZmluZWQgYXMgaXQgaW1wYWN0cyB0aGUgQURDIExTQiBlcXVpdmFsZW50IHZvbHRhZ2UuCisgICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tCisgICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudAorICAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgY2FsaWJyYXRpb24gZGF0YSBvZiB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLAorICAqICAgICAgICAgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQURDIHJlc29sdXRpb24gdG8gY29udmVydCB2b2x0YWdlIG9mCisgICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgICogICAgICAgICBPdGhlcndpc2UsIHRoaXMgbWFjcm8gcGVyZm9ybXMgdGhlIHByb2Nlc3NpbmcgdG8gc2NhbGUKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gMTIgYml0cy4KKyAgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fICAgICAgQURDIHJlc29sdXRpb24gYXQgd2hpY2ggaW50ZXJuYWwgdGVtcGVyYXR1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNvciB2b2x0YWdlIGhhcyBiZWVuIG1lYXN1cmVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHJldHZhbCBUZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpCisgICovCisjZGVmaW5lIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkUoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX0FEQ19EQVRBX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKCggKChpbnQzMl90KSgoX19MTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oKF9fVEVNUFNFTlNPUl9BRENfREFUQV9fKSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19BRENfUkVTT0xVVElPTl9fKSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19SRVNPTFVUSU9OXzEyQikgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgKiAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIC8gVEVNUFNFTlNPUl9DQUxfVlJFRkFOQUxPRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAtIChpbnQzMl90KSAqVEVNUFNFTlNPUl9DQUwxX0FERFIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICkgKiAoaW50MzJfdCkoVEVNUFNFTlNPUl9DQUwyX1RFTVAgLSBURU1QU0VOU09SX0NBTDFfVEVNUCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICApIC8gKGludDMyX3QpKChpbnQzMl90KSpURU1QU0VOU09SX0NBTDJfQUREUiAtIChpbnQzMl90KSpURU1QU0VOU09SX0NBTDFfQUREUikgXAorICAgKSArIFRFTVBTRU5TT1JfQ0FMMV9URU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZgorCisvKiBOb3RlOiBPbiBkZXZpY2UgU1RNMzJMMDEweHgsIHRlbXBlcmF0dXJlIHNlbnNvciBpcyBub3QgYXZhaWxhYmxlLiAgICAgICAgICAqLworLyogICAgICAgVGhlcmVmb3JlLCBoZWxwZXIgbWFjcm8gcmVsYXRlZCB0byB0ZW1wZXJhdHVyZSBzZW5zb3IgYXJlICAgICAgICAgICAgKi8KKy8qICAgICAgIG5vdCBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgIWRlZmluZWQoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQoU1RNMzJMMDEweDQpCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKiAgICAgICAgIGZyb20gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IgdHlwaWNhbCB2YWx1ZXMKKyAgKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0KS4KKyAgKiBAbm90ZSAgIENhbGN1bGF0aW9uIGZvcm11bGE6CisgICogICAgICAgICAgIFRlbXBlcmF0dXJlID0gKFRTX1RZUF9DQUx4X1ZPTFQodVYpIC0gVFNfQURDX0RBVEEgKiBDb252ZXJzaW9uX3VWKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIC8gQXZnX1Nsb3BlICsgQ0FMeF9URU1QCisgICogICAgICAgICAgIHdpdGggVFNfQURDX0RBVEEgICAgICA9IHRlbXBlcmF0dXJlIHNlbnNvciByYXcgZGF0YSBtZWFzdXJlZCBieSBBREMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpCisgICogICAgICAgICAgICAgICAgQXZnX1Nsb3BlICAgICAgICA9IHRlbXBlcmF0dXJlIHNlbnNvciBzbG9wZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogdVYvRGVncmVlIENlbHNpdXMpCisgICogICAgICAgICAgICAgICAgVFNfVFlQX0NBTHhfVk9MVCA9IHRlbXBlcmF0dXJlIHNlbnNvciBkaWdpdGFsIHZhbHVlIGF0CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIENBTHhfVEVNUCAodW5pdDogbVYpCisgICogICAgICAgICBDYXV0aW9uOiBDYWxjdWxhdGlvbiByZWxldmFuY3kgdW5kZXIgcmVzZXJ2ZSB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCBkZXZpY2UgaGFzIGNoYXJhY3RlcmlzdGljcyBpbiBsaW5lIHdpdGgKKyAgKiAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCB0eXBpY2FsIHZhbHVlcy4KKyAgKiAgICAgICAgICAgICAgICAgIElmIHRlbXBlcmF0dXJlIHNlbnNvciBjYWxpYnJhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBvbgorICAqICAgICAgICAgICAgICAgICAgb24gdGhpcyBkZXZpY2UgKHByZXNlbmNlIG9mIG1hY3JvIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkUoKSksCisgICogICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiB3aWxsIGJlIG1vcmUgYWNjdXJhdGUgdXNpbmcKKyAgKiAgICAgICAgICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkUoKS4KKyAgKiBAbm90ZSAgIEFzIGNhbGN1bGF0aW9uIGlucHV0LCB0aGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZQorICAqICAgICAgICAgZGVmaW5lZCBhcyBpdCBpbXBhY3RzIHRoZSBBREMgTFNCIGVxdWl2YWxlbnQgdm9sdGFnZS4KKyAgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgICogQG5vdGUgICBBREMgbWVhc3VyZW1lbnQgZGF0YSBtdXN0IGNvcnJlc3BvbmQgdG8gYSByZXNvbHV0aW9uIG9mIDEyYml0cworICAqICAgICAgICAgKGZ1bGwgc2NhbGUgZGlnaXRhbCB2YWx1ZSA0MDk1KS4gSWYgbm90IHRoZSBjYXNlLCB0aGUgZGF0YSBtdXN0IGJlCisgICogICAgICAgICBwcmVsaW1pbmFyaWx5IHJlc2NhbGVkIHRvIGFuIGVxdWl2YWxlbnQgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLgorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fICAgRGV2aWNlIGRhdGFzaGVldCBkYXRhOiBUZW1wZXJhdHVyZSBzZW5zb3Igc2xvcGUgdHlwaWNhbCB2YWx1ZSAodW5pdDogdVYvRGVnQ2Vsc2l1cykuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBTVE0zMkwwLCByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IHBhcmFtZXRlciAiQXZnX1Nsb3BlIi4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18gICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgc2Vuc29yIHZvbHRhZ2UgdHlwaWNhbCB2YWx1ZSAoYXQgdGVtcGVyYXR1cmUgYW5kIFZyZWYrIGRlZmluZWQgaW4gcGFyYW1ldGVycyBiZWxvdykgKHVuaXQ6IG1WKS4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIFNUTTMyTDAsIHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgcGFyYW1ldGVyICJWMTMwIiAoY29ycmVzcG9uZGluZyB0byBUU19DQUwyKS4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyAgICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgYXQgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIHZvbHRhZ2UgKHNlZSBwYXJhbWV0ZXIgYWJvdmUpIGlzIGNvcnJlc3BvbmRpbmcgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgICAgICAgQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykgdm9sdGFnZSAodW5pdDogbVYpCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgVGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX0NBTFhfVEVNUF9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVlJFRkFOQUxPR19WT0xUQUdFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX0FEQ19EQVRBX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgIFwKKyAgKCgoICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKGludDMyX3QpKCgoKF9fVEVNUFNFTlNPUl9BRENfREFUQV9fKSAqIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSkgICAgICAgXAorICAgICAgICAgICAgICAgICAgLyBfX0xMX0FEQ19ESUdJVEFMX1NDQUxFKF9fQURDX1JFU09MVVRJT05fXykpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKiAxMDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChpbnQzMl90KSgoKF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKiAxMDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICkgLyAoX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICkgKyAoX19URU1QU0VOU09SX0NBTFhfVEVNUF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEFEQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9ETUFfTWFuYWdlbWVudCBBREMgRE1BIG1hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyogTm90ZTogTEwgQURDIGZ1bmN0aW9ucyB0byBzZXQgRE1BIHRyYW5zZmVyIGFyZSBsb2NhdGVkIGludG8gc2VjdGlvbnMgb2YgICAgKi8KKy8qICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgQURDIGluc3RhbmNlLCBncm91cHMgYW5kIG11bHRpbW9kZSAoaWYgYXZhaWxhYmxlKTogICovCisvKiAgICAgICBAcmVmIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIoKSwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAYnJpZWYgIEZ1bmN0aW9uIHRvIGhlbHAgdG8gY29uZmlndXJlIERNQSB0cmFuc2ZlciBmcm9tIEFEQzogcmV0cmlldmUgdGhlCisgICogICAgICAgICBBREMgcmVnaXN0ZXIgYWRkcmVzcyBmcm9tIEFEQyBpbnN0YW5jZSBhbmQgYSBsaXN0IG9mIEFEQyByZWdpc3RlcnMKKyAgKiAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgKG1vc3QgY29tbW9ubHkpIHdpdGggRE1BIHRyYW5zZmVyLgorICAqIEBub3RlICAgVGhlc2UgQURDIHJlZ2lzdGVycyBhcmUgZGF0YSByZWdpc3RlcnM6CisgICogICAgICAgICB3aGVuIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgYXZhaWxhYmxlIGluIEFEQyBkYXRhIHJlZ2lzdGVycywKKyAgKiAgICAgICAgIEFEQyBnZW5lcmF0ZXMgYSBETUEgdHJhbnNmZXIgcmVxdWVzdC4KKyAgKiBAbm90ZSAgIFRoaXMgbWFjcm8gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIExMIERNQSBkcml2ZXIsIHJlZmVyIHRvCisgICogICAgICAgICBmdW5jdGlvbiAiTExfRE1BX0NvbmZpZ0FkZHJlc3NlcygpIi4KKyAgKiAgICAgICAgIEV4YW1wbGU6CisgICogICAgICAgICAgIExMX0RNQV9Db25maWdBZGRyZXNzZXMoRE1BMSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9ETUFfQ0hBTk5FTF8xLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19ETUFfR2V0UmVnQWRkcihBREMxLCBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEEpLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmPCBhcnJheSBvciB2YXJpYWJsZSA+LAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSk7CisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDOiBpbiBtdWx0aW1vZGUsIHNvbWUgZGV2aWNlcworICAqICAgICAgICAgdXNlIGEgZGlmZmVyZW50IGRhdGEgcmVnaXN0ZXIgb3V0c2lkZSBvZiBBREMgaW5zdGFuY2Ugc2NvcGUKKyAgKiAgICAgICAgIChjb21tb24gZGF0YSByZWdpc3RlcikuIFRoaXMgbWFjcm8gbWFuYWdlcyB0aGlzIHJlZ2lzdGVyIGRpZmZlcmVuY2UsCisgICogICAgICAgICBvbmx5IEFEQyBpbnN0YW5jZSBoYXMgdG8gYmUgc2V0IGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIERSICAgICAgIERBVEEgICAgICAgICAgIExMX0FEQ19ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlZ2lzdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBCisgICogQHJldHZhbCBBREMgcmVnaXN0ZXIgYWRkcmVzcworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19ETUFfR2V0UmVnQWRkcihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmVnaXN0ZXIpCit7CisgIC8qIFJldHJpZXZlIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgRFIgKi8KKyAgcmV0dXJuICh1aW50MzJfdCkmKEFEQ3gtPkRSKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfQ29tbW9uIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogY29tbW9uIHRvIHNldmVyYWwgQURDIGluc3RhbmNlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IENsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNoZWNrIGNhbiBiZSBkb25lIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfSXNFbmFibGVkKCkgZm9yIGVhY2gKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gaGVscGVyIG1hY3JvCisgICogICAgICAgICBAcmVmIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRSgpLgorICAqIEBybXRvbGwgQ0NSICAgICAgUFJFU0MgICAgICAgICAgTExfQURDX1NldENvbW1vbkNsb2NrCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcGFyYW0gIENvbW1vbkNsb2NrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0ICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjYgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWOCAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMCAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMiAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0ICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4ICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyNTYgKDEpCisgICoKKyAgKiAgICAgICAgICgxKSBBREMgY29tbW9uIGNsb2NrIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgaXMgYXBwbGllZCB0byAKKyAgKiAgICAgICAgICAgICBlYWNoIEFEQyBpbnN0YW5jZSBpZiB0aGUgY29ycmVzcG9uZGluZyBBREMgaW5zdGFuY2UgY2xvY2sgIAorICAqICAgICAgICAgICAgIGlzIHNldCB0byBjbG9jayBzb3VyY2UgYXN5bmNocm9ub3VzLgorICAqICAgICAgICAgICAgIChyZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDbG9jaygpICkuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q29tbW9uQ2xvY2soQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IENvbW1vbkNsb2NrKQoreworICBNT0RJRllfUkVHKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX1BSRVNDLCBDb21tb25DbG9jayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IENsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyLgorICAqIEBybXRvbGwgQ0NSICAgICAgUFJFU0MgICAgICAgICAgTExfQURDX0dldENvbW1vbkNsb2NrCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0ICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjYgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWOCAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMCAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMiAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0ICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4ICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyNTYgKDEpCisgICoKKyAgKiAgICAgICAgICgxKSBBREMgY29tbW9uIGNsb2NrIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgaXMgYXBwbGllZCB0byAKKyAgKiAgICAgICAgICAgICBlYWNoIEFEQyBpbnN0YW5jZSBpZiB0aGUgY29ycmVzcG9uZGluZyBBREMgaW5zdGFuY2UgY2xvY2sgIAorICAqICAgICAgICAgICAgIGlzIHNldCB0byBjbG9jayBzb3VyY2UgYXN5bmNocm9ub3VzLgorICAqICAgICAgICAgICAgIChyZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDbG9jaygpICkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldENvbW1vbkNsb2NrKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9QUkVTQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBDbG9jayBsb3cgZnJlcXVlbmN5IG1vZGUuCisgICogICAgICAgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBhbGlnbm1lbnRzIGZvcm1hdHMKKyAgKiAgICAgICAgIGRlcGVuZGVuY2llcyB0byBBREMgcmVzb2x1dGlvbnMuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDQ1IgICAgICBMRk1FTiAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uRnJlcXVlbmN5TW9kZQorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBSZXNvbHV0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0ZSRVFfTU9ERV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0ZSRVFfTU9ERV9MT1cKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDb21tb25GcmVxdWVuY3lNb2RlKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCB1aW50MzJfdCBSZXNvbHV0aW9uKQoreworICBNT0RJRllfUkVHKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX0xGTUVOLCBSZXNvbHV0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgcGFyYW1ldGVyIGNvbW1vbiB0byBzZXZlcmFsIEFEQzogQ2xvY2sgbG93IGZyZXF1ZW5jeSBtb2RlLgorICAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzCisgICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLgorICAqIEBybXRvbGwgQ0NSICAgICAgTEZNRU4gICAgICAgICAgTExfQURDX0dldENvbW1vbkZyZXF1ZW5jeU1vZGUKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfRlJFUV9NT0RFX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfRlJFUV9NT0RFX0xPVworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDb21tb25GcmVxdWVuY3lNb2RlKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9MRk1FTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsCisgICogICAgICAgICBjaGFubmVscyAoVnJlZkludCwgdGVtcGVyYXR1cmUgc2Vuc29yLCAuLi4pLgorICAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwKKyAgKiAgICAgICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKQorICAqIEBub3RlICAgU3RhYmlsaXphdGlvbiB0aW1lIG9mIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbDoKKyAgKiAgICAgICAgIEFmdGVyIGVuYWJsaW5nIGludGVybmFsIHBhdGhzLCBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb24sCisgICogICAgICAgICBhIGRlbGF5IGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBhbmQKKyAgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LgorICAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9WUkVGSU5UX1NUQUJfVVMuCisgICogICAgICAgICBSZWZlciB0byBsaXRlcmFsIEByZWYgTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUy4KKyAgKiBAbm90ZSAgIEFEQyBpbnRlcm5hbCBjaGFubmVsIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludDoKKyAgKiAgICAgICAgIEZvciBBREMgY29udmVyc2lvbiBvZiBpbnRlcm5hbCBjaGFubmVscywKKyAgKiAgICAgICAgIGEgc2FtcGxpbmcgdGltZSBtaW5pbXVtIHZhbHVlIGlzIHJlcXVpcmVkLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBbGwgQURDIGluc3RhbmNlcyBvZiB0aGUgQURDIGNvbW1vbiBncm91cCBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjaGVjayBjYW4gYmUgZG9uZSB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX0lzRW5hYmxlZCgpIGZvciBlYWNoCisgICogICAgICAgICBBREMgaW5zdGFuY2Ugb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIGhlbHBlciBtYWNybworICAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoKS4KKyAgKiBAcm10b2xsIENDUiAgICAgIFZSRUZFTiAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaFxuCisgICogICAgICAgICBDQ1IgICAgICBUU0VOICAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2hcbgorICAqICAgICAgICAgQ0NSICAgICAgVkxDREVOICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcGFyYW0gIFBhdGhJbnRlcm5hbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVkxDRCAoMSkKKyAgKgorICAqICAgICAgICAgKDEpIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzOiBvbmx5IG9uIFNUTTMyTDA1M3h4LCBTVE0zMkwwNjN4eCwgU1RNMzJMMDczeHgsIFNUTTMyTDA4M3h4LgorICAqICAgICAgICAgKDIpIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzOiBvbmx5IG9uIFNUTTMyTDA1M3h4LCBTVE0zMkwwNjN4eCwgU1RNMzJMMDczeHgsIFNUTTMyTDA4M3h4LCBTVE0zMkwwNHh4eCwgU1RNMzJMMDN4eHgsIFNUTTMyTDAyeHh4LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCB1aW50MzJfdCBQYXRoSW50ZXJuYWwpCit7CisjaWYgZGVmaW5lZCAoQURDX0NDUl9WTENERU4pICYmIGRlZmluZWQgKEFEQ19DQ1JfVFNFTikKKyAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9WUkVGRU4gfCBBRENfQ0NSX1RTRU4gfCBBRENfQ0NSX1ZMQ0RFTiwgUGF0aEludGVybmFsKTsKKyNlbGlmIGRlZmluZWQgKEFEQ19DQ1JfVFNFTikKKyAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9WUkVGRU4gfCBBRENfQ0NSX1RTRU4sIFBhdGhJbnRlcm5hbCk7CisjZWxzZQorICBNT0RJRllfUkVHKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX1ZSRUZFTiwgUGF0aEludGVybmFsKTsKKyNlbmRpZgorfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsCisgICogICAgICAgICBjaGFubmVscyAoVnJlZkludCwgdGVtcGVyYXR1cmUgc2Vuc29yLCAuLi4pLgorICAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwKKyAgKiAgICAgICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKQorICAqIEBybXRvbGwgQ0NSICAgICAgVlJFRkVOICAgICAgICAgTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoXG4KKyAgKiAgICAgICAgIENDUiAgICAgIFRTRU4gICAgICAgICAgIExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaFxuCisgICogICAgICAgICBDQ1IgICAgICBWTENERU4gICAgICAgICBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2gKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZMQ0QgKDEpCisgICoKKyAgKiAgICAgICAgICgxKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlczogb25seSBvbiBTVE0zMkwwNTN4eCwgU1RNMzJMMDYzeHgsIFNUTTMyTDA3M3h4LCBTVE0zMkwwODN4eC4KKyAgKiAgICAgICAgICgyKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlczogb25seSBvbiBTVE0zMkwwNTN4eCwgU1RNMzJMMDYzeHgsIFNUTTMyTDA3M3h4LCBTVE0zMkwwODN4eCwgU1RNMzJMMDR4eHgsIFNUTTMyTDAzeHh4LCBTVE0zMkwwMnh4eC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2goQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisjaWYgZGVmaW5lZCAoQURDX0NDUl9WTENERU4pICYmIGRlZmluZWQgKEFEQ19DQ1JfVFNFTikKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfVlJFRkVOIHwgQURDX0NDUl9UU0VOIHwgQURDX0NDUl9WTENERU4pKTsKKyNlbGlmIGRlZmluZWQgKEFEQ19DQ1JfVFNFTikKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfVlJFRkVOIHwgQURDX0NDUl9UU0VOKSk7CisjZWxzZQorICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9WUkVGRU4pKTsKKyNlbmRpZgorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19JbnN0YW5jZSBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IEFEQyBpbnN0YW5jZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBpbnN0YW5jZSBjbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IyICAgIENLTU9ERSAgICAgICAgIExMX0FEQ19TZXRDbG9jaworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENsb2NrU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYxICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQyAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIEFzeW5jaHJvbm91cyBjbG9jayBwcmVzY2FsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmcKKyAgKiAgICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDb21tb25DbG9jaygpLlxuCisgICogICAgICAgICAoMikgQ2F1dGlvbjogVGhpcyBwYXJhbWV0ZXIgaGFzIHNvbWUgY2xvY2sgcmF0aW8gY29uc3RyYWludHM6CisgICogICAgICAgICAgICAgVGhpcyBjb25maWd1cmF0aW9uIG11c3QgYmUgZW5hYmxlZCBvbmx5IGlmIFBDTEsgaGFzIGEgNTAlCisgICogICAgICAgICAgICAgZHV0eSBjbG9jayBjeWNsZSAoQVBCIHByZXNjYWxlciBjb25maWd1cmVkIGluc2lkZSB0aGUgUkNDCisgICogICAgICAgICAgICAgbXVzdCBiZSBieXBhc3NlZCBhbmQgdGhlIHN5c3RlbSBjbG9jayBtdXN0IGJ5IDUwJSBkdXR5CisgICogICAgICAgICAgICAgY3ljbGUpLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q2xvY2soQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IENsb2NrU291cmNlKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfQ0tNT0RFLCBDbG9ja1NvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBpbnN0YW5jZSBjbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAgKiBAcm10b2xsIENGR1IyICAgIENLTU9ERSAgICAgICAgIExMX0FEQ19HZXRDbG9jaworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYxICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQyAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIEFzeW5jaHJvbm91cyBjbG9jayBwcmVzY2FsZXIgY2FuIGJlIHJldHJpZXZlZCB1c2luZworICAqICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX0dldENvbW1vbkNsb2NrKCkuXG4KKyAgKiAgICAgICAgICgyKSBDYXV0aW9uOiBUaGlzIHBhcmFtZXRlciBoYXMgc29tZSBjbG9jayByYXRpbyBjb25zdHJhaW50czoKKyAgKiAgICAgICAgICAgICBUaGlzIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBlbmFibGVkIG9ubHkgaWYgUENMSyBoYXMgYSA1MCUKKyAgKiAgICAgICAgICAgICBkdXR5IGNsb2NrIGN5Y2xlIChBUEIgcHJlc2NhbGVyIGNvbmZpZ3VyZWQgaW5zaWRlIHRoZSBSQ0MKKyAgKiAgICAgICAgICAgICBtdXN0IGJlIGJ5cGFzc2VkIGFuZCB0aGUgc3lzdGVtIGNsb2NrIG11c3QgYnkgNTAlIGR1dHkKKyAgKiAgICAgICAgICAgICBjeWNsZSkuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0Q2xvY2soQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfQ0tNT0RFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBjYWxpYnJhdGlvbiBmYWN0b3IgaW4gdGhlIG1vZGUgc2luZ2xlLWVuZGVkCisgICogICAgICAgICBvciBkaWZmZXJlbnRpYWwgKGZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlKS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gc2V0IGNhbGlicmF0aW9uIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIHBlcmZvcm0gYSBuZXcgY2FsaWJyYXRpb24gdXNpbmcKKyAgKiAgICAgICAgIEByZWYgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkLCB3aXRob3V0IGNhbGlicmF0aW9uIG9uIGdvaW5nLCB3aXRob3V0IGNvbnZlcnNpb24KKyAgKiAgICAgICAgIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDQUxGQUNUICBDQUxGQUNUICAgICAgICBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3IKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDYWxpYnJhdGlvbkZhY3RvciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0YKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvcihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ2FsaWJyYXRpb25GYWN0b3IpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0FMRkFDVCwKKyAgICAgICAgICAgICBBRENfQ0FMRkFDVF9DQUxGQUNULAorICAgICAgICAgICAgIENhbGlicmF0aW9uRmFjdG9yKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGNhbGlicmF0aW9uIGZhY3RvciBpbiB0aGUgbW9kZSBzaW5nbGUtZW5kZWQKKyAgKiAgICAgICAgIG9yIGRpZmZlcmVudGlhbCAoZm9yIGRldmljZXMgd2l0aCBkaWZmZXJlbnRpYWwgbW9kZSBhdmFpbGFibGUpLgorICAqIEBub3RlICAgQ2FsaWJyYXRpb24gZmFjdG9ycyBhcmUgc2V0IGJ5IGhhcmR3YXJlIGFmdGVyIHBlcmZvcm1pbmcKKyAgKiAgICAgICAgIGEgY2FsaWJyYXRpb24gcnVuIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oKS4KKyAgKiBAcm10b2xsIENBTEZBQ1QgIENBTEZBQ1QgICAgICAgIExMX0FEQ19HZXRDYWxpYnJhdGlvbkZhY3RvcgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDYWxpYnJhdGlvbkZhY3RvcihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0FMRkFDVCwgQURDX0NBTEZBQ1RfQ0FMRkFDVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgcmVzb2x1dGlvbi4KKyAgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGFsaWdubWVudHMgZm9ybWF0cworICAqICAgICAgICAgZGVwZW5kZW5jaWVzIHRvIEFEQyByZXNvbHV0aW9ucy4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IxICAgIFJFUyAgICAgICAgICAgIExMX0FEQ19TZXRSZXNvbHV0aW9uCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmVzb2x1dGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRSZXNvbHV0aW9uKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSZXNvbHV0aW9uKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfUkVTLCBSZXNvbHV0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIHJlc29sdXRpb24uCisgICogICAgICAgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBhbGlnbm1lbnRzIGZvcm1hdHMKKyAgKiAgICAgICAgIGRlcGVuZGVuY2llcyB0byBBREMgcmVzb2x1dGlvbnMuCisgICogQHJtdG9sbCBDRkdSMSAgICBSRVMgICAgICAgICAgICBMTF9BRENfR2V0UmVzb2x1dGlvbgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRSZXNvbHV0aW9uKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMSwgQURDX0NGR1IxX1JFUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudC4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGFsaWdubWVudHMgZm9ybWF0cworICAqICAgICAgICAgZGVwZW5kZW5jaWVzIHRvIEFEQyByZXNvbHV0aW9ucy4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IxICAgIEFMSUdOICAgICAgICAgIExMX0FEQ19TZXREYXRhQWxpZ25tZW50CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgRGF0YUFsaWdubWVudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RBVEFfQUxJR05fTEVGVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldERhdGFBbGlnbm1lbnQoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IERhdGFBbGlnbm1lbnQpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9BTElHTiwgRGF0YUFsaWdubWVudCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50LgorICAqIEBub3RlICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzCisgICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgQUxJR04gICAgICAgICAgTExfQURDX0dldERhdGFBbGlnbm1lbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RBVEFfQUxJR05fTEVGVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXREYXRhQWxpZ25tZW50KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMSwgQURDX0NGR1IxX0FMSUdOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBsb3cgcG93ZXIgbW9kZS4KKyAgKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBsb3cgcG93ZXIgbW9kZXM6CisgICogICAgICAgICAtIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0IjogRHluYW1pYyBsb3cgcG93ZXIgbW9kZSwKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zIG9jY3VycmVuY2VzIGFyZSBsaW1pdGVkIHRvIHRoZSBtaW5pbXVtIG5lY2Vzc2FyeQorICAqICAgICAgICAgICBpbiBvcmRlciB0byByZWR1Y2UgcG93ZXIgY29uc3VtcHRpb24uCisgICogICAgICAgICAgIE5ldyBBREMgY29udmVyc2lvbiBzdGFydHMgb25seSB3aGVuIHRoZSBwcmV2aW91cworICAqICAgICAgICAgICB1bml0YXJ5IGNvbnZlcnNpb24gZGF0YSAoZm9yIEFEQyBncm91cCByZWd1bGFyKQorICAqICAgICAgICAgICBoYXMgYmVlbiByZXRyaWV2ZWQgYnkgdXNlciBzb2Z0d2FyZS4KKyAgKiAgICAgICAgICAgSW4gdGhlIG1lYW50aW1lLCBBREMgcmVtYWlucyBpZGxlOiBkb2VzIG5vdCBwZXJmb3JtcyBhbnkKKyAgKiAgICAgICAgICAgb3RoZXIgY29udmVyc2lvbi4KKyAgKiAgICAgICAgICAgVGhpcyBtb2RlIGFsbG93cyB0byBhdXRvbWF0aWNhbGx5IGFkYXB0IHRoZSBBREMgY29udmVyc2lvbnMKKyAgKiAgICAgICAgICAgdHJpZ2dlcnMgdG8gdGhlIHNwZWVkIG9mIHRoZSBzb2Z0d2FyZSB0aGF0IHJlYWRzIHRoZSBkYXRhLgorICAqICAgICAgICAgICBNb3Jlb3ZlciwgdGhpcyBhdm9pZHMgcmlzayBvZiBvdmVycnVuIGZvciBsb3cgZnJlcXVlbmN5CisgICogICAgICAgICAgIGFwcGxpY2F0aW9ucy4KKyAgKiAgICAgICAgICAgSG93IHRvIHVzZSB0aGlzIGxvdyBwb3dlciBtb2RlOgorICAqICAgICAgICAgICAtIERvIG5vdCB1c2Ugd2l0aCBpbnRlcnJ1cHRpb24gb3IgRE1BIHNpbmNlIHRoZXNlIG1vZGVzCisgICogICAgICAgICAgICAgaGF2ZSB0byBjbGVhciBpbW1lZGlhdGVseSB0aGUgRU9DIGZsYWcgdG8gZnJlZSB0aGUKKyAgKiAgICAgICAgICAgICBJUlEgdmVjdG9yIHNlcXVlbmNlci4KKyAgKiAgICAgICAgICAgLSBEbyB1c2Ugd2l0aCBwb2xsaW5nOiAxLiBTdGFydCBjb252ZXJzaW9uLAorICAqICAgICAgICAgICAgIDIuIExhdGVyIG9uLCB3aGVuIGNvbnZlcnNpb24gZGF0YSBpcyBuZWVkZWQ6IHBvbGwgZm9yIGVuZCBvZgorICAqICAgICAgICAgICAgIGNvbnZlcnNpb24gIHRvIGVuc3VyZSB0aGF0IGNvbnZlcnNpb24gaXMgY29tcGxldGVkIGFuZAorICAqICAgICAgICAgICAgIHJldHJpZXZlIEFEQyBjb252ZXJzaW9uIGRhdGEuIFRoaXMgd2lsbCB0cmlnIGFub3RoZXIKKyAgKiAgICAgICAgICAgICBBREMgY29udmVyc2lvbiBzdGFydC4KKyAgKiAgICAgICAgIC0gQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHBvd2VyLW9mZiIgKGZlYXR1cmUgYXZhaWxhYmxlIG9uCisgICogICAgICAgICAgIHRoaXMgZGV2aWNlIGlmIHBhcmFtZXRlciBMTF9BRENfTFBfTU9ERV9BVVRPT0ZGIGlzIGF2YWlsYWJsZSk6CisgICogICAgICAgICAgIHRoZSBBREMgYXV0b21hdGljYWxseSBwb3dlcnMtb2ZmIGFmdGVyIGEgY29udmVyc2lvbiBhbmQKKyAgKiAgICAgICAgICAgYXV0b21hdGljYWxseSB3YWtlcyB1cCB3aGVuIGEgbmV3IGNvbnZlcnNpb24gaXMgdHJpZ2dlcmVkCisgICogICAgICAgICAgICh3aXRoIHN0YXJ0dXAgdGltZSBiZXR3ZWVuIHRyaWdnZXIgYW5kIHN0YXJ0IG9mIHNhbXBsaW5nKS4KKyAgKiAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBjb21iaW5lZCB3aXRoIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiLgorICAqIEBub3RlICAgV2l0aCBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCIsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIHJlYWQKKyAgKiAgICAgICAgIGlzIGNvcnJlc3BvbmRpbmcgdG8gcHJldmlvdXMgQURDIGNvbnZlcnNpb24gc3RhcnQsIGluZGVwZW5kZW50bHkKKyAgKiAgICAgICAgIG9mIGRlbGF5IGR1cmluZyB3aGljaCBBREMgd2FzIGlkbGUuCisgICogICAgICAgICBUaGVyZWZvcmUsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIG1heSBiZSBvdXRkYXRlZDogZG9lcyBub3QKKyAgKiAgICAgICAgIGNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnQgdm9sdGFnZSBsZXZlbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIEFEQyBjaGFubmVsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgV0FJVCAgICAgICAgICAgTExfQURDX1NldExvd1Bvd2VyTW9kZVxuCisgICogICAgICAgICBDRkdSMSAgICBBVVRPRkYgICAgICAgICBMTF9BRENfU2V0TG93UG93ZXJNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgTG93UG93ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX01PREVfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19MUF9BVVRPV0FJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19MUF9BVVRPUE9XRVJPRkYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTFBfQVVUT1dBSVRfQVVUT1BPV0VST0ZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0TG93UG93ZXJNb2RlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBMb3dQb3dlck1vZGUpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsIChBRENfQ0ZHUjFfV0FJVCB8IEFEQ19DRkdSMV9BVVRPRkYpLCBMb3dQb3dlck1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgbG93IHBvd2VyIG1vZGU6CisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgbG93IHBvd2VyIG1vZGVzOgorICAqICAgICAgICAgLSBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCI6IER5bmFtaWMgbG93IHBvd2VyIG1vZGUsCisgICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucyBvY2N1cnJlbmNlcyBhcmUgbGltaXRlZCB0byB0aGUgbWluaW11bSBuZWNlc3NhcnkKKyAgKiAgICAgICAgICAgaW4gb3JkZXIgdG8gcmVkdWNlIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqICAgICAgICAgICBOZXcgQURDIGNvbnZlcnNpb24gc3RhcnRzIG9ubHkgd2hlbiB0aGUgcHJldmlvdXMKKyAgKiAgICAgICAgICAgdW5pdGFyeSBjb252ZXJzaW9uIGRhdGEgKGZvciBBREMgZ3JvdXAgcmVndWxhcikKKyAgKiAgICAgICAgICAgaGFzIGJlZW4gcmV0cmlldmVkIGJ5IHVzZXIgc29mdHdhcmUuCisgICogICAgICAgICAgIEluIHRoZSBtZWFudGltZSwgQURDIHJlbWFpbnMgaWRsZTogZG9lcyBub3QgcGVyZm9ybXMgYW55CisgICogICAgICAgICAgIG90aGVyIGNvbnZlcnNpb24uCisgICogICAgICAgICAgIFRoaXMgbW9kZSBhbGxvd3MgdG8gYXV0b21hdGljYWxseSBhZGFwdCB0aGUgQURDIGNvbnZlcnNpb25zCisgICogICAgICAgICAgIHRyaWdnZXJzIHRvIHRoZSBzcGVlZCBvZiB0aGUgc29mdHdhcmUgdGhhdCByZWFkcyB0aGUgZGF0YS4KKyAgKiAgICAgICAgICAgTW9yZW92ZXIsIHRoaXMgYXZvaWRzIHJpc2sgb2Ygb3ZlcnJ1biBmb3IgbG93IGZyZXF1ZW5jeQorICAqICAgICAgICAgICBhcHBsaWNhdGlvbnMuCisgICogICAgICAgICAgIEhvdyB0byB1c2UgdGhpcyBsb3cgcG93ZXIgbW9kZToKKyAgKiAgICAgICAgICAgLSBEbyBub3QgdXNlIHdpdGggaW50ZXJydXB0aW9uIG9yIERNQSBzaW5jZSB0aGVzZSBtb2RlcworICAqICAgICAgICAgICAgIGhhdmUgdG8gY2xlYXIgaW1tZWRpYXRlbHkgdGhlIEVPQyBmbGFnIHRvIGZyZWUgdGhlCisgICogICAgICAgICAgICAgSVJRIHZlY3RvciBzZXF1ZW5jZXIuCisgICogICAgICAgICAgIC0gRG8gdXNlIHdpdGggcG9sbGluZzogMS4gU3RhcnQgY29udmVyc2lvbiwKKyAgKiAgICAgICAgICAgICAyLiBMYXRlciBvbiwgd2hlbiBjb252ZXJzaW9uIGRhdGEgaXMgbmVlZGVkOiBwb2xsIGZvciBlbmQgb2YKKyAgKiAgICAgICAgICAgICBjb252ZXJzaW9uICB0byBlbnN1cmUgdGhhdCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlZCBhbmQKKyAgKiAgICAgICAgICAgICByZXRyaWV2ZSBBREMgY29udmVyc2lvbiBkYXRhLiBUaGlzIHdpbGwgdHJpZyBhbm90aGVyCisgICogICAgICAgICAgICAgQURDIGNvbnZlcnNpb24gc3RhcnQuCisgICogICAgICAgICAtIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byBwb3dlci1vZmYiIChmZWF0dXJlIGF2YWlsYWJsZSBvbgorICAqICAgICAgICAgICB0aGlzIGRldmljZSBpZiBwYXJhbWV0ZXIgTExfQURDX0xQX01PREVfQVVUT09GRiBpcyBhdmFpbGFibGUpOgorICAqICAgICAgICAgICB0aGUgQURDIGF1dG9tYXRpY2FsbHkgcG93ZXJzLW9mZiBhZnRlciBhIGNvbnZlcnNpb24gYW5kCisgICogICAgICAgICAgIGF1dG9tYXRpY2FsbHkgd2FrZXMgdXAgd2hlbiBhIG5ldyBjb252ZXJzaW9uIGlzIHRyaWdnZXJlZAorICAqICAgICAgICAgICAod2l0aCBzdGFydHVwIHRpbWUgYmV0d2VlbiB0cmlnZ2VyIGFuZCBzdGFydCBvZiBzYW1wbGluZykuCisgICogICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgY29tYmluZWQgd2l0aCBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0Ii4KKyAgKiBAbm90ZSAgIFdpdGggQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiLCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSByZWFkCisgICogICAgICAgICBpcyBjb3JyZXNwb25kaW5nIHRvIHByZXZpb3VzIEFEQyBjb252ZXJzaW9uIHN0YXJ0LCBpbmRlcGVuZGVudGx5CisgICogICAgICAgICBvZiBkZWxheSBkdXJpbmcgd2hpY2ggQURDIHdhcyBpZGxlLgorICAqICAgICAgICAgVGhlcmVmb3JlLCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBtYXkgYmUgb3V0ZGF0ZWQ6IGRvZXMgbm90CisgICogICAgICAgICBjb3JyZXNwb25kIHRvIHRoZSBjdXJyZW50IHZvbHRhZ2UgbGV2ZWwgb24gdGhlIHNlbGVjdGVkCisgICogICAgICAgICBBREMgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENGR1IxICAgIFdBSVQgICAgICAgICAgIExMX0FEQ19HZXRMb3dQb3dlck1vZGVcbgorICAqICAgICAgICAgQ0ZHUjEgICAgQVVUT0ZGICAgICAgICAgTExfQURDX0dldExvd1Bvd2VyTW9kZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX01PREVfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19MUF9BVVRPV0FJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19MUF9BVVRPUE9XRVJPRkYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTFBfQVVUT1dBSVRfQVVUT1BPV0VST0ZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldExvd1Bvd2VyTW9kZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjEsIChBRENfQ0ZHUjFfV0FJVCB8IEFEQ19DRkdSMV9BVVRPRkYpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHNhbXBsaW5nIHRpbWUgY29tbW9uIHRvIGEgZ3JvdXAgb2YgY2hhbm5lbHMuCisgICogQG5vdGUgICBVbml0OiBBREMgY2xvY2sgY3ljbGVzLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2FtcGxpbmcgdGltZSBzY29wZSBpcyBvbiBBREMgaW5zdGFuY2U6CisgICogICAgICAgICBTYW1wbGluZyB0aW1lIGNvbW1vbiB0byBhbGwgY2hhbm5lbHMuCisgICogICAgICAgICAob24gc29tZSBvdGhlciBTVE0zMiBmYW1pbGllcywgc2FtcGxpbmcgdGltZSBpcyBjaGFubmVsIHdpc2UpCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGludGVybmFsIGNoYW5uZWwgKFZyZWZJbnQsIFRlbXBTZW5zb3IsIC4uLikgdG8gYmUKKyAgKiAgICAgICAgIGNvbnZlcnRlZDoKKyAgKiAgICAgICAgIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludHMgbXVzdCBiZSByZXNwZWN0ZWQgKHNhbXBsaW5nIHRpbWUgY2FuIGJlCisgICogICAgICAgICBhZGp1c3RlZCBpbiBmdW5jdGlvbiBvZiBBREMgY2xvY2sgZnJlcXVlbmN5IGFuZCBzYW1wbGluZyB0aW1lCisgICogICAgICAgICBzZXR0aW5nKS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIHRpbWluZ3MgdmFsdWVzIChwYXJhbWV0ZXJzIFRTX3ZyZWZpbnQsCisgICogICAgICAgICBUU190ZW1wLCAuLi4pLgorICAqIEBub3RlICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUuCisgICogICAgICAgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgcHJvY2Vzc2luZyB0aW1lIGlzOgorICAqICAgICAgICAgLSAxMi41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gMTIgYml0cworICAqICAgICAgICAgLSAxMC41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gMTAgYml0cworICAqICAgICAgICAgLSA4LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA4IGJpdHMKKyAgKiAgICAgICAgIC0gNi41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gNiBiaXRzCisgICogQG5vdGUgICBJbiBjYXNlIG9mIEFEQyBjb252ZXJzaW9uIG9mIGludGVybmFsIGNoYW5uZWwgKFZyZWZJbnQsCisgICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IsIC4uLiksIGEgc2FtcGxpbmcgdGltZSBtaW5pbXVtIHZhbHVlCisgICogICAgICAgICBpcyByZXF1aXJlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBTTVBSICAgICBTTVAgICAgICAgICAgICBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ2hhbm5lbHMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTYW1wbGluZ1RpbWUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzFDWUNMRV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8zQ1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzdDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMTJDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMTlDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMzlDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNzlDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMTYwQ1lDTEVTXzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25DaGFubmVscyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2FtcGxpbmdUaW1lKQoreworICBNT0RJRllfUkVHKEFEQ3gtPlNNUFIsIEFEQ19TTVBSX1NNUCwgU2FtcGxpbmdUaW1lKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc2FtcGxpbmcgdGltZSBjb21tb24gdG8gYSBncm91cCBvZiBjaGFubmVscy4KKyAgKiBAbm90ZSAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzYW1wbGluZyB0aW1lIHNjb3BlIGlzIG9uIEFEQyBpbnN0YW5jZToKKyAgKiAgICAgICAgIFNhbXBsaW5nIHRpbWUgY29tbW9uIHRvIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgIChvbiBzb21lIG90aGVyIFNUTTMyIGZhbWlsaWVzLCBzYW1wbGluZyB0aW1lIGlzIGNoYW5uZWwgd2lzZSkKKyAgKiBAbm90ZSAgIENvbnZlcnNpb24gdGltZSBpcyB0aGUgYWRkaXRpb24gb2Ygc2FtcGxpbmcgdGltZSBhbmQgcHJvY2Vzc2luZyB0aW1lLgorICAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgQURDIHByb2Nlc3NpbmcgdGltZSBvZgorICAqICAgICAgICAgdGhpcyBTVE0zMiBzZXJpZS4KKyAgKiBAcm10b2xsIFNNUFIgICAgIFNNUCAgICAgICAgICAgIExMX0FEQ19HZXRTYW1wbGluZ1RpbWVDb21tb25DaGFubmVscworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xQ1lDTEVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfM0NZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV83Q1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzEyQ1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzE5Q1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzM5Q1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzc5Q1lDTEVTXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzE2MENZQ0xFU181CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldFNhbXBsaW5nVGltZUNvbW1vbkNoYW5uZWxzKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5TTVBSLCBBRENfU01QUl9TTVApKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfR3JvdXBfUmVndWxhciBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IGdyb3VwIHJlZ3VsYXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOgorICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LAorICAqICAgICAgICAgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyB0cmlnZ2VyIHNvdXJjZSB0byBleHRlcm5hbCB0cmlnZ2VyCisgICogICAgICAgICBhbHNvIHNldCB0cmlnZ2VyIHBvbGFyaXR5IHRvIHJpc2luZyBlZGdlIAorICAqICAgICAgICAgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyCisgICogICAgICAgICBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKS4KKyAgKiAgICAgICAgIEluIGNhc2Ugb2YgbmVlZCB0byBtb2RpZnkgdHJpZ2dlciBlZGdlLCB1c2UKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRUcmlnZ2VyRWRnZSgpLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIgCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IxICAgIEVYVFNFTCAgICAgICAgIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZVxuCisgICogICAgICAgICBDRkdSMSAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBUcmlnZ2VyU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX1NPRlRXQVJFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIxX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjJfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRUcmlnZ2VyU291cmNlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBUcmlnZ2VyU291cmNlKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfRVhURU4gfCBBRENfQ0ZHUjFfRVhUU0VMLCBUcmlnZ2VyU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToKKyAgKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsICh0aW1lciBldmVudCwKKyAgKiAgICAgICAgIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4KKyAgKiBAbm90ZSAgIFRvIGRldGVybWluZSB3aGV0aGVyIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgaXMKKyAgKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZXh0ZXJuYWwsIHdpdGhvdXQgZGV0YWlsCisgICogICAgICAgICBvZiB3aGljaCBwZXJpcGhlcmFsIGlzIHNlbGVjdGVkIGFzIGV4dGVybmFsIHRyaWdnZXIsCisgICogICAgICAgICAoZXF1aXZhbGVudCB0byAKKyAgKiAgICAgICAgICJpZihMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2UoQURDMSkgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSIpCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQuCisgICogQG5vdGUgICBBdmFpbGFiaWxpdHkgb2YgcGFyYW1ldGVycyBvZiB0cmlnZ2VyIHNvdXJjZXMgZnJvbSB0aW1lciAKKyAgKiAgICAgICAgIGRlcGVuZHMgb24gdGltZXJzIGF2YWlsYWJpbGl0eSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgRVhUU0VMICAgICAgICAgTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlXG4KKyAgKiAgICAgICAgIENGR1IxICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX1NPRlRXQVJFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIxX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMjJfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgVHJpZ2dlclNvdXJjZSA9IFJFQURfQklUKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfRVhUU0VMIHwgQURDX0NGR1IxX0VYVEVOKTsKKyAgCisgIC8qIFZhbHVlIGZvciBzaGlmdCBvZiB7MDsgNDsgODsgMTJ9IGRlcGVuZGluZyBvbiB2YWx1ZSBvZiBiaXRmaWVsZCAgICAgICAgICAqLworICAvKiBjb3JyZXNwb25kaW5nIHRvIEFEQ19DRkdSMV9FWFRFTiB7MDsgMTsgMjsgM30uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgdWludDMyX3QgU2hpZnRFeHRlbiA9ICgoVHJpZ2dlclNvdXJjZSAmIEFEQ19DRkdSMV9FWFRFTikgPj4gKEFEQ19SRUdfVFJJR19FWFRFTl9CSVRPRkZTRVRfUE9TIC0gMlUpKTsKKyAgCisgIC8qIFNldCBiaXRmaWVsZCBjb3JyZXNwb25kaW5nIHRvIEFEQ19DRkdSMV9FWFRFTiBhbmQgQURDX0NGR1IxX0VYVFNFTCAgICAgICAqLworICAvKiB0byBtYXRjaCB3aXRoIHRyaWdnZXJzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmV0dXJuICgoVHJpZ2dlclNvdXJjZQorICAgICAgICAgICAmIChBRENfUkVHX1RSSUdfU09VUkNFX01BU0sgPj4gU2hpZnRFeHRlbikgJiBBRENfQ0ZHUjFfRVhUU0VMKQorICAgICAgICAgIHwgKChBRENfUkVHX1RSSUdfRURHRV9NQVNLID4+IFNoaWZ0RXh0ZW4pICYgQURDX0NGR1IxX0VYVEVOKQorICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSBpbnRlcm5hbCAoU1cgc3RhcnQpCisgICAgICAgICAgICBvciBleHRlcm5hbC4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIHRvIGRldGVybWluZSB3aGljaCBwZXJpcGhlcmFsIGlzIHNlbGVjdGVkIGFzIGV4dGVybmFsIHRyaWdnZXIsCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2UoKS4KKyAgKiBAcm10b2xsIENGR1IxICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0cmlnZ2VyIHNvdXJjZSBleHRlcm5hbCB0cmlnZ2VyCisgICogICAgICAgICBWYWx1ZSAiMSIgaWYgdHJpZ2dlciBzb3VyY2UgU1cgc3RhcnQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfRVhURU4pID09IChMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgJiBBRENfQ0ZHUjFfRVhURU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5LgorICAqIEBub3RlICAgQXBwbGljYWJsZSBvbmx5IGZvciB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IxICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBFeHRlcm5hbFRyaWdnZXJFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEV4dGVybmFsVHJpZ2dlckVkZ2UpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9FWFRFTiwgRXh0ZXJuYWxUcmlnZ2VyRWRnZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eS4KKyAgKiBAbm90ZSAgIEFwcGxpY2FibGUgb25seSBmb3IgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIuCisgICogQHJtdG9sbCBDRkdSMSAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX0dldFRyaWdnZXJFZGdlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HRkFMTElORworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfRVhURU4pKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgc2NhbiBkaXJlY3Rpb24uCisgICogQG5vdGUgICBPbiBzb21lIG90aGVyIFNUTTMyIGZhbWlsaWVzLCB0aGlzIHNldHRpbmcgaXMgbm90IGF2YWlsYWJsZSBhbmQKKyAgKiAgICAgICAgIHRoZSBkZWZhdWx0IHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSMSAgICBTQ0FORElSICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclNjYW5EaXJlY3Rpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTY2FuRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9ESVJfRk9SV0FSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRElSX0JBQ0tXQVJECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFNlcXVlbmNlclNjYW5EaXJlY3Rpb24oQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNjYW5EaXJlY3Rpb24pCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9TQ0FORElSLCBTY2FuRGlyZWN0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHNjYW4gZGlyZWN0aW9uLgorICAqIEBub3RlICAgT24gc29tZSBvdGhlciBTVE0zMiBmYW1pbGllcywgdGhpcyBzZXR0aW5nIGlzIG5vdCBhdmFpbGFibGUgYW5kCisgICogICAgICAgICB0aGUgZGVmYXVsdCBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgU0NBTkRJUiAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJTY2FuRGlyZWN0aW9uCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJUl9GT1JXQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9ESVJfQkFDS1dBUkQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFNlcXVlbmNlclNjYW5EaXJlY3Rpb24oQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfU0NBTkRJUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICAqICAgICAgICAgc2VxdWVuY2Ugc3ViZGl2aWRlZCBhbmQgc2NhbiBjb252ZXJzaW9ucyBpbnRlcnJ1cHRlZCBldmVyeSBzZWxlY3RlZAorICAqICAgICAgICAgbnVtYmVyIG9mIHJhbmtzLgorICAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCByZWd1bGFyIAorICAqICAgICAgICAgY29udGludW91cyBtb2RlIGFuZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgRElTQ0VOICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250XG4KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTZXFEaXNjb250IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF8xUkFOSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBTZXFEaXNjb250KQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfRElTQ0VOLCBTZXFEaXNjb250KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZToKKyAgKiAgICAgICAgIHNlcXVlbmNlIHN1YmRpdmlkZWQgYW5kIHNjYW4gY29udmVyc2lvbnMgaW50ZXJydXB0ZWQgZXZlcnkgc2VsZWN0ZWQKKyAgKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4KKyAgKiBAcm10b2xsIENGR1IxICAgIERJU0NFTiAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyRGlzY29udFxuCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJEaXNjb250KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMSwgQURDX0NGR1IxX0RJU0NFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZTogY2hhbm5lbCBvbiByYW5rIGNvcnJlc3BvbmRpbmcgdG8KKyAgKiAgICAgICAgIGNoYW5uZWwgbnVtYmVyLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtczoKKyAgKiAgICAgICAgIC0gQ2hhbm5lbHMgb3JkZXJpbmcgaW50byBlYWNoIHJhbmsgb2Ygc2NhbiBzZXF1ZW5jZToKKyAgKiAgICAgICAgICAgcmFuayBvZiBlYWNoIGNoYW5uZWwgaXMgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIKKyAgKiAgICAgICAgICAgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4KKyAgKiAgICAgICAgIC0gU2V0IGNoYW5uZWxzIHNlbGVjdGVkIGJ5IG92ZXJ3cml0aW5nIHRoZSBjdXJyZW50IHNlcXVlbmNlcgorICAqICAgICAgICAgICBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGlzCisgICogICAgICAgICBub3QgZnVsbHkgY29uZmlndXJhYmxlOiBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsKKyAgKiAgICAgICAgIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbCBhcmUgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0byBtZWFzdXJlIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LAorICAqICAgICAgICAgVGVtcFNlbnNvciwgLi4uKSwgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbXVzdCBiZQorICAqICAgICAgICAgZW5hYmxlZCBzZXBhcmF0ZWx5LgorICAqICAgICAgICAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfQ0hBTk5FTF80IHwgTExfQURDX0NIQU5ORUxfMTIgfCAuLi4pCisgICogQHJtdG9sbCBDSFNFTFIgICBDSFNFTDAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMSAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwyICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDMgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMNCAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw1ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDYgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMNyAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw4ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDkgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMSAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDEyICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTMgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxNCAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE1ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTYgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxNyAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE4ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WTENEICAgICAgICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJMMCwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IG9ubHkgb24gU1RNMzJMMDUzeHgsIFNUTTMyTDA2M3h4LCBTVE0zMkwwNzN4eCwgU1RNMzJMMDgzeHguCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBQYXJhbWV0ZXIgIkNoYW5uZWwiIGlzIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlIGNvbnRhaW5pbmcgICAgICAgICAgICAgICAgKi8KKyAgLyogb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFdSSVRFX1JFRyhBREN4LT5DSFNFTFIsIChDaGFubmVsICYgQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFkZCBjaGFubmVsIHRvIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHJhbmsgY29ycmVzcG9uZGluZyB0bworICAqICAgICAgICAgY2hhbm5lbCBudW1iZXIuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zOgorICAqICAgICAgICAgLSBDaGFubmVscyBvcmRlcmluZyBpbnRvIGVhY2ggcmFuayBvZiBzY2FuIHNlcXVlbmNlOgorICAqICAgICAgICAgICByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlcgorICAqICAgICAgICAgICAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLgorICAqICAgICAgICAgLSBTZXQgY2hhbm5lbHMgc2VsZWN0ZWQgYnkgYWRkaW5nIHRoZW0gdG8gdGhlIGN1cnJlbnQgc2VxdWVuY2VyCisgICogICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgaXMKKyAgKiAgICAgICAgIG5vdCBmdWxseSBjb25maWd1cmFibGU6IHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuaworICAqICAgICAgICAgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4KKyAgKiBAbm90ZSAgIERlcGVuZGluZyBvbiBkZXZpY2VzIGFuZCBwYWNrYWdlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlIGF2YWlsYWJsZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRvIG1lYXN1cmUgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsCisgICogICAgICAgICBUZW1wU2Vuc29yLCAuLi4pLCBtZWFzdXJlbWVudCBwYXRocyB0byBpbnRlcm5hbCBjaGFubmVscyBtdXN0IGJlCisgICogICAgICAgICBlbmFibGVkIHNlcGFyYXRlbHkuCisgICogICAgICAgICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBPbmUgb3Igc2V2ZXJhbCB2YWx1ZXMgY2FuIGJlIHNlbGVjdGVkLgorICAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19DSEFOTkVMXzQgfCBMTF9BRENfQ0hBTk5FTF8xMiB8IC4uLikKKyAgKiBAcm10b2xsIENIU0VMUiAgIENIU0VMMCAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDIgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMyAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw0ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDUgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMNiAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw3ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDggICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMOSAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMCAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDExICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTIgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMyAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE0ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTUgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxNiAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE3ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTggICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZMQ0QgICAgICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkwwLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogb25seSBvbiBTVE0zMkwwNTN4eCwgU1RNMzJMMDYzeHgsIFNUTTMyTDA3M3h4LCBTVE0zMkwwODN4eC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGQoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIFBhcmFtZXRlciAiQ2hhbm5lbCIgaXMgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgY29udGFpbmluZyAgICAgICAgICAgICAgICAqLworICAvKiBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0VUX0JJVChBREN4LT5DSFNFTFIsIChDaGFubmVsICYgQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbW92ZSBjaGFubmVsIHRvIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHJhbmsgY29ycmVzcG9uZGluZyB0bworICAqICAgICAgICAgY2hhbm5lbCBudW1iZXIuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zOgorICAqICAgICAgICAgLSBDaGFubmVscyBvcmRlcmluZyBpbnRvIGVhY2ggcmFuayBvZiBzY2FuIHNlcXVlbmNlOgorICAqICAgICAgICAgICByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlcgorICAqICAgICAgICAgICAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLgorICAqICAgICAgICAgLSBTZXQgY2hhbm5lbHMgc2VsZWN0ZWQgYnkgcmVtb3ZpbmcgdGhlbSB0byB0aGUgY3VycmVudCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBpcworICAqICAgICAgICAgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZTogc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rCisgICogICAgICAgICBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwgYXJlIGZpeGVkIGJ5IGNoYW5uZWwgSFcgbnVtYmVyLgorICAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIHBhY2thZ2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUgYXZhaWxhYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdG8gbWVhc3VyZSBpbnRlcm5hbCBjaGFubmVscyAoVnJlZkludCwKKyAgKiAgICAgICAgIFRlbXBTZW5zb3IsIC4uLiksIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG11c3QgYmUKKyAgKiAgICAgICAgIGVuYWJsZWQgc2VwYXJhdGVseS4KKyAgKiAgICAgICAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCisgICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX0NIQU5ORUxfNCB8IExMX0FEQ19DSEFOTkVMXzEyIHwgLi4uKQorICAqIEBybXRvbGwgQ0hTRUxSICAgQ0hTRUwwICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDEgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMiAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwzICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDQgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMNSAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw2ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDcgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMOCAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw5ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDEwICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTEgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMiAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDEzICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTQgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxNSAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE2ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTcgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxOCAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkxDRCAgICAgICAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyTDAsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzOiBvbmx5IG9uIFNUTTMyTDA1M3h4LCBTVE0zMkwwNjN4eCwgU1RNMzJMMDczeHgsIFNUTTMyTDA4M3h4LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogUGFyYW1ldGVyICJDaGFubmVsIiBpcyB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSBjb250YWluaW5nICAgICAgICAgICAgICAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBDTEVBUl9CSVQoQURDeC0+Q0hTRUxSLCAoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2U6IGNoYW5uZWwgb24gcmFuayBjb3JyZXNwb25kaW5nIHRvCisgICogICAgICAgICBjaGFubmVsIG51bWJlci4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXM6CisgICogICAgICAgICAtIENoYW5uZWxzIG9yZGVyIHJlYWRpbmcgaW50byBlYWNoIHJhbmsgb2Ygc2NhbiBzZXF1ZW5jZToKKyAgKiAgICAgICAgICAgcmFuayBvZiBlYWNoIGNoYW5uZWwgaXMgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIKKyAgKiAgICAgICAgICAgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBpcworICAqICAgICAgICAgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZTogc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rCisgICogICAgICAgICBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwgYXJlIGZpeGVkIGJ5IGNoYW5uZWwgSFcgbnVtYmVyLgorICAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIHBhY2thZ2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUgYXZhaWxhYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdG8gbWVhc3VyZSBpbnRlcm5hbCBjaGFubmVscyAoVnJlZkludCwKKyAgKiAgICAgICAgIFRlbXBTZW5zb3IsIC4uLiksIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG11c3QgYmUKKyAgKiAgICAgICAgIGVuYWJsZWQgc2VwYXJhdGVseS4KKyAgKiAgICAgICAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgcmV0cmlldmVkLgorICAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19DSEFOTkVMXzQgfCBMTF9BRENfQ0hBTk5FTF8xMiB8IC4uLikKKyAgKiBAcm10b2xsIENIU0VMUiAgIENIU0VMMCAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDIgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMyAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw0ICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDUgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMNiAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw3ICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDggICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMOSAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMCAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDExICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTIgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMyAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE0ICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTUgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxNiAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE3ICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTggICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WTENEICAgICAgICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJMMCwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXM6IG9ubHkgb24gU1RNMzJMMDUzeHgsIFNUTTMyTDA2M3h4LCBTVE0zMkwwNzN4eCwgU1RNMzJMMDgzeHguCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVscyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgQ2hhbm5lbHNCaXRmaWVsZCA9IFJFQURfQklUKEFEQ3gtPkNIU0VMUiwgQURDX0NIU0VMUl9DSFNFTCk7CisgIAorICByZXR1cm4gKCAgICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMCkgPj4gQURDX0NIU0VMUl9DSFNFTDBfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF8wKQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMSkgPj4gQURDX0NIU0VMUl9DSFNFTDFfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF8xKQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMikgPj4gQURDX0NIU0VMUl9DSFNFTDJfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF8yKQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMykgPj4gQURDX0NIU0VMUl9DSFNFTDNfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF8zKQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMNCkgPj4gQURDX0NIU0VMUl9DSFNFTDRfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF80KQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMNSkgPj4gQURDX0NIU0VMUl9DSFNFTDVfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF81KQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMNikgPj4gQURDX0NIU0VMUl9DSFNFTDZfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF82KQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMNykgPj4gQURDX0NIU0VMUl9DSFNFTDdfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF83KQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMOCkgPj4gQURDX0NIU0VMUl9DSFNFTDhfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF84KQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMOSkgPj4gQURDX0NIU0VMUl9DSFNFTDlfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF85KQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMTApID4+IEFEQ19DSFNFTFJfQ0hTRUwxMF9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzEwKQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMTEpID4+IEFEQ19DSFNFTFJfQ0hTRUwxMV9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzExKQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMTIpID4+IEFEQ19DSFNFTFJfQ0hTRUwxMl9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzEyKQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMTMpID4+IEFEQ19DSFNFTFJfQ0hTRUwxM19CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzEzKQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMTQpID4+IEFEQ19DSFNFTFJfQ0hTRUwxNF9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzE0KQorICAgICAgICAgICB8ICgoKENoYW5uZWxzQml0ZmllbGQgJiBBRENfQ0hTRUxSX0NIU0VMMTUpID4+IEFEQ19DSFNFTFJfQ0hTRUwxNV9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzE1KQorI2lmIGRlZmluZWQoQURDX0NDUl9WTENERU4pCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxNikgPj4gQURDX0NIU0VMUl9DSFNFTDE2X0JJVE9GRlNFVF9QT1MpICogTExfQURDX0NIQU5ORUxfMTYpCisjZW5kaWYKKyAgICAgICAgICAgfCAoKChDaGFubmVsc0JpdGZpZWxkICYgQURDX0NIU0VMUl9DSFNFTDE3KSA+PiBBRENfQ0hTRUxSX0NIU0VMMTdfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF8xNykKKyAgICAgICAgICAgfCAoKChDaGFubmVsc0JpdGZpZWxkICYgQURDX0NIU0VMUl9DSFNFTDE4KSA+PiBBRENfQ0hTRUxSX0NIU0VMMThfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF8xOCkKKyAgICAgICAgICk7Cit9CisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGU6CisgICogICAgICAgICAtIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcgorICAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGU6IGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcKKyAgKiAgICAgICAgICAgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkuCisgICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIHJlZ3VsYXIgCisgICogICAgICAgICBjb250aW51b3VzIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSMSAgICBDT05UICAgICAgICAgICBMTF9BRENfUkVHX1NldENvbnRpbnVvdXNNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29udGludW91cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfQ09OVl9TSU5HTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRDb250aW51b3VzTW9kZShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ29udGludW91cykKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMSwgQURDX0NGR1IxX0NPTlQsIENvbnRpbnVvdXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGU6CisgICogICAgICAgICAtIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcgorICAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGU6IGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcKKyAgKiAgICAgICAgICAgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkuCisgICogQHJtdG9sbCBDRkdSMSAgICBDT05UICAgICAgICAgICBMTF9BRENfUkVHX0dldENvbnRpbnVvdXNNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfU0lOR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldENvbnRpbnVvdXNNb2RlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMSwgQURDX0NGR1IxX0NPTlQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvcgorICAqICAgICAgICAgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUuCisgICogQG5vdGUgICBJZiB0cmFuc2ZlciBieSBETUEgc2VsZWN0ZWQsIHNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3RzCisgICogICAgICAgICBtb2RlOgorICAqICAgICAgICAgLSBMaW1pdGVkIG1vZGUgKE9uZSBzaG90IG1vZGUpOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHN0b3BwZWQKKyAgKiAgICAgICAgICAgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKSBpcyByZWFjaGVkLgorICAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBub24tY2lyY3VsYXIuCisgICogICAgICAgICAtIFVubGltaXRlZCBtb2RlOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHVubGltaXRlZCwKKyAgKiAgICAgICAgICAgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucykuCisgICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLgorICAqIEBub3RlICAgSWYgQURDIERNQSByZXF1ZXN0cyBtb2RlIGlzIHNldCB0byB1bmxpbWl0ZWQgYW5kIERNQSBpcyBzZXQgdG8KKyAgKiAgICAgICAgIG1vZGUgbm9uLWNpcmN1bGFyOgorICAqICAgICAgICAgd2hlbiBETUEgdHJhbnNmZXJzIHNpemUgd2lsbCBiZSByZWFjaGVkLCBETUEgd2lsbCBzdG9wIHRyYW5zZmVycyBvZgorICAqICAgICAgICAgQURDIGNvbnZlcnNpb25zIGRhdGEgQURDIHdpbGwgcmFpc2UgYW4gb3ZlcnJ1biBlcnJvcgorICAqICAgICAgICAob3ZlcnJ1biBmbGFnIGFuZCBpbnRlcnJ1cHRpb24gaWYgZW5hYmxlZCkuCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgRE1BIHNvdXJjZSBhZGRyZXNzIChwZXJpcGhlcmFsIGFkZHJlc3MpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSMSAgICBETUFFTiAgICAgICAgICBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENGR1IxICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBETUFUcmFuc2ZlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBETUFUcmFuc2ZlcikKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMSwgQURDX0NGR1IxX0RNQUVOIHwgQURDX0NGR1IxX0RNQUNGRywgRE1BVHJhbnNmZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyIG9yCisgICogICAgICAgICB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZS4KKyAgKiBAbm90ZSAgIElmIHRyYW5zZmVyIGJ5IERNQSBzZWxlY3RlZCwgc3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdHMKKyAgKiAgICAgICAgIG1vZGU6CisgICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZAorICAqICAgICAgICAgICB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZgorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuCisgICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4KKyAgKiAgICAgICAgIC0gVW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLAorICAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4KKyAgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuCisgICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bworICAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6CisgICogICAgICAgICB3aGVuIERNQSB0cmFuc2ZlcnMgc2l6ZSB3aWxsIGJlIHJlYWNoZWQsIERNQSB3aWxsIHN0b3AgdHJhbnNmZXJzIG9mCisgICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yCisgICogICAgICAgICAob3ZlcnJ1biBmbGFnIGFuZCBpbnRlcnJ1cHRpb24gaWYgZW5hYmxlZCkuCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgRE1BIHNvdXJjZSBhZGRyZXNzIChwZXJpcGhlcmFsIGFkZHJlc3MpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuCisgICogQHJtdG9sbCBDRkdSMSAgICBETUFFTiAgICAgICAgICBMTF9BRENfUkVHX0dldERNQVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENGR1IxICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19SRUdfR2V0RE1BVHJhbnNmZXIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRETUFUcmFuc2ZlcihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9ETUFFTiB8IEFEQ19DRkdSMV9ETUFDRkcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOgorICAqICAgICAgICAgZGF0YSBwcmVzZXJ2ZWQgb3Igb3ZlcndyaXR0ZW4uCisgICogQG5vdGUgICBDb21wYXRpYmlsaXR5IHdpdGggZGV2aWNlcyB3aXRob3V0IGZlYXR1cmUgb3ZlcnJ1bjoKKyAgKiAgICAgICAgIG90aGVyIGRldmljZXMgd2l0aG91dCB0aGlzIGZlYXR1cmUgaGF2ZSBhIGJlaGF2aW9yCisgICogICAgICAgICBlcXVpdmFsZW50IHRvIGRhdGEgb3ZlcndyaXR0ZW4uCisgICogICAgICAgICBUaGUgZGVmYXVsdCBzZXR0aW5nIG9mIG92ZXJydW4gaXMgZGF0YSBwcmVzZXJ2ZWQuCisgICogICAgICAgICBUaGVyZWZvcmUsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYWxsIGRldmljZXMsIHBhcmFtZXRlcgorICAqICAgICAgICAgb3ZlcnJ1biBzaG91bGQgYmUgc2V0IHRvIGRhdGEgb3ZlcndyaXR0ZW4uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSMSAgICBPVlJNT0QgICAgICAgICBMTF9BRENfUkVHX1NldE92ZXJydW4KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBPdmVycnVuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldE92ZXJydW4oQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE92ZXJydW4pCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9PVlJNT0QsIE92ZXJydW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46CisgICogICAgICAgICBkYXRhIHByZXNlcnZlZCBvciBvdmVyd3JpdHRlbi4KKyAgKiBAcm10b2xsIENGR1IxICAgIE9WUk1PRCAgICAgICAgIExMX0FEQ19SRUdfR2V0T3ZlcnJ1bgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRPdmVycnVuKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMSwgQURDX0NGR1IxX09WUk1PRCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0FuYWxvZ1dhdGNoZG9nIENvbmZpZ3VyYXRpb24gb2YgQURDIHRyYW5zdmVyc2FsIHNjb3BlOiBhbmFsb2cgd2F0Y2hkb2cKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JlZCBjaGFubmVsczoKKyAgKiAgICAgICAgIGEgc2luZ2xlIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLAorICAqICAgICAgICAgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBPbmNlIG1vbml0b3JlZCBjaGFubmVscyBhcmUgc2VsZWN0ZWQsIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgaXMgZW5hYmxlZC4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgbmVlZCB0byBkZWZpbmUgYSBzaW5nbGUgY2hhbm5lbCB0byBtb25pdG9yCisgICogICAgICAgICB3aXRoIGFuYWxvZyB3YXRjaGRvZyBmcm9tIHNlcXVlbmNlciBjaGFubmVsIGRlZmluaXRpb24sCisgICogICAgICAgICB1c2UgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUCgpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgb25seSAxIGtpbmQgb2YgYW5hbG9nIHdhdGNoZG9nCisgICogICAgICAgICBpbnN0YW5jZToKKyAgKiAgICAgICAgIC0gQVdEIHN0YW5kYXJkIChpbnN0YW5jZSBBV0QxKToKKyAgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGNhbiBtb25pdG9yIDEgY2hhbm5lbCBvciBhbGwgY2hhbm5lbHMuCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogQURDIGdyb3VwIHJlZ3VsYXIuCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAgKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IxICAgIEFXRENIICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQ0ZHUjEgICAgQVdEU0dMICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBDRkdSMSAgICBBV0RFTiAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEQ2hhbm5lbEdyb3VwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcgICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkxDRF9SRUcgICAgICAgICAgICAgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkwwLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlczogb25seSBvbiBTVE0zMkwwNTN4eCwgU1RNMzJMMDYzeHgsIFNUTTMyTDA3M3h4LCBTVE0zMkwwODN4eC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRENoYW5uZWxHcm91cCkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMSwKKyAgICAgICAgICAgICAoQURDX0NGR1IxX0FXRENIIHwgQURDX0NGR1IxX0FXRFNHTCB8IEFEQ19DRkdSMV9BV0RFTiksCisgICAgICAgICAgICAgKEFXRENoYW5uZWxHcm91cCAmIEFEQ19BV0RfQ1JfQUxMX0NIQU5ORUxfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JlZCBjaGFubmVsLgorICAqIEBub3RlICAgVXNhZ2Ugb2YgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyOgorICAqICAgICAgICAgLSBUbyByZWluamVjdCB0aGlzIGNoYW5uZWwgaW50byBhbm90aGVyIGZ1bmN0aW9uIExMX0FEQ194eHg6CisgICogICAgICAgICAgIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlciBpcyBvbmx5IHBhcnRseSBmb3JtYXR0ZWQgb24gZGVmaW5pdGlvbgorICAqICAgICAgICAgICBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LiBUaGVyZWZvcmUsIGl0IGhhcyB0byBiZSBjb21wYXJlZAorICAqICAgICAgICAgICB3aXRoIHBhcnRzIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3ggb3IgdXNpbmcKKyAgKiAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogICAgICAgICAgIFRoZW4gdGhlIHNlbGVjdGVkIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCBjYW4gYmUgdXNlZAorICAqICAgICAgICAgICBhcyBwYXJhbWV0ZXIgZm9yIGFub3RoZXIgZnVuY3Rpb24uCisgICogICAgICAgICAtIFRvIGdldCB0aGUgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQ6CisgICogICAgICAgICAgIHByb2Nlc3MgdGhlIHJldHVybmVkIHZhbHVlIHdpdGggdGhlIGhlbHBlciBtYWNybworICAqICAgICAgICAgICBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICAqICAgICAgICAgICBBcHBsaWNhYmxlIG9ubHkgd2hlbiB0aGUgYW5hbG9nIHdhdGNoZG9nIGlzIHNldCB0byBtb25pdG9yCisgICogICAgICAgICAgIG9uZSBjaGFubmVsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgaXMgb25seSAxIGtpbmQgb2YgYW5hbG9nIHdhdGNoZG9nCisgICogICAgICAgICBpbnN0YW5jZToKKyAgKiAgICAgICAgIC0gQVdEIHN0YW5kYXJkIChpbnN0YW5jZSBBV0QxKToKKyAgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGNhbiBtb25pdG9yIDEgY2hhbm5lbCBvciBhbGwgY2hhbm5lbHMuCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogQURDIGdyb3VwIHJlZ3VsYXIuCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAgKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IxICAgIEFXRENIICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQ0ZHUjEgICAgQVdEU0dMICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBDRkdSMSAgICBBV0RFTiAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVscyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgQVdEQ2hhbm5lbEdyb3VwID0gUkVBRF9CSVQoQURDeC0+Q0ZHUjEsIChBRENfQ0ZHUjFfQVdEQ0ggfCBBRENfQ0ZHUjFfQVdEU0dMIHwgQURDX0NGR1IxX0FXREVOKSk7CisgIAorICAvKiBOb3RlOiBTZXQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIGNoYW5uZWwgZGVmaW5pdGlvbiBpbmNsdWRpbmcgY2hhbm5lbCBJRCAgKi8KKyAgLyogICAgICAgd2l0aCBiaXRmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ2lzdGVyIHVpbnQzMl90IEFXRENoYW5uZWxTaW5nbGUgPSAoKEFXRENoYW5uZWxHcm91cCAmIEFEQ19DRkdSMV9BV0RTR0wpID4+IEFEQ19DRkdSMV9BV0RTR0xfQklUT0ZGU0VUX1BPUyk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IEFXRENoYW5uZWxCaXRGaWVsZCA9IChBRENfQ0hBTk5FTF8wX0JJVEZJRUxEIDw8ICgoQVdEQ2hhbm5lbEdyb3VwICYgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spID4+IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSk7CisgIAorICByZXR1cm4gKEFXRENoYW5uZWxHcm91cCB8IChBV0RDaGFubmVsQml0RmllbGQgKiBBV0RDaGFubmVsU2luZ2xlKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyB2YWx1ZSBvZiBib3RoIHRocmVzaG9sZHMKKyAgKiAgICAgICAgIGhpZ2ggYW5kIGxvdy4KKyAgKiBAbm90ZSAgIElmIHZhbHVlIG9mIG9ubHkgb25lIHRocmVzaG9sZCBoaWdoIG9yIGxvdyBtdXN0IGJlIHNldCwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBkYXRhIHJlcXVpcmUgYSBzcGVjaWZpYyBzaGlmdC4KKyAgKiAgICAgICAgIFVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9TRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGlzIG9ubHkgMSBraW5kIG9mIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgaW5zdGFuY2U6CisgICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cCByZWd1bGFyLgorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvCisgICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBUUiAgICAgICBIVCAgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSICAgICAgIExUICAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBV0RUaHJlc2hvbGRIaWdoVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcGFyYW0gIEFXRFRocmVzaG9sZExvd1ZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBBV0RUaHJlc2hvbGRIaWdoVmFsdWUsIHVpbnQzMl90IEFXRFRocmVzaG9sZExvd1ZhbHVlKQoreworICBNT0RJRllfUkVHKEFEQ3gtPlRSLAorICAgICAgICAgICAgIEFEQ19UUl9IVCB8IEFEQ19UUl9MVCwKKyAgICAgICAgICAgICAoQVdEVGhyZXNob2xkSGlnaFZhbHVlIDw8IEFEQ19UUl9IVF9CSVRPRkZTRVRfUE9TKSB8IEFXRFRocmVzaG9sZExvd1ZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgdmFsdWUgb2YgdGhyZXNob2xkCisgICogICAgICAgICBoaWdoIG9yIGxvdy4KKyAgKiBAbm90ZSAgIElmIHZhbHVlcyBvZiBib3RoIHRocmVzaG9sZHMgaGlnaCBvciBsb3cgbXVzdCBiZSBzZXQsCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIEFEQyByZXNvbHV0aW9uIGRpZmZlcmVudCBvZiAxMiBiaXRzLAorICAqICAgICAgICAgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgZGF0YSByZXF1aXJlIGEgc3BlY2lmaWMgc2hpZnQuCisgICogICAgICAgICBVc2UgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQU5BTE9HV0RfU0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBpcyBvbmx5IDEga2luZCBvZiBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGluc3RhbmNlOgorICAqICAgICAgICAgLSBBV0Qgc3RhbmRhcmQgKGluc3RhbmNlIEFXRDEpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXAgcmVndWxhci4KKyAgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIG5vdCBsaW1pdGVkIChjb3JyZXNwb25kcyB0bworICAqICAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGNvbmZpZ3VyZWQpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgVFIgICAgICAgSFQgICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUiAgICAgICBMVCAgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEVGhyZXNob2xkc0hpZ2hMb3cgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfTE9XCisgICogQHBhcmFtICBBV0RUaHJlc2hvbGRWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEVGhyZXNob2xkc0hpZ2hMb3csIHVpbnQzMl90IEFXRFRocmVzaG9sZFZhbHVlKQoreworICAvKiBQYXJhbWV0ZXIgIkFXRFRocmVzaG9sZHNIaWdoTG93IiBpcyB1c2VkIHdpdGggbWFzayAiMHgwMDAwMDAxMCIgICAgICAgICAgKi8KKyAgLyogdG8gYmUgZXF1aXZhbGVudCB0byAiUE9TSVRJT05fVkFMKEFXRFRocmVzaG9sZHNIaWdoTG93KSI6IGlmIHRocmVzaG9sZCAgICovCisgIC8qIGhpZ2ggaXMgc2VsZWN0ZWQsIHRoZW4gZGF0YSBpcyBzaGlmdGVkIHRvIExTQi4gRWxzZSh0aHJlc2hvbGQgbG93KSwgICAgICAqLworICAvKiBkYXRhIGlzIG5vdCBzaGlmdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5UUiwKKyAgICAgICAgICAgICBBV0RUaHJlc2hvbGRzSGlnaExvdywKKyAgICAgICAgICAgICBBV0RUaHJlc2hvbGRWYWx1ZSA8PCAoKEFXRFRocmVzaG9sZHNIaWdoTG93ID4+IEFEQ19UUl9IVF9CSVRPRkZTRVRfUE9TKSAmICgodWludDMyX3QpMHgwMDAwMDAxMFUpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIHZhbHVlIG9mIHRocmVzaG9sZCBoaWdoLAorICAqICAgICAgICAgdGhyZXNob2xkIGxvdyBvciByYXcgZGF0YSB3aXRoIEFEQyB0aHJlc2hvbGRzIGhpZ2ggYW5kIGxvdworICAqICAgICAgICAgY29uY2F0ZW5hdGVkLgorICAqIEBub3RlICAgSWYgcmF3IGRhdGEgd2l0aCBBREMgdGhyZXNob2xkcyBoaWdoIGFuZCBsb3cgaXMgcmV0cmlldmVkLAorICAqICAgICAgICAgdGhlIGRhdGEgb2YgZWFjaCB0aHJlc2hvbGQgaGlnaCBvciBsb3cgY2FuIGJlIGlzb2xhdGVkCisgICogICAgICAgICB1c2luZyBoZWxwZXIgbWFjcm86CisgICogICAgICAgICBAcmVmIF9fTExfQURDX0FOQUxPR1dEX1RIUkVTSE9MRFNfSElHSF9MT1coKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBkYXRhIHJlcXVpcmUgYSBzcGVjaWZpYyBzaGlmdC4KKyAgKiAgICAgICAgIFVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9HRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oKS4KKyAgKiBAcm10b2xsIFRSICAgICAgIEhUICAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIgICAgICAgTFQgICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFXRFRocmVzaG9sZHNIaWdoTG93IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEU19ISUdIX0xPVworICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEVGhyZXNob2xkc0hpZ2hMb3cpCit7CisgIC8qIFBhcmFtZXRlciAiQVdEVGhyZXNob2xkc0hpZ2hMb3ciIGlzIHVzZWQgd2l0aCBtYXNrICIweDAwMDAwMDEwIiAgICAgICAgICAqLworICAvKiB0byBiZSBlcXVpdmFsZW50IHRvICJQT1NJVElPTl9WQUwoQVdEVGhyZXNob2xkc0hpZ2hMb3cpIjogaWYgdGhyZXNob2xkICAgKi8KKyAgLyogaGlnaCBpcyBzZWxlY3RlZCwgdGhlbiBkYXRhIGlzIHNoaWZ0ZWQgdG8gTFNCLiBFbHNlKHRocmVzaG9sZCBsb3cgb3IgICAgICovCisgIC8qIGJvdGggdGhyZXNob2xkcyksIGRhdGEgaXMgbm90IHNoaWZ0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5UUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFXRFRocmVzaG9sZHNIaWdoTG93IHwgQURDX1RSX0xUKSkKKyAgICAgICAgICAgICAgICAgICAgPj4gKCh+QVdEVGhyZXNob2xkc0hpZ2hMb3cpICYgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkpCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfb3ZlcnNhbXBsaW5nIENvbmZpZ3VyYXRpb24gb2YgQURDIHRyYW5zdmVyc2FsIHNjb3BlOiBvdmVyc2FtcGxpbmcKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgb3ZlcnNhbXBsaW5nIHNjb3BlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjIgICAgT1ZTRSAgICAgICAgICAgTExfQURDX1NldE92ZXJTYW1wbGluZ1Njb3BlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3ZzU2NvcGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0dSUF9SRUdVTEFSX0NPTlRJTlVFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE92ZXJTYW1wbGluZ1Njb3BlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBPdnNTY29wZSkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMiwgQURDX0NGR1IyX09WU0UsIE92c1Njb3BlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIG92ZXJzYW1wbGluZyBzY29wZS4KKyAgKiBAcm10b2xsIENGR1IyICAgIE9WU0UgICAgICAgICAgIExMX0FEQ19HZXRPdmVyU2FtcGxpbmdTY29wZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfUkVHVUxBUl9DT05USU5VRUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nU2NvcGUoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfT1ZTRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgb3ZlcnNhbXBsaW5nIGRpc2NvbnRpbnVvdXMgbW9kZSAodHJpZ2dlcmVkIG1vZGUpCisgICogICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgQURDIGdyb3VwLgorICAqIEBub3RlICAgTnVtYmVyIG9mIG92ZXJzYW1wbGVkIGNvbnZlcnNpb25zIGFyZSBkb25lIGVpdGhlciBpbjoKKyAgKiAgICAgICAgIC0gY29udGludW91cyBtb2RlIChhbGwgY29udmVyc2lvbnMgb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvCisgICogICAgICAgICAgIGFyZSBkb25lIGZyb20gMSB0cmlnZ2VyKQorICAqICAgICAgICAgLSBkaXNjb250aW51b3VzIG1vZGUgKGVhY2ggY29udmVyc2lvbiBvZiBvdmVyc2FtcGxpbmcgcmF0aW8KKyAgKiAgICAgICAgICAgbmVlZHMgYSB0cmlnZ2VyKQorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjIgICAgVE9WUyAgICAgICAgICAgTExfQURDX1NldE92ZXJTYW1wbGluZ0Rpc2NvbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBPdmVyU2FtcGxpbmdEaXNjb250IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SRUdfQ09OVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkVHX0RJU0NPTlQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPdmVyU2FtcGxpbmdEaXNjb250KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBPdmVyU2FtcGxpbmdEaXNjb250KQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfVE9WUywgT3ZlclNhbXBsaW5nRGlzY29udCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBvdmVyc2FtcGxpbmcgZGlzY29udGludW91cyBtb2RlICh0cmlnZ2VyZWQgbW9kZSkKKyAgKiAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBBREMgZ3JvdXAuCisgICogQG5vdGUgICBOdW1iZXIgb2Ygb3ZlcnNhbXBsZWQgY29udmVyc2lvbnMgYXJlIGRvbmUgZWl0aGVyIGluOgorICAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGUgKGFsbCBjb252ZXJzaW9ucyBvZiBvdmVyc2FtcGxpbmcgcmF0aW8KKyAgKiAgICAgICAgICAgYXJlIGRvbmUgZnJvbSAxIHRyaWdnZXIpCisgICogICAgICAgICAtIGRpc2NvbnRpbnVvdXMgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIG92ZXJzYW1wbGluZyByYXRpbworICAqICAgICAgICAgICBuZWVkcyBhIHRyaWdnZXIpCisgICogQHJtdG9sbCBDRkdSMiAgICBUT1ZTICAgICAgICAgICBMTF9BRENfR2V0T3ZlclNhbXBsaW5nRGlzY29udAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SRUdfQ09OVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkVHX0RJU0NPTlQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nRGlzY29udChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9UT1ZTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBvdmVyc2FtcGxpbmcKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSAyIGl0ZW1zIG9mIG92ZXJzYW1wbGluZyBjb25maWd1cmF0aW9uOgorICAqICAgICAgICAgLSByYXRpbworICAqICAgICAgICAgLSBzaGlmdAorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjIgICAgT1ZTUyAgICAgICAgICAgTExfQURDX0NvbmZpZ092ZXJTYW1wbGluZ1JhdGlvU2hpZnRcbgorICAqICAgICAgICAgQ0ZHUjIgICAgT1ZTUiAgICAgICAgICAgTExfQURDX0NvbmZpZ092ZXJTYW1wbGluZ1JhdGlvU2hpZnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSYXRpbyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT182NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18yNTYKKyAgKiBAcGFyYW0gIFNoaWZ0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19TSElGVF9SSUdIVF84CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ29uZmlnT3ZlclNhbXBsaW5nUmF0aW9TaGlmdChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmF0aW8sIHVpbnQzMl90IFNoaWZ0KQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IyLCAoQURDX0NGR1IyX09WU1MgfCBBRENfQ0ZHUjJfT1ZTUiksIChTaGlmdCB8IFJhdGlvKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8KKyAgKiBAcm10b2xsIENGR1IyICAgIE9WU1IgICAgICAgICAgIExMX0FEQ19HZXRPdmVyU2FtcGxpbmdSYXRpbworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJhdGlvIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT180CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT184CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzI1NgorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nUmF0aW8oQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfT1ZTUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0CisgICogQHJtdG9sbCBDRkdSMiAgICBPVlNTICAgICAgICAgICBMTF9BRENfR2V0T3ZlclNhbXBsaW5nU2hpZnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTaGlmdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfOAorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nU2hpZnQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfT1ZTUykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9PcGVyYXRpb25fQURDX0luc3RhbmNlIE9wZXJhdGlvbiBvbiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBBREMgaW5zdGFuY2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMgaW5zdGFuY2UgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBhcmUgdGhyZWUgcG9zc2liaWxpdGllcyB0byBlbmFibGUKKyAgKiAgICAgICAgIHRoZSB2b2x0YWdlIHJlZ3VsYXRvcjoKKyAgKiAgICAgICAgIC0gYnkgZW5hYmxpbmcgaXQgbWFudWFsbHkKKyAgKiAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfRW5hYmxlSW50ZXJuYWxSZWd1bGF0b3IoKS4KKyAgKiAgICAgICAgIC0gYnkgbGF1bmNoaW5nIGEgY2FsaWJyYXRpb24KKyAgKiAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbigpLgorICAqICAgICAgICAgLSBieSBlbmFibGluZyB0aGUgQURDCisgICogICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX0VuYWJsZSgpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYWZ0ZXIgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yIGVuYWJsZSwKKyAgKiAgICAgICAgIGEgZGVsYXkgZm9yIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBzdGFiaWxpemF0aW9uCisgICogICAgICAgICBpcyByZXF1aXJlZCBiZWZvcmUgcGVyZm9ybWluZyBhIEFEQyBjYWxpYnJhdGlvbiBvciBBREMgZW5hYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0VVBfTERPIi4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgQHJlZiBMTF9BRENfREVMQVlfSU5URVJOQUxfUkVHVUxfU1RBQl9VUy4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFZSRUdFTiAgICAgICBMTF9BRENfRW5hYmxlSW50ZXJuYWxSZWd1bGF0b3IKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSW50ZXJuYWxSZWd1bGF0b3IoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsCisgICAgICAgICAgICAgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsCisgICAgICAgICAgICAgQURDX0NSX0FEVlJFR0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvci4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFZSRUdFTiAgICAgICBMTF9BRENfRGlzYWJsZUludGVybmFsUmVndWxhdG9yCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJbnRlcm5hbFJlZ3VsYXRvcihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPkNSLCAoQURDX0NSX0FEVlJFR0VOIHwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBzdGF0ZS4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEVlJFR0VOICAgICAgIExMX0FEQ19Jc0ludGVybmFsUmVndWxhdG9yRW5hYmxlZAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IGludGVybmFsIHJlZ3VsYXRvciBpcyBkaXNhYmxlZCwgMTogaW50ZXJuYWwgcmVndWxhdG9yIGlzIGVuYWJsZWQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzSW50ZXJuYWxSZWd1bGF0b3JFbmFibGVkKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURWUkVHRU4pID09IChBRENfQ1JfQURWUkVHRU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGFmdGVyIEFEQyBlbmFibGUsIGEgZGVsYXkgZm9yIAorICAqICAgICAgICAgQURDIGludGVybmFsIGFuYWxvZyBzdGFiaWxpemF0aW9uIGlzIHJlcXVpcmVkIGJlZm9yZSBwZXJmb3JtaW5nIGEKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIHN0YXJ0LgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIHRTVEFCLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIEFEQyBkaXNhYmxlZCBhbmQgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBREVOICAgICAgICAgICBMTF9BRENfRW5hYmxlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwKKyAgICAgICAgICAgICBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywKKyAgICAgICAgICAgICBBRENfQ1JfQURFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIG5vdCBkaXNhYmxlZC4gTXVzdCBiZSBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENSICAgICAgIEFERElTICAgICAgICAgIExMX0FEQ19EaXNhYmxlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGUoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsCisgICAgICAgICAgICAgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsCisgICAgICAgICAgICAgQURDX0NSX0FERElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBlbmFibGUgc3RhdGUuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBmbGFnIExMX0FEQ19GTEFHX0FEUkRZIGlzIHJhaXNlZCB3aGVuIHRoZSBBREMKKyAgKiAgICAgICAgIGlzIGVuYWJsZWQgYW5kIHdoZW4gY29udmVyc2lvbiBjbG9jayBpcyBhY3RpdmUuCisgICogICAgICAgICAobm90IG9ubHkgY29yZSBjbG9jazogdGhpcyBBREMgaGFzIGEgZHVhbCBjbG9jayBkb21haW4pCisgICogQHJtdG9sbCBDUiAgICAgICBBREVOICAgICAgICAgICBMTF9BRENfSXNFbmFibGVkCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgMDogQURDIGlzIGRpc2FibGVkLCAxOiBBREMgaXMgZW5hYmxlZC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURFTikgPT0gKEFEQ19DUl9BREVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgZGlzYWJsZSBzdGF0ZS4KKyAgKiBAcm10b2xsIENSICAgICAgIEFERElTICAgICAgICAgIExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgMDogbm8gQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNEaXNhYmxlT25nb2luZyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FERElTKSA9PSAoQURDX0NSX0FERElTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgQURDIGNhbGlicmF0aW9uIGluIHRoZSBtb2RlIHNpbmdsZS1lbmRlZAorICAqICAgICAgICAgb3IgZGlmZmVyZW50aWFsIChmb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZSkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBhIG1pbmltdW0gbnVtYmVyIG9mIEFEQyBjbG9jayBjeWNsZXMKKyAgKiAgICAgICAgIGFyZSByZXF1aXJlZCBiZXR3ZWVuIEFEQyBlbmQgb2YgY2FsaWJyYXRpb24gYW5kIEFEQyBlbmFibGUuCisgICogICAgICAgICBSZWZlciB0byBsaXRlcmFsIEByZWYgTExfQURDX0RFTEFZX0NBTElCX0VOQUJMRV9BRENfQ1lDTEVTLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiB1c2FnZSBvZiBBREMgd2l0aCBETUEgdHJhbnNmZXI6CisgICogICAgICAgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgRE1BIHRyYW5zZmVyIHJlcXVlc3Qgc2hvdWxkIGJlIGRpc2FibGVkCisgICogICAgICAgICBkdXJpbmcgY2FsaWJyYXRpb246CisgICogICAgICAgICBDYWxpYnJhdGlvbiBmYWN0b3IgaXMgYXZhaWxhYmxlIGluIGRhdGEgcmVnaXN0ZXIKKyAgKiAgICAgICAgIGFuZCBhbHNvIHRyYW5zZmVyZWQgYnkgRE1BLgorICAqICAgICAgICAgVG8gbm90IGluc2VydCBBREMgY2FsaWJyYXRpb24gZmFjdG9yIGFtb25nIEFEQyBjb252ZXJzaW9uIGRhdGEKKyAgKiAgICAgICAgIGluIGFycmF5IHZhcmlhYmxlLCBETUEgdHJhbnNmZXIgbXVzdCBiZSBkaXNhYmxlZCBkdXJpbmcKKyAgKiAgICAgICAgIGNhbGlicmF0aW9uLgorICAqICAgICAgICAgKERNQSB0cmFuc2ZlciBzZXR0aW5nIGJhY2t1cCBhbmQgZGlzYWJsZSBiZWZvcmUgY2FsaWJyYXRpb24sCisgICogICAgICAgICBETUEgdHJhbnNmZXIgc2V0dGluZyByZXN0b3JlIGFmdGVyIGNhbGlicmF0aW9uLgorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb25zIEByZWYgTExfQURDX1JFR19HZXRETUFUcmFuc2ZlcigpLAorICAqICAgICAgICAgQHJlZiBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyKCkgKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBRENBTCAgICAgICAgICBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TdGFydENhbGlicmF0aW9uKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRENBTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBjYWxpYnJhdGlvbiBzdGF0ZS4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEQ0FMICAgICAgICAgIExMX0FEQ19Jc0NhbGlicmF0aW9uT25Hb2luZworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IGNhbGlicmF0aW9uIGNvbXBsZXRlLCAxOiBjYWxpYnJhdGlvbiBpbiBwcm9ncmVzcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNDYWxpYnJhdGlvbk9uR29pbmcoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRENBTCkgPT0gKEFEQ19DUl9BRENBTCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9PcGVyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIgT3BlcmF0aW9uIG9uIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IGdyb3VwIHJlZ3VsYXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50IGZvciBib3RoIAorICAqICAgICAgICAgaW50ZXJuYWwgdHJpZ2dlciAoU1cgc3RhcnQpIGFuZCBleHRlcm5hbCB0cmlnZ2VyOgorICAqICAgICAgICAgLSBJZiBBREMgdHJpZ2dlciBoYXMgYmVlbiBzZXQgdG8gc29mdHdhcmUgc3RhcnQsIEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICAgIHN0YXJ0cyBpbW1lZGlhdGVseS4KKyAgKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIsIEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICAgIHdpbGwgc3RhcnQgYXQgbmV4dCB0cmlnZ2VyIGV2ZW50IChvbiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBlZGdlKQorICAqICAgICAgICAgICBmb2xsb3dpbmcgdGhlIEFEQyBzdGFydCBjb252ZXJzaW9uIGNvbW1hbmQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhciwKKyAgKiAgICAgICAgIHdpdGhvdXQgY29udmVyc2lvbiBzdG9wIGNvbW1hbmQgb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhciwKKyAgKiAgICAgICAgIHdpdGhvdXQgQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEU1RBUlQgICAgICAgIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24oQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsCisgICAgICAgICAgICAgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsCisgICAgICAgICAgICAgQURDX0NSX0FEU1RBUlQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbi4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLAorICAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLgorICAqIEBybXRvbGwgQ1IgICAgICAgQURTVFAgICAgICAgICAgTExfQURDX1JFR19TdG9wQ29udmVyc2lvbgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU3RvcENvbnZlcnNpb24oQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsCisgICAgICAgICAgICAgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsCisgICAgICAgICAgICAgQURDX0NSX0FEU1RQKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBzdGF0ZS4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEU1RBUlQgICAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURTVEFSVCkgPT0gKEFEQ19DUl9BRFNUQVJUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbW1hbmQgb2YgY29udmVyc2lvbiBzdG9wIHN0YXRlCisgICogQHJtdG9sbCBDUiAgICAgICBBRFNUUCAgICAgICAgICBMTF9BRENfUkVHX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgMDogbm8gY29tbWFuZCBvZiBjb252ZXJzaW9uIHN0b3AgaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19Jc1N0b3BDb252ZXJzaW9uT25nb2luZyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FEU1RQKSA9PSAoQURDX0NSX0FEU1RQKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgYWxsIEFEQyBjb25maWd1cmF0aW9uczogYWxsIEFEQyByZXNvbHV0aW9ucyBhbmQKKyAgKiAgICAgICAgIGFsbCBvdmVyc2FtcGxpbmcgaW5jcmVhc2VkIGRhdGEgd2lkdGggKGZvciBkZXZpY2VzCisgICogICAgICAgICB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nKS4KKyAgKiBAcm10b2xsIERSICAgICAgIERBVEEgICAgICAgICAgIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX0RBVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMiBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBEUiAgICAgICBEQVRBICAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEyKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX0RBVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMCBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBEUiAgICAgICBEQVRBICAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEwCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHgzRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEwKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX0RBVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiA4IGJpdHMuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nOiBPdmVyc2FtcGxpbmcKKyAgKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UKKyAgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAgKiBAcm10b2xsIERSICAgICAgIERBVEEgICAgICAgICAgIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhOAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE4KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKEFEQ3gtPkRSLCBBRENfRFJfREFUQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAgKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDYgYml0cy4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQorICAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICAqIEBybXRvbGwgRFIgICAgICAgREFUQSAgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE2CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDNGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTYoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9EQVRBKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBBREMgZmxhZyBtYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgcmVhZHkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBmbGFnIExMX0FEQ19GTEFHX0FEUkRZIGlzIHJhaXNlZCB3aGVuIHRoZSBBREMKKyAgKiAgICAgICAgIGlzIGVuYWJsZWQgYW5kIHdoZW4gY29udmVyc2lvbiBjbG9jayBpcyBhY3RpdmUuCisgICogICAgICAgICAobm90IG9ubHkgY29yZSBjbG9jazogdGhpcyBBREMgaGFzIGEgZHVhbCBjbG9jayBkb21haW4pCisgICogQHJtdG9sbCBJU1IgICAgICBBRFJEWSAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0FEUkRZCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BRFJEWSkgPT0gKExMX0FEQ19GTEFHX0FEUkRZKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEVPQyAgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklTUiwgQURDX0lTUl9FT0MpID09IChBRENfSVNSX0VPQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElTUiAgICAgIEVPU0VRICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9TKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9TKSA9PSAoTExfQURDX0ZMQUdfRU9TKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1bi4KKyAgKiBAcm10b2xsIElTUiAgICAgIE9WUiAgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfT1ZSCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfT1ZSKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfT1ZSKSA9PSAoTExfQURDX0ZMQUdfT1ZSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9TTVAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19FT1NNUAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPU01QKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9TTVApID09IChMTF9BRENfRkxBR19FT1NNUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICBBV0QgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDEKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMSkgPT0gKExMX0FEQ19GTEFHX0FXRDEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgZW5kIG9mIGNhbGlicmF0aW9uLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9DQUwgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19FT0NBTAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPQ0FMKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9DQUwpID09IChMTF9BRENfRkxBR19FT0NBTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIHJlYWR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBybXRvbGwgSVNSICAgICAgQURSRFkgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FEUkRZKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgICogQHJtdG9sbCBJU1IgICAgICBFT0MgICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0VPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9TRVEgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9TKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4uCisgICogQHJtdG9sbCBJU1IgICAgICBPVlIgICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfT1ZSKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19PVlIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9TTVAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT1NNUAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfRU9TTVAoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0VPU01QKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMS4KKyAgKiBAcm10b2xsIElTUiAgICAgIEFXRCAgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQVdEMShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZW5kIG9mIGNhbGlicmF0aW9uLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9DQUwgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT0NBTAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfRU9DQUwoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0VPQ0FMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfSVRfTWFuYWdlbWVudCBBREMgSVQgbWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFEQyByZWFkeS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9BRFJEWShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BRFJEWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLgorICAqIEBybXRvbGwgSUVSICAgICAgRU9DSUUgICAgICAgICAgTExfQURDX0VuYWJsZUlUX0VPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9FT0MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9DKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPU0VRSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfRU9TKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFEQyBncm91cCByZWd1bGFyIGludGVycnVwdGlvbiBvdmVycnVuLgorICAqIEBybXRvbGwgSUVSICAgICAgT1ZSSUUgICAgICAgICAgTExfQURDX0VuYWJsZUlUX09WUgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9PVlIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfT1ZSKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPU01QSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9FT1NNUAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9FT1NNUChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1NNUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEuCisgICogQHJtdG9sbCBJRVIgICAgICBBV0RJRSAgICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGVuZCBvZiBjYWxpYnJhdGlvbi4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0FMSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9FT0NBTAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9FT0NBTChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0NBTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIHJlYWR5LgorICAqIEBybXRvbGwgSUVSICAgICAgQURSRFlJRSAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BRFJEWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT0MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPU0VRSUUgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4uCisgICogQHJtdG9sbCBJRVIgICAgICBPVlJJRSAgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX09WUgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfT1ZSKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfT1ZSKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NNUElFICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0VPU01QCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT1NNUChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEuCisgICogQHJtdG9sbCBJRVIgICAgICBBV0RJRSAgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0FXRDEKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QxKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uLgorICAqIEBybXRvbGwgSUVSICAgICAgRU9DQUxJRSAgICAgICAgTExfQURDX0Rpc2FibGVJVF9FT0NBTAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfRU9DQUwoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0NBTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgcmVhZHkKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQURSRFkpID09IChMTF9BRENfSVRfQURSRFkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24KKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT0MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0VPQyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpID09IChMTF9BRENfSVRfRU9DKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPU0VRSUUgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1MpID09IChMTF9BRENfSVRfRU9TKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBPVlJJRSAgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfT1ZSCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9PVlIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfT1ZSKSA9PSAoTExfQURDX0lUX09WUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NNUElFICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfRU9TTVAKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0VPU01QKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKSA9PSAoTExfQURDX0lUX0VPU01QKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFXRElFICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDEpID09IChMTF9BRENfSVRfQVdEMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGVuZCBvZiBjYWxpYnJhdGlvbgorICAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICAqIEBybXRvbGwgSUVSICAgICAgRU9DQUxJRSAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0VPQ0FMCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9FT0NBTChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0NBTCkgPT0gKExMX0FEQ19JVF9FT0NBTCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBjb21tb24gcGFyYW1ldGVycyBhbmQgbXVsdGltb2RlICovCitFcnJvclN0YXR1cyBMTF9BRENfQ29tbW9uRGVJbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKTsKK0Vycm9yU3RhdHVzIExMX0FEQ19Db21tb25Jbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgKkFEQ19Db21tb25Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0FEQ19Db21tb25TdHJ1Y3RJbml0KExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpOworCisvKiBEZS1pbml0aWFsaXphdGlvbiBvZiBBREMgaW5zdGFuY2UgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19EZUluaXQoQURDX1R5cGVEZWYgKkFEQ3gpOworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZSAqLworRXJyb3JTdGF0dXMgTExfQURDX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQURDX1N0cnVjdEluaXQoTExfQURDX0luaXRUeXBlRGVmICpBRENfSW5pdFN0cnVjdCk7CisKKy8qIEluaXRpYWxpemF0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlIGFuZCBBREMgZ3JvdXAgcmVndWxhciAqLworRXJyb3JTdGF0dXMgTExfQURDX1JFR19Jbml0KEFEQ19UeXBlRGVmICpBREN4LCBMTF9BRENfUkVHX0luaXRUeXBlRGVmICpBRENfUkVHX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQURDX1JFR19TdHJ1Y3RJbml0KExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgKkFEQ19SRUdfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBBREMxICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9MTF9BRENfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9sbF9idXMuaCBiL0luYy9zdG0zMmwweHhfbGxfYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2ZjI3YQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfbGxfYnVzLmgKQEAgLTAsMCArMSwxMTcxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX2J1cy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBCVVMgTEwgbW9kdWxlLgorCisgIEB2ZXJiYXRpbQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJDQyBMaW1pdGF0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBBIGRlbGF5IGJldHdlZW4gYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxlIGFuZCB0aGUgZWZmZWN0aXZlIHBlcmlwaGVyYWwKKyAgICAgIGVuYWJsaW5nIHNob3VsZCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gb3JkZXIgdG8gbWFuYWdlIHRoZSBwZXJpcGhlcmFsIHJlYWQvd3JpdGUKKyAgICAgIGZyb20vdG8gcmVnaXN0ZXJzLgorICAgICAgKCspIFRoaXMgZGVsYXkgZGVwZW5kcyBvbiB0aGUgcGVyaXBoZXJhbCBtYXBwaW5nLgorICAgICAgICAoKyspIEFIQiAmIEFQQiBwZXJpcGhlcmFscywgMSBkdW1teSByZWFkIGlzIG5lY2Vzc2FyeQorCisgICAgWy4uXQorICAgICAgV29ya2Fyb3VuZHM6CisgICAgICAoIykgRm9yIEFIQiAmIEFQQiBwZXJpcGhlcmFscywgYSBkdW1teSByZWFkIHRvIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIGhhcyBiZWVuCisgICAgICAgICAgaW5zZXJ0ZWQgaW4gZWFjaCBMTF97QlVTfV9HUlB7eH1fRW5hYmxlQ2xvY2soKSBmdW5jdGlvbi4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0xMX0JVU19ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0xMX0JVU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSQ0MpCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMIEJVUworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBCVVMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQUhCMV9HUlAxX1BFUklQSCAgQUhCMSBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfQUxMICAgICAgICAgICAgKHVpbnQzMl90KTB4RkZGRkZGRkZVCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMSAgICAgICAgICAgUkNDX0FIQkVOUl9ETUExRU4gICAgICAvKiE8IERNQTEgY2xvY2sgZW5hYmxlICovCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfTUlGICAgICAgICAgICAgUkNDX0FIQkVOUl9NSUZFTiAgICAgICAvKiE8IE1JRiBjbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9TUkFNICAgICAgICAgICBSQ0NfQUhCU01FTlJfU1JBTVNNRU4gIC8qITwgU2xlZXAgTW9kZSBTUkFNIGNsb2NrIGVuYWJsZSAqLworI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQyAgICAgICAgICAgIFJDQ19BSEJFTlJfQ1JDRU4gICAgICAgLyohPCBDUkMgY2xvY2sgZW5hYmxlICovCisjaWYgZGVmaW5lZChUU0MpCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDICAgICAgICAgICAgUkNDX0FIQkVOUl9UU0NFTiAgICAgICAvKiE8IFRTQyBjbG9jayBlbmFibGUgKi8KKyNlbmRpZiAvKlRTQyovCisjaWYgZGVmaW5lZChSTkcpCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfUk5HICAgICAgICAgICAgUkNDX0FIQkVOUl9STkdFTiAgICAgICAvKiE8IFJORyBjbG9jayBlbmFibGUgKi8KKyNlbmRpZiAvKlJORyovCisjaWYgZGVmaW5lZChBRVMpCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JZUCAgICAgICAgICAgUkNDX0FIQkVOUl9DUllQRU4gICAgICAvKiE8IENSWVAgY2xvY2sgZW5hYmxlICovCisjZW5kaWYgLypBRVMqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FQ19BUEIxX0dSUDFfUEVSSVBIICBBUEIxIEdSUDEgUEVSSVBICisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9BTEwgICAgICAgICAgICAodWludDMyX3QpMHhGRkZGRkZGRlUKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yICAgICAgICAgICBSQ0NfQVBCMUVOUl9USU0yRU4gICAgIC8qITwgVElNMiBjbG9jayBlbmFibGUgKi8KKyNpZiBkZWZpbmVkKFRJTTMpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMyAgICAgICAgICAgUkNDX0FQQjFFTlJfVElNM0VOICAgICAvKiE8IFRJTTMgY2xvY2sgZW5hYmxlICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTYpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNiAgICAgICAgICAgUkNDX0FQQjFFTlJfVElNNkVOICAgICAvKiE8IFRJTTYgY2xvY2sgZW5hYmxlICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTcpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAgICAgICAgICAgUkNDX0FQQjFFTlJfVElNN0VOICAgICAvKiE8IFRJTTcgY2xvY2sgZW5hYmxlICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKExDRCkKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9MQ0QgICAgICAgICAgICBSQ0NfQVBCMUVOUl9MQ0RFTiAgICAgIC8qITwgTENEIGNsb2NrIGVuYWJsZSAqLworI2VuZGlmIC8qTENEKi8KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHICAgICAgICAgICBSQ0NfQVBCMUVOUl9XV0RHRU4gICAgIC8qITwgV1dERyBjbG9jayBlbmFibGUgKi8KKyNpZiBkZWZpbmVkKFNQSTIpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMiAgICAgICAgICAgUkNDX0FQQjFFTlJfU1BJMkVOICAgICAvKiE8IFNQSTIgY2xvY2sgZW5hYmxlICovCisjZW5kaWYKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIgICAgICAgICBSQ0NfQVBCMUVOUl9VU0FSVDJFTiAgIC8qITwgVVNBUlQyIGNsb2NrIGVuYWJsZSAqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEgICAgICAgIFJDQ19BUEIxRU5SX0xQVUFSVDFFTiAgLyohPCBMUFVBUlQxIGNsb2NrIGVuYWJsZSAqLworI2lmIGRlZmluZWQoVVNBUlQ0KQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNCAgICAgICAgIFJDQ19BUEIxRU5SX1VTQVJUNEVOICAgLyohPCBVU0FSVDQgY2xvY2sgZW5hYmxlICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTQVJUNSkKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDUgICAgICAgICBSQ0NfQVBCMUVOUl9VU0FSVDVFTiAgIC8qITwgVVNBUlQ1IGNsb2NrIGVuYWJsZSAqLworI2VuZGlmCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMSAgICAgICAgICAgUkNDX0FQQjFFTlJfSTJDMUVOICAgICAvKiE8IEkyQzEgY2xvY2sgZW5hYmxlICovCisjaWYgZGVmaW5lZChJMkMyKQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgICAgICAgICAgIFJDQ19BUEIxRU5SX0kyQzJFTiAgICAgLyohPCBJMkMyIGNsb2NrIGVuYWJsZSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChVU0IpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNCICAgICAgICAgICAgUkNDX0FQQjFFTlJfVVNCRU4gICAgICAvKiE8IFVTQiBjbG9jayBlbmFibGUgKi8KKyNlbmRpZiAvKlVTQiovCisjaWYgZGVmaW5lZChDUlMpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTICAgICAgICAgICAgUkNDX0FQQjFFTlJfQ1JTRU4gICAgICAvKiE8IENSUyBjbG9jayBlbmFibGUgKi8KKyNlbmRpZiAvKkNSUyovCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSICAgICAgICAgICAgUkNDX0FQQjFFTlJfUFdSRU4gICAgICAvKiE8IFBXUiBjbG9jayBlbmFibGUgKi8KKyNpZiBkZWZpbmVkKERBQykKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxICAgICAgICAgICBSQ0NfQVBCMUVOUl9EQUNFTiAgICAgIC8qITwgREFDIGNsb2NrIGVuYWJsZSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChJMkMzKQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMgICAgICAgICAgIFJDQ19BUEIxRU5SX0kyQzNFTiAgICAgLyohPCBJMkMzIGNsb2NrIGVuYWJsZSAqLworI2VuZGlmCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xICAgICAgICAgUkNDX0FQQjFFTlJfTFBUSU0xRU4gICAvKiE8IExQVElNMSBjbG9jayBlbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKworCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0FQQjJfR1JQMV9QRVJJUEggIEFQQjIgR1JQMSBQRVJJUEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX0FMTCAgICAgICAgICAgICh1aW50MzJfdCkweEZGRkZGRkZGVQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1NZU0NGRyAgICAgICAgIFJDQ19BUEIyRU5SX1NZU0NGR0VOICAvKiE8IFNZU0NGRyBjbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMSAgICAgICAgICBSQ0NfQVBCMkVOUl9USU0yMUVOICAgLyohPCBUSU0yMSBjbG9jayBlbmFibGUgKi8KKyNpZiBkZWZpbmVkKFRJTTIyKQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIyICAgICAgICAgIFJDQ19BUEIyRU5SX1RJTTIyRU4gICAvKiE8IFRJTTIyIGNsb2NrIGVuYWJsZSAqLworI2VuZGlmCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfRlcgICAgICAgICAgICAgUkNDX0FQQjJFTlJfRldFTiAgICAgIC8qITwgRmlyZVdhbGwgY2xvY2sgZW5hYmxlICovCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfQURDMSAgICAgICAgICAgUkNDX0FQQjJFTlJfQURDMUVOICAgIC8qITwgQURDMSBjbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxICAgICAgICAgICBSQ0NfQVBCMkVOUl9TUEkxRU4gICAgLyohPCBTUEkxIGNsb2NrIGVuYWJsZSAqLworI2lmIGRlZmluZWQoVVNBUlQxKQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSAgICAgICAgIFJDQ19BUEIyRU5SX1VTQVJUMUVOICAvKiE8IFVTQVJUMSBjbG9jayBlbmFibGUgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX0RCR01DVSAgICAgICAgIFJDQ19BUEIyRU5SX0RCR01DVUVOICAvKiE8IERCR01DVSBjbG9jayBlbmFibGUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0lPUF9HUlAxX1BFUklQSCAgSU9QIEdSUDEgUEVSSVBICisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSU9QX0dSUDFfUEVSSVBIX0FMTCAgICAgICAgICAgICAodWludDMyX3QpMHhGRkZGRkZGRlUKKyNkZWZpbmUgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9BICAgICAgICAgICBSQ0NfSU9QRU5SX0dQSU9BRU4gICAgLyohPCBHUElPIHBvcnQgQSBjb250cm9sICovCisjZGVmaW5lIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQiAgICAgICAgICAgUkNDX0lPUEVOUl9HUElPQkVOICAgIC8qITwgR1BJTyBwb3J0IEIgY29udHJvbCAqLworI2RlZmluZSBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MgICAgICAgICAgIFJDQ19JT1BFTlJfR1BJT0NFTiAgICAvKiE8IEdQSU8gcG9ydCBDIGNvbnRyb2wgKi8KKyNpZiBkZWZpbmVkKEdQSU9EKQorI2RlZmluZSBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QgICAgICAgICAgIFJDQ19JT1BFTlJfR1BJT0RFTiAgICAvKiE8IEdQSU8gcG9ydCBEIGNvbnRyb2wgKi8KKyNlbmRpZiAvKkdQSU9EKi8KKyNpZiBkZWZpbmVkKEdQSU9FKQorI2RlZmluZSBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0UgICAgICAgICAgIFJDQ19JT1BFTlJfR1BJT0VFTiAgICAvKiE8IEdQSU8gcG9ydCBIIGNvbnRyb2wgKi8KKyNlbmRpZiAvKkdQSU9FKi8KKyNpZiBkZWZpbmVkKEdQSU9IKQorI2RlZmluZSBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0ggICAgICAgICAgIFJDQ19JT1BFTlJfR1BJT0hFTiAgICAvKiE8IEdQSU8gcG9ydCBIIGNvbnRyb2wgKi8KKyNlbmRpZiAvKkdQSU9IKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEJVU19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQlVTIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0FIQjEgQUhCMQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFIQjEgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBBSEJFTlIgICAgICBETUFFTiAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgIE1JRkVOICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgQ1JDRU4gICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICBUU0NFTiAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgIFJOR0VOICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgQ1JZUEVOICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX01JRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9UU0MgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9STkcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUllQICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQUhCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBBSEJFTlIgICAgICBETUFFTiAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgIE1JRkVOICAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgQ1JDRU4gICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICBUU0NFTiAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgIFJOR0VOICAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgQ1JZUEVOICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX01JRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9UU0MgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9STkcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUllQICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBTdGF0ZSBvZiBQZXJpcGhzICgxIG9yIDApLgorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFBlcmlwaHMpID09IChQZXJpcGhzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQUhCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFIQkVOUiAgICAgIERNQUVOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgIE1JRkVOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgIENSQ0VOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgIFRTQ0VOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgIFJOR0VOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgIENSWVBFTiAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfTUlGCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1RTQyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1JORyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSWVAgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFIQkVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgQUhCMSBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFIQlJTVFIgICAgICBETUFSU1QgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBNSUZSU1QgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBDUkNSU1QgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBUU0NSU1QgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBSTkdSU1QgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBDUllQUlNUICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9NSUYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfUk5HICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JZUCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIFNFVF9CSVQoUkNDLT5BSEJSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIEFIQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBSEJSU1RSICAgICAgRE1BUlNUICAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBNSUZSU1QgICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIENSQ1JTVCAgICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgVFNDUlNUICAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBSTkdSU1QgICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIENSWVBSU1QgICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfTUlGCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1RTQyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1JORyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSWVAgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFIQlJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBSEIxIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQUhCU01FTlIgICAgIERNQVNNRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIE1JRlNNRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIFNSQU1TTUVOICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIENSQ1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIFRTQ1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIFJOR1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIENSWVBTTUVOICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXAKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9NSUYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfUk5HICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JZUCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCU01FTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQUhCMSBwZXJpcGhlcmFscyBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAcm10b2xsIEFIQlNNRU5SICAgICBETUFTTUVOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEJTTUVOUiAgICAgTUlGU01FTiAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIFNSQU1TTUVOICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQlNNRU5SICAgICBDUkNTTUVOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEJTTUVOUiAgICAgVFNDU01FTiAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIFJOR1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQlNNRU5SICAgICBDUllQU01FTiAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX01JRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfU1JBTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9UU0MgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9STkcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUllQICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFIQlNNRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUZfQVBCMSBBUEIxCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFQQjFFTlIgICAgIFRJTTJFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFRJTTNFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFRJTTZFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFRJTTdFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIExDREVOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFdXREdFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFNQSTJFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFVTQVJUMkVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIExQVUFSVDFFTiAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFVTQVJUNEVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFVTQVJUNUVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIEkyQzFFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIEkyQzJFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFVTQkVOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIENSU0VOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFBXUkVOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIERBQ0VOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIEkyQzNFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIExQVElNMUVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTENEICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBVQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQ0ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQ1ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfREFDMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjFFTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBBUEIxRU5SICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBUSU0zRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBUSU02RU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBUSU03RU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBMQ0RFTiAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBXV0RHRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBTUEkyRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBVU0FSVDJFTiAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBMUFVBUlQxRU4gICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBVU0FSVDRFTiAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBVU0FSVDVFTiAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBJMkMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBJMkMyRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBVU0JFTiAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBDUlNFTiAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBQV1JFTiAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBEQUNFTiAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBJMkMzRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBMUFRJTTFFTiAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFBlcmlwaHMgKDEgb3IgMCkuCisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIFBlcmlwaHMpID09IChQZXJpcGhzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFQQjFFTlIgICAgIFRJTTJFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBUSU0zRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgVElNNkVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFRJTTdFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBMQ0RFTiAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgV1dER0VOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFNQSTJFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBVU0FSVDJFTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgTFBVQVJUMUVOICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFVTQVJUNEVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBVU0FSVDVFTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgSTJDMUVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIEkyQzJFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBVU0JFTiAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgQ1JTRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIFBXUkVOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SICAgICBEQUNFTiAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUiAgICAgSTJDM0VOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIgICAgIExQVElNMUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFQQjFFTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZvcmNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBUEIxUlNUUiAgICAgVElNMlJTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFRJTTNSU1QgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU02UlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgVElNN1JTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIExDRFJTVCAgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBXV0RHUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgU1BJMlJTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFVTQVJUMlJTVCAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBMUFVBUlQxUlNUICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgVVNBUlQ0UlNUICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFVTQVJUNVJTVCAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBJMkMxUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgSTJDMlJTVCAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIFVTQlJTVCAgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBDUlNSU1QgICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgUFdSUlNUICAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIgICAgIERBQ1JTVCAgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBJMkMzUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUiAgICAgTFBUSU0xUlNUICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKFJDQy0+QVBCMVJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgQVBCMSBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFQQjFSU1RSICAgICBUSU0yUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU0zUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU02UlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBUSU03UlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBMQ0RSU1QgICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBXV0RHUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBTUEkyUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVU0FSVDJSU1QgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBMUFVBUlQxUlNUICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVU0FSVDRSU1QgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVU0FSVDVSU1QgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBJMkMxUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBJMkMyUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBVU0JSU1QgICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBDUlNSU1QgICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBQV1JSU1QgICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBEQUNSU1QgICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBJMkMzUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSICAgICBMUFRJTTFSU1QgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MQ0QgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFVBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNCICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BUEIxUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFQQjEgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBBUEIxU01FTlIgICAgVElNMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVElNM1NNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVElNNlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVElNN1NNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgTENEU01FTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgV1dER1NNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgU1BJMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVVNBUlQyU01FTiAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgTFBVQVJUMVNNRU4gICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVVNBUlQ0U01FTiAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVVNBUlQ1U01FTiAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgSTJDMVNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgSTJDMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVVNCU01FTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgQ1JTU01FTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgUFdSU01FTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgREFDU01FTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgSTJDM1NNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgTFBUSU0xU01FTiAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMVNNRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAcm10b2xsIEFQQjFTTUVOUiAgICBUSU0yU01FTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVElNM1NNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SICAgIFRJTTZTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUiAgICBUSU03U01FTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgTENEU01FTiAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SICAgIFdXREdTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUiAgICBTUEkyU01FTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVVNBUlQyU01FTiAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SICAgIExQVUFSVDFTTUVOICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUiAgICBVU0FSVDRTTUVOICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVVNBUlQ1U01FTiAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SICAgIEkyQzFTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUiAgICBJMkMyU01FTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgVVNCU01FTiAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SICAgIENSU1NNRU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUiAgICBQV1JTTUVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIgICAgREFDU01FTiAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SICAgIEkyQzNTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUiAgICBMUFRJTTFTTUVOICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVNNRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUZfQVBCMiBBUEIyCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQVBCMiBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFQQjJFTlIgICAgICBTWVNDRkdFTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMjFFTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTIyRU4gICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBGV0VOICAgICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgQURDRU4gICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBVU0FSVDFFTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgREJHRU4gICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMiAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9GVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfQURDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfREJHTUNVCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5BUEIyRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEFQQjIgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQVBCMkVOUiAgICAgIFNZU0NGR0VOICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0yMUVOICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMjJFTiAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIEZXRU4gICAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBBRENFTiAgICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgU1BJMUVOICAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFVTQVJUMUVOICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBEQkdFTiAgICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NZU0NGRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIyICAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0ZXCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9BREMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9EQkdNQ1UKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgU3RhdGUgb2YgUGVyaXBocyAoMSBvciAwKS4KKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QVBCMkVOUiwgUGVyaXBocykgPT0gKFBlcmlwaHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBUEIyIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQVBCMkVOUiAgICAgIFNZU0NGR0VOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMjFFTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0yMkVOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIEZXRU4gICAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgQURDRU4gICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBTUEkxRU4gICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFVTQVJUMUVOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgREJHRU4gICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjIgICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfRlcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0FEQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9EQkdNQ1UKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMkVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgQVBCMiBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFQQjJSU1RSICAgICBTWVNDRkdSU1QgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBUSU0yMVJTVCAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBUSU0yMlJTVCAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBBRENSU1QgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBTUEkxUlNUICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBVU0FSVDFSU1QgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBEQkdSU1QgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMiAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9BREMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9EQkdNQ1UKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIFNFVF9CSVQoUkNDLT5BUEIyUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVsZWFzZSBBUEIyIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgQVBCMlJTVFIgICAgIFNZU0NGR1JTVCAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMjFSU1QgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBUSU0yMlJTVCAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIEFEQ1JTVCAgICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgU1BJMVJTVCAgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBVU0FSVDFSU1QgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIERCR1JTVCAgICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjIgICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfQURDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxICAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0RCR01DVQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BUEIyUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFQQjIgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBBUEIyU01FTlIgICAgU1lTQ0ZHU01FTiAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgVElNMjFTTUVOICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgVElNMjJTTUVOICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgQURDU01FTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgU1BJMVNNRU4gICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgVVNBUlQxU01FTiAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgREJHU01FTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NZU0NGRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIyICAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0FEQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9EQkdNQ1UKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QVBCMlNNRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBUEIyIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQVBCMlNNRU5SICAgIFNZU0NGR1NNRU4gICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjJTTUVOUiAgICBUSU0yMVNNRU4gICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgVElNMjJTTUVOICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMlNNRU5SICAgIEFEQ1NNRU4gICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjJTTUVOUiAgICBTUEkxU01FTiAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgVVNBUlQxU01FTiAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMlNNRU5SICAgIERCR1NNRU4gICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjIgICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfQURDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxICAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0RCR01DVQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFQQjJTTUVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9JT1AgSU9QCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSU9QIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgSU9QRU5SICAgICAgIEdQSU9BRU4gICAgICAgTExfSU9QX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgSU9QRU5SICAgICAgIEdQSU9CRU4gICAgICAgTExfSU9QX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgSU9QRU5SICAgICAgIEdQSU9DRU4gICAgICAgTExfSU9QX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgSU9QRU5SICAgICAgIEdQSU9ERU4gICAgICAgTExfSU9QX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgSU9QRU5SICAgICAgIEdQSU9FRU4gICAgICAgTExfSU9QX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgSU9QRU5SICAgICAgIEdQSU9IRU4gICAgICAgTExfSU9QX0dSUDFfRW5hYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9EICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0ggKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JT1BfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPklPUEVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+SU9QRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIElPUCBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBJT1BFTlIgICAgICAgR1BJT0FFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0JFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0NFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0RFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0VFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0hFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9FICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPSCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgU3RhdGUgb2YgUGVyaXBocyAoMSBvciAwKS4KKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSU9QX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFBlcmlwaHMpID09IChQZXJpcGhzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSU9QIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgSU9QRU5SICAgICAgIEdQSU9BRU4gICAgICAgTExfSU9QX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIElPUEVOUiAgICAgICBHUElPQkVOICAgICAgIExMX0lPUF9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0NFTiAgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgSU9QRU5SICAgICAgIEdQSU9ERU4gICAgICAgTExfSU9QX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIElPUEVOUiAgICAgICBHUElPRUVOICAgICAgIExMX0lPUF9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0hFTiAgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9EICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0ggKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+SU9QRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIElPUCBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIElPUFJTVFIgICAgICBHUElPQVNNRU4gICAgIExMX0lPUF9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgSU9QUlNUUiAgICAgIEdQSU9CU01FTiAgICAgTExfSU9QX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBJT1BSU1RSICAgICAgR1BJT0NTTUVOICAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIElPUFJTVFIgICAgICBHUElPRFNNRU4gICAgIExMX0lPUF9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgSU9QUlNUUiAgICAgIEdQSU9FU01FTiAgICAgTExfSU9QX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBJT1BSU1RSICAgICAgR1BJT0hTTUVOICAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9FICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPSCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lPUF9HUlAxX0ZvcmNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChSQ0MtPklPUFJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgSU9QIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgSU9QUlNUUiAgICAgIEdQSU9BU01FTiAgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIElPUFJTVFIgICAgICBHUElPQlNNRU4gICAgIExMX0lPUF9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBJT1BSU1RSICAgICAgR1BJT0NTTUVOICAgICBMTF9JT1BfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgSU9QUlNUUiAgICAgIEdQSU9EU01FTiAgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIElPUFJTVFIgICAgICBHUElPRVNNRU4gICAgIExMX0lPUF9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBJT1BSU1RSICAgICAgR1BJT0hTTUVOICAgICBMTF9JT1BfR1JQMV9SZWxlYXNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPRCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0UgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9IICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPklPUFJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJT1AgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBJT1BTTUVOUiAgICAgR1BJT0FSU1QgICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIElPUFNNRU5SICAgICBHUElPQlJTVCAgICAgIExMX0lPUF9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgSU9QU01FTlIgICAgIEdQSU9DUlNUICAgICAgTExfSU9QX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0RSU1QgICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIElPUFNNRU5SICAgICBHUElPRVJTVCAgICAgIExMX0lPUF9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgSU9QU01FTlIgICAgIEdQSU9IUlNUICAgICAgTExfSU9QX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9FICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPSCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lPUF9HUlAxX0VuYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5JT1BTTUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+SU9QU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJT1AgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBJT1BTTUVOUiAgICAgR1BJT0FSU1QgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0JSU1QgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0NSU1QgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0RSU1QgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0VSU1QgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0hSU1QgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9FICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPSCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lPUF9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPklPUFNNRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChSQ0MpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9MTF9CVVNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9sbF9jb21wLmggYi9JbmMvc3RtMzJsMHh4X2xsX2NvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTIzODY0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9sbF9jb21wLmgKQEAgLTAsMCArMSw3MDUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfY29tcC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDT01QIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0xMX0NPTVBfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9MTF9DT01QX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChDT01QMSkgfHwgZGVmaW5lZCAoQ09NUDIpCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTCBDT01QCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX0xMX1ByaXZhdGVfQ29uc3RhbnRzIENPTVAgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBDT01QIHJlZ2lzdGVycyBiaXRzIHBvc2l0aW9ucyAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9MRVZFTF9CSVRPRkZTRVRfUE9TICgodWludDMyX3QpMzBVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChDT01QX0NTUl9DT01QMVZBTFVFKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FU19JTklUIENPTVAgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQ09NUCBpbnN0YW5jZS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBvd2VyTW9kZTsgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBvcGVyYXRpbmcgbW9kZSB0byBhZGp1c3QgcG93ZXIgYW5kIHNwZWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xMX0VDX1BPV0VSTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0UG93ZXJNb2RlKCkuICovCisKKyAgdWludDMyX3QgSW5wdXRQbHVzOyAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcgaW5wdXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xMX0VDX0lOUFVUX1BMVVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldElucHV0UGx1cygpLiAqLworCisgIHVpbnQzMl90IElucHV0TWludXM7ICAgICAgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nIGlucHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19JTlBVVF9NSU5VUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0SW5wdXRNaW51cygpLiAqLworCisgIHVpbnQzMl90IE91dHB1dFBvbGFyaXR5OyAgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfTExfRUNfT1VUUFVUX1BPTEFSSVRZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eSgpLiAqLworCit9IExMX0NPTVBfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIENPTVAgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX0NPTU1PTl9XSU5ET1dNT0RFIENvbXBhcmF0b3IgY29tbW9uIG1vZGVzIC0gV2luZG93IG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX1dJTkRPV01PREVfRElTQUJMRSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBXaW5kb3cgbW9kZSBkaXNhYmxlOiBDb21wYXJhdG9ycyAxIGFuZCAyIGFyZSBpbmRlcGVuZGVudCAqLworI2RlZmluZSBMTF9DT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04gKENPTVBfQ1NSX0NPTVAxV00pICAgICAgLyohPCBXaW5kb3cgbW9kZSBlbmFibGU6IENvbXBhcmF0b3JzIGluc3RhbmNlcyBwYWlyIENPTVAxIGFuZCBDT01QMiBoYXZlIHRoZWlyIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvZ2V0aGVyLiBUaGUgY29tbW9uIGlucHV0IGlzIENPTVAxIGlucHV0IHBsdXMgKENPTVAyIGlucHV0IHBsdXMgaXMgbm8gbW9yZSBhY2Nlc3NpYmxlKS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19QT1dFUk1PREUgQ29tcGFyYXRvciBtb2RlcyAtIFBvd2VyIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX1BPV0VSTU9ERV9VTFRSQUxPV1BPV0VSICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgIC8qITwgQ09NUCBwb3dlciBtb2RlIHRvIGxvdyBzcGVlZCAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVEICAgICAoQ09NUF9DU1JfQ09NUDJTUEVFRCkgICAgICAgLyohPCBDT01QIHBvd2VyIG1vZGUgdG8gZmFzdCBzcGVlZCAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfSU5QVVRfUExVUyBDb21wYXJhdG9yIGlucHV0cyAtIElucHV0IHBsdXMgKGlucHV0IG5vbi1pbnZlcnRpbmcpIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfUExVU19JTzEgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMSAocGluIFBBMSBmb3IgQ09NUDEsIHBpbiBQQTMgZm9yIENPTVAyKSAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX1BMVVNfSU8yICAgICAgICAgIChDT01QX0NTUl9DT01QMklOUFNFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBJTzIgKHBpbiBQQjQgZm9yIENPTVAyKSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfUExVU19JTzMgICAgICAgICAgKENPTVBfQ1NSX0NPTVAySU5QU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMyAocGluIFBBNSBmb3IgQ09NUDIpIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9QTFVTX0lPNCAgICAgICAgICAoQ09NUF9DU1JfQ09NUDJJTlBTRUxfMCB8IENPTVBfQ1NSX0NPTVAySU5QU0VMXzEpICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gSU80IChwaW4gUEI2IGZvciBDT01QMikgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX1BMVVNfSU81ICAgICAgICAgIChDT01QX0NTUl9DT01QMklOUFNFTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBJTzUgKHBpbiBQQjcgZm9yIENPTVAyKSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjaWYgZGVmaW5lZCAoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2RlZmluZSBMTF9DT01QX0lOUFVUX1BMVVNfSU82ICAgICAgICAgIChDT01QX0NTUl9DT01QMklOUFNFTF8yIHwgQ09NUF9DU1JfQ09NUDJJTlBTRUxfMCkgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBJTzYgKHBpbiBQQTcgZm9yIENPTVAyKSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpIChBdmFpbGFibGUgb25seSBvbiBkZXZpY2VzIFNUTTMyTDAgY2F0ZWdvcnkgMSkgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX0lOUFVUX01JTlVTIENvbXBhcmF0b3IgaW5wdXRzIC0gSW5wdXQgbWludXMgKGlucHV0IGludmVydGluZykgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UICAoQ09NUF9DU1JfQ09NUDJJTk5TRUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIDEvNCBWcmVmSW50IChzcGVjaWZpdHkgb2YgQ09NUDIgcmVsYXRlZCB0byBwYXRoIHRvIGVuYWJsZSB2aWEgU1lTQ0ZHOiByZWZlciB0byBjb21tZW50IGluIGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRJbnB1dE1pbnVzKCkgKSAoc3BlY2lmaWMgdG8gQ09NUCBpbnN0YW5jZTogQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVCAgKENPTVBfQ1NSX0NPTVAySU5OU0VMXzIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDJJTk5TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byAxLzIgVnJlZkludCAoc3BlY2lmaXR5IG9mIENPTVAyIHJlbGF0ZWQgdG8gcGF0aCB0byBlbmFibGUgdmlhIFNZU0NGRzogcmVmZXIgdG8gY29tbWVudCBpbiBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0SW5wdXRNaW51cygpICkgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTXzNfNFZSRUZJTlQgIChDT01QX0NTUl9DT01QMklOTlNFTF8yIHwgQ09NUF9DU1JfQ09NUDJJTk5TRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gMy80IFZyZWZJbnQgKHNwZWNpZml0eSBvZiBDT01QMiByZWxhdGVkIHRvIHBhdGggdG8gZW5hYmxlIHZpYSBTWVNDRkc6IHJlZmVyIHRvIGNvbW1lbnQgaW4gZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldElucHV0TWludXMoKSApIChzcGVjaWZpYyB0byBDT01QIGluc3RhbmNlOiBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIFZyZWZJbnQgKHNwZWNpZml0eSBvZiBDT01QMiByZWxhdGVkIHRvIHBhdGggdG8gZW5hYmxlIHZpYSBTWVNDRkc6IHJlZmVyIHRvIGNvbW1lbnQgaW4gZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldElucHV0TWludXMoKSApICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMklOTlNFTF8xICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMSAoREFDX09VVDEpICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyICAgICggICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDJJTk5TRUxfMSB8IENPTVBfQ1NSX0NPTVAySU5OU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gREFDMSBjaGFubmVsIDIgKERBQ19PVVQyKSAgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU19JTzEgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMklOTlNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIElPMSAocGluIFBBMCBmb3IgQ09NUDEsIHBpbiBQQTIgZm9yIENPTVAyKSAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMiAgICAgICAgIChDT01QX0NTUl9DT01QMklOTlNFTF8yIHwgQ09NUF9DU1JfQ09NUDJJTk5TRUxfMSB8IENPTVBfQ1NSX0NPTVAySU5OU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8yIChwaW4gUEIzIGZvciBDT01QMikgKHNwZWNpZmljIHRvIENPTVAgaW5zdGFuY2U6IENPTVAyKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX09VVFBVVF9TRUxFQ1RJT05fTFBUSU0gQ29tcGFyYXRvciBvdXRwdXQgLSBPdXRwdXQgc2VsZWN0aW9uIHNwZWNpZmljIHRvIExQVElNIHBlcmlwaGVyYWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVF9MUFRJTTFfSU4xX0NPTVAxICAgICAgICAgKENPTVBfQ1NSX0NPTVAxTFBUSU0xSU4xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgY29ubmVjdGVkIHRvIFRJTTIgaW5wdXQgY2FwdHVyZSA0ICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX0xQVElNMV9JTjFfQ09NUDIgICAgICAgICAoQ09NUF9DU1JfQ09NUDJMUFRJTTFJTjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG91dHB1dCBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCBjYXB0dXJlIDQgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTFBUSU0xX0lOMl9DT01QMiAgICAgICAgIChDT01QX0NTUl9DT01QMkxQVElNMUlOMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGNvbm5lY3RlZCB0byBUSU0yIGlucHV0IGNhcHR1cmUgNCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX09VVFBVVF9QT0xBUklUWSBDb21wYXJhdG9yIG91dHB1dCAtIE91dHB1dCBwb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgIC8qITwgQ09NUCBvdXRwdXQgcG9sYXJpdHkgaXMgbm90IGludmVydGVkOiBjb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIHBsdXMgKG5vbi1pbnZlcnRpbmcpIGlucHV0IGlzIGF0IGEgaGlnaGVyIHZvbHRhZ2UgdGhhbiB0aGUgbWludXMgKGludmVydGluZykgaW5wdXQgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRQT0xfSU5WRVJURUQgICAgICAoQ09NUF9DU1JfQ09NUDFQT0xBUklUWSkgLyohPCBDT01QIG91dHB1dCBwb2xhcml0eSBpcyBpbnZlcnRlZDogY29tcGFyYXRvciBvdXRwdXQgaXMgbG93IHdoZW4gdGhlIHBsdXMgKG5vbi1pbnZlcnRpbmcpIGlucHV0IGlzIGF0IGEgbG93ZXIgdm9sdGFnZSB0aGFuIHRoZSBtaW51cyAoaW52ZXJ0aW5nKSBpbnB1dCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfT1VUUFVUX0xFVkVMIENvbXBhcmF0b3Igb3V0cHV0IC0gT3V0cHV0IGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTEVWRUxfTE9XICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIGxvdyAoaWYgdGhlIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZCwgb3RoZXJ3aXNlIHRvIGJlIGNvbXBsZW1lbnRlZCkgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTEVWRUxfSElHSCAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIGhpZ2ggKGlmIHRoZSBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQsIG90aGVyd2lzZSB0byBiZSBjb21wbGVtZW50ZWQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfSFdfREVMQVlTICBEZWZpbml0aW9ucyBvZiBDT01QIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cworICAqIEBub3RlICAgT25seSBDT01QIElQIEhXIGRlbGF5cyBhcmUgZGVmaW5lZCBpbiBDT01QIExMIGRyaXZlciBkcml2ZXIsCisgICogICAgICAgICBub3QgdGltZW91dCB2YWx1ZXMuCisgICogICAgICAgICBGb3IgZGV0YWlscyBvbiBkZWxheXMgdmFsdWVzLCByZWZlciB0byBkZXNjcmlwdGlvbnMgaW4gc291cmNlIGNvZGUKKyAgKiAgICAgICAgIGFib3ZlIGVhY2ggbGl0ZXJhbCBkZWZpbml0aW9uLgorICAqIEB7CisgICovCisKKy8qIERlbGF5IGZvciBjb21wYXJhdG9yIHN0YXJ0dXAgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBEZWxheSByZXF1aXJlZCB0byByZWFjaCBwcm9wYWdhdGlvbiBkZWxheSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidFNUQVJUIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DT01QX0RFTEFZX1NUQVJUVVBfVVMgICAgICAgICAgKCh1aW50MzJfdCkgMjVVKSAgLyohPCBEZWxheSBmb3IgQ09NUCBzdGFydHVwIHRpbWUgKi8KKworLyogRGVsYXkgZm9yIGNvbXBhcmF0b3Igdm9sdGFnZSBzY2FsZXIgc3RhYmlsaXphdGlvbiB0aW1lICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICh2b2x0YWdlIGZyb20gVnJlZkludCwgZGVsYXkgYmFzZWQgb24gVnJlZkludCBzdGFydHVwIHRpbWUpLiAgICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJUVlJFRklOVCIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NPTVBfREVMQVlfVk9MVEFHRV9TQ0FMRVJfU1RBQl9VUyAoKHVpbnQzMl90KTMwMDBVKSAgLyohPCBEZWxheSBmb3IgQ09NUCB2b2x0YWdlIHNjYWxlciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FeHBvcnRlZF9NYWNyb3MgQ09NUCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBDT01QX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIHdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBtYWNybworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBDT01QIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gY29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIENPTVAgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0NPTVBfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FTV9IRUxQRVJfTUFDUk8gQ09NUCBoZWxwZXIgbWFjcm8KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBzZWxlY3QgdGhlIENPTVAgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICB0byB3aGljaCBpcyBiZWxvbmdpbmcgdGhlIHNlbGVjdGVkIENPTVAgaW5zdGFuY2UuCisgICogQG5vdGUgICBDT01QIGNvbW1vbiByZWdpc3RlciBpbnN0YW5jZSBjYW4gYmUgdXNlZCB0bworICAqICAgICAgICAgc2V0IHBhcmFtZXRlcnMgY29tbW9uIHRvIHNldmVyYWwgQ09NUCBpbnN0YW5jZXMuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJDT01QeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBfX0NPTVB4X18gQ09NUCBpbnN0YW5jZQorICAqIEByZXR2YWwgQ09NUCBjb21tb24gaW5zdGFuY2Ugb3IgdmFsdWUgIjAiIGlmIHRoZXJlIGlzIG5vIENPTVAgY29tbW9uIGluc3RhbmNlLgorICAqLworI2RlZmluZSBfX0xMX0NPTVBfQ09NTU9OX0lOU1RBTkNFKF9fQ09NUHhfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKENPTVAxMl9DT01NT04pCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIENPTVAgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VGX0NvbmZpZ3VyYXRpb25fY29tcGFyYXRvcl9jb21tb24gQ29uZmlndXJhdGlvbiBvZiBDT01QIGhpZXJhcmNoaWNhbCBzY29wZTogY29tbW9uIHRvIHNldmVyYWwgQ09NUCBpbnN0YW5jZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCB3aW5kb3cgbW9kZSBvZiBhIHBhaXIgb2YgY29tcGFyYXRvcnMgaW5zdGFuY2VzCisgICogICAgICAgICAoMiBjb25zZWN1dGl2ZSBDT01QIGluc3RhbmNlcyBvZGQgYW5kIGV2ZW4gQ09NUDx4PiBhbmQgQ09NUDx4KzE+KS4KKyAgKiBAcm10b2xsIENPTVAxX0NTUiBDT01QMVdNICAgICAgIExMX0NPTVBfU2V0Q29tbW9uV2luZG93TW9kZQorICAqIEBwYXJhbSAgQ09NUHh5X0NPTU1PTiBDb21wYXJhdG9yIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBXaW5kb3dNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0Q29tbW9uV2luZG93TW9kZShDT01QX0NvbW1vbl9UeXBlRGVmICpDT01QeHlfQ09NTU9OLCB1aW50MzJfdCBXaW5kb3dNb2RlKQoreworICBNT0RJRllfUkVHKENPTVB4eV9DT01NT04tPkNTUiwgQ09NUF9DU1JfQ09NUDFXTSwgV2luZG93TW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHdpbmRvdyBtb2RlIG9mIGEgcGFpciBvZiBjb21wYXJhdG9ycyBpbnN0YW5jZXMKKyAgKiAgICAgICAgICgyIGNvbnNlY3V0aXZlIENPTVAgaW5zdGFuY2VzIG9kZCBhbmQgZXZlbiBDT01QPHg+IGFuZCBDT01QPHgrMT4pLgorICAqIEBybXRvbGwgQ09NUDFfQ1NSIENPTVAxV00gICAgICAgTExfQ09NUF9HZXRDb21tb25XaW5kb3dNb2RlCisgICogQHBhcmFtICBDT01QeHlfQ09NTU9OIENvbXBhcmF0b3IgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9DT01QX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldENvbW1vbldpbmRvd01vZGUoQ09NUF9Db21tb25fVHlwZURlZiAqQ09NUHh5X0NPTU1PTikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHh5X0NPTU1PTi0+Q1NSLCBDT01QX0NTUl9DT01QMVdNKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Db25maWd1cmF0aW9uX2NvbXBhcmF0b3JfbW9kZXMgQ29uZmlndXJhdGlvbiBvZiBjb21wYXJhdG9yIG1vZGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnN0YW5jZSBvcGVyYXRpbmcgbW9kZSB0byBhZGp1c3QgcG93ZXIgYW5kIHNwZWVkLgorICAqIEBybXRvbGwgQ09NUDJfQ1NSIENPTVAyU1BFRUQgICAgTExfQ09NUF9TZXRQb3dlck1vZGUKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBvd2VyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVEICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIEF2YWlsYWJsZSBvbmx5IG9uIENPTVAgaW5zdGFuY2U6IENPTVAyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRQb3dlck1vZGUoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgUG93ZXJNb2RlKQoreworICBNT0RJRllfUkVHKENPTVB4LT5DU1IsIENPTVBfQ1NSX0NPTVAyU1BFRUQsIFBvd2VyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgaW5zdGFuY2Ugb3BlcmF0aW5nIG1vZGUgdG8gYWRqdXN0IHBvd2VyIGFuZCBzcGVlZC4KKyAgKiBAbm90ZSAgQXZhaWxhYmxlIG9ubHkgb24gQ09NUCBpbnN0YW5jZTogQ09NUDIuCisgICogQHJtdG9sbCBDT01QMl9DU1IgQ09NUDJTUEVFRCAgICBMTF9DT01QX0dldFBvd2VyTW9kZVxuCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVEICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIEF2YWlsYWJsZSBvbmx5IG9uIENPTVAgaW5zdGFuY2U6IENPTVAyLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0UG93ZXJNb2RlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENPTVB4LT5DU1IsIENPTVBfQ1NSX0NPTVAyU1BFRUQpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VGX0NvbmZpZ3VyYXRpb25fY29tcGFyYXRvcl9pbnB1dHMgQ29uZmlndXJhdGlvbiBvZiBjb21wYXJhdG9yIGlucHV0cworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3IgaW5wdXRzIG1pbnVzIChpbnZlcnRpbmcpIGFuZCBwbHVzIChub24taW52ZXJ0aW5nKS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hhbGwgb25seSBiZSB1c2VkIGZvciBDT01QMi4KKyAgKiAgICAgICAgIEZvciBzZXR0aW5nIENPTVAxIGlucHV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBMTF9DT01QX1NldElucHV0TWludXMoKQorICAqICAgICAgICAgUGx1cyAobm9uLWludmVydGluZykgaW5wdXQgaXMgbm90IGNvbmZpZ3VyYWJsZSBvbiBDT01QMS4KKyAgKiAgICAgICAgIFVzaW5nIHRoaXMgZnVuY3Rpb24gZm9yIENPTVAxIHdpbGwgY29ycnVwdCBDT01QMVdNIHJlZ2lzdGVyCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzcGVjaWZpY2l0eSBpZiB1c2luZyBDT01QIGluc3RhbmNlIENPTVAyCisgICogICAgICAgICB3aXRoIENPTVAgaW5wdXQgYmFzZWQgb24gVnJlZkludCAoVnJlZkludCBvciBzdWJkaXZpc2lvbgorICAqICAgICAgICAgb2YgVnJlZkludCk6IHNjYWxlciBicmlkZ2UgaXMgYmFzZWQgb24gVnJlZkludCBhbmQgcmVxdWlyZXMKKyAgKiAgICAgICAgIHRvIGVuYWJsZSBwYXRoIGZyb20gVnJlZkludCAocmVmZXIgdG8gbGl0ZXJhbAorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IzX0VOQlVGTFBfVlJFRklOVF9DT01QKS4KKyAgKiBAcm10b2xsIENPTVAyX0NTUiBDT01QMklOTlNFTCAgIExMX0NPTVBfQ29uZmlnSW5wdXRzXG4KKyAgKiAgICAgICAgIENPTVAyX0NTUiBDT01QMklOUFNFTCAgIExMX0NPTVBfQ29uZmlnSW5wdXRzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dE1pbnVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yCisgICogQHBhcmFtICBJbnB1dFBsdXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8xICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzIgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMyAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU80ICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzUgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPNiAoMSkoMikKKyAgKgorICAqICAgICAgICAgKDEpIEF2YWlsYWJsZSBvbmx5IG9uIENPTVAgaW5zdGFuY2U6IENPTVAyLgorICAqICAgICAgICAgKDIpIEF2YWlsYWJsZSBvbmx5IG9uIGRldmljZXMgU1RNMzJMMCBjYXRlZ29yeSAxLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9Db25maWdJbnB1dHMoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgSW5wdXRNaW51cywgdWludDMyX3QgSW5wdXRQbHVzKQoreworICBNT0RJRllfUkVHKENPTVB4LT5DU1IsCisgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDJJTk5TRUwgfCBDT01QX0NTUl9DT01QMklOUFNFTCwKKyAgICAgICAgICAgICBJbnB1dE1pbnVzIHwgSW5wdXRQbHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnB1dCBwbHVzIChub24taW52ZXJ0aW5nKS4KKyAgKiBAbm90ZSAgIE9ubHkgQ09NUDIgYWxsb3dzIHRvIHNldCB0aGUgaW5wdXQgcGx1cyAobm9uLWludmVydGluZykuCisgICogICAgICAgICBGb3IgQ09NUDEgaXQgaXMgYWx3YXlzIFBBMSBJTywgZXhjZXB0IHdoZW4gV2luZG93cyBNb2RlIGlzIHNlbGVjdGVkLgorICAqIEBybXRvbGwgQ09NUDJfQ1NSIENPTVAySU5QU0VMICAgIExMX0NPTVBfU2V0SW5wdXRQbHVzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dFBsdXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8xICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzIgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMyAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU80ICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzUgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPNiAoMSkoMikKKyAgKgorICAqICAgICAgICAgKDEpIEF2YWlsYWJsZSBvbmx5IG9uIENPTVAgaW5zdGFuY2U6IENPTVAyLgorICAqICAgICAgICAgKDIpIEF2YWlsYWJsZSBvbmx5IG9uIGRldmljZXMgU1RNMzJMMCBjYXRlZ29yeSAxLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRJbnB1dFBsdXMoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgSW5wdXRQbHVzKQoreworICBNT0RJRllfUkVHKENPTVB4LT5DU1IsIENPTVBfQ1NSX0NPTVAySU5QU0VMLCBJbnB1dFBsdXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcpLgorICAqIEBub3RlICAgT25seSBDT01QMiBhbGxvd3MgdG8gc2V0IHRoZSBpbnB1dCBwbHVzIChub24taW52ZXJ0aW5nKS4KKyAgKiAgICAgICAgIEZvciBDT01QMSBpdCBpcyBhbHdheXMgUEExIElPLCBleGNlcHQgd2hlbiBXaW5kb3dzIE1vZGUgaXMgc2VsZWN0ZWQuCisgICogQHJtdG9sbCBDT01QMl9DU1IgQ09NUDJJTlBTRUwgICAgTExfQ09NUF9HZXRJbnB1dFBsdXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMSAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8yICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzMgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPNCAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU81ICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzYgKDEpKDIpCisgICoKKyAgKiAgICAgICAgICgxKSBBdmFpbGFibGUgb25seSBvbiBDT01QIGluc3RhbmNlOiBDT01QMi4KKyAgKiAgICAgICAgICgyKSBBdmFpbGFibGUgb25seSBvbiBkZXZpY2VzIFNUTTMyTDAgY2F0ZWdvcnkgMS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldElucHV0UGx1cyhDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QMklOUFNFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGlucHV0IG1pbnVzIChpbnZlcnRpbmcpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBjb21wYXJhdG9yIGlucHV0IHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJTzoKKyAgKiAgICAgICAgIEdQSU8gcGlucyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycyBvciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc3BlY2lmaWNpdHkgaWYgdXNpbmcgQ09NUCBpbnN0YW5jZSBDT01QMgorICAqICAgICAgICAgd2l0aCBDT01QIGlucHV0IGJhc2VkIG9uIFZyZWZJbnQgKFZyZWZJbnQgb3Igc3ViZGl2aXNpb24KKyAgKiAgICAgICAgIG9mIFZyZWZJbnQpOiBzY2FsZXIgYnJpZGdlIGlzIGJhc2VkIG9uIFZyZWZJbnQgYW5kIHJlcXVpcmVzCisgICogICAgICAgICB0byBlbmFibGUgcGF0aCBmcm9tIFZyZWZJbnQgKHJlZmVyIHRvIGxpdGVyYWwKKyAgKiAgICAgICAgIFNZU0NGR19DRkdSM19FTkJVRkxQX1ZSRUZJTlRfQ09NUCkuCisgICogQHJtdG9sbCBDT01QMV9DU1IgQ09NUDFJTk5TRUwgICAgTExfQ09NUF9TZXRJbnB1dE1pbnVzXG4KKyAgKiAgICAgICAgIENPTVAyX0NTUiBDT01QMklOTlNFTCAgICBMTF9DT01QX1NldElucHV0TWludXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIElucHV0TWludXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTXzNfNFZSRUZJTlQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzIgICAgICAgICgqKQorICAqICAgICAgICAgCisgICogICAgICAgICAoKikgQXZhaWxhYmxlIG9ubHkgb24gQ09NUCBpbnN0YW5jZTogQ09NUDIuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX1NldElucHV0TWludXMoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgSW5wdXRNaW51cykKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QMklOTlNFTCwgSW5wdXRNaW51cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgaW5wdXQgbWludXMgKGludmVydGluZykuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGNvbXBhcmF0b3IgaW5wdXQgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElPOgorICAqICAgICAgICAgR1BJTyBwaW5zIGFyZSBzcGVjaWZpYyB0byBlYWNoIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXJzIG9yIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQHJtdG9sbCBDT01QMV9DU1IgQ09NUDFJTk5TRUwgICBMTF9DT01QX0dldElucHV0TWludXNcbgorICAqICAgICAgICAgQ09NUDJfQ1NSIENPTVAySU5OU0VMICAgTExfQ09NUF9HZXRJbnB1dE1pbnVzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMiAgICAgICAgKCopCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgqKSBBdmFpbGFibGUgb25seSBvbiBDT01QIGluc3RhbmNlOiBDT01QMi4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldElucHV0TWludXMoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUDJJTk5TRUwpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VGX0NvbmZpZ3VyYXRpb25fY29tcGFyYXRvcl9vdXRwdXQgQ29uZmlndXJhdGlvbiBvZiBjb21wYXJhdG9yIG91dHB1dAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3Igb3V0cHV0IExQVElNLgorICAqIEBybXRvbGwgQ09NUDFfQ1NSIENPTVAxTFBUSU1JTjEgTExfQ09NUF9TZXRPdXRwdXRMUFRJTVxuCisgICogICAgICAgICBDT01QMl9DU1IgQ09NUDJMUFRJTUlOMSBMTF9DT01QX1NldE91dHB1dExQVElNXG4KKyAgKiAgICAgICAgIENPTVAyX0NTUiBDT01QMkxQVElNSU4yIExMX0NPTVBfU2V0T3V0cHV0TFBUSU0KKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dExwdGltIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRfTFBUSU0xX0lOMV9DT01QMSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9MUFRJTTFfSU4xX0NPTVAyICgqKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9MUFRJTTFfSU4yX0NPTVAyICgqKikKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKCopICBBdmFpbGFibGUgb25seSBvbiBDT01QIGluc3RhbmNlOiBDT01QMS5cbgorICAqICAgICAgICAgKCoqKSBBdmFpbGFibGUgb25seSBvbiBDT01QIGluc3RhbmNlOiBDT01QMi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0T3V0cHV0TFBUSU0oQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgT3V0cHV0THB0aW0pCit7CisgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwgKENPTVBfQ1NSX0NPTVAxTFBUSU0xSU4xIHwgQ09NUF9DU1JfQ09NUDJMUFRJTTFJTjEgfCBDT01QX0NTUl9DT01QMkxQVElNMUlOMiksIE91dHB1dExwdGltKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBvdXRwdXQgTFBUSU0uCisgICogQHJtdG9sbCBDT01QMV9DU1IgQ09NUDFMUFRJTUlOMSBMTF9DT01QX0dldE91dHB1dExQVElNXG4KKyAgKiAgICAgICAgIENPTVAyX0NTUiBDT01QMkxQVElNSU4xIExMX0NPTVBfR2V0T3V0cHV0TFBUSU1cbgorICAqICAgICAgICAgQ09NUDJfQ1NSIENPTVAyTFBUSU1JTjIgTExfQ09NUF9HZXRPdXRwdXRMUFRJTQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9MUFRJTTFfSU4xX0NPTVAxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xQVElNMV9JTjFfQ09NUDIgKCoqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xQVElNMV9JTjJfQ09NUDIgKCoqKQorICAqICAgICAgICAgCisgICogICAgICAgICAoKikgIEF2YWlsYWJsZSBvbmx5IG9uIENPTVAgaW5zdGFuY2U6IENPTVAxLlxuCisgICogICAgICAgICAoKiopIEF2YWlsYWJsZSBvbmx5IG9uIENPTVAgaW5zdGFuY2U6IENPTVAyLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0T3V0cHV0TFBUSU0oQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgKENPTVBfQ1NSX0NPTVAxTFBUSU0xSU4xIHwgQ09NUF9DU1JfQ09NUDJMUFRJTTFJTjEgfCBDT01QX0NTUl9DT01QMkxQVElNMUlOMikpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnN0YW5jZSBvdXRwdXQgcG9sYXJpdHkuCisgICogQHJtdG9sbCBDT01QICAgICBDT01QMVBPTEFSSVRZICBMTF9DT01QX1NldE91dHB1dFBvbGFyaXR5CisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXRQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRQT0xfSU5WRVJURUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0T3V0cHV0UG9sYXJpdHkoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgT3V0cHV0UG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhQT0xBUklUWSwgT3V0cHV0UG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENPTVAgICAgIENPTVAxUE9MQVJJVFkgIExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhQT0xBUklUWSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUZfT3BlcmF0aW9uIE9wZXJhdGlvbiBvbiBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsZSBmcm9tIG9mZiBzdGF0ZSwgY29tcGFyYXRvciByZXF1aXJlcyBhIGRlbGF5CisgICogICAgICAgICB0byByZWFjaCByZWFjaCBwcm9wYWdhdGlvbiBkZWxheSBzcGVjaWZpY2F0aW9uLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U1RBUlQiLgorICAqIEBybXRvbGwgQ09NUDFfQ1NSIENPTVAxRU4gICAgICAgTExfQ09NUF9FbmFibGVcbgorICAqICAgICAgICAgQ09NUDJfQ1NSIENPTVAyRU4gICAgICAgTExfQ09NUF9FbmFibGUKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfRW5hYmxlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIFNFVF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ09NUDFfQ1NSIENPTVAxRU4gICAgICAgTExfQ09NUF9EaXNhYmxlXG4KKyAgKiAgICAgICAgIENPTVAyX0NTUiBDT01QMkVOICAgICAgIExMX0NPTVBfRGlzYWJsZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9EaXNhYmxlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIENMRUFSX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBlbmFibGUgc3RhdGUKKyAgKiAgICAgICAgICgwOiBDT01QIGlzIGRpc2FibGVkLCAxOiBDT01QIGlzIGVuYWJsZWQpCisgICogQHJtdG9sbCBDT01QMV9DU1IgQ09NUDFFTiAgICAgICAgTExfQ09NUF9Jc0VuYWJsZWRcbgorICAqICAgICAgICAgQ09NUDJfQ1NSIENPTVAyRU4gICAgICAgIExMX0NPTVBfSXNFbmFibGVkCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ09NUF9Jc0VuYWJsZWQoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeEVOKSA9PSAoQ09NUF9DU1JfQ09NUHhFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIE9uY2UgbG9ja2VkLCBjb21wYXJhdG9yIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGFjY2Vzc2VkIGluIHJlYWQtb25seS4KKyAgKiBAbm90ZSAgIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuCisgICogQHJtdG9sbCBDT01QMV9DU1IgQ09NUDFMT0NLICAgICBMTF9DT01QX0xvY2tcbgorICAqICAgICAgICAgQ09NUDJfQ1NSIENPTVAyTE9DSyAgICAgTExfQ09NUF9Mb2NrCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX0xvY2soQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgU0VUX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9DT01QeExPQ0spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGxvY2sgc3RhdGUKKyAgKiAgICAgICAgICgwOiBDT01QIGlzIHVubG9ja2VkLCAxOiBDT01QIGlzIGxvY2tlZCkuCisgICogQG5vdGUgICBPbmNlIGxvY2tlZCwgY29tcGFyYXRvciBjb25maWd1cmF0aW9uIGNhbiBiZSBhY2Nlc3NlZCBpbiByZWFkLW9ubHkuCisgICogQG5vdGUgICBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LgorICAqIEBybXRvbGwgQ09NUDFfQ1NSIENPTVAxTE9DSyAgICAgTExfQ09NUF9Jc0xvY2tlZFxuCisgICogICAgICAgICBDT01QMl9DU1IgQ09NUDJMT0NLICAgICBMTF9DT01QX0lzTG9ja2VkCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ09NUF9Jc0xvY2tlZChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKFJFQURfQklUKENPTVB4LT5DU1IsIENPTVBfQ1NSX0NPTVB4TE9DSykgPT0gKENPTVBfQ1NSX0NPTVB4TE9DSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgY29tcGFyYXRvciBpbnN0YW5jZSBvdXRwdXQgbGV2ZWwuCisgICogQG5vdGUgICBUaGUgY29tcGFyYXRvciBvdXRwdXQgbGV2ZWwgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgcG9sYXJpdHkKKyAgKiAgICAgICAgIChSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0T3V0cHV0UG9sYXJpdHkoKSkuCisgICogICAgICAgICBJZiB0aGUgY29tcGFyYXRvciBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQ6CisgICogICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgaW5wdXQgcGx1cworICAqICAgICAgICAgICAgaXMgYXQgYSBsb3dlciB2b2x0YWdlIHRoYW4gdGhlIGlucHV0IG1pbnVzCisgICogICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIGlucHV0IHBsdXMKKyAgKiAgICAgICAgICAgIGlzIGF0IGEgaGlnaGVyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgIElmIHRoZSBjb21wYXJhdG9yIHBvbGFyaXR5IGlzIGludmVydGVkOgorICAqICAgICAgICAgIC0gQ29tcGFyYXRvciBvdXRwdXQgaXMgaGlnaCB3aGVuIHRoZSBpbnB1dCBwbHVzCisgICogICAgICAgICAgICBpcyBhdCBhIGxvd2VyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyB3aGVuIHRoZSBpbnB1dCBwbHVzCisgICogICAgICAgICAgICBpcyBhdCBhIGhpZ2hlciB2b2x0YWdlIHRoYW4gdGhlIGlucHV0IG1pbnVzCisgICogQHJtdG9sbCBDT01QMV9DU1IgQ09NUDFWQUxVRSAgICBMTF9DT01QX1JlYWRPdXRwdXRMZXZlbFxuCisgICogICAgICAgICBDT01QMl9DU1IgQ09NUDJWQUxVRSAgICBMTF9DT01QX1JlYWRPdXRwdXRMZXZlbAorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9MRVZFTF9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVF9MRVZFTF9ISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ09NUF9SZWFkT3V0cHV0TGV2ZWwoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfQ09NUHhPVVRWQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgPj4gTExfQ09NUF9PVVRQVVRfTEVWRUxfQklUT0ZGU0VUX1BPUyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9DT01QX0RlSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4KTsKK0Vycm9yU3RhdHVzIExMX0NPTVBfSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4LCBMTF9DT01QX0luaXRUeXBlRGVmICpDT01QX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQ09NUF9TdHJ1Y3RJbml0KExMX0NPTVBfSW5pdFR5cGVEZWYgKkNPTVBfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBDT01QMSB8fCBDT01QMiAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfTExfQ09NUF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2xsX2NvcnRleC5oIGIvSW5jL3N0bTMybDB4eF9sbF9jb3J0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODFhYjdmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9sbF9jb3J0ZXguaApAQCAtMCwwICsxLDU5MCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9jb3J0ZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09SVEVYIExMIG1vZHVsZS4KKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIExMIENPUlRFWCBkcml2ZXIgY29udGFpbnMgYSBzZXQgb2YgZ2VuZXJpYyBBUElzIHRoYXQgY2FuIGJlCisgICAgdXNlZCBieSB1c2VyOgorICAgICAgKCspIFNZU1RJQ0sgY29uZmlndXJhdGlvbiB1c2VkIGJ5IEByZWYgTExfbURlbGF5IGFuZCBAcmVmIExMX0luaXQxbXNUaWNrCisgICAgICAgICAgZnVuY3Rpb25zCisgICAgICAoKykgTG93IHBvd2VyIG1vZGUgY29uZmlndXJhdGlvbiAoU0NCIHJlZ2lzdGVyIG9mIENvcnRleC1NQ1UpCisgICAgICAoKykgTVBVIEFQSSB0byBjb25maWd1cmUgYW5kIGVuYWJsZSByZWdpb25zCisgICAgICAoKykgQVBJIHRvIGFjY2VzcyB0byBNQ1UgaW5mbyAoQ1BVSUQgcmVnaXN0ZXIpCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9MTF9DT1JURVhfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9MTF9DT1JURVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTEwgQ09SVEVYCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIENPUlRFWCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19DTEtTT1VSQ0VfSENMSyBTWVNUSUNLIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOCAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgIC8qITwgQUhCIGNsb2NrIGRpdmlkZWQgYnkgOCBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4qLworI2RlZmluZSBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLICAgICAgICAgICgodWludDMyX3QpU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2spIC8qITwgQUhCIGNsb2NrIHNlbGVjdGVkIGFzIFN5c1RpY2sgY2xvY2sgc291cmNlLiAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIF9fTVBVX1BSRVNFTlQKKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfQ1RSTF9IRk5NSV9QUklWREVGIE1QVSBDb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX0NUUkxfSEZOTUlfUFJJVkRFRl9OT05FICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpc2FibGUgTk1JIGFuZCBwcml2aWxlZ2VkIFNXIGFjY2VzcyAqLworI2RlZmluZSBMTF9NUFVfQ1RSTF9IQVJERkFVTFRfTk1JICAgICAgICAgIE1QVV9DVFJMX0hGTk1JRU5BX01zayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGVzIHRoZSBvcGVyYXRpb24gb2YgTVBVIGR1cmluZyBoYXJkIGZhdWx0LCBOTUksIGFuZCBGQVVMVE1BU0sgaGFuZGxlcnMgKi8KKyNkZWZpbmUgTExfTVBVX0NUUkxfUFJJVklMRUdFRF9ERUZBVUxUICAgICBNUFVfQ1RSTF9QUklWREVGRU5BX01zayAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIHByaXZpbGVnZWQgc29mdHdhcmUgYWNjZXNzIHRvIGRlZmF1bHQgbWVtb3J5IG1hcCAqLworI2RlZmluZSBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGICAgICAgICAgIChNUFVfQ1RSTF9IRk5NSUVOQV9Nc2sgfCBNUFVfQ1RSTF9QUklWREVGRU5BX01zaykgLyohPCBFbmFibGUgTk1JIGFuZCBwcml2aWxlZ2VkIFNXIGFjY2VzcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfUkVHSU9OIE1QVSBSZWdpb24gTnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIwICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDBVKSAvKiE8IFJFR0lPTiBOdW1iZXIgMCAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjEgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMVUpIC8qITwgUkVHSU9OIE51bWJlciAxICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSMiAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAyVSkgLyohPCBSRUdJT04gTnVtYmVyIDIgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIzICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDNVKSAvKiE8IFJFR0lPTiBOdW1iZXIgMyAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwNFUpIC8qITwgUkVHSU9OIE51bWJlciA0ICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSNSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDA1VSkgLyohPCBSRUdJT04gTnVtYmVyIDUgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVI2ICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDZVKSAvKiE8IFJFR0lPTiBOdW1iZXIgNiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjcgICAgICAgICAgICAgICgodWludDMyX3QpMHgwN1UpIC8qITwgUkVHSU9OIE51bWJlciA3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19SRUdJT05fU0laRSBNUFUgUmVnaW9uIFNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMzJCICAgICAgICAgICAgICgodWludDMyX3QpKDB4MDRVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCAzMkIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV82NEIgICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgwNVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpKSAvKiE8IDY0QiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzEyOEIgICAgICAgICAgICAoKHVpbnQzMl90KSgweDA2VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykpIC8qITwgMTI4QiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzI1NkIgICAgICAgICAgICAoKHVpbnQzMl90KSgweDA3VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykpIC8qITwgMjU2QiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzUxMkIgICAgICAgICAgICAoKHVpbnQzMl90KSgweDA4VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykpIC8qITwgNTEyQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzFLQiAgICAgICAgICAgICAoKHVpbnQzMl90KSgweDA5VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykpIC8qITwgMUtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMktCICAgICAgICAgICAgICgodWludDMyX3QpKDB4MEFVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCAyS0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV80S0IgICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgwQlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpKSAvKiE8IDRLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzhLQiAgICAgICAgICAgICAoKHVpbnQzMl90KSgweDBDVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykpIC8qITwgOEtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTZLQiAgICAgICAgICAgICgodWludDMyX3QpKDB4MERVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCAxNktCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMzJLQiAgICAgICAgICAgICgodWludDMyX3QpKDB4MEVVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCAzMktCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNjRLQiAgICAgICAgICAgICgodWludDMyX3QpKDB4MEZVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCA2NEtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4S0IgICAgICAgICAgICgodWludDMyX3QpKDB4MTBVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCAxMjhLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzI1NktCICAgICAgICAgICAoKHVpbnQzMl90KSgweDExVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykpIC8qITwgMjU2S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV81MTJLQiAgICAgICAgICAgKCh1aW50MzJfdCkoMHgxMlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpKSAvKiE8IDUxMktCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMU1CICAgICAgICAgICAgICgodWludDMyX3QpKDB4MTNVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCAxTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8yTUIgICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgxNFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpKSAvKiE8IDJNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzRNQiAgICAgICAgICAgICAoKHVpbnQzMl90KSgweDE1VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykpIC8qITwgNE1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfOE1CICAgICAgICAgICAgICgodWludDMyX3QpKDB4MTZVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCA4TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xNk1CICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgxN1UgPDwgTVBVX1JBU1JfU0laRV9Qb3MpKSAvKiE8IDE2TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8zMk1CICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgxOFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpKSAvKiE8IDMyTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV82NE1CICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgxOVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpKSAvKiE8IDY0TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xMjhNQiAgICAgICAgICAgKCh1aW50MzJfdCkoMHgxQVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpKSAvKiE8IDEyOE1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2TUIgICAgICAgICAgICgodWludDMyX3QpKDB4MUJVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCAyNTZNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzUxMk1CICAgICAgICAgICAoKHVpbnQzMl90KSgweDFDVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykpIC8qITwgNTEyTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xR0IgICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgxRFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpKSAvKiE8IDFHQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzJHQiAgICAgICAgICAgICAoKHVpbnQzMl90KSgweDFFVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykpIC8qITwgMkdCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNEdCICAgICAgICAgICAgICgodWludDMyX3QpKDB4MUZVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSkgLyohPCA0R0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19SRUdJT05fUFJJVklMRURHRVMgTVBVIFJlZ2lvbiBQcml2aWxlZ2VzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OT19BQ0NFU1MgICAgICAgICAgICAoKHVpbnQzMl90KSgweDAwVSA8PCBNUFVfUkFTUl9BUF9Qb3MpKSAvKiE8IE5vIGFjY2VzcyovCisjZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9SVyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgwMVUgPDwgTVBVX1JBU1JfQVBfUG9zKSkgLyohPCBSVyBwcml2aWxlZ2VkIChwcml2aWxlZ2VkIGFjY2VzcyBvbmx5KSovCisjZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9SV19VUk8gICAgICAgICAgKCh1aW50MzJfdCkoMHgwMlUgPDwgTVBVX1JBU1JfQVBfUG9zKSkgLyohPCBSVyBwcml2aWxlZ2VkIC0gUk8gdXNlciAoV3JpdGUgaW4gYSB1c2VyIHByb2dyYW0gZ2VuZXJhdGVzIGEgZmF1bHQpICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fRlVMTF9BQ0NFU1MgICAgICAgICAgKCh1aW50MzJfdCkoMHgwM1UgPDwgTVBVX1JBU1JfQVBfUG9zKSkgLyohPCBSVyBwcml2aWxlZ2VkICYgdXNlciAoRnVsbCBhY2Nlc3MpICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9STyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgwNVUgPDwgTVBVX1JBU1JfQVBfUG9zKSkgLyohPCBSTyBwcml2aWxlZ2VkIChwcml2aWxlZ2VkIHJlYWQgb25seSkqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1BSSVZfUk9fVVJPICAgICAgICAgICgodWludDMyX3QpKDB4MDZVIDw8IE1QVV9SQVNSX0FQX1BvcykpIC8qITwgUk8gcHJpdmlsZWdlZCAmIHVzZXIgKHJlYWQgb25seSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX1RFWCBNUFUgVEVYIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX1RFWF9MRVZFTDAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KSgweDAwVSA8PCBNUFVfUkFTUl9URVhfUG9zKSkgLyohPCBiMDAwIGZvciBURVggYml0cyAqLworI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKDB4MDFVIDw8IE1QVV9SQVNSX1RFWF9Qb3MpKSAvKiE8IGIwMDEgZm9yIFRFWCBiaXRzICovCisjZGVmaW5lIExMX01QVV9URVhfTEVWRUwyICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoMHgwMlUgPDwgTVBVX1JBU1JfVEVYX1BvcykpIC8qITwgYjAxMCBmb3IgVEVYIGJpdHMgKi8KKyNkZWZpbmUgTExfTVBVX1RFWF9MRVZFTDQgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KSgweDA0VSA8PCBNUFVfUkFTUl9URVhfUG9zKSkgLyohPCBiMTAwIGZvciBURVggYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfSU5TVFJVQ1RJT05fQUNDRVNTIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSAgICgodWludDMyX3QpMHgwMFUpIC8qITwgSW5zdHJ1Y3Rpb24gZmV0Y2hlcyBlbmFibGVkICovCisjZGVmaW5lIExMX01QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRElTQUJMRSAgTVBVX1JBU1JfWE5fTXNrICAvKiE8IEluc3RydWN0aW9uIGZldGNoZXMgZGlzYWJsZWQqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfU0hBUkVBQkxFX0FDQ0VTUyBNUFUgU2hhcmVhYmxlIEFjY2VzcworICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9BQ0NFU1NfU0hBUkVBQkxFICAgICAgICAgICAgTVBVX1JBU1JfU19Nc2sgICAvKiE8IFNoYXJlYWJsZSBtZW1vcnkgYXR0cmlidXRlICovCisjZGVmaW5lIExMX01QVV9BQ0NFU1NfTk9UX1NIQVJFQUJMRSAgICAgICAgKCh1aW50MzJfdCkweDAwVSkgLyohPCBOb3QgU2hhcmVhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0NBQ0hFQUJMRV9BQ0NFU1MgTVBVIENhY2hlYWJsZSBBY2Nlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX0NBQ0hFQUJMRSAgICAgICAgICAgIE1QVV9SQVNSX0NfTXNrICAgLyohPCBDYWNoZWFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUgICAgICAgICgodWludDMyX3QpMHgwMFUpIC8qITwgTm90IENhY2hlYWJsZSBtZW1vcnkgYXR0cmlidXRlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19CVUZGRVJBQkxFX0FDQ0VTUyBNUFUgQnVmZmVyYWJsZSBBY2Nlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX0JVRkZFUkFCTEUgICAgICAgICAgIE1QVV9SQVNSX0JfTXNrICAgLyohPCBCdWZmZXJhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19OT1RfQlVGRkVSQUJMRSAgICAgICAoKHVpbnQzMl90KTB4MDBVKSAvKiE8IE5vdCBCdWZmZXJhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBDT1JURVggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfU1lTVElDSyBTWVNUSUNLCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgU3lzdGljayBjb3VudGVyIGZsYWcgaXMgYWN0aXZlIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB1c2VkIGluIHRpbWVvdXQgZnVuY3Rpb24gb24gYXBwbGljYXRpb24gc2lkZS4KKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBDT1VOVEZMQUcgICAgIExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZyh2b2lkKQoreworICByZXR1cm4gKChTeXNUaWNrLT5DVFJMICYgU3lzVGlja19DVFJMX0NPVU5URkxBR19Nc2spID09IChTeXNUaWNrX0NUUkxfQ09VTlRGTEFHX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFN5c1RpY2sgY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBTVEtfQ1RSTCAgICAgQ0xLU09VUkNFICAgICBMTF9TWVNUSUNLX1NldENsa1NvdXJjZQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTVElDS19TZXRDbGtTb3VyY2UodWludDMyX3QgU291cmNlKQoreworICBpZiAoU291cmNlID09IExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEspCisgIHsKKyAgICBTRVRfQklUKFN5c1RpY2stPkNUUkwsIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEspOworICB9CisgIGVsc2UKKyAgeworICAgIENMRUFSX0JJVChTeXNUaWNrLT5DVFJMLCBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBDTEtTT1VSQ0UgICAgIExMX1NZU1RJQ0tfR2V0Q2xrU291cmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEsKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNUSUNLX0dldENsa1NvdXJjZSh2b2lkKQoreworICByZXR1cm4gUkVBRF9CSVQoU3lzVGljay0+Q1RSTCwgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFN5c1RpY2sgZXhjZXB0aW9uIHJlcXVlc3QKKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBUSUNLSU5UICAgICAgIExMX1NZU1RJQ0tfRW5hYmxlSVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU1RJQ0tfRW5hYmxlSVQodm9pZCkKK3sKKyAgU0VUX0JJVChTeXNUaWNrLT5DVFJMLCBTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU3lzVGljayBleGNlcHRpb24gcmVxdWVzdAorICAqIEBybXRvbGwgU1RLX0NUUkwgICAgIFRJQ0tJTlQgICAgICAgTExfU1lTVElDS19EaXNhYmxlSVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU1RJQ0tfRGlzYWJsZUlUKHZvaWQpCit7CisgIENMRUFSX0JJVChTeXNUaWNrLT5DVFJMLCBTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyBpZiB0aGUgU1lTVElDSyBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBUSUNLSU5UICAgICAgIExMX1NZU1RJQ0tfSXNFbmFibGVkSVQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNUSUNLX0lzRW5hYmxlZElUKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoU3lzVGljay0+Q1RSTCwgU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKSA9PSAoU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VGX0xPV19QT1dFUl9NT0RFIExPVyBQT1dFUiBNT0RFCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBQcm9jZXNzb3IgdXNlcyBzbGVlcCBhcyBpdHMgbG93IHBvd2VyIG1vZGUKKyAgKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTTEVFUERFRVAgICAgIExMX0xQTV9FbmFibGVTbGVlcAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0VuYWJsZVNsZWVwKHZvaWQpCit7CisgIC8qIENsZWFyIFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBQcm9jZXNzb3IgdXNlcyBkZWVwIHNsZWVwIGFzIGl0cyBsb3cgcG93ZXIgbW9kZQorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNMRUVQREVFUCAgICAgTExfTFBNX0VuYWJsZURlZXBTbGVlcAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0VuYWJsZURlZXBTbGVlcCh2b2lkKQoreworICAvKiBTZXQgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHNsZWVwLW9uLWV4aXQgd2hlbiByZXR1cm5pbmcgZnJvbSBIYW5kbGVyIG1vZGUgdG8gVGhyZWFkIG1vZGUuCisgICogQG5vdGUgICBTZXR0aW5nIHRoaXMgYml0IHRvIDEgZW5hYmxlcyBhbiBpbnRlcnJ1cHQtZHJpdmVuIGFwcGxpY2F0aW9uIHRvIGF2b2lkIHJldHVybmluZyB0byBhbgorICAqICAgICAgICAgZW1wdHkgbWFpbiBhcHBsaWNhdGlvbi4KKyAgKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTTEVFUE9ORVhJVCAgIExMX0xQTV9FbmFibGVTbGVlcE9uRXhpdAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0VuYWJsZVNsZWVwT25FeGl0KHZvaWQpCit7CisgIC8qIFNldCBTTEVFUE9ORVhJVCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUE9ORVhJVF9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBEbyBub3Qgc2xlZXAgd2hlbiByZXR1cm5pbmcgdG8gVGhyZWFkIG1vZGUuCisgICogQHJtdG9sbCBTQ0JfU0NSICAgICAgU0xFRVBPTkVYSVQgICBMTF9MUE1fRGlzYWJsZVNsZWVwT25FeGl0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRGlzYWJsZVNsZWVwT25FeGl0KHZvaWQpCit7CisgIC8qIENsZWFyIFNMRUVQT05FWElUIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBPTkVYSVRfTXNrKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlZCBldmVudHMgYW5kIGFsbCBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgZGlzYWJsZWQgaW50ZXJydXB0cywgY2FuIHdha2V1cCB0aGUKKyAgKiAgICAgICAgIHByb2Nlc3Nvci4KKyAgKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTRVZFT05QRU5EICAgIExMX0xQTV9FbmFibGVFdmVudE9uUGVuZAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0VuYWJsZUV2ZW50T25QZW5kKHZvaWQpCit7CisgIC8qIFNldCBTRVZFT05QRU5EIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NFVk9OUEVORF9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBPbmx5IGVuYWJsZWQgaW50ZXJydXB0cyBvciBldmVudHMgY2FuIHdha2V1cCB0aGUgcHJvY2Vzc29yLCBkaXNhYmxlZCBpbnRlcnJ1cHRzIGFyZQorICAqICAgICAgICAgZXhjbHVkZWQKKyAgKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTRVZFT05QRU5EICAgIExMX0xQTV9EaXNhYmxlRXZlbnRPblBlbmQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9EaXNhYmxlRXZlbnRPblBlbmQodm9pZCkKK3sKKyAgLyogQ2xlYXIgU0VWRU9OUEVORCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NFVk9OUEVORF9Nc2spKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfTUNVX0lORk8gTUNVIElORk8KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbXBsZW1lbnRlciBjb2RlCisgICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgSU1QTEVNRU5URVIgICBMTF9DUFVJRF9HZXRJbXBsZW1lbnRlcgorICAqIEByZXR2YWwgVmFsdWUgc2hvdWxkIGJlIGVxdWFsIHRvIDB4NDEgZm9yIEFSTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldEltcGxlbWVudGVyKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9JTVBMRU1FTlRFUl9Nc2spID4+IFNDQl9DUFVJRF9JTVBMRU1FTlRFUl9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBWYXJpYW50IG51bWJlciAoVGhlIHIgdmFsdWUgaW4gdGhlIHJucG4gcHJvZHVjdCByZXZpc2lvbiBpZGVudGlmaWVyKQorICAqIEBybXRvbGwgU0NCX0NQVUlEICAgIFZBUklBTlQgICAgICAgTExfQ1BVSURfR2V0VmFyaWFudAorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgKDB4MDogcmV2aXNpb24gMCkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUFVJRF9HZXRWYXJpYW50KHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9WQVJJQU5UX01zaykgPj4gU0NCX0NQVUlEX1ZBUklBTlRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQXJjaGl0ZWN0dXJlIG51bWJlciAKKyAgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBBUkNISVRFQ1RVUkUgIExMX0NQVUlEX0dldEFyY2hpdGVjdHVyZQorICAqIEByZXR2YWwgVmFsdWUgc2hvdWxkIGJlIGVxdWFsIHRvIDB4QyBmb3IgQ29ydGV4LU0wKyBkZXZpY2VzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0QXJjaGl0ZWN0dXJlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9BUkNISVRFQ1RVUkVfTXNrKSA+PiBTQ0JfQ1BVSURfQVJDSElURUNUVVJFX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBhcnQgbnVtYmVyCisgICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgUEFSVE5PICAgICAgICBMTF9DUFVJRF9HZXRQYXJObworICAqIEByZXR2YWwgVmFsdWUgc2hvdWxkIGJlIGVxdWFsIHRvIDB4QzYwIGZvciBDb3J0ZXgtTTArCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0UGFyTm8odm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX1BBUlROT19Nc2spID4+IFNDQl9DUFVJRF9QQVJUTk9fUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUmV2aXNpb24gbnVtYmVyIChUaGUgcCB2YWx1ZSBpbiB0aGUgcm5wbiBwcm9kdWN0IHJldmlzaW9uIGlkZW50aWZpZXIsIGluZGljYXRlcyBwYXRjaCByZWxlYXNlKQorICAqIEBybXRvbGwgU0NCX0NQVUlEICAgIFJFVklTSU9OICAgICAgTExfQ1BVSURfR2V0UmV2aXNpb24KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gMCBhbmQgMjU1ICgweDE6IHBhdGNoIDEpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0UmV2aXNpb24odm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX1JFVklTSU9OX01zaykgPj4gU0NCX0NQVUlEX1JFVklTSU9OX1Bvcyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBfX01QVV9QUkVTRU5UCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9NUFUgTVBVCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTVBVIHdpdGggaW5wdXQgb3B0aW9ucworICAqIEBybXRvbGwgTVBVX0NUUkwgICAgIEVOQUJMRSAgICAgICAgTExfTVBVX0VuYWJsZQorICAqIEBwYXJhbSAgT3B0aW9ucyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9DVFJMX0hGTk1JX1BSSVZERUZfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9DVFJMX0hBUkRGQVVMVF9OTUkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQ1RSTF9QUklWSUxFR0VEX0RFRkFVTFQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRW5hYmxlKHVpbnQzMl90IE9wdGlvbnMpCit7CisgIC8qIEVuYWJsZSB0aGUgTVBVKi8KKyAgV1JJVEVfUkVHKE1QVS0+Q1RSTCwgKE1QVV9DVFJMX0VOQUJMRV9Nc2sgfCBPcHRpb25zKSk7CisgIC8qIEVuc3VyZSBNUFUgc2V0dGluZ3MgdGFrZSBlZmZlY3RzICovCisgIF9fRFNCKCk7CisgIC8qIFNlcXVlbmNlIGluc3RydWN0aW9uIGZldGNoZXMgdXNpbmcgdXBkYXRlIHNldHRpbmdzICovCisgIF9fSVNCKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBNUFUKKyAgKiBAcm10b2xsIE1QVV9DVFJMICAgICBFTkFCTEUgICAgICAgIExMX01QVV9EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRGlzYWJsZSh2b2lkKQoreworICAvKiBNYWtlIHN1cmUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGFyZSBkb25lICovCisgIF9fRE1CKCk7CisgIC8qIERpc2FibGUgTVBVKi8KKyAgV1JJVEVfUkVHKE1QVS0+Q1RSTCwgMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIE1QVSBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgTVBVX0NUUkwgICAgIEVOQUJMRSAgICAgICAgTExfTVBVX0lzRW5hYmxlZAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX01QVV9Jc0VuYWJsZWQodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChNUFUtPkNUUkwsIE1QVV9DVFJMX0VOQUJMRV9Nc2spID09IChNUFVfQ1RSTF9FTkFCTEVfTXNrKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGEgTVBVIHJlZ2lvbgorICAqIEBybXRvbGwgTVBVX1JBU1IgICAgIEVOQUJMRSAgICAgICAgTExfTVBVX0VuYWJsZVJlZ2lvbgorICAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRW5hYmxlUmVnaW9uKHVpbnQzMl90IFJlZ2lvbikKK3sKKyAgLyogU2V0IFJlZ2lvbiBudW1iZXIgKi8KKyAgV1JJVEVfUkVHKE1QVS0+Uk5SLCBSZWdpb24pOworICAvKiBFbmFibGUgdGhlIE1QVSByZWdpb24gKi8KKyAgU0VUX0JJVChNUFUtPlJBU1IsIE1QVV9SQVNSX0VOQUJMRV9Nc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBhbmQgZW5hYmxlIGEgcmVnaW9uCisgICogQHJtdG9sbCBNUFVfUk5SICAgICAgUkVHSU9OICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQkFSICAgICBSRUdJT04gICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JCQVIgICAgIEFERFIgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgWE4gICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQVNSICAgICBBUCAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JBU1IgICAgIFMgICAgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgQyAgICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQVNSICAgICBCICAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JBU1IgICAgIFNJWkUgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvbgorICAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3CisgICogQHBhcmFtICBBZGRyZXNzIFZhbHVlIG9mIHJlZ2lvbiBiYXNlIGFkZHJlc3MKKyAgKiBAcGFyYW0gIFN1YlJlZ2lvbkRpc2FibGUgU3ViLXJlZ2lvbiBkaXNhYmxlIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYKKyAgKiBAcGFyYW0gIEF0dHJpYnV0ZXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzMyQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV82NEIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4QiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yNTZCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzUxMkIKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMUtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzJLQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV80S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfOEtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzE2S0IKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMzJLQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV82NEtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzEyOEtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzI1NktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzUxMktCCisgICogICAgICAgICAgIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzFNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yTUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzhNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xNk1CCisgICogICAgICAgICAgIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzMyTUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNjRNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xMjhNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yNTZNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV81MTJNQgorICAqICAgICAgICAgICBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xR0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMkdCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzRHQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTk9fQUNDRVNTIG9yIEByZWYgTExfTVBVX1JFR0lPTl9QUklWX1JXIG9yIEByZWYgTExfTVBVX1JFR0lPTl9QUklWX1JXX1VSTyBvciBAcmVmIExMX01QVV9SRUdJT05fRlVMTF9BQ0NFU1MKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUk8gb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUk9fVVJPCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1RFWF9MRVZFTDAgb3IgQHJlZiBMTF9NUFVfVEVYX0xFVkVMMSBvciBAcmVmIExMX01QVV9URVhfTEVWRUwyIG9yIEByZWYgTExfTVBVX1RFWF9MRVZFTDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSBvciAgQHJlZiBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQUNDRVNTX1NIQVJFQUJMRSBvciBAcmVmIExMX01QVV9BQ0NFU1NfTk9UX1NIQVJFQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9BQ0NFU1NfQ0FDSEVBQkxFIG9yIEByZWYgTExfTVBVX0FDQ0VTU19OT1RfQ0FDSEVBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0FDQ0VTU19CVUZGRVJBQkxFIG9yIEByZWYgTExfTVBVX0FDQ0VTU19OT1RfQlVGRkVSQUJMRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0NvbmZpZ1JlZ2lvbih1aW50MzJfdCBSZWdpb24sIHVpbnQzMl90IFN1YlJlZ2lvbkRpc2FibGUsIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IEF0dHJpYnV0ZXMpCit7CisgIC8qIFNldCBSZWdpb24gbnVtYmVyICovCisgIFdSSVRFX1JFRyhNUFUtPlJOUiwgUmVnaW9uKTsKKyAgLyogU2V0IGJhc2UgYWRkcmVzcyAqLworICBXUklURV9SRUcoTVBVLT5SQkFSLCAoQWRkcmVzcyAmIDB4RkZGRkZGRTBVKSk7CisgIC8qIENvbmZpZ3VyZSBNUFUgKi8KKyAgV1JJVEVfUkVHKE1QVS0+UkFTUiwgKE1QVV9SQVNSX0VOQUJMRV9Nc2sgfCBBdHRyaWJ1dGVzIHwgU3ViUmVnaW9uRGlzYWJsZSA8PCBNUFVfUkFTUl9TUkRfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhIHJlZ2lvbgorICAqIEBybXRvbGwgTVBVX1JOUiAgICAgIFJFR0lPTiAgICAgICAgTExfTVBVX0Rpc2FibGVSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JBU1IgICAgIEVOQUJMRSAgICAgICAgTExfTVBVX0Rpc2FibGVSZWdpb24KKyAgKiBAcGFyYW0gIFJlZ2lvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTlVNQkVSNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0Rpc2FibGVSZWdpb24odWludDMyX3QgUmVnaW9uKQoreworICAvKiBTZXQgUmVnaW9uIG51bWJlciAqLworICBXUklURV9SRUcoTVBVLT5STlIsIFJlZ2lvbik7CisgIC8qIERpc2FibGUgdGhlIE1QVSByZWdpb24gKi8KKyAgQ0xFQVJfQklUKE1QVS0+UkFTUiwgTVBVX1JBU1JfRU5BQkxFX01zayk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfTExfQ09SVEVYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfY3JjLmggYi9JbmMvc3RtMzJsMHh4X2xsX2NyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNTlmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2xsX2NyYy5oCkBAIC0wLDAgKzEsNDY0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX2NyYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUkMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9MTF9DUkNfSAorI2RlZmluZSBTVE0zMkwweHhfTExfQ1JDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKENSQykKKworLyoqIEBkZWZncm91cCBDUkNfTEwgQ1JDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgQ1JDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX1BPTFlMRU5HVEggUG9seW5vbWlhbCBsZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DUkNfUE9MWUxFTkdUSF8zMkIgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAzMiBiaXRzIFBvbHlub21pYWwgc2l6ZSAqLworI2RlZmluZSBMTF9DUkNfUE9MWUxFTkdUSF8xNkIgICAgICAgICAgICAgIENSQ19DUl9QT0xZU0laRV8wICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAxNiBiaXRzIFBvbHlub21pYWwgc2l6ZSAqLworI2RlZmluZSBMTF9DUkNfUE9MWUxFTkdUSF84QiAgICAgICAgICAgICAgIENSQ19DUl9QT0xZU0laRV8xICAgICAgICAgICAgICAgICAgICAgICAgLyohPCA4IGJpdHMgUG9seW5vbWlhbCBzaXplICovCisjZGVmaW5lIExMX0NSQ19QT0xZTEVOR1RIXzdCICAgICAgICAgICAgICAgKENSQ19DUl9QT0xZU0laRV8xIHwgQ1JDX0NSX1BPTFlTSVpFXzApICAvKiE8IDcgYml0cyBQb2x5bm9taWFsIHNpemUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX0lOREFUQV9SRVZFUlNFIElucHV0IERhdGEgUmV2ZXJzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9OT05FICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IERhdGEgYml0IG9yZGVyIG5vdCBhZmZlY3RlZCAqLworI2RlZmluZSBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfQllURSAgICAgICAgIENSQ19DUl9SRVZfSU5fMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBEYXRhIGJpdCByZXZlcnNhbCBkb25lIGJ5IGJ5dGUgKi8KKyNkZWZpbmUgTExfQ1JDX0lOREFUQV9SRVZFUlNFX0hBTEZXT1JEICAgICBDUkNfQ1JfUkVWX0lOXzEgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgRGF0YSBiaXQgcmV2ZXJzYWwgZG9uZSBieSBoYWxmLXdvcmQgKi8KKyNkZWZpbmUgTExfQ1JDX0lOREFUQV9SRVZFUlNFX1dPUkQgICAgICAgICAoQ1JDX0NSX1JFVl9JTl8xIHwgQ1JDX0NSX1JFVl9JTl8wKSAgICAgIC8qITwgSW5wdXQgRGF0YSBiaXQgcmV2ZXJzYWwgZG9uZSBieSB3b3JkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19MTF9FQ19PVVREQVRBX1JFVkVSU0UgT3V0cHV0IERhdGEgUmV2ZXJzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfTk9ORSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgRGF0YSBiaXQgb3JkZXIgbm90IGFmZmVjdGVkICovCisjZGVmaW5lIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfQklUICAgICAgICAgQ1JDX0NSX1JFVl9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgRGF0YSBiaXQgcmV2ZXJzYWwgZG9uZSBieSBiaXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX0RlZmF1bHRfUG9seW5vbWlhbF9WYWx1ZSAgICBEZWZhdWx0IENSQyBnZW5lcmF0aW5nIHBvbHlub21pYWwgdmFsdWUKKyAgKiBAYnJpZWYgICAgTm9ybWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcG9seW5vbWlhbCB2YWx1ZSBpcworICAqICAgICAgICAgICBYXjMyICsgWF4yNiArIFheMjMgKyBYXjIyICsgWF4xNiArIFheMTIgKyBYXjExICsgWF4xMCArWF44ICsgWF43ICsgWF41ICsgWF40ICsgWF4yICsgWCArIDEgLgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSQ19ERUZBVUxUX0NSQzMyX1BPTFkgICAgICAgICAgMHgwNEMxMURCN1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEZWZhdWx0IENSQyBnZW5lcmF0aW5nIHBvbHlub21pYWwgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX0RlZmF1bHRfSW5pdFZhbHVlICAgIERlZmF1bHQgQ1JDIGNvbXB1dGF0aW9uIGluaXRpYWxpemF0aW9uIHZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX0RFRkFVTFRfQ1JDX0lOSVRWQUxVRSAgICAgICAweEZGRkZGRkZGVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlZmF1bHQgQ1JDIGNvbXB1dGF0aW9uIGluaXRpYWxpemF0aW9uIHZhbHVlICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNfTExfRXhwb3J0ZWRfTWFjcm9zIENSQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSQ19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIENSQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCBfX1ZBTFVFX18pCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIENSQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9DUkNfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUkMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUZfQ29uZmlndXJhdGlvbiBDUkMgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBDUkMgY2FsY3VsYXRpb24gdW5pdC4KKyAgKiBAbm90ZSAgIElmIFByb2dyYW1tYWJsZSBJbml0aWFsIENSQyB2YWx1ZSBmZWF0dXJlCisgICogICAgICAgICBpcyBhdmFpbGFibGUsIGFsc28gc2V0IHRoZSBEYXRhIFJlZ2lzdGVyIHRvIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlCisgICogICAgICAgICBDUkNfSU5JVCByZWdpc3Rlciwgb3RoZXJ3aXNlLCByZXNldCBEYXRhIFJlZ2lzdGVyIHRvIGl0cyBkZWZhdWx0IHZhbHVlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJFU0VUICAgICAgICAgTExfQ1JDX1Jlc2V0Q1JDQ2FsY3VsYXRpb25Vbml0CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1Jlc2V0Q1JDQ2FsY3VsYXRpb25Vbml0KENSQ19UeXBlRGVmICpDUkN4KQoreworICBTRVRfQklUKENSQ3gtPkNSLCBDUkNfQ1JfUkVTRVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBzaXplIG9mIHRoZSBwb2x5bm9taWFsLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBPTFlTSVpFICAgICAgTExfQ1JDX1NldFBvbHlub21pYWxTaXplCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG9seVNpemUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF8zMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF8xNkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19QT0xZTEVOR1RIXzdCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfU2V0UG9seW5vbWlhbFNpemUoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQzMl90IFBvbHlTaXplKQoreworICBNT0RJRllfUkVHKENSQ3gtPkNSLCBDUkNfQ1JfUE9MWVNJWkUsIFBvbHlTaXplKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gc2l6ZSBvZiB0aGUgcG9seW5vbWlhbC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQT0xZU0laRSAgICAgIExMX0NSQ19HZXRQb2x5bm9taWFsU2l6ZQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfMzJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfMTZCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF83QgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19HZXRQb2x5bm9taWFsU2l6ZShDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JDeC0+Q1IsIENSQ19DUl9QT0xZU0laRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgcmV2ZXJzYWwgb2YgdGhlIGJpdCBvcmRlciBvZiB0aGUgaW5wdXQgZGF0YQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJFVl9JTiAgICAgICAgTExfQ1JDX1NldElucHV0RGF0YVJldmVyc2VNb2RlCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmV2ZXJzZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9CWVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX0hBTEZXT1JECisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX1dPUkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19TZXRJbnB1dERhdGFSZXZlcnNlTW9kZShDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgUmV2ZXJzZU1vZGUpCit7CisgIE1PRElGWV9SRUcoQ1JDeC0+Q1IsIENSQ19DUl9SRVZfSU4sIFJldmVyc2VNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdHlwZSBvZiByZXZlcnNhbCBmb3IgaW5wdXQgZGF0YSBiaXQgb3JkZXIKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRVZfSU4gICAgICAgIExMX0NSQ19HZXRJbnB1dERhdGFSZXZlcnNlTW9kZQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfQllURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9XT1JECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JDX0dldElucHV0RGF0YVJldmVyc2VNb2RlKENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUkN4LT5DUiwgQ1JDX0NSX1JFVl9JTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgcmV2ZXJzYWwgb2YgdGhlIGJpdCBvcmRlciBvZiB0aGUgT3V0cHV0IGRhdGEKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRVZfT1VUICAgICAgIExMX0NSQ19TZXRPdXRwdXREYXRhUmV2ZXJzZU1vZGUKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBSZXZlcnNlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfQklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfU2V0T3V0cHV0RGF0YVJldmVyc2VNb2RlKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBSZXZlcnNlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhDUkN4LT5DUiwgQ1JDX0NSX1JFVl9PVVQsIFJldmVyc2VNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHJldmVyc2FsIG9mIHRoZSBiaXQgb3JkZXIgb2YgdGhlIE91dHB1dCBkYXRhCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUkVWX09VVCAgICAgICBMTF9DUkNfR2V0T3V0cHV0RGF0YVJldmVyc2VNb2RlCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfT1VUREFUQV9SRVZFUlNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfT1VUREFUQV9SRVZFUlNFX0JJVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19HZXRPdXRwdXREYXRhUmV2ZXJzZU1vZGUoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSQ3gtPkNSLCBDUkNfQ1JfUkVWX09VVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFByb2dyYW1tYWJsZSBpbml0aWFsIENSQyB2YWx1ZS4KKyAgKiBAbm90ZSAgIElmIHRoZSBDUkMgc2l6ZSBpcyBsZXNzIHRoYW4gMzIgYml0cywgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKKyAgKiAgICAgICAgIGFyZSB1c2VkIHRvIHdyaXRlIHRoZSBjb3JyZWN0IHZhbHVlCisgICogQG5vdGUgICBMTF9DUkNfREVGQVVMVF9DUkNfSU5JVFZBTFVFIGNvdWxkIGJlIHVzZWQgYXMgdmFsdWUgZm9yIEluaXRDcmMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgSU5JVCAgICAgICAgIElOSVQgICAgICAgICAgTExfQ1JDX1NldEluaXRpYWxEYXRhCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSW5pdENyYyBWYWx1ZSB0byBiZSBwcm9ncmFtbWVkIGluIFByb2dyYW1tYWJsZSBpbml0aWFsIENSQyB2YWx1ZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1NldEluaXRpYWxEYXRhKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBJbml0Q3JjKQoreworICBXUklURV9SRUcoQ1JDeC0+SU5JVCwgSW5pdENyYyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgSW5pdGlhbCBDUkMgdmFsdWUuCisgICogQG5vdGUgICBJZiB0aGUgQ1JDIHNpemUgaXMgbGVzcyB0aGFuIDMyIGJpdHMsIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzCisgICogICAgICAgICBhcmUgdXNlZCB0byByZWFkIHRoZSBjb3JyZWN0IHZhbHVlCisgICogQHJtdG9sbCBJTklUICAgICAgICAgSU5JVCAgICAgICAgICBMTF9DUkNfR2V0SW5pdGlhbERhdGEKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBwcm9ncmFtbWVkIGluIFByb2dyYW1tYWJsZSBpbml0aWFsIENSQyB2YWx1ZSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19HZXRJbml0aWFsRGF0YShDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoQ1JDeC0+SU5JVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFByb2dyYW1tYWJsZSBwb2x5bm9taWFsIHZhbHVlCisgICogICAgICAgICAoY29lZmZpY2llbnRzIG9mIHRoZSBwb2x5bm9taWFsIHRvIGJlIHVzZWQgZm9yIENSQyBjYWxjdWxhdGlvbikuCisgICogQG5vdGUgICBMTF9DUkNfREVGQVVMVF9DUkMzMl9QT0xZIGNvdWxkIGJlIHVzZWQgYXMgdmFsdWUgZm9yIFBvbHlub21Db2VmIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBSZWZlcmVuY2UgTWFudWFsIGFuZCBleGlzdGluZyBFcnJhdGEgU2hlZXRzLAorICAqICAgICAgICAgcmVnYXJkaW5nIHBvc3NpYmxlIGxpbWl0YXRpb25zIGZvciBQb2x5bm9taWFsIHZhbHVlcyB1c2FnZS4KKyAgKiAgICAgICAgIEZvciBleGFtcGxlLCBmb3IgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA3LCBYXjcgKyBYXjYgKyBYXjUgKyBYXjIgKyAxIGlzIHdyaXR0ZW4gMHg2NQorICAqIEBybXRvbGwgUE9MICAgICAgICAgIFBPTCAgICAgICAgICAgTExfQ1JDX1NldFBvbHlub21pYWxDb2VmCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG9seW5vbUNvZWYgVmFsdWUgdG8gYmUgcHJvZ3JhbW1lZCBpbiBQcm9ncmFtbWFibGUgUG9seW5vbWlhbCB2YWx1ZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1NldFBvbHlub21pYWxDb2VmKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBQb2x5bm9tQ29lZikKK3sKKyAgV1JJVEVfUkVHKENSQ3gtPlBPTCwgUG9seW5vbUNvZWYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IFByb2dyYW1tYWJsZSBwb2x5bm9taWFsIHZhbHVlCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgUmVmZXJlbmNlIE1hbnVhbCBhbmQgZXhpc3RpbmcgRXJyYXRhIFNoZWV0cywKKyAgKiAgICAgICAgIHJlZ2FyZGluZyBwb3NzaWJsZSBsaW1pdGF0aW9ucyBmb3IgUG9seW5vbWlhbCB2YWx1ZXMgdXNhZ2UuCisgICogICAgICAgICBGb3IgZXhhbXBsZSwgZm9yIGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgNywgWF43ICsgWF42ICsgWF41ICsgWF4yICsgMSBpcyB3cml0dGVuIDB4NjUKKyAgKiBAcm10b2xsIFBPTCAgICAgICAgICBQT0wgICAgICAgICAgIExMX0NSQ19HZXRQb2x5bm9taWFsQ29lZgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIHByb2dyYW1tZWQgaW4gUHJvZ3JhbW1hYmxlIFBvbHlub21pYWwgdmFsdWUgcmVnaXN0ZXIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUkNfR2V0UG9seW5vbWlhbENvZWYoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKENSQ3gtPlBPTCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19MTF9FRl9EYXRhX01hbmFnZW1lbnQgRGF0YV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBnaXZlbiAzMi1iaXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0NSQ19GZWVkRGF0YTMyCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSW5EYXRhIHZhbHVlIHRvIGJlIHByb3ZpZGVkIHRvIENSQyBjYWxjdWxhdG9yIGJldHdlZW4gYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfRmVlZERhdGEzMihDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgSW5EYXRhKQoreworICBXUklURV9SRUcoQ1JDeC0+RFIsIEluRGF0YSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgZ2l2ZW4gMTYtYml0IGRhdGEgdG8gdGhlIENSQyBjYWxjdWxhdG9yCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9DUkNfRmVlZERhdGExNgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEluRGF0YSAxNiBiaXQgdmFsdWUgdG8gYmUgcHJvdmlkZWQgdG8gQ1JDIGNhbGN1bGF0b3IgYmV0d2VlbiBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX0ZlZWREYXRhMTYoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQxNl90IEluRGF0YSkKK3sKKyAgX19JTyB1aW50MTZfdCAqcFJlZzsKKworICBwUmVnID0gKF9fSU8gdWludDE2X3QgKikoX19JTyB2b2lkICopKCZDUkN4LT5EUik7CisgICpwUmVnID0gSW5EYXRhOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGdpdmVuIDgtYml0IGRhdGEgdG8gdGhlIENSQyBjYWxjdWxhdG9yCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9DUkNfRmVlZERhdGE4CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSW5EYXRhIDggYml0IHZhbHVlIHRvIGJlIHByb3ZpZGVkIHRvIENSQyBjYWxjdWxhdG9yIGJldHdlZW4gYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfRmVlZERhdGE4KENSQ19UeXBlRGVmICpDUkN4LCB1aW50OF90IEluRGF0YSkKK3sKKyAgKih1aW50OF90IF9fSU8gKikoJkNSQ3gtPkRSKSA9ICh1aW50OF90KSBJbkRhdGE7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgQ1JDIGNhbGN1bGF0aW9uIHJlc3VsdC4gMzIgYml0cyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0NSQ19SZWFkRGF0YTMyCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0IGFzIHN0b3JlZCBpbiBDUkNfRFIgcmVnaXN0ZXIgKDMyIGJpdHMpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19SZWFkRGF0YTMyKENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhDUkN4LT5EUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQuIDE2IGJpdHMgdmFsdWUgaXMgcmV0dXJuZWQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4gYSAxNiBiaXRzIENSQyBwb2x5bm9taWFsIHNpemUgY29udGV4dC4KKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0NSQ19SZWFkRGF0YTE2CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0IGFzIHN0b3JlZCBpbiBDUkNfRFIgcmVnaXN0ZXIgKDE2IGJpdHMpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0NSQ19SZWFkRGF0YTE2KENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQxNl90KVJFQURfUkVHKENSQ3gtPkRSKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0LiA4IGJpdHMgdmFsdWUgaXMgcmV0dXJuZWQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4gYSA4IGJpdHMgQ1JDIHBvbHlub21pYWwgc2l6ZSBjb250ZXh0LgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX1JlYWREYXRhOAorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEN1cnJlbnQgQ1JDIGNhbGN1bGF0aW9uIHJlc3VsdCBhcyBzdG9yZWQgaW4gQ1JDX0RSIHJlZ2lzdGVyICg4IGJpdHMpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfQ1JDX1JlYWREYXRhOChDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KVJFQURfUkVHKENSQ3gtPkRSKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0LiA3IGJpdHMgdmFsdWUgaXMgcmV0dXJuZWQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4gYSA3IGJpdHMgQ1JDIHBvbHlub21pYWwgc2l6ZSBjb250ZXh0LgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX1JlYWREYXRhNworICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEN1cnJlbnQgQ1JDIGNhbGN1bGF0aW9uIHJlc3VsdCBhcyBzdG9yZWQgaW4gQ1JDX0RSIHJlZ2lzdGVyICg3IGJpdHMpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfQ1JDX1JlYWREYXRhNyhDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX1JFRyhDUkN4LT5EUikgJiAweDdGVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGRhdGEgc3RvcmVkIGluIHRoZSBJbmRlcGVuZGVudCBEYXRhKElEUikgcmVnaXN0ZXIuCisgICogQG5vdGUgICBUaGlzIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgbG9jYXRpb24gZm9yIG9uZSBieXRlLgorICAqIEBybXRvbGwgSURSICAgICAgICAgIElEUiAgICAgICAgICAgTExfQ1JDX1JlYWRfSURSCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgc3RvcmVkIGluIENSQ19JRFIgcmVnaXN0ZXIgKEdlbmVyYWwtcHVycG9zZSA4LWJpdCBkYXRhIHJlZ2lzdGVyKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUkNfUmVhZF9JRFIoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKENSQ3gtPklEUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3JlIGRhdGEgaW4gdGhlIEluZGVwZW5kZW50IERhdGEoSURSKSByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIFRoaXMgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSBsb2NhdGlvbiBmb3Igb25lIGJ5dGUuCisgICogQHJtdG9sbCBJRFIgICAgICAgICAgSURSICAgICAgICAgICBMTF9DUkNfV3JpdGVfSURSCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSW5EYXRhIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBDUkNfSURSIHJlZ2lzdGVyICg4LWJpdCkgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfV3JpdGVfSURSKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBJbkRhdGEpCit7CisgICooKHVpbnQ4X3QgX19JTyAqKSgmQ1JDeC0+SURSKSkgPSAodWludDhfdCkgSW5EYXRhOworfQorLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBDUkNfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworRXJyb3JTdGF0dXMgTExfQ1JDX0RlSW5pdChDUkNfVHlwZURlZiAqQ1JDeCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKENSQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9MTF9DUkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9sbF9jcnMuaCBiL0luYy9zdG0zMmwweHhfbGxfY3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NDU2ZAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfbGxfY3JzLmgKQEAgLTAsMCArMSw3OTggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfY3JzLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSUyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9MTF9DUlNfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9MTF9DUlNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoQ1JTKQorCisvKiogQGRlZmdyb3VwIENSU19MTCBDUlMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX1ByaXZhdGVfQ29uc3RhbnRzIENSUyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIERlZmluZXMgdXNlZCBmb3IgdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgcmVnaXN0ZXIgYW5kIHBlcmZvcm0gb2Zmc2V0cyovCisjZGVmaW5lIENSU19QT1NJVElPTl9UUklNICAgICAgICAoQ1JTX0NSX1RSSU1fUG9zKSAgICAgLyogYml0IHBvc2l0aW9uIGluIENSIHJlZyAqLworI2RlZmluZSBDUlNfUE9TSVRJT05fRkVDQVAgICAgICAgKENSU19JU1JfRkVDQVBfUG9zKSAgIC8qIGJpdCBwb3NpdGlvbiBpbiBJU1IgcmVnICovCisjZGVmaW5lIENSU19QT1NJVElPTl9GRUxJTSAgICAgICAoQ1JTX0NGR1JfRkVMSU1fUG9zKSAgLyogYml0IHBvc2l0aW9uIGluIENGR1IgcmVnICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSU19MTF9FeHBvcnRlZF9Db25zdGFudHMgQ1JTIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9DUlNfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSU19JU1JfU1lOQ09LRiAgICAgICAgICAgICAgICAgQ1JTX0lTUl9TWU5DT0tGCisjZGVmaW5lIExMX0NSU19JU1JfU1lOQ1dBUk5GICAgICAgICAgICAgICAgQ1JTX0lTUl9TWU5DV0FSTkYKKyNkZWZpbmUgTExfQ1JTX0lTUl9FUlJGICAgICAgICAgICAgICAgICAgICBDUlNfSVNSX0VSUkYKKyNkZWZpbmUgTExfQ1JTX0lTUl9FU1lOQ0YgICAgICAgICAgICAgICAgICBDUlNfSVNSX0VTWU5DRgorI2RlZmluZSBMTF9DUlNfSVNSX1NZTkNFUlIgICAgICAgICAgICAgICAgIENSU19JU1JfU1lOQ0VSUgorI2RlZmluZSBMTF9DUlNfSVNSX1NZTkNNSVNTICAgICAgICAgICAgICAgIENSU19JU1JfU1lOQ01JU1MKKyNkZWZpbmUgTExfQ1JTX0lTUl9UUklNT1ZGICAgICAgICAgICAgICAgICBDUlNfSVNSX1RSSU1PVkYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0NSU19SZWFkUmVnIGFuZCAgTExfQ1JTX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSU19DUl9TWU5DT0tJRSAgICAgICAgICAgICAgICAgQ1JTX0NSX1NZTkNPS0lFCisjZGVmaW5lIExMX0NSU19DUl9TWU5DV0FSTklFICAgICAgICAgICAgICAgQ1JTX0NSX1NZTkNXQVJOSUUKKyNkZWZpbmUgTExfQ1JTX0NSX0VSUklFICAgICAgICAgICAgICAgICAgICBDUlNfQ1JfRVJSSUUKKyNkZWZpbmUgTExfQ1JTX0NSX0VTWU5DSUUgICAgICAgICAgICAgICAgICBDUlNfQ1JfRVNZTkNJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUNfU1lOQ19ESVYgU3luY2hyb25pemF0aW9uIFNpZ25hbCBEaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzEgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm8gU2lnbmFsIG5vdCBkaXZpZGVkIChkZWZhdWx0KSAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMiAgICAgICAgICAgICAgICAgIENSU19DRkdSX1NZTkNESVZfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX0NSU19TWU5DX0RJVl80ICAgICAgICAgICAgICAgICAgQ1JTX0NGR1JfU1lOQ0RJVl8xICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzggICAgICAgICAgICAgICAgICAoQ1JTX0NGR1JfU1lOQ0RJVl8xIHwgQ1JTX0NGR1JfU1lOQ0RJVl8wKSAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMTYgICAgICAgICAgICAgICAgIENSU19DRkdSX1NZTkNESVZfMiAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMzIgICAgICAgICAgICAgICAgIChDUlNfQ0ZHUl9TWU5DRElWXzIgfCBDUlNfQ0ZHUl9TWU5DRElWXzApIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfNjQgICAgICAgICAgICAgICAgIChDUlNfQ0ZHUl9TWU5DRElWXzIgfCBDUlNfQ0ZHUl9TWU5DRElWXzEpIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSA2NCAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMTI4ICAgICAgICAgICAgICAgIENSU19DRkdSX1NZTkNESVYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxMjggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX1NZTkNfU09VUkNFIFN5bmNocm9uaXphdGlvbiBTaWduYWwgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfU09VUkNFX0dQSU8gICAgICAgICAgICAoKHVpbnQzMl90KTB4MDBVKSAgICAgICAvKiE8IFN5bmNocm8gU2lnbmFsIHNvdWNyZSBHUElPICovCisjZGVmaW5lIExMX0NSU19TWU5DX1NPVVJDRV9MU0UgICAgICAgICAgICAgQ1JTX0NGR1JfU1lOQ1NSQ18wICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBzb3VyY2UgTFNFICovCisjZGVmaW5lIExMX0NSU19TWU5DX1NPVVJDRV9VU0IgICAgICAgICAgICAgQ1JTX0NGR1JfU1lOQ1NSQ18xICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBzb3VyY2UgVVNCIFNPRiAoZGVmYXVsdCkqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUNfU1lOQ19QT0xBUklUWSBTeW5jaHJvbml6YXRpb24gU2lnbmFsIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HICAgICAgICAoKHVpbnQzMl90KTB4MDBVKSAgICAgLyohPCBTeW5jaHJvIEFjdGl2ZSBvbiByaXNpbmcgZWRnZSAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORyAgICAgICBDUlNfQ0ZHUl9TWU5DUE9MICAgICAgLyohPCBTeW5jaHJvIEFjdGl2ZSBvbiBmYWxsaW5nIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX0ZSRVFFUlJPUkRJUiBGcmVxdWVuY3kgRXJyb3IgRGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX0ZSRVFfRVJST1JfRElSX1VQICAgICAgICAgICAgICgodWludDMyX3QpMHgwMFUpICAgICAgICAgLyohPCBVcGNvdW50aW5nIGRpcmVjdGlvbiwgdGhlIGFjdHVhbCBmcmVxdWVuY3kgaXMgYWJvdmUgdGhlIHRhcmdldCAqLworI2RlZmluZSBMTF9DUlNfRlJFUV9FUlJPUl9ESVJfRE9XTiAgICAgICAgICAgKCh1aW50MzJfdClDUlNfSVNSX0ZFRElSKSAvKiE8IERvd25jb3VudGluZyBkaXJlY3Rpb24sIHRoZSBhY3R1YWwgZnJlcXVlbmN5IGlzIGJlbG93IHRoZSB0YXJnZXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX0RFRkFVTFRWQUxVRVMgRGVmYXVsdCBWYWx1ZXMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmIFJlc2V0IHZhbHVlIG9mIHRoZSBSRUxPQUQgZmllbGQKKyAgKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgb2YgdGhlIFJFTE9BRCBmaWVsZCBjb3JyZXNwb25kcyB0byBhIHRhcmdldCBmcmVxdWVuY3kgb2YgNDggTUh6CisgICogICAgICAgYW5kIGEgc3luY2hyb25pemF0aW9uIHNpZ25hbCBmcmVxdWVuY3kgb2YgMSBrSHogKFNPRiBzaWduYWwgZnJvbSBVU0IpCisgICovCisjZGVmaW5lIExMX0NSU19SRUxPQURWQUxVRV9ERUZBVUxUICAgICAgICAgKCh1aW50MzJfdCkweEJCN0ZVKSAgICAgIAorCisvKioKKyAgKiBAYnJpZWYgUmVzZXQgdmFsdWUgb2YgRnJlcXVlbmN5IGVycm9yIGxpbWl0LgorICAqLworI2RlZmluZSBMTF9DUlNfRVJST1JMSU1JVF9ERUZBVUxUICAgICAgICAgICgodWludDMyX3QpMHgyMlUpICAgICAgCisKKy8qKgorICAqIEBicmllZiBSZXNldCB2YWx1ZSBvZiB0aGUgSFNJNDggQ2FsaWJyYXRpb24gZmllbGQKKyAgKiBAbm90ZSBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMiwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIG1pZGRsZSBvZiB0aGUgdHJpbW1pbmcgaW50ZXJ2YWwuIAorICAqICAgICAgIFRoZSB0cmltbWluZyBzdGVwIGlzIGFyb3VuZCA2NyBrSHogYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgVFJJTSBzdGVwcy4gCisgICogICAgICAgQSBoaWdoZXIgVFJJTSB2YWx1ZSBjb3JyZXNwb25kcyB0byBhIGhpZ2hlciBvdXRwdXQgZnJlcXVlbmN5CisgICovCisjZGVmaW5lIExMX0NSU19IU0k0OENBTElCUkFUSU9OX0RFRkFVTFQgICAgKCh1aW50MzJfdCkweDIwVSkgICAgICAKKy8qKgorICAqIEB9CisgICovIAorICAKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSU19MTF9FeHBvcnRlZF9NYWNyb3MgQ1JTIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gQ1JTIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gQ1JTIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9DUlNfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBDUlMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBDUlMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSU19MTF9FTV9FeHBvcnRlZF9NYWNyb3NfQ2FsY3VsYXRlX1JlbG9hZCBFeHBvcnRlZF9NYWNyb3NfQ2FsY3VsYXRlX1JlbG9hZAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY2FsY3VsYXRlIHJlbG9hZCB2YWx1ZSB0byBiZSBzZXQgaW4gQ1JTIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0YXJnZXQgYW5kIHN5bmMgZnJlcXVlbmNpZXMKKyAgKiBAbm90ZSAgIFRoZSBSRUxPQUQgdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkIGFjY29yZGluZyB0byB0aGUgcmF0aW8gYmV0d2VlbiAKKyAgKiAgICAgICAgIHRoZSB0YXJnZXQgZnJlcXVlbmN5IGFuZCB0aGUgZnJlcXVlbmN5IG9mIHRoZSBzeW5jaHJvbml6YXRpb24gc291cmNlIGFmdGVyCisgICogICAgICAgICBwcmVzY2FsaW5nLiBJdCBpcyB0aGVuIGRlY3JlYXNlZCBieSBvbmUgaW4gb3JkZXIgdG8gcmVhY2ggdGhlIGV4cGVjdGVkCisgICogICAgICAgICBzeW5jaHJvbml6YXRpb24gb24gdGhlIHplcm8gdmFsdWUuIFRoZSBmb3JtdWxhIGlzIHRoZSBmb2xsb3dpbmc6CisgICogICAgICAgICAgICAgIFJFTE9BRCA9IChmVEFSR0VUIC8gZlNZTkMpIC0xCisgICogQHBhcmFtICBfX0ZUQVJHRVRfXyBUYXJnZXQgZnJlcXVlbmN5ICh2YWx1ZSBpbiBIeikKKyAgKiBAcGFyYW0gIF9fRlNZTkNfXyBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyZXF1ZW5jeSAodmFsdWUgaW4gSHopCisgICogQHJldHZhbCBSZWxvYWQgdmFsdWUgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX0NSU19DQUxDX0NBTENVTEFURV9SRUxPQURWQUxVRShfX0ZUQVJHRVRfXywgX19GU1lOQ19fKSAoKChfX0ZUQVJHRVRfXykgLyAoX19GU1lOQ19fKSkgLSAxVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUlMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRnJlcXVlbmN5IGVycm9yIGNvdW50ZXIKKyAgKiBAbm90ZSBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhlIENSU19DRkdSIHJlZ2lzdGVyIGlzIHdyaXRlLXByb3RlY3RlZCBhbmQgY2Fubm90IGJlIG1vZGlmaWVkCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9DUlNfRW5hYmxlRnJlcUVycm9yQ291bnRlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0VuYWJsZUZyZXFFcnJvckNvdW50ZXIodm9pZCkKK3sKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZyZXF1ZW5jeSBlcnJvciBjb3VudGVyCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9DUlNfRGlzYWJsZUZyZXFFcnJvckNvdW50ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19EaXNhYmxlRnJlcUVycm9yQ291bnRlcih2b2lkKQoreworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBDRU4gICAgICAgICAgIExMX0NSU19Jc0VuYWJsZWRGcmVxRXJyb3JDb3VudGVyCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzRW5hYmxlZEZyZXFFcnJvckNvdW50ZXIodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChDUlMtPkNSLCBDUlNfQ1JfQ0VOKSA9PSAoQ1JTX0NSX0NFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBdXRvbWF0aWMgdHJpbW1pbmcgY291bnRlcgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFVVE9UUklNRU4gICAgTExfQ1JTX0VuYWJsZUF1dG9UcmltbWluZworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0VuYWJsZUF1dG9UcmltbWluZyh2b2lkKQoreworICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9BVVRPVFJJTUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEF1dG9tYXRpYyB0cmltbWluZyBjb3VudGVyCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQVVUT1RSSU1FTiAgICBMTF9DUlNfRGlzYWJsZUF1dG9UcmltbWluZworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0Rpc2FibGVBdXRvVHJpbW1pbmcodm9pZCkKK3sKKyAgQ0xFQVJfQklUKENSUy0+Q1IsIENSU19DUl9BVVRPVFJJTUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBdXRvbWF0aWMgdHJpbW1pbmcgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBVVRPVFJJTUVOICAgIExMX0NSU19Jc0VuYWJsZWRBdXRvVHJpbW1pbmcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNFbmFibGVkQXV0b1RyaW1taW5nKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0FVVE9UUklNRU4pID09IChDUlNfQ1JfQVVUT1RSSU1FTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBIU0k0OCBvc2NpbGxhdG9yIHNtb290aCB0cmltbWluZworICAqIEBub3RlICAgV2hlbiB0aGUgQVVUT1RSSU1FTiBiaXQgaXMgc2V0LCB0aGlzIGZpZWxkIGlzIGNvbnRyb2xsZWQgYnkgaGFyZHdhcmUgYW5kIGlzIHJlYWQtb25seQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRSSU0gICAgICAgICAgTExfQ1JTX1NldEhTSTQ4U21vb3RoVHJpbW1pbmcKKyAgKiBAcGFyYW0gIFZhbHVlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDYzCisgICogQG5vdGUgICBEZWZhdWx0IHZhbHVlIGNhbiBiZSBzZXQgdGhhbmtzIHRvIEByZWYgTExfQ1JTX0hTSTQ4Q0FMSUJSQVRJT05fREVGQVVMVCAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19TZXRIU0k0OFNtb290aFRyaW1taW5nKHVpbnQzMl90IFZhbHVlKQoreworICBNT0RJRllfUkVHKENSUy0+Q1IsIENSU19DUl9UUklNLCBWYWx1ZSA8PCBDUlNfUE9TSVRJT05fVFJJTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhTSTQ4IG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVFJJTSAgICAgICAgICBMTF9DUlNfR2V0SFNJNDhTbW9vdGhUcmltbWluZworICAqIEByZXR2YWwgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNjMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0SFNJNDhTbW9vdGhUcmltbWluZyh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNSLCBDUlNfQ1JfVFJJTSkgPj4gQ1JTX1BPU0lUSU9OX1RSSU0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb3VudGVyIHJlbG9hZCB2YWx1ZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFJFTE9BRCAgICAgICAgTExfQ1JTX1NldFJlbG9hZENvdW50ZXIKKyAgKiBAcGFyYW0gIFZhbHVlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRgorICAqIEBub3RlICAgRGVmYXVsdCB2YWx1ZSBjYW4gYmUgc2V0IHRoYW5rcyB0byBAcmVmIExMX0NSU19SRUxPQURWQUxVRV9ERUZBVUxUIAorICAqICAgICAgICAgT3RoZXJ3aXNlIGl0IGNhbiBiZSBjYWxjdWxhdGVkIGluIHVzaW5nIG1hY3JvIEByZWYgX19MTF9DUlNfQ0FMQ19DQUxDVUxBVEVfUkVMT0FEVkFMVUUgKF9GVEFSR0VUXywgX0ZTWU5DXykKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19TZXRSZWxvYWRDb3VudGVyKHVpbnQzMl90IFZhbHVlKQoreworICBNT0RJRllfUkVHKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfUkVMT0FELCBWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvdW50ZXIgcmVsb2FkIHZhbHVlCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUkVMT0FEICAgICAgICBMTF9DUlNfR2V0UmVsb2FkQ291bnRlcgorICAqIEByZXR2YWwgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldFJlbG9hZENvdW50ZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9SRUxPQUQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZnJlcXVlbmN5IGVycm9yIGxpbWl0CisgICogQHJtdG9sbCBDRkdSICAgICAgICAgRkVMSU0gICAgICAgICBMTF9DUlNfU2V0RnJlcUVycm9yTGltaXQKKyAgKiBAcGFyYW0gIFZhbHVlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI1NQorICAqIEBub3RlICAgRGVmYXVsdCB2YWx1ZSBjYW4gYmUgc2V0IHRoYW5rcyB0byBAcmVmIExMX0NSU19FUlJPUkxJTUlUX0RFRkFVTFQgCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0RnJlcUVycm9yTGltaXQodWludDMyX3QgVmFsdWUpCit7CisgIE1PRElGWV9SRUcoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9GRUxJTSwgVmFsdWUgPDwgQ1JTX1BPU0lUSU9OX0ZFTElNKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZnJlcXVlbmN5IGVycm9yIGxpbWl0CisgICogQHJtdG9sbCBDRkdSICAgICAgICAgRkVMSU0gICAgICAgICBMTF9DUlNfR2V0RnJlcUVycm9yTGltaXQKKyAgKiBAcmV0dmFsIEEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI1NQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19HZXRGcmVxRXJyb3JMaW1pdCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX0ZFTElNKSA+PiBDUlNfUE9TSVRJT05fRkVMSU0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBkaXZpc2lvbiBmYWN0b3IgZm9yIFNZTkMgc2lnbmFsCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgU1lOQ0RJViAgICAgICBMTF9DUlNfU2V0U3luY0RpdmlkZXIKKyAgKiBAcGFyYW0gIERpdmlkZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8xMjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19TZXRTeW5jRGl2aWRlcih1aW50MzJfdCBEaXZpZGVyKQoreworICBNT0RJRllfUkVHKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfU1lOQ0RJViwgRGl2aWRlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGRpdmlzaW9uIGZhY3RvciBmb3IgU1lOQyBzaWduYWwKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTWU5DRElWICAgICAgIExMX0NSU19HZXRTeW5jRGl2aWRlcgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8xMjgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0U3luY0RpdmlkZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9TWU5DRElWKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFNZTkMgc2lnbmFsIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNZTkNTUkMgICAgICAgTExfQ1JTX1NldFN5bmNTaWduYWxTb3VyY2UKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9HUElPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9VU0IKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19TZXRTeW5jU2lnbmFsU291cmNlKHVpbnQzMl90IFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNTUkMsIFNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNZTkMgc2lnbmFsIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNZTkNTUkMgICAgICAgTExfQ1JTX0dldFN5bmNTaWduYWxTb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0dQSU8KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19TT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX1VTQgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19HZXRTeW5jU2lnbmFsU291cmNlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfU1lOQ1NSQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBpbnB1dCBwb2xhcml0eSBmb3IgdGhlIFNZTkMgc2lnbmFsIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNZTkNQT0wgICAgICAgTExfQ1JTX1NldFN5bmNQb2xhcml0eQorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19QT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19QT0xBUklUWV9GQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0U3luY1BvbGFyaXR5KHVpbnQzMl90IFBvbGFyaXR5KQoreworICBNT0RJRllfUkVHKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfU1lOQ1BPTCwgUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnB1dCBwb2xhcml0eSBmb3IgdGhlIFNZTkMgc2lnbmFsIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNZTkNQT0wgICAgICAgTExfQ1JTX0dldFN5bmNQb2xhcml0eQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19QT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19QT0xBUklUWV9GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldFN5bmNQb2xhcml0eSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNQT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQ1JTIGZvciB0aGUgc3luY2hyb25pemF0aW9uCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVFJJTSAgICAgICAgICBMTF9DUlNfQ29uZmlnU3luY2hyb25pemF0aW9uXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBSRUxPQUQgICAgICAgIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb25cbgorICAqICAgICAgICAgQ0ZHUiAgICAgICAgIEZFTElNICAgICAgICAgTExfQ1JTX0NvbmZpZ1N5bmNocm9uaXphdGlvblxuCisgICogICAgICAgICBDRkdSICAgICAgICAgU1lOQ0RJViAgICAgICBMTF9DUlNfQ29uZmlnU3luY2hyb25pemF0aW9uXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBTWU5DU1JDICAgICAgIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb25cbgorICAqICAgICAgICAgQ0ZHUiAgICAgICAgIFNZTkNQT0wgICAgICAgTExfQ1JTX0NvbmZpZ1N5bmNocm9uaXphdGlvbgorICAqIEBwYXJhbSAgSFNJNDhDYWxpYnJhdGlvblZhbHVlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDYzCisgICogQHBhcmFtICBFcnJvckxpbWl0VmFsdWUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgICogQHBhcmFtICBSZWxvYWRWYWx1ZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUKKyAgKiBAcGFyYW0gIFNldHRpbmdzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl8xIG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzIgb3IgQHJlZiBMTF9DUlNfU1lOQ19ESVZfNCBvciBAcmVmIExMX0NSU19TWU5DX0RJVl84CisgICogICAgICAgICAgICAgIG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzE2IG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzMyIG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzY0IG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9HUElPIG9yIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0xTRSBvciBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9VU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19QT0xBUklUWV9SSVNJTkcgb3IgQHJlZiBMTF9DUlNfU1lOQ19QT0xBUklUWV9GQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfQ29uZmlnU3luY2hyb25pemF0aW9uKHVpbnQzMl90IEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSwgdWludDMyX3QgRXJyb3JMaW1pdFZhbHVlLCB1aW50MzJfdCBSZWxvYWRWYWx1ZSwgdWludDMyX3QgU2V0dGluZ3MpCit7CisgIE1PRElGWV9SRUcoQ1JTLT5DUiwgQ1JTX0NSX1RSSU0sIEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSk7CisgIE1PRElGWV9SRUcoQ1JTLT5DRkdSLCAKKyAgICAgICAgICAgICBDUlNfQ0ZHUl9SRUxPQUQgfCBDUlNfQ0ZHUl9GRUxJTSB8IENSU19DRkdSX1NZTkNESVYgfCBDUlNfQ0ZHUl9TWU5DU1JDIHwgQ1JTX0NGR1JfU1lOQ1BPTCwgCisgICAgICAgICAgICAgUmVsb2FkVmFsdWUgfCAoRXJyb3JMaW1pdFZhbHVlIDw8IENSU19QT1NJVElPTl9GRUxJTSkgfCBTZXR0aW5ncyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VGX0NSU19NYW5hZ2VtZW50IENSU19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBzb2Z0d2FyZSBTWU5DIGV2ZW50CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgU1dTWU5DICAgICAgICBMTF9DUlNfR2VuZXJhdGVFdmVudF9TV1NZTkMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19HZW5lcmF0ZUV2ZW50X1NXU1lOQyh2b2lkKQoreworICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9TV1NZTkMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgZnJlcXVlbmN5IGVycm9yIGRpcmVjdGlvbiBsYXRjaGVkIGluIHRoZSB0aW1lIG9mIHRoZSBsYXN0IAorICAqIFNZTkMgZXZlbnQKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBGRURJUiAgICAgICAgIExMX0NSU19HZXRGcmVxRXJyb3JEaXJlY3Rpb24KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX0ZSRVFfRVJST1JfRElSX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX0ZSRVFfRVJST1JfRElSX0RPV04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0RnJlcUVycm9yRGlyZWN0aW9uKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX0ZFRElSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBmcmVxdWVuY3kgZXJyb3IgY291bnRlciB2YWx1ZSBsYXRjaGVkIGluIHRoZSB0aW1lIG9mIHRoZSBsYXN0IFNZTkMgZXZlbnQKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBGRUNBUCAgICAgICAgIExMX0NSU19HZXRGcmVxRXJyb3JDYXB0dXJlCisgICogQHJldHZhbCBBIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19HZXRGcmVxRXJyb3JDYXB0dXJlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX0ZFQ0FQKSA+PiBDUlNfUE9TSVRJT05fRkVDQVApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSU19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTWU5DIGV2ZW50IE9LIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DT0tGICAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ09LCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzQWN0aXZlRmxhZ19TWU5DT0sodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9TWU5DT0tGKSA9PSAoQ1JTX0lTUl9TWU5DT0tGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1lOQyB3YXJuaW5nIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DV0FSTkYgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ1dBUk4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX1NZTkNXQVJOKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQ1JTLT5JU1IsIENSU19JU1JfU1lOQ1dBUk5GKSA9PSAoQ1JTX0lTUl9TWU5DV0FSTkYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3Igc2lnbmFsIG9jY3VycmVkIG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEVSUkYgICAgICAgICAgTExfQ1JTX0lzQWN0aXZlRmxhZ19FUlIKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX0VSUih2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX0VSUkYpID09IChDUlNfSVNSX0VSUkYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFeHBlY3RlZCBTWU5DIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBFU1lOQ0YgICAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfRVNZTkMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX0VTWU5DKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQ1JTLT5JU1IsIENSU19JU1JfRVNZTkNGKSA9PSAoQ1JTX0lTUl9FU1lOQ0YpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTWU5DIGVycm9yIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DRVJSICAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ0VSUgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ0VSUih2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX1NZTkNFUlIpID09IChDUlNfSVNSX1NZTkNFUlIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTWU5DIG1pc3NlZCBlcnJvciBzaWduYWwgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgU1lOQ01JU1MgICAgICBMTF9DUlNfSXNBY3RpdmVGbGFnX1NZTkNNSVNTCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzQWN0aXZlRmxhZ19TWU5DTUlTUyh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX1NZTkNNSVNTKSA9PSAoQ1JTX0lTUl9TWU5DTUlTUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFRyaW1taW5nIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUUklNT1ZGICAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfVFJJTU9WRgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0FjdGl2ZUZsYWdfVFJJTU9WRih2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX1RSSU1PVkYpID09IChDUlNfSVNSX1RSSU1PVkYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgU1lOQyBldmVudCBPSyBmbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgU1lOQ09LQyAgICAgICBMTF9DUlNfQ2xlYXJGbGFnX1NZTkNPSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0NsZWFyRmxhZ19TWU5DT0sodm9pZCkKK3sKKyAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX1NZTkNPS0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSAgU1lOQyB3YXJuaW5nIGZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBTWU5DV0FSTkMgICAgIExMX0NSU19DbGVhckZsYWdfU1lOQ1dBUk4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19DbGVhckZsYWdfU1lOQ1dBUk4odm9pZCkKK3sKKyAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX1NZTkNXQVJOQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVFJJTU9WRiwgU1lOQ01JU1MgYW5kIFNZTkNFUlIgYml0cyBhbmQgY29uc2VxdWVudGx5IGFsc28gCisgICogdGhlIEVSUiBmbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgRVJSQyAgICAgICAgICBMTF9DUlNfQ2xlYXJGbGFnX0VSUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0NsZWFyRmxhZ19FUlIodm9pZCkKK3sKKyAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX0VSUkMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEV4cGVjdGVkIFNZTkMgZmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIEVTWU5DQyAgICAgICAgTExfQ1JTX0NsZWFyRmxhZ19FU1lOQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0NsZWFyRmxhZ19FU1lOQyh2b2lkKQoreworICBXUklURV9SRUcoQ1JTLT5JQ1IsIENSU19JQ1JfRVNZTkNDKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DT0tJRSAgICAgIExMX0NSU19FbmFibGVJVF9TWU5DT0sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19FbmFibGVJVF9TWU5DT0sodm9pZCkKK3sKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1lOQ09LSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DT0tJRSAgICAgIExMX0NSU19EaXNhYmxlSVRfU1lOQ09LCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUlUX1NZTkNPSyh2b2lkKQoreworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNPS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTWU5DIGV2ZW50IE9LIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNZTkNPS0lFICAgICAgTExfQ1JTX0lzRW5hYmxlZElUX1NZTkNPSworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0VuYWJsZWRJVF9TWU5DT0sodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1lOQ09LSUUpID09IChDUlNfQ1JfU1lOQ09LSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1lOQyB3YXJuaW5nIGludGVycnVwdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNZTkNXQVJOSUUgICAgTExfQ1JTX0VuYWJsZUlUX1NZTkNXQVJOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRW5hYmxlSVRfU1lOQ1dBUk4odm9pZCkKK3sKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1lOQ1dBUk5JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTWU5DIHdhcm5pbmcgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgU1lOQ1dBUk5JRSAgICBMTF9DUlNfRGlzYWJsZUlUX1NZTkNXQVJOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUlUX1NZTkNXQVJOKHZvaWQpCit7CisgIENMRUFSX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1lOQ1dBUk5JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1lOQyB3YXJuaW5nIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNZTkNXQVJOSUUgICAgTExfQ1JTX0lzRW5hYmxlZElUX1NZTkNXQVJOCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzRW5hYmxlZElUX1NZTkNXQVJOKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNXQVJOSUUpID09IChDUlNfQ1JfU1lOQ1dBUk5JRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3IgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9DUlNfRW5hYmxlSVRfRVJSCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRW5hYmxlSVRfRVJSKHZvaWQpCit7CisgIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VSUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFN5bmNocm9uaXphdGlvbiBvciB0cmltbWluZyBlcnJvciBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0NSU19EaXNhYmxlSVRfRVJSCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUlUX0VSUih2b2lkKQoreworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VSUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3IgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9DUlNfSXNFbmFibGVkSVRfRVJSCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzRW5hYmxlZElUX0VSUih2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKENSUy0+Q1IsIENSU19DUl9FUlJJRSkgPT0gKENSU19DUl9FUlJJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHBlY3RlZCBTWU5DIGludGVycnVwdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVTWU5DSUUgICAgICAgTExfQ1JTX0VuYWJsZUlUX0VTWU5DCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRW5hYmxlSVRfRVNZTkModm9pZCkKK3sKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfRVNZTkNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHBlY3RlZCBTWU5DIGludGVycnVwdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVTWU5DSUUgICAgICAgTExfQ1JTX0Rpc2FibGVJVF9FU1lOQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0Rpc2FibGVJVF9FU1lOQyh2b2lkKQoreworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VTWU5DSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRVNZTkNJRSAgICAgICBMTF9DUlNfSXNFbmFibGVkSVRfRVNZTkMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNFbmFibGVkSVRfRVNZTkModm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChDUlMtPkNSLCBDUlNfQ1JfRVNZTkNJRSkgPT0gKENSU19DUl9FU1lOQ0lFKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisgIAorRXJyb3JTdGF0dXMgTExfQ1JTX0RlSW5pdCh2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoQ1JTKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfTExfQ1JTX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfZGFjLmggYi9JbmMvc3RtMzJsMHh4X2xsX2RhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjRmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2xsX2RhYy5oCkBAIC0wLDAgKzEsMTQxOCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9kYWMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgREFDIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0xMX0RBQ19ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0xMX0RBQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoREFDMSkKKworLyoqIEBkZWZncm91cCBEQUNfTEwgREFDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERBQ19MTF9Qcml2YXRlX0NvbnN0YW50cyBEQUMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBJbnRlcm5hbCBtYXNrcyBmb3IgREFDIGNoYW5uZWxzIGRlZmluaXRpb24gKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfREFDX0NIQU5ORUxfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgYml0cyBwb3NpdGlvbiBpbnRvIHJlZ2lzdGVyIENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIGJpdHMgcG9zaXRpb24gaW50byByZWdpc3RlciBTV1RSSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCByZWdpc3RlciBvZmZzZXQgb2YgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIERIUnggICAgICAgICAgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgcmVnaXN0ZXIgb2Zmc2V0IG9mIGRhdGEgb3V0cHV0IHJlZ2lzdGVyIERPUnggICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQUNfQ1JfQ0gxX0JJVE9GRlNFVCAgICAgICAgICAgMFUgICAgLyogUG9zaXRpb24gb2YgY2hhbm5lbCBiaXRzIGludG8gcmVnaXN0ZXJzIENSLCBNQ1IsIENDUiwgU0hIUiwgU0hSUiBvZiBjaGFubmVsIDEgKi8KKyNkZWZpbmUgREFDX0NSX0NIMl9CSVRPRkZTRVQgICAgICAgICAgIDE2VSAgIC8qIFBvc2l0aW9uIG9mIGNoYW5uZWwgYml0cyBpbnRvIHJlZ2lzdGVycyBDUiwgTUNSLCBDQ1IsIFNISFIsIFNIUlIgb2YgY2hhbm5lbCAyICovCisjZGVmaW5lIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0sgICAgICAoREFDX0NSX0NIMV9CSVRPRkZTRVQgfCBEQUNfQ1JfQ0gyX0JJVE9GRlNFVCkKKworI2RlZmluZSBEQUNfU1dUUl9DSDEgICAgICAgICAgICAgICAgICAgKERBQ19TV1RSSUdSX1NXVFJJRzEpIC8qIENoYW5uZWwgYml0IGludG8gcmVnaXN0ZXIgU1dUUklHUiBvZiBjaGFubmVsIDEuIFRoaXMgYml0IGlzIGludG8gYXJlYSBvZiBMTF9EQUNfQ1JfQ0h4X0JJVE9GRlNFVCBidXQgZXhjbHVkZWQgYnkgbWFzayBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLIChkb25lIHRvIGJlIGVuYWJsZSB0byB0cmlnIFNXIHN0YXJ0IG9mIGJvdGggREFDIGNoYW5uZWxzIHNpbXVsdGFuZW91c2x5KS4gKi8KKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorI2RlZmluZSBEQUNfU1dUUl9DSDIgICAgICAgICAgICAgICAgICAgKERBQ19TV1RSSUdSX1NXVFJJRzIpIC8qIENoYW5uZWwgYml0IGludG8gcmVnaXN0ZXIgU1dUUklHUiBvZiBjaGFubmVsIDIuIFRoaXMgYml0IGlzIGludG8gYXJlYSBvZiBMTF9EQUNfQ1JfQ0h4X0JJVE9GRlNFVCBidXQgZXhjbHVkZWQgYnkgbWFzayBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLIChkb25lIHRvIGJlIGVuYWJsZSB0byB0cmlnIFNXIHN0YXJ0IG9mIGJvdGggREFDIGNoYW5uZWxzIHNpbXVsdGFuZW91c2x5KS4gKi8KKyNkZWZpbmUgREFDX1NXVFJfQ0hYX01BU0sgICAgICAgICAgICAgIChEQUNfU1dUUl9DSDEgfCBEQUNfU1dUUl9DSDIpCisjZWxzZQorI2RlZmluZSBEQUNfU1dUUl9DSFhfTUFTSyAgICAgICAgICAgICAgKERBQ19TV1RSX0NIMSkKKyNlbmRpZiAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworCisjZGVmaW5lIERBQ19SRUdfREhSMTJSMV9SRUdPRkZTRVQgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBESFIxMlJ4IGNoYW5uZWwgMSB0YWtlbiBhcyByZWZlcmVuY2UgKi8KKyNkZWZpbmUgREFDX1JFR19ESFIxMkwxX1JFR09GRlNFVCAgICAgIDB4MDAxMDAwMDBVICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIG9mZnNldCBvZiBESFIxMkx4IGNoYW5uZWwgMSB2ZXJzdXMgREhSMTJSeCBjaGFubmVsIDEgKHNoaWZ0ZWQgbGVmdCBvZiAyMCBiaXRzKSAqLworI2RlZmluZSBEQUNfUkVHX0RIUjhSMV9SRUdPRkZTRVQgICAgICAgMHgwMjAwMDAwMFUgICAgICAgICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0IG9mIERIUjhSeCAgY2hhbm5lbCAxIHZlcnN1cyBESFIxMlJ4IGNoYW5uZWwgMSAoc2hpZnRlZCBsZWZ0IG9mIDI0IGJpdHMpICovCisjaWYgZGVmaW5lZChEQUNfQ0hBTk5FTDJfU1VQUE9SVCkKKyNkZWZpbmUgREFDX1JFR19ESFIxMlIyX1JFR09GRlNFVCAgICAgIDB4MDAwMzAwMDBVICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIG9mZnNldCBvZiBESFIxMlJ4IGNoYW5uZWwgMiB2ZXJzdXMgREhSMTJSeCBjaGFubmVsIDEgKHNoaWZ0ZWQgbGVmdCBvZiAxNiBiaXRzKSAqLworI2RlZmluZSBEQUNfUkVHX0RIUjEyTDJfUkVHT0ZGU0VUICAgICAgMHgwMDQwMDAwMFUgICAgICAgICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0IG9mIERIUjEyTHggY2hhbm5lbCAyIHZlcnN1cyBESFIxMlJ4IGNoYW5uZWwgMSAoc2hpZnRlZCBsZWZ0IG9mIDIwIGJpdHMpICovCisjZGVmaW5lIERBQ19SRUdfREhSOFIyX1JFR09GRlNFVCAgICAgICAweDA1MDAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBvZmZzZXQgb2YgREhSOFJ4ICBjaGFubmVsIDIgdmVyc3VzIERIUjEyUnggY2hhbm5lbCAxIChzaGlmdGVkIGxlZnQgb2YgMjQgYml0cykgKi8KKyNlbmRpZiAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworI2RlZmluZSBEQUNfUkVHX0RIUjEyUlhfUkVHT0ZGU0VUX01BU0sgMHgwMDBGMDAwMFUKKyNkZWZpbmUgREFDX1JFR19ESFIxMkxYX1JFR09GRlNFVF9NQVNLIDB4MDBGMDAwMDBVCisjZGVmaW5lIERBQ19SRUdfREhSOFJYX1JFR09GRlNFVF9NQVNLICAweDBGMDAwMDAwVQorI2RlZmluZSBEQUNfUkVHX0RIUlhfUkVHT0ZGU0VUX01BU0sgICAgKERBQ19SRUdfREhSMTJSWF9SRUdPRkZTRVRfTUFTSyB8IERBQ19SRUdfREhSMTJMWF9SRUdPRkZTRVRfTUFTSyB8IERBQ19SRUdfREhSOFJYX1JFR09GRlNFVF9NQVNLKQorCisjZGVmaW5lIERBQ19SRUdfRE9SMV9SRUdPRkZTRVQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBET1J4IGNoYW5uZWwgMSB0YWtlbiBhcyByZWZlcmVuY2UgKi8KKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorI2RlZmluZSBEQUNfUkVHX0RPUjJfUkVHT0ZGU0VUICAgICAgICAgMHgxMDAwMDAwMFUgICAgICAgICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0IG9mIERPUnggY2hhbm5lbCAxIHZlcnN1cyBET1J4IGNoYW5uZWwgMiAoc2hpZnRlZCBsZWZ0IG9mIDI4IGJpdHMpICovCisjZGVmaW5lIERBQ19SRUdfRE9SWF9SRUdPRkZTRVRfTUFTSyAgICAoREFDX1JFR19ET1IxX1JFR09GRlNFVCB8IERBQ19SRUdfRE9SMl9SRUdPRkZTRVQpCisjZWxzZQorI2RlZmluZSBEQUNfUkVHX0RPUlhfUkVHT0ZGU0VUX01BU0sgICAgKERBQ19SRUdfRE9SMV9SRUdPRkZTRVQpCisjZW5kaWYgLyogREFDX0NIQU5ORUwyX1NVUFBPUlQgKi8KKworI2RlZmluZSBEQUNfUkVHX1JFR09GRlNFVF9NQVNLX1BPU0JJVDAgICAgICAgICAgICAgMHgwMDAwMDAwRlUgIC8qIE1hc2sgb2YgcmVnaXN0ZXJzIG9mZnNldCAoREhSMTJSeCwgREhSMTJMeCwgREhSOFJ4LCBET1J4LCAuLi4pIHdoZW4gc2hpZnRlZCB0byBwb3NpdGlvbiAwICovCisKKyNkZWZpbmUgREFDX1JFR19ESFIxMlJYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TICAgICAgICAgICAxNlUgICAvKiBQb3NpdGlvbiBvZiBiaXRzIHJlZ2lzdGVyIG9mZnNldCBvZiBESFIxMlJ4IGNoYW5uZWwgMSBvciAyIHZlcnN1cyBESFIxMlJ4IGNoYW5uZWwgMSAoc2hpZnRlZCBsZWZ0IG9mIDE2IGJpdHMpICovCisjZGVmaW5lIERBQ19SRUdfREhSMTJMWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUyAgICAgICAgICAgMjBVICAgLyogUG9zaXRpb24gb2YgYml0cyByZWdpc3RlciBvZmZzZXQgb2YgREhSMTJMeCBjaGFubmVsIDEgb3IgMiB2ZXJzdXMgREhSMTJSeCBjaGFubmVsIDEgKHNoaWZ0ZWQgbGVmdCBvZiAyMCBiaXRzKSAqLworI2RlZmluZSBEQUNfUkVHX0RIUjhSWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUyAgICAgICAgICAgIDI0VSAgIC8qIFBvc2l0aW9uIG9mIGJpdHMgcmVnaXN0ZXIgb2Zmc2V0IG9mIERIUjhSeCAgY2hhbm5lbCAxIG9yIDIgdmVyc3VzIERIUjEyUnggY2hhbm5lbCAxIChzaGlmdGVkIGxlZnQgb2YgMjQgYml0cykgKi8KKyNkZWZpbmUgREFDX1JFR19ET1JYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgICAyOFUgICAvKiBQb3NpdGlvbiBvZiBiaXRzIHJlZ2lzdGVyIG9mZnNldCBvZiBET1J4IGNoYW5uZWwgMSBvciAyIHZlcnN1cyBET1J4IGNoYW5uZWwgMSAoc2hpZnRlZCBsZWZ0IG9mIDI4IGJpdHMpICovCisKKy8qIERBQyByZWdpc3RlcnMgYml0cyBwb3NpdGlvbnMgKi8KKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorI2RlZmluZSBEQUNfREhSMTJSRF9EQUNDMkRIUl9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgICAgIDE2VSAgLyogVmFsdWUgZXF1aXZhbGVudCB0byBQT1NJVElPTl9WQUwoREFDX0RIUjEyUkRfREFDQzJESFIpICovCisjZGVmaW5lIERBQ19ESFIxMkxEX0RBQ0MyREhSX0JJVE9GRlNFVF9QT1MgICAgICAgICAgICAgICAgMjBVICAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChEQUNfREhSMTJMRF9EQUNDMkRIUikgKi8KKyNkZWZpbmUgREFDX0RIUjhSRF9EQUNDMkRIUl9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgICAgICAgOFUgIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKERBQ19ESFI4UkRfREFDQzJESFIpICovCisjZW5kaWYgLyogREFDX0NIQU5ORUwyX1NVUFBPUlQgKi8KKworLyogTWlzY2VsbGFuZW91cyBkYXRhICovCisjZGVmaW5lIERBQ19ESUdJVEFMX1NDQUxFXzEyQklUUyAgICAgICAgICAgICAgICAgICAgICAgIDQwOTVVICAvKiBGdWxsLXNjYWxlIGRpZ2l0YWwgdmFsdWUgd2l0aCBhIHJlc29sdXRpb24gb2YgMTIgYml0cyAodm9sdGFnZSByYW5nZSBkZXRlcm1pbmVkIGJ5IGFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZXMgVnJlZisgYW5kIFZyZWYtLCByZWZlciB0byByZWZlcmVuY2UgbWFudWFsKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERBQ19MTF9Qcml2YXRlX01hY3JvcyBEQUMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERyaXZlciBtYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlOiBzZXQgYSBwb2ludGVyIHRvCisgICogICAgICAgICBhIHJlZ2lzdGVyIGZyb20gYSByZWdpc3RlciBiYXNpcyBmcm9tIHdoaWNoIGFuIG9mZnNldAorICAqICAgICAgICAgaXMgYXBwbGllZC4KKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgYmFzaXMgZnJvbSB3aGljaCB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQuCisgICogQHBhcmFtICBfX1JFR19PRkZGU0VUX18gT2Zmc2V0IHRvIGJlIGFwcGxpZWQgKHVuaXQ6IG51bWJlciBvZiByZWdpc3RlcnMpLgorICAqIEByZXR2YWwgUG9pbnRlciB0byByZWdpc3RlciBhZGRyZXNzCisqLworI2RlZmluZSBfX0RBQ19QVFJfUkVHX09GRlNFVChfX1JFR19fLCBfX1JFR19PRkZGU0VUX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAoKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSAoKHVpbnQzMl90KSgmKF9fUkVHX18pKSArICgoX19SRUdfT0ZGRlNFVF9fKSA8PCAyVSkpKSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBEQUNfTExfRVNfSU5JVCBEQUMgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgREFDIGluc3RhbmNlLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVHJpZ2dlclNvdXJjZTsgICAgICAgICAgICAgICAvKiE8IFNldCB0aGUgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOiBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGZyb20gZXh0ZXJuYWwgSVAgKHRpbWVyIGV2ZW50LCBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19MTF9FQ19UUklHR0VSX1NPVVJDRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRUcmlnZ2VyU291cmNlKCkuICovCisKKyAgdWludDMyX3QgV2F2ZUF1dG9HZW5lcmF0aW9uOyAgICAgICAgICAvKiE8IFNldCB0aGUgd2F2ZWZvcm0gYXV0b21hdGljIGdlbmVyYXRpb24gbW9kZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfTExfRUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRXYXZlQXV0b0dlbmVyYXRpb24oKS4gKi8KKworICB1aW50MzJfdCBXYXZlQXV0b0dlbmVyYXRpb25Db25maWc7ICAgIC8qITwgU2V0IHRoZSB3YXZlZm9ybSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB3YXZlZm9ybSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBtb2RlIGlzIHNldCB0byBub2lzZSwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfTExfRUNfV0FWRV9OT0lTRV9MRlNSX1VOTUFTS19CSVRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB3YXZlZm9ybSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBtb2RlIGlzIHNldCB0byB0cmlhbmdsZSwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfTExfRUNfV0FWRV9UUklBTkdMRV9BTVBMSVRVREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIElmIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUgaXMgZGlzYWJsZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9EQUNfU2V0V2F2ZU5vaXNlTEZTUigpIG9yIEByZWYgTExfREFDX1NldFdhdmVUcmlhbmdsZUFtcGxpdHVkZSgpLCBkZXBlbmRpbmcgb24gdGhlIHdhdmUgYXV0b21hdGljIGdlbmVyYXRpb24gc2VsZWN0ZWQuICovCisKKyAgdWludDMyX3QgT3V0cHV0QnVmZmVyOyAgICAgICAgICAgICAgICAvKiE8IFNldCB0aGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfTExfRUNfT1VUUFVUX0JVRkZFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRPdXRwdXRCdWZmZXIoKS4gKi8KKworfSBMTF9EQUNfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERBQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgREFDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX0dFVF9GTEFHIERBQyBmbGFncworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfREFDX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworLyogREFDIGNoYW5uZWwgMSBmbGFncyAqLworI2RlZmluZSBMTF9EQUNfRkxBR19ETUFVRFIxICAgICAgICAgICAgICAgIChEQUNfU1JfRE1BVURSMSkgICAvKiE8IERBQyBjaGFubmVsIDEgZmxhZyBETUEgdW5kZXJydW4gKi8KKworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisvKiBEQUMgY2hhbm5lbCAyIGZsYWdzICovCisjZGVmaW5lIExMX0RBQ19GTEFHX0RNQVVEUjIgICAgICAgICAgICAgICAgKERBQ19TUl9ETUFVRFIyKSAgIC8qITwgREFDIGNoYW5uZWwgMiBmbGFnIERNQSB1bmRlcnJ1biAqLworI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19JVCBEQUMgaW50ZXJydXB0aW9ucworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfREFDX1JlYWRSZWcgYW5kICBMTF9EQUNfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX0lUX0RNQVVEUklFMSAgICAgICAgICAgICAgICAoREFDX0NSX0RNQVVEUklFMSkgLyohPCBEQUMgY2hhbm5lbCAxIGludGVycnVwdGlvbiBETUEgdW5kZXJydW4gKi8KKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorI2RlZmluZSBMTF9EQUNfSVRfRE1BVURSSUUyICAgICAgICAgICAgICAgIChEQUNfQ1JfRE1BVURSSUUyKSAvKiE8IERBQyBjaGFubmVsIDIgaW50ZXJydXB0aW9uIERNQSB1bmRlcnJ1biAqLworI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19DSEFOTkVMIERBQyBjaGFubmVscworICAqIEB7CisgICovCisjZGVmaW5lIExMX0RBQ19DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgKERBQ19SRUdfRE9SMV9SRUdPRkZTRVQgfCBEQUNfUkVHX0RIUjEyUjFfUkVHT0ZGU0VUIHwgREFDX1JFR19ESFIxMkwxX1JFR09GRlNFVCB8IERBQ19SRUdfREhSOFIxX1JFR09GRlNFVCB8IERBQ19DUl9DSDFfQklUT0ZGU0VUIHwgREFDX1NXVFJfQ0gxKSAvKiE8IERBQyBjaGFubmVsIDEgKi8KKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorI2RlZmluZSBMTF9EQUNfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgIChEQUNfUkVHX0RPUjJfUkVHT0ZGU0VUIHwgREFDX1JFR19ESFIxMlIyX1JFR09GRlNFVCB8IERBQ19SRUdfREhSMTJMMl9SRUdPRkZTRVQgfCBEQUNfUkVHX0RIUjhSMl9SRUdPRkZTRVQgfCBEQUNfQ1JfQ0gyX0JJVE9GRlNFVCB8IERBQ19TV1RSX0NIMikgLyohPCBEQUMgY2hhbm5lbCAyICovCisjZW5kaWYgLyogREFDX0NIQU5ORUwyX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX1RSSUdHRVJfU09VUkNFIERBQyB0cmlnZ2VyIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RBQ19UUklHX1NPRlRXQVJFICAgICAgICAgICAgICAgKERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVFNFTDFfMCkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgaW50ZXJuYWwgKFNXIHN0YXJ0KSAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgIChEQUNfQ1JfVFNFTDFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTIgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0zIFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU0zX0NIMyAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzEgICAgICAgICAgICAgICAgICkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNMyBDSDMgZXZlbnQuICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU02X1RSR08gICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBJUDogVElNNiBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNN19UUkdPICAgICAgICAgIChEQUNfQ1JfVFNFTDFfMiAgICAgICAgICAgICAgICAgIHwgREFDX0NSX1RTRUwxXzApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IFRJTTcgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTIxX1RSR08gICAgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIElQOiBUSU0yMSBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfRVhUSV9MSU5FOSAgICAgICAgIChEQUNfQ1JfVFNFTDFfMiB8IERBQ19DUl9UU0VMMV8xICAgICAgICAgICAgICAgICApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgSVA6IGV4dGVybmFsIGludGVycnVwdCBsaW5lIDkuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19XQVZFX0FVVE9fR0VORVJBVElPTl9NT0RFIERBQyB3YXZlZm9ybSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PTkUgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgd2F2ZSBhdXRvIGdlbmVyYXRpb24gbW9kZSBkaXNhYmxlZC4gKi8KKyNkZWZpbmUgTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PSVNFICAgIChEQUNfQ1JfV0FWRTFfMCkgICAgICAgIC8qITwgREFDIGNoYW5uZWwgd2F2ZSBhdXRvIGdlbmVyYXRpb24gbW9kZSBlbmFibGVkLCBzZXQgZ2VuZXJhdGVkIG5vaXNlIHdhdmVmb3JtLiAqLworI2RlZmluZSBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fVFJJQU5HTEUgKERBQ19DUl9XQVZFMV8xKSAgICAgICAgLyohPCBEQUMgY2hhbm5lbCB3YXZlIGF1dG8gZ2VuZXJhdGlvbiBtb2RlIGVuYWJsZWQsIHNldCBnZW5lcmF0ZWQgdHJpYW5nbGUgd2F2ZWZvcm0uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19XQVZFX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMgREFDIHdhdmUgZ2VuZXJhdGlvbiAtIE5vaXNlIExGU1IgdW5tYXNrIGJpdHMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUMCAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdDAsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxXzAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzE6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMyXzAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8xICAgICAgICAgICAgICAgICApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzI6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMzXzAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8xIHwgREFDX0NSX01BTVAxXzApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzM6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM0XzAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzQ6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM1XzAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMiAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzU6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM2XzAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMiB8IERBQ19DUl9NQU1QMV8xICAgICAgICAgICAgICAgICApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzY6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM3XzAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMiB8IERBQ19DUl9NQU1QMV8xIHwgREFDX0NSX01BTVAxXzApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzc6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM4XzAgICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzg6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM5XzAgICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzk6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxMF8wICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8xICAgICAgICAgICAgICAgICApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzEwOjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTFfMCAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0c1sxMTowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfV0FWRV9UUklBTkdMRV9BTVBMSVRVREUgREFDIHdhdmUgZ2VuZXJhdGlvbiAtIFRyaWFuZ2xlIGFtcGxpdHVkZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDEgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgMyBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzcgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzEgICAgICAgICAgICAgICAgICkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiA3IExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMTUgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDE1IExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMzEgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDMxIExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNjMgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDYzIExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMTI3ICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDEyNyBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzI1NSAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiAyNTUgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV81MTEgICAgICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgNTEyIExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMTAyMyAgICAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDEwMjMgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yMDQ3ICAgICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8xICAgICAgICAgICAgICAgICApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgMjA0NyBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzQwOTUgICAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiA0MDk1IExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19PVVRQVVRfQlVGRkVSIERBQyBjaGFubmVsIG91dHB1dCBidWZmZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQUNfT1VUUFVUX0JVRkZFUl9FTkFCTEUgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIG91dHB1dCBpcyBidWZmZXJlZDogaGlnaGVyIGRyaXZlIGN1cnJlbnQgY2FwYWJpbGl0eSwgYnV0IGFsc28gaGlnaGVyIGN1cnJlbnQgY29uc3VtcHRpb24gKi8KKyNkZWZpbmUgTExfREFDX09VVFBVVF9CVUZGRVJfRElTQUJMRSAgICAgICAoREFDX0NSX0JPRkYxKSAgICAgICAgICAvKiE8IFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBvdXRwdXQgaXMgbm90IGJ1ZmZlcmVkOiBsb3dlciBkcml2ZSBjdXJyZW50IGNhcGFiaWxpdHksIGJ1dCBhbHNvIGxvd2VyIGN1cnJlbnQgY29uc3VtcHRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfUkVTT0xVVElPTiAgREFDIGNoYW5uZWwgb3V0cHV0IHJlc29sdXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQUNfUkVTT0xVVElPTl8xMkIgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgcmVzb2x1dGlvbiAxMiBiaXRzICovCisjZGVmaW5lIExMX0RBQ19SRVNPTFVUSU9OXzhCICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUgICAgICAgICAgICAgLyohPCBEQUMgY2hhbm5lbCByZXNvbHV0aW9uIDggYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfUkVHSVNURVJTICBEQUMgcmVnaXN0ZXJzIGNvbXBsaWFudCB3aXRoIHNwZWNpZmljIHB1cnBvc2UKKyAgKiBAeworICAqLworLyogTGlzdCBvZiBEQUMgcmVnaXN0ZXJzIGludGVuZGVkIHRvIGJlIHVzZWQgKG1vc3QgY29tbW9ubHkpIHdpdGggICAgICAgICAgICAgKi8KKy8qIERNQSB0cmFuc2Zlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0RBQ19ETUFfR2V0UmVnQWRkcigpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9EQUNfRE1BX1JFR19EQVRBXzEyQklUU19SSUdIVF9BTElHTkVEICBEQUNfUkVHX0RIUjEyUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MgLyohPCBEQUMgY2hhbm5lbCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgMTIgYml0cyByaWdodCBhbGlnbmVkICovCisjZGVmaW5lIExMX0RBQ19ETUFfUkVHX0RBVEFfMTJCSVRTX0xFRlRfQUxJR05FRCAgIERBQ19SRUdfREhSMTJMWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUyAvKiE8IERBQyBjaGFubmVsIGRhdGEgaG9sZGluZyByZWdpc3RlciAxMiBiaXRzIGxlZnQgYWxpZ25lZCAqLworI2RlZmluZSBMTF9EQUNfRE1BX1JFR19EQVRBXzhCSVRTX1JJR0hUX0FMSUdORUQgICBEQUNfUkVHX0RIUjhSWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUyAgLyohPCBEQUMgY2hhbm5lbCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgOCBiaXRzIHJpZ2h0IGFsaWduZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX0hXX0RFTEFZUyAgRGVmaW5pdGlvbnMgb2YgREFDIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cworICAqIEBub3RlICAgT25seSBEQUMgSVAgSFcgZGVsYXlzIGFyZSBkZWZpbmVkIGluIERBQyBMTCBkcml2ZXIgZHJpdmVyLAorICAqICAgICAgICAgbm90IHRpbWVvdXQgdmFsdWVzLgorICAqICAgICAgICAgRm9yIGRldGFpbHMgb24gZGVsYXlzIHZhbHVlcywgcmVmZXIgdG8gZGVzY3JpcHRpb25zIGluIHNvdXJjZSBjb2RlCisgICogICAgICAgICBhYm92ZSBlYWNoIGxpdGVyYWwgZGVmaW5pdGlvbi4KKyAgKiBAeworICAqLworCisvKiBEZWxheSBmb3IgREFDIGNoYW5uZWwgdm9sdGFnZSBzZXR0bGluZyB0aW1lIGZyb20gREFDIGNoYW5uZWwgc3RhcnR1cCAgICAgICAqLworLyogKHRyYW5zaXRpb24gZnJvbSBkaXNhYmxlIHRvIGVuYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IERBQyBjaGFubmVsIHN0YXJ0dXAgdGltZSBkZXBlbmRzIG9uIGJvYXJkIGFwcGxpY2F0aW9uIGVudmlyb25tZW50OiAgICovCisvKiAgICAgICBpbXBlZGFuY2UgY29ubmVjdGVkIHRvIERBQyBjaGFubmVsIG91dHB1dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVGhlIGRlbGF5IGJlbG93IGlzIHNwZWNpZmllZCB1bmRlciBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIHZvbHRhZ2UgbWF4aW11bSB0cmFuc2l0aW9uIChsb3dlc3QgdG8gaGlnaGVzdCB2YWx1ZSkgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSB1bnRpbCB2b2x0YWdlIHJlYWNoZXMgZmluYWwgdmFsdWUgKy0xTFNCICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gREFDIGNoYW5uZWwgb3V0cHV0IGJ1ZmZlciBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIGxvYWQgaW1wZWRhbmNlIG9mIDVrT2htIChtaW4pLCA1MHBGIChtYXgpICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0V0FLRVVQIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RBQ19ERUxBWV9TVEFSVFVQX1ZPTFRBR0VfU0VUVExJTkdfVVMgICAgICAgICAgICAgMTVVICAvKiE8IERlbGF5IGZvciBEQUMgY2hhbm5lbCB2b2x0YWdlIHNldHRsaW5nIHRpbWUgZnJvbSBEQUMgY2hhbm5lbCBzdGFydHVwICh0cmFuc2l0aW9uIGZyb20gZGlzYWJsZSB0byBlbmFibGUpICovCisKKy8qIERlbGF5IGZvciBEQUMgY2hhbm5lbCB2b2x0YWdlIHNldHRsaW5nIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBEQUMgY2hhbm5lbCBzdGFydHVwIHRpbWUgZGVwZW5kcyBvbiBib2FyZCBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudDogICAqLworLyogICAgICAgaW1wZWRhbmNlIGNvbm5lY3RlZCB0byBEQUMgY2hhbm5lbCBvdXRwdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFRoZSBkZWxheSBiZWxvdyBpcyBzcGVjaWZpZWQgdW5kZXIgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSB2b2x0YWdlIG1heGltdW0gdHJhbnNpdGlvbiAobG93ZXN0IHRvIGhpZ2hlc3QgdmFsdWUpICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gdW50aWwgdm9sdGFnZSByZWFjaGVzIGZpbmFsIHZhbHVlICstMUxTQiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIERBQyBjaGFubmVsIG91dHB1dCBidWZmZXIgZW5hYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBsb2FkIGltcGVkYW5jZSBvZiA1a09obSBtaW4sIDUwcEYgbWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidFNFVFRMSU5HIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9EQUNfREVMQVlfVk9MVEFHRV9TRVRUTElOR19VUyAgICAgICAgICAgICAgICAgICAgMTJVICAvKiE8IERlbGF5IGZvciBEQUMgY2hhbm5lbCB2b2x0YWdlIHNldHRsaW5nIHRpbWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERBQ19MTF9FeHBvcnRlZF9NYWNyb3MgREFDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIHdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBtYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gREFDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gREFDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9EQUNfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBEQUMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBEQUMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfREFDX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VNX0hFTFBFUl9NQUNSTyBEQUMgaGVscGVyIG1hY3JvCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IERBQyBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdAorICAqICAgICAgICAgZnJvbSBsaXRlcmFscyBMTF9EQUNfQ0hBTk5FTF94LgorICAqICAgICAgICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgIF9fTExfREFDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihMTF9EQUNfQ0hBTk5FTF8xKQorICAqICAgICAgICAgICAgd2lsbCByZXR1cm4gZGVjaW1hbCBudW1iZXIgIjEiLgorICAqIEBub3RlICAgVGhlIGlucHV0IGNhbiBiZSBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbAorICAqICAgICAgICAgbnVtYmVyIGlzIHJldHVybmVkLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIDEuLi4yICh2YWx1ZSAiMiIgZGVwZW5kaW5nIG9uIERBQyBjaGFubmVsIDIgYXZhaWxhYmlsaXR5KQorICAqLworI2RlZmluZSBfX0xMX0RBQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX0NIQU5ORUxfXykgJiBEQUNfU1dUUl9DSFhfTUFTSykKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IERBQyBjaGFubmVsIGluIGxpdGVyYWwgZm9ybWF0IExMX0RBQ19DSEFOTkVMX3gKKyAgKiAgICAgICAgIGZyb20gbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0LgorICAqICAgICAgICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgX19MTF9EQUNfREVDSU1BTF9OQl9UT19DSEFOTkVMKDEpCisgICogICAgICAgICAgIHdpbGwgcmV0dXJuIGEgZGF0YSBlcXVpdmFsZW50IHRvICJMTF9EQUNfQ0hBTk5FTF8xIi4KKyAgKiBAbm90ZSAgSWYgdGhlIGlucHV0IHBhcmFtZXRlciBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgREFDIGNoYW5uZWwsCisgICogICAgICAgIHRoaXMgbWFjcm8gcmV0dXJucyB2YWx1ZSAnMCcuCisgICogQHBhcmFtICBfX0RFQ0lNQUxfTkJfXyAxLi4uMiAodmFsdWUgIjIiIGRlcGVuZGluZyBvbiBEQUMgY2hhbm5lbCAyIGF2YWlsYWJpbGl0eSkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICovCisjaWYgZGVmaW5lZChEQUNfQ0hBTk5FTDJfU1VQUE9SVCkKKyNkZWZpbmUgX19MTF9EQUNfREVDSU1BTF9OQl9UT19DSEFOTkVMKF9fREVDSU1BTF9OQl9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fREVDSU1BTF9OQl9fKSA9PSAxVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgTExfREFDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKChfX0RFQ0lNQUxfTkJfXykgPT0gMlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIExMX0RBQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZWxzZQorI2RlZmluZSBfX0xMX0RBQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoX19ERUNJTUFMX05CX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19ERUNJTUFMX05CX18pID09IDFVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBMTF9EQUNfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VuZGlmICAvKiBEQUNfQ0hBTk5FTDJfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZWZpbmUgdGhlIERBQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBkaWdpdGFsCisgICogICAgICAgICB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3RlZCBEQUMgcmVzb2x1dGlvbi4KKyAgKiBAbm90ZSAgIERBQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBjb3JyZXNwb25kcyB0byB2b2x0YWdlIHJhbmdlCisgICogICAgICAgICBkZXRlcm1pbmVkIGJ5IGFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZXMgVnJlZisgYW5kIFZyZWYtCisgICogICAgICAgICAocmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCkuCisgICogQHBhcmFtICBfX0RBQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfUkVTT0xVVElPTl84QgorICAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBlcXVpdmFsZW50IHZvbHRhZ2UgdmFsdWUgKHVuaXQ6IG1Wb2x0KQorICAqLworI2RlZmluZSBfX0xMX0RBQ19ESUdJVEFMX1NDQUxFKF9fREFDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgweDAwMDAwRkZGVSkgPj4gKChfX0RBQ19SRVNPTFVUSU9OX18pIDw8IDFVKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBEQUMgY29udmVyc2lvbiBkYXRhICh1bml0OiBkaWdpdGFsCisgICogICAgICAgICB2YWx1ZSkgY29ycmVzcG9uZGluZyB0byBhIHZvbHRhZ2UgKHVuaXQ6IG1Wb2x0KS4KKyAgKiBAbm90ZSAgIFRoaXMgaGVscGVyIG1hY3JvIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgaW5wdXQgZGF0YSBpbiB2b2x0YWdlCisgICogICAgICAgICByYXRoZXIgdGhhbiBkaWdpdGFsIHZhbHVlLAorICAqICAgICAgICAgdG8gYmUgdXNlZCB3aXRoIExMIERBQyBmdW5jdGlvbnMgc3VjaCBhcworICAqICAgICAgICAgQHJlZiBMTF9EQUNfQ29udmVydERhdGExMlJpZ2h0QWxpZ25lZCgpLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fREFDX1ZPTFRBR0VfXyBWb2x0YWdlIHRvIGJlIGdlbmVyYXRlZCBieSBEQUMgY2hhbm5lbAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBtVm9sdCkuCisgICogQHBhcmFtICBfX0RBQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfUkVTT0xVVElPTl84QgorICAqIEByZXR2YWwgREFDIGNvbnZlcnNpb24gZGF0YSAodW5pdDogZGlnaXRhbCB2YWx1ZSkKKyAgKi8KKyNkZWZpbmUgX19MTF9EQUNfQ0FMQ19WT0xUQUdFX1RPX0RBVEEoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fREFDX1ZPTFRBR0VfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fREFDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fREFDX1ZPTFRBR0VfXykgKiBfX0xMX0RBQ19ESUdJVEFMX1NDQUxFKF9fREFDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgIFwKKyAgIC8gKF9fVlJFRkFOQUxPR19WT0xUQUdFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIERBQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBEQUNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uIG9mIERBQyBjaGFubmVscworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQG5vdGUgICBGb3IgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSB0byBiZSBlZmZlY3RpdmUsIERBQyB0cmlnZ2VyCisgICogICAgICAgICBtdXN0IGJlIGVuYWJsZWQgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9EQUNfRW5hYmxlVHJpZ2dlcigpLgorICAqIEBub3RlICAgVG8gc2V0IGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UsIERBQyBjaGFubmVsIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBPdGhlcndpc2UsIHRoZSBzZXR0aW5nIGlzIGRpc2NhcmRlZC4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENSICAgICAgIFRTRUwxICAgICAgICAgIExMX0RBQ19TZXRUcmlnZ2VyU291cmNlXG4KKyAgKiAgICAgICAgIENSICAgICAgIFRTRUwyICAgICAgICAgIExMX0RBQ19TZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcGFyYW0gIFRyaWdnZXJTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19TT0ZUV0FSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU0yX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNM19UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTNfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTZfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU03X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNMjFfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9FWFRJX0xJTkU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfU2V0VHJpZ2dlclNvdXJjZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgREFDX0NSX1RTRUwxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIFRyaWdnZXJTb3VyY2UgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBub3RlICAgRm9yIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UgdG8gYmUgZWZmZWN0aXZlLCBEQUMgdHJpZ2dlcgorICAqICAgICAgICAgbXVzdCBiZSBlbmFibGVkIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfREFDX0VuYWJsZVRyaWdnZXIoKS4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENSICAgICAgIFRTRUwxICAgICAgICAgIExMX0RBQ19HZXRUcmlnZ2VyU291cmNlXG4KKyAgKiAgICAgICAgIENSICAgICAgIFRTRUwyICAgICAgICAgIExMX0RBQ19HZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfU09GVFdBUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU0zX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU02X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNN19UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTIxX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfRVhUSV9MSU5FOQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19HZXRUcmlnZ2VyU291cmNlKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREFDeC0+Q1IsIERBQ19DUl9UU0VMMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgPj4gKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgd2F2ZWZvcm0gYXV0b21hdGljIGdlbmVyYXRpb24gbW9kZQorICAqICAgICAgICAgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENSICAgICAgIFdBVkUxICAgICAgICAgIExMX0RBQ19TZXRXYXZlQXV0b0dlbmVyYXRpb25cbgorICAqICAgICAgICAgQ1IgICAgICAgV0FWRTIgICAgICAgICAgTExfREFDX1NldFdhdmVBdXRvR2VuZXJhdGlvbgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHBhcmFtICBXYXZlQXV0b0dlbmVyYXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT0lTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9UUklBTkdMRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX1NldFdhdmVBdXRvR2VuZXJhdGlvbihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IFdhdmVBdXRvR2VuZXJhdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhEQUN4LT5DUiwKKyAgICAgICAgICAgICBEQUNfQ1JfV0FWRTEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSyksCisgICAgICAgICAgICAgV2F2ZUF1dG9HZW5lcmF0aW9uIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUKKyAgKiAgICAgICAgIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHJtdG9sbCBDUiAgICAgICBXQVZFMSAgICAgICAgICBMTF9EQUNfR2V0V2F2ZUF1dG9HZW5lcmF0aW9uXG4KKyAgKiAgICAgICAgIENSICAgICAgIFdBVkUyICAgICAgICAgIExMX0RBQ19HZXRXYXZlQXV0b0dlbmVyYXRpb24KKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT0lTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9UUklBTkdMRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19HZXRXYXZlQXV0b0dlbmVyYXRpb24oREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQUN4LT5DUiwgREFDX0NSX1dBVkUxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKQorICAgICAgICAgICAgICAgICAgICA+PiAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBub2lzZSB3YXZlZm9ybSBnZW5lcmF0aW9uIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWw6CisgICogICAgICAgICBOb2lzZSBtb2RlIGFuZCBwYXJhbWV0ZXJzIExGU1IgKGxpbmVhciBmZWVkYmFjayBzaGlmdCByZWdpc3RlcikuCisgICogQG5vdGUgICBGb3Igd2F2ZSBnZW5lcmF0aW9uIHRvIGJlIGVmZmVjdGl2ZSwgREFDIGNoYW5uZWwKKyAgKiAgICAgICAgIHdhdmUgZ2VuZXJhdGlvbiBtb2RlIG11c3QgYmUgZW5hYmxlZCB1c2luZworICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9EQUNfU2V0V2F2ZUF1dG9HZW5lcmF0aW9uKCkuCisgICogQG5vdGUgICBUaGlzIHNldHRpbmcgY2FuIGJlIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBpcyBkaXNhYmxlZAorICAqICAgICAgICAgKG90aGVyd2lzZSwgdGhlIHNldHRpbmcgb3BlcmF0aW9uIGlzIGlnbm9yZWQpLgorICAqIEBybXRvbGwgQ1IgICAgICAgTUFNUDEgICAgICAgICAgTExfREFDX1NldFdhdmVOb2lzZUxGU1JcbgorICAqICAgICAgICAgQ1IgICAgICAgTUFNUDIgICAgICAgICAgTExfREFDX1NldFdhdmVOb2lzZUxGU1IKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBwYXJhbSAgTm9pc2VMRlNSTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVQwCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzJfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTM18wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM0XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM3XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzhfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTOV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxMF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxMV8wCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfU2V0V2F2ZU5vaXNlTEZTUihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IE5vaXNlTEZTUk1hc2spCit7CisgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgREFDX0NSX01BTVAxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIE5vaXNlTEZTUk1hc2sgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgbm9pc2Ugd2F2ZWZvcm0gZ2VuZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOgorICAqICAgICAgICAgTm9pc2UgbW9kZSBhbmQgcGFyYW1ldGVycyBMRlNSIChsaW5lYXIgZmVlZGJhY2sgc2hpZnQgcmVnaXN0ZXIpLgorICAqIEBybXRvbGwgQ1IgICAgICAgTUFNUDEgICAgICAgICAgTExfREFDX0dldFdhdmVOb2lzZUxGU1JcbgorICAqICAgICAgICAgQ1IgICAgICAgTUFNUDIgICAgICAgICAgTExfREFDX0dldFdhdmVOb2lzZUxGU1IKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMyXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzNfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM1XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTN18wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM4XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzlfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTBfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTFfMAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19HZXRXYXZlTm9pc2VMRlNSKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREFDeC0+Q1IsIERBQ19DUl9NQU1QMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgPj4gKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdHJpYW5nbGUgd2F2ZWZvcm0gZ2VuZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOgorICAqICAgICAgICAgdHJpYW5nbGUgbW9kZSBhbmQgYW1wbGl0dWRlLgorICAqIEBub3RlICAgRm9yIHdhdmUgZ2VuZXJhdGlvbiB0byBiZSBlZmZlY3RpdmUsIERBQyBjaGFubmVsCisgICogICAgICAgICB3YXZlIGdlbmVyYXRpb24gbW9kZSBtdXN0IGJlIGVuYWJsZWQgdXNpbmcKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfREFDX1NldFdhdmVBdXRvR2VuZXJhdGlvbigpLgorICAqIEBub3RlICAgVGhpcyBzZXR0aW5nIGNhbiBiZSBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgaXMgZGlzYWJsZWQKKyAgKiAgICAgICAgIChvdGhlcndpc2UsIHRoZSBzZXR0aW5nIG9wZXJhdGlvbiBpcyBpZ25vcmVkKS4KKyAgKiBAcm10b2xsIENSICAgICAgIE1BTVAxICAgICAgICAgIExMX0RBQ19TZXRXYXZlVHJpYW5nbGVBbXBsaXR1ZGVcbgorICAqICAgICAgICAgQ1IgICAgICAgTUFNUDIgICAgICAgICAgTExfREFDX1NldFdhdmVUcmlhbmdsZUFtcGxpdHVkZQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHBhcmFtICBUcmlhbmdsZUFtcGxpdHVkZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV82MworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMTI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yNTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzUxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMTAyMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMjA0NworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNDA5NQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX1NldFdhdmVUcmlhbmdsZUFtcGxpdHVkZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IFRyaWFuZ2xlQW1wbGl0dWRlKQoreworICBNT0RJRllfUkVHKERBQ3gtPkNSLAorICAgICAgICAgICAgIERBQ19DUl9NQU1QMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSwKKyAgICAgICAgICAgICBUcmlhbmdsZUFtcGxpdHVkZSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0cmlhbmdsZSB3YXZlZm9ybSBnZW5lcmF0aW9uIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWw6CisgICogICAgICAgICB0cmlhbmdsZSBtb2RlIGFuZCBhbXBsaXR1ZGUuCisgICogQHJtdG9sbCBDUiAgICAgICBNQU1QMSAgICAgICAgICBMTF9EQUNfR2V0V2F2ZVRyaWFuZ2xlQW1wbGl0dWRlXG4KKyAgKiAgICAgICAgIENSICAgICAgIE1BTVAyICAgICAgICAgIExMX0RBQ19HZXRXYXZlVHJpYW5nbGVBbXBsaXR1ZGUKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEyNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMjU1CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV81MTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEwMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzIwNDcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzQwOTUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0V2F2ZVRyaWFuZ2xlQW1wbGl0dWRlKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREFDeC0+Q1IsIERBQ19DUl9NQU1QMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgPj4gKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBybXRvbGwgQ1IgICAgICAgQk9GRjEgICAgICAgICAgTExfREFDX1NldE91dHB1dEJ1ZmZlclxuCisgICogICAgICAgICBDUiAgICAgICBCT0ZGMiAgICAgICAgICBMTF9EQUNfU2V0T3V0cHV0QnVmZmVyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcGFyYW0gIE91dHB1dEJ1ZmZlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19PVVRQVVRfQlVGRkVSX0VOQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19PVVRQVVRfQlVGRkVSX0RJU0FCTEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19TZXRPdXRwdXRCdWZmZXIoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBPdXRwdXRCdWZmZXIpCit7CisgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgREFDX0NSX0JPRkYxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIE91dHB1dEJ1ZmZlciA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBvdXRwdXQgYnVmZmVyIHN0YXRlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHJtdG9sbCBDUiAgICAgICBCT0ZGMSAgICAgICAgICBMTF9EQUNfR2V0T3V0cHV0QnVmZmVyXG4KKyAgKiAgICAgICAgIENSICAgICAgIEJPRkYyICAgICAgICAgIExMX0RBQ19HZXRPdXRwdXRCdWZmZXIKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9ESVNBQkxFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0dldE91dHB1dEJ1ZmZlcihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERBQ3gtPkNSLCBEQUNfQ1JfQk9GRjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUZfRE1BX01hbmFnZW1lbnQgRE1BIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBEQUMgRE1BIHRyYW5zZmVyIHJlcXVlc3Qgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgRE1BIHNvdXJjZSBhZGRyZXNzIChwZXJpcGhlcmFsIGFkZHJlc3MpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfREFDX0RNQV9HZXRSZWdBZGRyKCkuCisgICogQHJtdG9sbCBDUiAgICAgICBETUFFTjEgICAgICAgICBMTF9EQUNfRW5hYmxlRE1BUmVxXG4KKyAgKiAgICAgICAgIENSICAgICAgIERNQUVOMiAgICAgICAgIExMX0RBQ19FbmFibGVETUFSZXEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0VuYWJsZURNQVJlcShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIFNFVF9CSVQoREFDeC0+Q1IsCisgICAgICAgICAgREFDX0NSX0RNQUVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBEQUMgRE1BIHRyYW5zZmVyIHJlcXVlc3Qgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgRE1BIHNvdXJjZSBhZGRyZXNzIChwZXJpcGhlcmFsIGFkZHJlc3MpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfREFDX0RNQV9HZXRSZWdBZGRyKCkuCisgICogQHJtdG9sbCBDUiAgICAgICBETUFFTjEgICAgICAgICBMTF9EQUNfRGlzYWJsZURNQVJlcVxuCisgICogICAgICAgICBDUiAgICAgICBETUFFTjIgICAgICAgICBMTF9EQUNfRGlzYWJsZURNQVJlcQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfRGlzYWJsZURNQVJlcShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIENMRUFSX0JJVChEQUN4LT5DUiwKKyAgICAgICAgICAgIERBQ19DUl9ETUFFTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBEQUMgRE1BIHRyYW5zZmVyIHJlcXVlc3Qgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogICAgICAgICAoMDogREFDIERNQSB0cmFuc2ZlciByZXF1ZXN0IGlzIGRpc2FibGVkLCAxOiBEQUMgRE1BIHRyYW5zZmVyIHJlcXVlc3QgaXMgZW5hYmxlZCkKKyAgKiBAcm10b2xsIENSICAgICAgIERNQUVOMSAgICAgICAgIExMX0RBQ19Jc0RNQVJlcUVuYWJsZWRcbgorICAqICAgICAgICAgQ1IgICAgICAgRE1BRU4yICAgICAgICAgTExfREFDX0lzRE1BUmVxRW5hYmxlZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0lzRE1BUmVxRW5hYmxlZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoREFDeC0+Q1IsCisgICAgICAgICAgICAgICAgICAgREFDX0NSX0RNQUVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICA9PSAoREFDX0NSX0RNQUVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZ1bmN0aW9uIHRvIGhlbHAgdG8gY29uZmlndXJlIERNQSB0cmFuc2ZlciB0byBEQUM6IHJldHJpZXZlIHRoZQorICAqICAgICAgICAgREFDIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbSBEQUMgaW5zdGFuY2UgYW5kIGEgbGlzdCBvZiBEQUMgcmVnaXN0ZXJzCisgICogICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIChtb3N0IGNvbW1vbmx5KSB3aXRoIERNQSB0cmFuc2Zlci4KKyAgKiBAbm90ZSAgIFRoZXNlIERBQyByZWdpc3RlcnMgYXJlIGRhdGEgaG9sZGluZyByZWdpc3RlcnM6CisgICogICAgICAgICB3aGVuIERBQyBjb252ZXJzaW9uIGlzIHJlcXVlc3RlZCwgREFDIGdlbmVyYXRlcyBhIERNQSB0cmFuc2ZlcgorICAqICAgICAgICAgcmVxdWVzdCB0byBoYXZlIGRhdGEgYXZhaWxhYmxlIGluIERBQyBkYXRhIGhvbGRpbmcgcmVnaXN0ZXJzLgorICAqIEBub3RlICAgVGhpcyBtYWNybyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggTEwgRE1BIGRyaXZlciwgcmVmZXIgdG8KKyAgKiAgICAgICAgIGZ1bmN0aW9uICJMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKCkiLgorICAqICAgICAgICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgTExfRE1BX0NvbmZpZ0FkZHJlc3NlcyhETUExLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9DSEFOTkVMXzEsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSY8IGFycmF5IG9yIHZhcmlhYmxlID4sCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfREFDX0RNQV9HZXRSZWdBZGRyKERBQzEsIExMX0RBQ19DSEFOTkVMXzEsIExMX0RBQ19ETUFfUkVHX0RBVEFfMTJCSVRTX1JJR0hUX0FMSUdORUQpLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCk7CisgICogQHJtdG9sbCBESFIxMlIxICBEQUNDMURIUiAgICAgICBMTF9EQUNfRE1BX0dldFJlZ0FkZHJcbgorICAqICAgICAgICAgREhSMTJMMSAgREFDQzFESFIgICAgICAgTExfREFDX0RNQV9HZXRSZWdBZGRyXG4KKyAgKiAgICAgICAgIERIUjhSMSAgIERBQ0MxREhSICAgICAgIExMX0RBQ19ETUFfR2V0UmVnQWRkclxuCisgICogICAgICAgICBESFIxMlIyICBEQUNDMkRIUiAgICAgICBMTF9EQUNfRE1BX0dldFJlZ0FkZHJcbgorICAqICAgICAgICAgREhSMTJMMiAgREFDQzJESFIgICAgICAgTExfREFDX0RNQV9HZXRSZWdBZGRyXG4KKyAgKiAgICAgICAgIERIUjhSMiAgIERBQ0MyREhSICAgICAgIExMX0RBQ19ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHBhcmFtICBSZWdpc3RlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19ETUFfUkVHX0RBVEFfMTJCSVRTX1JJR0hUX0FMSUdORUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfRE1BX1JFR19EQVRBXzEyQklUU19MRUZUX0FMSUdORUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfRE1BX1JFR19EQVRBXzhCSVRTX1JJR0hUX0FMSUdORUQKKyAgKiBAcmV0dmFsIERBQyByZWdpc3RlciBhZGRyZXNzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0RNQV9HZXRSZWdBZGRyKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgUmVnaXN0ZXIpCit7CisgIC8qIFJldHJpZXZlIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgREhSMTJSeCwgREhSMTJMeCBvciBESFI4UnggZGVwZW5kaW5nIG9uICAgICAqLworICAvKiBEQUMgY2hhbm5lbCBzZWxlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmV0dXJuICgodWludDMyX3QpKF9fREFDX1BUUl9SRUdfT0ZGU0VUKChEQUN4KS0+REhSMTJSMSwgKChEQUNfQ2hhbm5lbCA+PiBSZWdpc3RlcikgJiBEQUNfUkVHX1JFR09GRlNFVF9NQVNLX1BPU0JJVDApKSkpOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUZfT3BlcmF0aW9uIE9wZXJhdGlvbiBvbiBEQUMgY2hhbm5lbHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBEQUMgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENSICAgICAgIEVOMSAgICAgICAgICAgIExMX0RBQ19FbmFibGVcbgorICAqICAgICAgICAgQ1IgICAgICAgRU4yICAgICAgICAgICAgTExfREFDX0VuYWJsZQorICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxlIGZyb20gb2ZmIHN0YXRlLCBEQUMgY2hhbm5lbCByZXF1aXJlcyBhIGRlbGF5CisgICogICAgICAgICBmb3Igb3V0cHV0IHZvbHRhZ2UgdG8gcmVhY2ggYWNjdXJhY3kgKy8tIDEgTFNCLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0V0FLRVVQIi4KKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0VuYWJsZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIFNFVF9CSVQoREFDeC0+Q1IsCisgICAgICAgICAgREFDX0NSX0VOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBEQUMgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENSICAgICAgIEVOMSAgICAgICAgICAgIExMX0RBQ19EaXNhYmxlXG4KKyAgKiAgICAgICAgIENSICAgICAgIEVOMiAgICAgICAgICAgIExMX0RBQ19EaXNhYmxlCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19EaXNhYmxlKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgQ0xFQVJfQklUKERBQ3gtPkNSLAorICAgICAgICAgICAgREFDX0NSX0VOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERBQyBlbmFibGUgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogICAgICAgICAoMDogREFDIGNoYW5uZWwgaXMgZGlzYWJsZWQsIDE6IERBQyBjaGFubmVsIGlzIGVuYWJsZWQpCisgICogQHJtdG9sbCBDUiAgICAgICBFTjEgICAgICAgICAgICBMTF9EQUNfSXNFbmFibGVkXG4KKyAgKiAgICAgICAgIENSICAgICAgIEVOMiAgICAgICAgICAgIExMX0RBQ19Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19Jc0VuYWJsZWQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICByZXR1cm4gKFJFQURfQklUKERBQ3gtPkNSLAorICAgICAgICAgICAgICAgICAgIERBQ19DUl9FTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgPT0gKERBQ19DUl9FTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgREFDIHRyaWdnZXIgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogQG5vdGUgICAtIElmIERBQyB0cmlnZ2VyIGlzIGRpc2FibGVkLCBEQUMgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQKKyAgKiAgICAgICAgICAgYXV0b21hdGljYWxseSBvbmNlIHRoZSBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgaXMgdXBkYXRlZCwKKyAgKiAgICAgICAgICAgdXNpbmcgZnVuY3Rpb25zICJMTF9EQUNfQ29udmVydERhdGF7ODsgMTJ9e1JpZ2h0OyBMZWZ0fSBBbGlnbmVkKCkiOgorICAqICAgICAgICAgICBAcmVmIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkKCksIC4uLgorICAqICAgICAgICAgLSBJZiBEQUMgdHJpZ2dlciBpcyBlbmFibGVkLCBEQUMgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQKKyAgKiAgICAgICAgICAgb25seSB3aGVuIGEgaGFyZHdhcmUgb2Ygc29mdHdhcmUgdHJpZ2dlciBldmVudCBpcyBvY2N1cnJpbmcuCisgICogICAgICAgICAgIFNlbGVjdCB0cmlnZ2VyIHNvdXJjZSB1c2luZworICAqICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRUcmlnZ2VyU291cmNlKCkuCisgICogQHJtdG9sbCBDUiAgICAgICBURU4xICAgICAgICAgICBMTF9EQUNfRW5hYmxlVHJpZ2dlclxuCisgICogICAgICAgICBDUiAgICAgICBURU4yICAgICAgICAgICBMTF9EQUNfRW5hYmxlVHJpZ2dlcgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfRW5hYmxlVHJpZ2dlcihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIFNFVF9CSVQoREFDeC0+Q1IsCisgICAgICAgICAgREFDX0NSX1RFTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgREFDIHRyaWdnZXIgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogQHJtdG9sbCBDUiAgICAgICBURU4xICAgICAgICAgICBMTF9EQUNfRGlzYWJsZVRyaWdnZXJcbgorICAqICAgICAgICAgQ1IgICAgICAgVEVOMiAgICAgICAgICAgTExfREFDX0Rpc2FibGVUcmlnZ2VyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19EaXNhYmxlVHJpZ2dlcihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIENMRUFSX0JJVChEQUN4LT5DUiwKKyAgICAgICAgICAgIERBQ19DUl9URU4xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgREFDIHRyaWdnZXIgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogICAgICAgICAoMDogREFDIHRyaWdnZXIgaXMgZGlzYWJsZWQsIDE6IERBQyB0cmlnZ2VyIGlzIGVuYWJsZWQpCisgICogQHJtdG9sbCBDUiAgICAgICBURU4xICAgICAgICAgICBMTF9EQUNfSXNUcmlnZ2VyRW5hYmxlZFxuCisgICogICAgICAgICBDUiAgICAgICBURU4yICAgICAgICAgICBMTF9EQUNfSXNUcmlnZ2VyRW5hYmxlZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0lzVHJpZ2dlckVuYWJsZWQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICByZXR1cm4gKFJFQURfQklUKERBQ3gtPkNSLAorICAgICAgICAgICAgICAgICAgIERBQ19DUl9URU4xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKQorICAgICAgICAgID09IChEQUNfQ1JfVEVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyaWcgREFDIGNvbnZlcnNpb24gYnkgc29mdHdhcmUgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIFByZWxpbWluYXJpbHksIERBQyB0cmlnZ2VyIG11c3QgYmUgc2V0IHRvIHNvZnR3YXJlIHRyaWdnZXIKKyAgKiAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfREFDX1NldFRyaWdnZXJTb3VyY2UoKQorICAqICAgICAgICAgd2l0aCBwYXJhbWV0ZXIgIkxMX0RBQ19UUklHR0VSX1NPRlRXQVJFIi4KKyAgKiAgICAgICAgIGFuZCBEQUMgdHJpZ2dlciBtdXN0IGJlIGVuYWJsZWQgdXNpbmcKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfREFDX0VuYWJsZVRyaWdnZXIoKS4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIGZlYXR1cmluZyBEQUMgd2l0aCAyIGNoYW5uZWxzOiB0aGlzIGZ1bmN0aW9uCisgICogICAgICAgICBjYW4gcGVyZm9ybSBhIFNXIHN0YXJ0IG9mIGJvdGggREFDIGNoYW5uZWxzIHNpbXVsdGFuZW91c2x5LgorICAqICAgICAgICAgVHdvIGNoYW5uZWxzIGNhbiBiZSBzZWxlY3RlZCBhcyBwYXJhbWV0ZXIuCisgICogICAgICAgICBFeGFtcGxlOiAoTExfREFDX0NIQU5ORUxfMSB8IExMX0RBQ19DSEFOTkVMXzIpCisgICogQHJtdG9sbCBTV1RSSUdSICBTV1RSSUcxICAgICAgICBMTF9EQUNfVHJpZ1NXQ29udmVyc2lvblxuCisgICogICAgICAgICBTV1RSSUdSICBTV1RSSUcyICAgICAgICBMTF9EQUNfVHJpZ1NXQ29udmVyc2lvbgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsICBUaGlzIHBhcmFtZXRlciBjYW4gYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19UcmlnU1dDb252ZXJzaW9uKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVChEQUN4LT5TV1RSSUdSLAorICAgICAgICAgIChEQUNfQ2hhbm5lbCAmIERBQ19TV1RSX0NIWF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBkYXRhIHRvIGJlIGxvYWRlZCBpbiB0aGUgZGF0YSBob2xkaW5nIHJlZ2lzdGVyCisgICogICAgICAgICBpbiBmb3JtYXQgMTIgYml0cyBsZWZ0IGFsaWdubWVudCAoTFNCIGFsaWduZWQgb24gYml0IDApLAorICAqICAgICAgICAgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcm10b2xsIERIUjEyUjEgIERBQ0MxREhSICAgICAgIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkXG4KKyAgKiAgICAgICAgIERIUjEyUjIgIERBQ0MyREhSICAgICAgIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcGFyYW0gIERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgRGF0YSkKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fREFDX1BUUl9SRUdfT0ZGU0VUKERBQ3gtPkRIUjEyUjEsIChEQUNfQ2hhbm5lbCA+PiBEQUNfUkVHX0RIUjEyUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MpICYgREFDX1JFR19SRUdPRkZTRVRfTUFTS19QT1NCSVQwKTsKKyAgCisgIE1PRElGWV9SRUcoKnByZWcsCisgICAgICAgICAgICAgREFDX0RIUjEyUjFfREFDQzFESFIsCisgICAgICAgICAgICAgRGF0YSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBkYXRhIHRvIGJlIGxvYWRlZCBpbiB0aGUgZGF0YSBob2xkaW5nIHJlZ2lzdGVyCisgICogICAgICAgICBpbiBmb3JtYXQgMTIgYml0cyBsZWZ0IGFsaWdubWVudCAoTVNCIGFsaWduZWQgb24gYml0IDE1KSwKKyAgKiAgICAgICAgIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHJtdG9sbCBESFIxMkwxICBEQUNDMURIUiAgICAgICBMTF9EQUNfQ29udmVydERhdGExMkxlZnRBbGlnbmVkXG4KKyAgKiAgICAgICAgIERIUjEyTDIgIERBQ0MyREhSICAgICAgIExMX0RBQ19Db252ZXJ0RGF0YTEyTGVmdEFsaWduZWQKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBwYXJhbSAgRGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0NvbnZlcnREYXRhMTJMZWZ0QWxpZ25lZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IERhdGEpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0RBQ19QVFJfUkVHX09GRlNFVChEQUN4LT5ESFIxMlIxLCAoREFDX0NoYW5uZWwgPj4gREFDX1JFR19ESFIxMkxYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TKSAmIERBQ19SRUdfUkVHT0ZGU0VUX01BU0tfUE9TQklUMCk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIERBQ19ESFIxMkwxX0RBQ0MxREhSLAorICAgICAgICAgICAgIERhdGEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlcgorICAqICAgICAgICAgaW4gZm9ybWF0IDggYml0cyBsZWZ0IGFsaWdubWVudCAoTFNCIGFsaWduZWQgb24gYml0IDApLAorICAqICAgICAgICAgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcm10b2xsIERIUjhSMSAgIERBQ0MxREhSICAgICAgIExMX0RBQ19Db252ZXJ0RGF0YThSaWdodEFsaWduZWRcbgorICAqICAgICAgICAgREhSOFIyICAgREFDQzJESFIgICAgICAgTExfREFDX0NvbnZlcnREYXRhOFJpZ2h0QWxpZ25lZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIgKDEpCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQHBhcmFtICBEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0NvbnZlcnREYXRhOFJpZ2h0QWxpZ25lZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IERhdGEpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0RBQ19QVFJfUkVHX09GRlNFVChEQUN4LT5ESFIxMlIxLCAoREFDX0NoYW5uZWwgPj4gREFDX1JFR19ESFI4UlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MpICYgREFDX1JFR19SRUdPRkZTRVRfTUFTS19QT1NCSVQwKTsKKyAgCisgIE1PRElGWV9SRUcoKnByZWcsCisgICAgICAgICAgICAgREFDX0RIUjhSMV9EQUNDMURIUiwKKyAgICAgICAgICAgICBEYXRhKTsKK30KKworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlcgorICAqICAgICAgICAgaW4gZm9ybWF0IDEyIGJpdHMgbGVmdCBhbGlnbm1lbnQgKExTQiBhbGlnbmVkIG9uIGJpdCAwKSwKKyAgKiAgICAgICAgIGZvciBib3RoIERBQyBjaGFubmVscy4KKyAgKiBAcm10b2xsIERIUjEyUkQgIERBQ0MxREhSICAgICAgIExMX0RBQ19Db252ZXJ0RHVhbERhdGExMlJpZ2h0QWxpZ25lZFxuCisgICogICAgICAgICBESFIxMlJEICBEQUNDMkRIUiAgICAgICBMTF9EQUNfQ29udmVydER1YWxEYXRhMTJSaWdodEFsaWduZWQKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEYXRhQ2hhbm5lbDEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcGFyYW0gIERhdGFDaGFubmVsMiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0NvbnZlcnREdWFsRGF0YTEyUmlnaHRBbGlnbmVkKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEYXRhQ2hhbm5lbDEsIHVpbnQzMl90IERhdGFDaGFubmVsMikKK3sKKyAgTU9ESUZZX1JFRyhEQUN4LT5ESFIxMlJELAorICAgICAgICAgICAgIChEQUNfREhSMTJSRF9EQUNDMkRIUiB8IERBQ19ESFIxMlJEX0RBQ0MxREhSKSwKKyAgICAgICAgICAgICAoKERhdGFDaGFubmVsMiA8PCBEQUNfREhSMTJSRF9EQUNDMkRIUl9CSVRPRkZTRVRfUE9TKSB8IERhdGFDaGFubmVsMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlcgorICAqICAgICAgICAgaW4gZm9ybWF0IDEyIGJpdHMgbGVmdCBhbGlnbm1lbnQgKE1TQiBhbGlnbmVkIG9uIGJpdCAxNSksCisgICogICAgICAgICBmb3IgYm90aCBEQUMgY2hhbm5lbHMuCisgICogQHJtdG9sbCBESFIxMkxEICBEQUNDMURIUiAgICAgICBMTF9EQUNfQ29udmVydER1YWxEYXRhMTJMZWZ0QWxpZ25lZFxuCisgICogICAgICAgICBESFIxMkxEICBEQUNDMkRIUiAgICAgICBMTF9EQUNfQ29udmVydER1YWxEYXRhMTJMZWZ0QWxpZ25lZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFDaGFubmVsMSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEBwYXJhbSAgRGF0YUNoYW5uZWwyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfQ29udmVydER1YWxEYXRhMTJMZWZ0QWxpZ25lZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgRGF0YUNoYW5uZWwxLCB1aW50MzJfdCBEYXRhQ2hhbm5lbDIpCit7CisgIC8qIE5vdGU6IERhdGEgb2YgREFDIGNoYW5uZWwgMiBzaGlmdCB2YWx1ZSBzdWJ0cmFjdGVkIG9mIDQgYmVjYXVzZSAgICAgICAgICAqLworICAvKiAgICAgICBkYXRhIG9uIDE2IGJpdHMgYW5kIERBQyBjaGFubmVsIDIgYml0cyBmaWVsZCBpcyBvbiB0aGUgMTIgTVNCLCAgICAgKi8KKyAgLyogICAgICAgdGhlIDQgTFNCIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50IGZvciB0aGUgc2hpZnQgdmFsdWUuICAgICAgICAgICovCisgIE1PRElGWV9SRUcoREFDeC0+REhSMTJMRCwKKyAgICAgICAgICAgICAoREFDX0RIUjEyTERfREFDQzJESFIgfCBEQUNfREhSMTJMRF9EQUNDMURIUiksCisgICAgICAgICAgICAgKChEYXRhQ2hhbm5lbDIgPDwgKERBQ19ESFIxMkxEX0RBQ0MyREhSX0JJVE9GRlNFVF9QT1MgLSA0VSkpIHwgRGF0YUNoYW5uZWwxKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBkYXRhIHRvIGJlIGxvYWRlZCBpbiB0aGUgZGF0YSBob2xkaW5nIHJlZ2lzdGVyCisgICogICAgICAgICBpbiBmb3JtYXQgOCBiaXRzIGxlZnQgYWxpZ25tZW50IChMU0IgYWxpZ25lZCBvbiBiaXQgMCksCisgICogICAgICAgICBmb3IgYm90aCBEQUMgY2hhbm5lbHMuCisgICogQHJtdG9sbCBESFI4UkQgIERBQ0MxREhSICAgICAgIExMX0RBQ19Db252ZXJ0RHVhbERhdGE4UmlnaHRBbGlnbmVkXG4KKyAgKiAgICAgICAgIERIUjhSRCAgREFDQzJESFIgICAgICAgTExfREFDX0NvbnZlcnREdWFsRGF0YThSaWdodEFsaWduZWQKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEYXRhQ2hhbm5lbDEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHBhcmFtICBEYXRhQ2hhbm5lbDIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfQ29udmVydER1YWxEYXRhOFJpZ2h0QWxpZ25lZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgRGF0YUNoYW5uZWwxLCB1aW50MzJfdCBEYXRhQ2hhbm5lbDIpCit7CisgIE1PRElGWV9SRUcoREFDeC0+REhSOFJELAorICAgICAgICAgICAgIChEQUNfREhSOFJEX0RBQ0MyREhSIHwgREFDX0RIUjhSRF9EQUNDMURIUiksCisgICAgICAgICAgICAgKChEYXRhQ2hhbm5lbDIgPDwgREFDX0RIUjhSRF9EQUNDMkRIUl9CSVRPRkZTRVRfUE9TKSB8IERhdGFDaGFubmVsMSkpOworfQorCisjZW5kaWYgLyogREFDX0NIQU5ORUwyX1NVUFBPUlQgKi8KKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgb3V0cHV0IGRhdGEgY3VycmVudGx5IGdlbmVyYXRlZCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBub3RlICAgV2hhdGV2ZXIgYWxpZ25tZW50IGFuZCByZXNvbHV0aW9uIHNldHRpbmdzCisgICogICAgICAgICAodXNpbmcgZnVuY3Rpb25zICJMTF9EQUNfQ29udmVydERhdGF7ODsgMTJ9e1JpZ2h0OyBMZWZ0fSBBbGlnbmVkKCkiOgorICAqICAgICAgICAgQHJlZiBMTF9EQUNfQ29udmVydERhdGExMlJpZ2h0QWxpZ25lZCgpLCAuLi4pLAorICAqICAgICAgICAgb3V0cHV0IGRhdGEgZm9ybWF0IGlzIDEyIGJpdHMgcmlnaHQgYWxpZ25lZCAoTFNCIGFsaWduZWQgb24gYml0IDApLgorICAqIEBybXRvbGwgRE9SMSAgICAgREFDQzFET1IgICAgICAgTExfREFDX1JldHJpZXZlT3V0cHV0RGF0YVxuCisgICogICAgICAgICBET1IyICAgICBEQUNDMkRPUiAgICAgICBMTF9EQUNfUmV0cmlldmVPdXRwdXREYXRhCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX1JldHJpZXZlT3V0cHV0RGF0YShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0RBQ19QVFJfUkVHX09GRlNFVChEQUN4LT5ET1IxLCAoREFDX0NoYW5uZWwgPj4gREFDX1JFR19ET1JYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TKSAmIERBQ19SRUdfUkVHT0ZGU0VUX01BU0tfUE9TQklUMCk7CisgIAorICByZXR1cm4gKHVpbnQxNl90KSBSRUFEX0JJVCgqcHJlZywgREFDX0RPUjFfREFDQzFET1IpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBRyBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgR2V0IERBQyB1bmRlcnJ1biBmbGFnIGZvciBEQUMgY2hhbm5lbCAxCisgICogQHJtdG9sbCBTUiAgICAgICBETUFVRFIxICAgICAgICBMTF9EQUNfSXNBY3RpdmVGbGFnX0RNQVVEUjEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0lzQWN0aXZlRmxhZ19ETUFVRFIxKERBQ19UeXBlRGVmICpEQUN4KQoreworICByZXR1cm4gKFJFQURfQklUKERBQ3gtPlNSLCBMTF9EQUNfRkxBR19ETUFVRFIxKSA9PSAoTExfREFDX0ZMQUdfRE1BVURSMSkpOworfQorCisjaWYgZGVmaW5lZChEQUNfQ0hBTk5FTDJfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgR2V0IERBQyB1bmRlcnJ1biBmbGFnIGZvciBEQUMgY2hhbm5lbCAyCisgICogQHJtdG9sbCBTUiAgICAgICBETUFVRFIyICAgICAgICBMTF9EQUNfSXNBY3RpdmVGbGFnX0RNQVVEUjIKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0lzQWN0aXZlRmxhZ19ETUFVRFIyKERBQ19UeXBlRGVmICpEQUN4KQoreworICByZXR1cm4gKFJFQURfQklUKERBQ3gtPlNSLCBMTF9EQUNfRkxBR19ETUFVRFIyKSA9PSAoTExfREFDX0ZMQUdfRE1BVURSMikpOworfQorI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgREFDIHVuZGVycnVuIGZsYWcgZm9yIERBQyBjaGFubmVsIDEKKyAgKiBAcm10b2xsIFNSICAgICAgIERNQVVEUjEgICAgICAgIExMX0RBQ19DbGVhckZsYWdfRE1BVURSMQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19DbGVhckZsYWdfRE1BVURSMShEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgV1JJVEVfUkVHKERBQ3gtPlNSLCBMTF9EQUNfRkxBR19ETUFVRFIxKTsKK30KKworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIERBQyB1bmRlcnJ1biBmbGFnIGZvciBEQUMgY2hhbm5lbCAyCisgICogQHJtdG9sbCBTUiAgICAgICBETUFVRFIyICAgICAgICBMTF9EQUNfQ2xlYXJGbGFnX0RNQVVEUjIKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfQ2xlYXJGbGFnX0RNQVVEUjIoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIFdSSVRFX1JFRyhEQUN4LT5TUiwgTExfREFDX0ZMQUdfRE1BVURSMik7Cit9CisjZW5kaWYgLyogREFDX0NIQU5ORUwyX1NVUFBPUlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUZfSVRfTWFuYWdlbWVudCBJVCBtYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIHVuZGVycnVuIGludGVycnVwdCBmb3IgREFDIGNoYW5uZWwgMQorICAqIEBybXRvbGwgQ1IgICAgICAgRE1BVURSSUUxICAgICAgTExfREFDX0VuYWJsZUlUX0RNQVVEUjEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfRW5hYmxlSVRfRE1BVURSMShEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgU0VUX0JJVChEQUN4LT5DUiwgTExfREFDX0lUX0RNQVVEUklFMSk7Cit9CisKKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIHVuZGVycnVuIGludGVycnVwdCBmb3IgREFDIGNoYW5uZWwgMgorICAqIEBybXRvbGwgQ1IgICAgICAgRE1BVURSSUUyICAgICAgTExfREFDX0VuYWJsZUlUX0RNQVVEUjIKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfRW5hYmxlSVRfRE1BVURSMihEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgU0VUX0JJVChEQUN4LT5DUiwgTExfREFDX0lUX0RNQVVEUklFMik7Cit9CisjZW5kaWYgLyogREFDX0NIQU5ORUwyX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDEKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMSAgICAgIExMX0RBQ19EaXNhYmxlSVRfRE1BVURSMQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19EaXNhYmxlSVRfRE1BVURSMShEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgQ0xFQVJfQklUKERBQ3gtPkNSLCBMTF9EQUNfSVRfRE1BVURSSUUxKTsKK30KKworI2lmIGRlZmluZWQoREFDX0NIQU5ORUwyX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIHVuZGVycnVuIGludGVycnVwdCBmb3IgREFDIGNoYW5uZWwgMgorICAqIEBybXRvbGwgQ1IgICAgICAgRE1BVURSSUUyICAgICAgTExfREFDX0Rpc2FibGVJVF9ETUFVRFIyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0Rpc2FibGVJVF9ETUFVRFIyKERBQ19UeXBlRGVmICpEQUN4KQoreworICBDTEVBUl9CSVQoREFDeC0+Q1IsIExMX0RBQ19JVF9ETUFVRFJJRTIpOworfQorI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDEKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMSAgICAgIExMX0RBQ19Jc0VuYWJsZWRJVF9ETUFVRFIxCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19Jc0VuYWJsZWRJVF9ETUFVRFIxKERBQ19UeXBlRGVmICpEQUN4KQoreworICByZXR1cm4gKFJFQURfQklUKERBQ3gtPkNSLCBMTF9EQUNfSVRfRE1BVURSSUUxKSA9PSAoTExfREFDX0lUX0RNQVVEUklFMSkpOworfQorCisjaWYgZGVmaW5lZChEQUNfQ0hBTk5FTDJfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgR2V0IERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDIKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMiAgICAgIExMX0RBQ19Jc0VuYWJsZWRJVF9ETUFVRFIyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19Jc0VuYWJsZWRJVF9ETUFVRFIyKERBQ19UeXBlRGVmICpEQUN4KQoreworICByZXR1cm4gKFJFQURfQklUKERBQ3gtPkNSLCBMTF9EQUNfSVRfRE1BVURSSUUyKSA9PSAoTExfREFDX0lUX0RNQVVEUklFMikpOworfQorI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0RBQ19EZUluaXQoREFDX1R5cGVEZWYqIERBQ3gpOworRXJyb3JTdGF0dXMgTExfREFDX0luaXQoREFDX1R5cGVEZWYqIERBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCBMTF9EQUNfSW5pdFR5cGVEZWYqIERBQ19Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0RBQ19TdHJ1Y3RJbml0KExMX0RBQ19Jbml0VHlwZURlZiogREFDX0luaXRTdHJ1Y3QpOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogREFDMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfTExfREFDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfZG1hLmggYi9JbmMvc3RtMzJsMHh4X2xsX2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTdkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2xsX2RtYS5oCkBAIC0wLDAgKzEsMjEyOSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9kbWEuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRE1BIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9MTF9ETUFfSAorI2RlZmluZSBTVE0zMkwweHhfTExfRE1BX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChETUExKQorCisvKiogQGRlZmdyb3VwIERNQV9MTCBETUEKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX1ByaXZhdGVfVmFyaWFibGVzIERNQSBQcml2YXRlIFZhcmlhYmxlcworICAqIEB7CisgICovCisvKiBBcnJheSB1c2VkIHRvIGdldCB0aGUgRE1BIGNoYW5uZWwgcmVnaXN0ZXIgb2Zmc2V0IHZlcnN1cyBjaGFubmVsIGluZGV4IExMX0RNQV9DSEFOTkVMX3ggKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IENIQU5ORUxfT0ZGU0VUX1RBQltdID0KK3sKKyAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDFfQkFTRSAtIERNQTFfQkFTRSksCisgICh1aW50OF90KShETUExX0NoYW5uZWwyX0JBU0UgLSBETUExX0JBU0UpLAorICAodWludDhfdCkoRE1BMV9DaGFubmVsM19CQVNFIC0gRE1BMV9CQVNFKSwKKyAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDRfQkFTRSAtIERNQTFfQkFTRSksCisgICh1aW50OF90KShETUExX0NoYW5uZWw1X0JBU0UgLSBETUExX0JBU0UpLAorI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNikKKyAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDZfQkFTRSAtIERNQTFfQkFTRSksCisjZW5kaWYgLypETUExX0NoYW5uZWw2Ki8KKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisgICh1aW50OF90KShETUExX0NoYW5uZWw3X0JBU0UgLSBETUExX0JBU0UpCisjZW5kaWYgLypETUExX0NoYW5uZWw3Ki8KK307CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfTExfUHJpdmF0ZV9Db25zdGFudHMgRE1BIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIERlZmluZSB1c2VkIHRvIGdldCBDU0VMUiByZWdpc3RlciBvZmZzZXQgKi8KKyNkZWZpbmUgRE1BX0NTRUxSX09GRlNFVCAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoRE1BMV9DU0VMUl9CQVNFIC0gRE1BMV9CQVNFKQorCisvKiBEZWZpbmVzIHVzZWQgZm9yIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIHJlZ2lzdGVyIGFuZCBwZXJmb3JtIG9mZnNldHMgKi8KKyNkZWZpbmUgRE1BX1BPU0lUSU9OX0NTRUxSX0NYUyAgICAgICAgICAgICgoQ2hhbm5lbC0xVSkqNFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBETUFfTExfUHJpdmF0ZV9NYWNyb3MgRE1BIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBETUFfTExfRVNfSU5JVCBETUEgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUGVyaXBoT3JNMk1TcmNBZGRyZXNzOyAgLyohPCBTcGVjaWZpZXMgdGhlIHBlcmlwaGVyYWwgYmFzZSBhZGRyZXNzIGZvciBETUEgdHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhcyBTb3VyY2UgYmFzZSBhZGRyZXNzIGluIGNhc2Ugb2YgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRi4gKi8KKworICB1aW50MzJfdCBNZW1vcnlPck0yTURzdEFkZHJlc3M7ICAvKiE8IFNwZWNpZmllcyB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBmb3IgRE1BIHRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYXMgRGVzdGluYXRpb24gYmFzZSBhZGRyZXNzIGluIGNhc2Ugb2YgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRi4gKi8KKworICB1aW50MzJfdCBEaXJlY3Rpb247ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgZGF0YSB3aWxsIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIHBlcmlwaGVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtZW1vcnkgdG8gbWVtb3J5IG9yIGZyb20gcGVyaXBoZXJhbCB0byBtZW1vcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfRElSRUNUSU9OCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24oKS4gKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbm9ybWFsIG9yIGNpcmN1bGFyIG9wZXJhdGlvbiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZTogVGhlIGNpcmN1bGFyIGJ1ZmZlciBtb2RlIGNhbm5vdCBiZSB1c2VkIGlmIHRoZSBtZW1vcnkgdG8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIGlzIGNvbmZpZ3VyZWQgb24gdGhlIHNlbGVjdGVkIENoYW5uZWwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldE1vZGUoKS4gKi8KKworICB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0luY01vZGU7ICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBQZXJpcGhlcmFsIGFkZHJlc3Mgb3IgU291cmNlIGFkZHJlc3MgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluY3JlbWVudGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19QRVJJUEgKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldFBlcmlwaEluY01vZGUoKS4gKi8KKworICB1aW50MzJfdCBNZW1vcnlPck0yTURzdEluY01vZGU7ICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBNZW1vcnkgYWRkcmVzcyBvciBEZXN0aW5hdGlvbiBhZGRyZXNzIGluIGNhc2Ugb2YgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbmNyZW1lbnRlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfTUVNT1JZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRNZW1vcnlJbmNNb2RlKCkuICovCisKKyAgdWludDMyX3QgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFBlcmlwaGVyYWwgZGF0YSBzaXplIGFsaWdubWVudCBvciBTb3VyY2UgZGF0YSBzaXplIGFsaWdubWVudCAoYnl0ZSwgaGFsZiB3b3JkLCB3b3JkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2YgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfUERBVEFBTElHTgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0UGVyaXBoU2l6ZSgpLiAqLworCisgIHVpbnQzMl90IE1lbW9yeU9yTTJNRHN0RGF0YVNpemU7IC8qITwgU3BlY2lmaWVzIHRoZSBNZW1vcnkgZGF0YSBzaXplIGFsaWdubWVudCBvciBEZXN0aW5hdGlvbiBkYXRhIHNpemUgYWxpZ25tZW50IChieXRlLCBoYWxmIHdvcmQsIHdvcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19NREFUQUFMSUdOCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRNZW1vcnlTaXplKCkuICovCisKKyAgdWludDMyX3QgTmJEYXRhOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIHRvIHRyYW5zZmVyLCBpbiBkYXRhIHVuaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGEgdW5pdCBpcyBlcXVhbCB0byB0aGUgc291cmNlIGJ1ZmZlciBjb25maWd1cmF0aW9uIHNldCBpbiBQZXJpcGhlcmFsU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIE1lbW9yeVNpemUgcGFyYW1ldGVycyBkZXBlbmRpbmcgaW4gdGhlIHRyYW5zZmVyIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgwMDAwRkZGRgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0RGF0YUxlbmd0aCgpLiAqLworCisgIHVpbnQzMl90IFBlcmlwaFJlcXVlc3Q7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwZXJpcGhlcmFsIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfUkVRVUVTVAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0UGVyaXBoUmVxdWVzdCgpLiAqLworCisgIHVpbnQzMl90IFByaW9yaXR5OyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjaGFubmVsIHByaW9yaXR5IGxldmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX1BSSU9SSVRZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRDaGFubmVsUHJpb3JpdHlMZXZlbCgpLiAqLworCit9IExMX0RNQV9Jbml0VHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIERNQSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBETUFfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGMSAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjEgICAgICAgIC8qITwgQ2hhbm5lbCAxIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUYxICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGMSAgICAgICAvKiE8IENoYW5uZWwgMSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGMSAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjEgICAgICAgLyohPCBDaGFubmVsIDEgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjEgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUYxICAgICAgIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjIgICAgICAgICAgICAgICAgIERNQV9JRkNSX0NHSUYyICAgICAgICAvKiE8IENoYW5uZWwgMiBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGMiAgICAgICAgICAgICAgICBETUFfSUZDUl9DVENJRjIgICAgICAgLyohPCBDaGFubmVsIDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjIgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0hUSUYyICAgICAgIC8qITwgQ2hhbm5lbCAyIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUYyICAgICAgICAgICAgICAgIERNQV9JRkNSX0NURUlGMiAgICAgICAvKiE8IENoYW5uZWwgMiB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUYzICAgICAgICAgICAgICAgICBETUFfSUZDUl9DR0lGMyAgICAgICAgLyohPCBDaGFubmVsIDMgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjMgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RDSUYzICAgICAgIC8qITwgQ2hhbm5lbCAzIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUYzICAgICAgICAgICAgICAgIERNQV9JRkNSX0NIVElGMyAgICAgICAvKiE8IENoYW5uZWwgMyBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGMyAgICAgICAgICAgICAgICBETUFfSUZDUl9DVEVJRjMgICAgICAgLyohPCBDaGFubmVsIDMgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGNCAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjQgICAgICAgIC8qITwgQ2hhbm5lbCA0IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY0ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGNCAgICAgICAvKiE8IENoYW5uZWwgNCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGNCAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjQgICAgICAgLyohPCBDaGFubmVsIDQgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjQgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUY0ICAgICAgIC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjUgICAgICAgICAgICAgICAgIERNQV9JRkNSX0NHSUY1ICAgICAgICAvKiE8IENoYW5uZWwgNSBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGNSAgICAgICAgICAgICAgICBETUFfSUZDUl9DVENJRjUgICAgICAgLyohPCBDaGFubmVsIDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjUgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0hUSUY1ICAgICAgIC8qITwgQ2hhbm5lbCA1IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUY1ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NURUlGNSAgICAgICAvKiE8IENoYW5uZWwgNSB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw2KQorI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGNiAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjYgICAgICAgIC8qITwgQ2hhbm5lbCA2IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY2ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGNiAgICAgICAvKiE8IENoYW5uZWwgNiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGNiAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjYgICAgICAgLyohPCBDaGFubmVsIDYgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjYgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUY2ICAgICAgIC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykKKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjcgICAgICAgICAgICAgICAgIERNQV9JRkNSX0NHSUY3ICAgICAgICAvKiE8IENoYW5uZWwgNyBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGNyAgICAgICAgICAgICAgICBETUFfSUZDUl9DVENJRjcgICAgICAgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjcgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0hUSUY3ICAgICAgIC8qITwgQ2hhbm5lbCA3IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUY3ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NURUlGNyAgICAgICAvKiE8IENoYW5uZWwgNyB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGMSAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjEgICAgICAgICAgLyohPCBDaGFubmVsIDEgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUYxICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGMSAgICAgICAgIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGMSAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjEgICAgICAgICAvKiE8IENoYW5uZWwgMSBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjEgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUYxICAgICAgICAgLyohPCBDaGFubmVsIDEgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX0dJRjIgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUYyICAgICAgICAgIC8qITwgQ2hhbm5lbCAyIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGMiAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjIgICAgICAgICAvKiE8IENoYW5uZWwgMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjIgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUYyICAgICAgICAgLyohPCBDaGFubmVsIDIgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUYyICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGMiAgICAgICAgIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUYzICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGMyAgICAgICAgICAvKiE8IENoYW5uZWwgMyBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjMgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUYzICAgICAgICAgLyohPCBDaGFubmVsIDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUYzICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGMyAgICAgICAgIC8qITwgQ2hhbm5lbCAzIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGMyAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjMgICAgICAgICAvKiE8IENoYW5uZWwgMyB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGNCAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjQgICAgICAgICAgLyohPCBDaGFubmVsIDQgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUY0ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNCAgICAgICAgIC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGNCAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjQgICAgICAgICAvKiE8IENoYW5uZWwgNCBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjQgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY0ICAgICAgICAgLyohPCBDaGFubmVsIDQgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX0dJRjUgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUY1ICAgICAgICAgIC8qITwgQ2hhbm5lbCA1IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGNSAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjUgICAgICAgICAvKiE8IENoYW5uZWwgNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjUgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUY1ICAgICAgICAgLyohPCBDaGFubmVsIDUgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUY1ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGNSAgICAgICAgIC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGNiAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjYgICAgICAgICAgLyohPCBDaGFubmVsIDYgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUY2ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNiAgICAgICAgIC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGNiAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjYgICAgICAgICAvKiE8IENoYW5uZWwgNiBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjYgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY2ICAgICAgICAgLyohPCBDaGFubmVsIDYgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2VuZGlmCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQorI2RlZmluZSBMTF9ETUFfSVNSX0dJRjcgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUY3ICAgICAgICAgIC8qITwgQ2hhbm5lbCA3IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGNyAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjcgICAgICAgICAvKiE8IENoYW5uZWwgNyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjcgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUY3ICAgICAgICAgLyohPCBDaGFubmVsIDcgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUY3ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGNyAgICAgICAgIC8qITwgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BX1JlYWRSZWcgYW5kICBMTF9ETUFfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX0NDUl9UQ0lFICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfVENJRSAgICAgICAgICAvKiE8IFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCAqLworI2RlZmluZSBMTF9ETUFfQ0NSX0hUSUUgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9IVElFICAgICAgICAgIC8qITwgSGFsZiBUcmFuc2ZlciBpbnRlcnJ1cHQgICAgICovCisjZGVmaW5lIExMX0RNQV9DQ1JfVEVJRSAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1RFSUUgICAgICAgICAgLyohPCBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0NIQU5ORUwgQ0hBTk5FTAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAvKiE8IERNQSBDaGFubmVsIDEgKi8KKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgRE1BIENoYW5uZWwgMiAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM1UgLyohPCBETUEgQ2hhbm5lbCAzICovCisjZGVmaW5lIExMX0RNQV9DSEFOTkVMXzQgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAvKiE8IERNQSBDaGFubmVsIDQgKi8KKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDVVIC8qITwgRE1BIENoYW5uZWwgNSAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNikKKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfNiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDZVIC8qITwgRE1BIENoYW5uZWwgNiAqLworI2VuZGlmCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQorI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF83ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwN1UgLyohPCBETUEgQ2hhbm5lbCA3ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfQUxMICAgICAgICAgICAgICAgIDB4RkZGRjAwMDBVIC8qITwgRE1BIENoYW5uZWwgYWxsICh1c2VkIG9ubHkgZm9yIGZ1bmN0aW9uIEByZWYgTExfRE1BX0RlSW5pdCgpLiAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0RJUkVDVElPTiBUcmFuc2ZlciBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIHRvIG1lbW9yeSBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIERNQV9DQ1JfRElSICAgICAgICAgICAgIC8qITwgTWVtb3J5IHRvIHBlcmlwaGVyYWwgZGlyZWN0aW9uICovCisjZGVmaW5lIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBETUFfQ0NSX01FTTJNRU0gICAgICAgICAvKiE8IE1lbW9yeSB0byBtZW1vcnkgZGlyZWN0aW9uICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfTU9ERSBUcmFuc2ZlciBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX01PREVfTk9STUFMICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTm9ybWFsIE1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfTU9ERV9DSVJDVUxBUiAgICAgICAgICAgICAgRE1BX0NDUl9DSVJDICAgICAgICAgICAgLyohPCBDaXJjdWxhciBNb2RlICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19QRVJJUEggUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UICAgICAgICAgICBETUFfQ0NSX1BJTkMgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUgRW5hYmxlICovCisjZGVmaW5lIExMX0RNQV9QRVJJUEhfTk9JTkNSRU1FTlQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUgRGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfTUVNT1JZIE1lbW9yeSBpbmNyZW1lbnQgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UICAgICAgICAgICBETUFfQ0NSX01JTkMgICAgICAgICAgICAvKiE8IE1lbW9yeSBpbmNyZW1lbnQgbW9kZSBFbmFibGUgICovCisjZGVmaW5lIExMX0RNQV9NRU1PUllfTk9JTkNSRU1FTlQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE1lbW9yeSBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19QREFUQUFMSUdOIFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfUERBVEFBTElHTl9CWVRFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogQnl0ZSAgICAgKi8KKyNkZWZpbmUgTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQgICAgICAgIERNQV9DQ1JfUFNJWkVfMCAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEhhbGZXb3JkICovCisjZGVmaW5lIExMX0RNQV9QREFUQUFMSUdOX1dPUkQgICAgICAgICAgICBETUFfQ0NSX1BTSVpFXzEgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBXb3JkICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfTURBVEFBTElHTiBNZW1vcnkgZGF0YSBhbGlnbm1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfTURBVEFBTElHTl9CWVRFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLworI2RlZmluZSBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRCAgICAgICAgRE1BX0NDUl9NU0laRV8wICAgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBIYWxmV29yZCAqLworI2RlZmluZSBMTF9ETUFfTURBVEFBTElHTl9XT1JEICAgICAgICAgICAgRE1BX0NDUl9NU0laRV8xICAgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBXb3JkICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfUFJJT1JJVFkgVHJhbnNmZXIgUHJpb3JpdHkgbGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfTE9XICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IExvdyAgICAgICAqLworI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfTUVESVVNICAgICAgICAgICAgRE1BX0NDUl9QTF8wICAgICAgICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IE1lZGl1bSAgICAqLworI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfSElHSCAgICAgICAgICAgICAgRE1BX0NDUl9QTF8xICAgICAgICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IEhpZ2ggICAgICAqLworI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0ggICAgICAgICAgRE1BX0NDUl9QTCAgICAgICAgICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IFZlcnlfSGlnaCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfUkVRVUVTVCBUcmFuc2ZlciBwZXJpcGhlcmFsIHJlcXVlc3QKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfUkVRVUVTVF8wICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBETUEgcGVyaXBoZXJhbCByZXF1ZXN0IDAgICovCisjZGVmaW5lIExMX0RNQV9SRVFVRVNUXzEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAvKiE8IERNQSBwZXJpcGhlcmFsIHJlcXVlc3QgMSAgKi8KKyNkZWZpbmUgTExfRE1BX1JFUVVFU1RfMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAgICAgICAgICAgIC8qITwgRE1BIHBlcmlwaGVyYWwgcmVxdWVzdCAyICAqLworI2RlZmluZSBMTF9ETUFfUkVRVUVTVF8zICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM1UgICAgICAgICAgICAgLyohPCBETUEgcGVyaXBoZXJhbCByZXF1ZXN0IDMgICovCisjZGVmaW5lIExMX0RNQV9SRVFVRVNUXzQgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgICAgICAgICAgICAvKiE8IERNQSBwZXJpcGhlcmFsIHJlcXVlc3QgNCAgKi8KKyNkZWZpbmUgTExfRE1BX1JFUVVFU1RfNSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDVVICAgICAgICAgICAgIC8qITwgRE1BIHBlcmlwaGVyYWwgcmVxdWVzdCA1ICAqLworI2RlZmluZSBMTF9ETUFfUkVRVUVTVF82ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNlUgICAgICAgICAgICAgLyohPCBETUEgcGVyaXBoZXJhbCByZXF1ZXN0IDYgICovCisjZGVmaW5lIExMX0RNQV9SRVFVRVNUXzcgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3VSAgICAgICAgICAgICAvKiE8IERNQSBwZXJpcGhlcmFsIHJlcXVlc3QgNyAgKi8KKyNkZWZpbmUgTExfRE1BX1JFUVVFU1RfOCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVICAgICAgICAgICAgIC8qITwgRE1BIHBlcmlwaGVyYWwgcmVxdWVzdCA4ICAqLworI2RlZmluZSBMTF9ETUFfUkVRVUVTVF85ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOVUgICAgICAgICAgICAgLyohPCBETUEgcGVyaXBoZXJhbCByZXF1ZXN0IDkgICovCisjZGVmaW5lIExMX0RNQV9SRVFVRVNUXzEwICAgICAgICAgICAgICAgICAweDAwMDAwMDBBVSAgICAgICAgICAgICAvKiE8IERNQSBwZXJpcGhlcmFsIHJlcXVlc3QgMTAgKi8KKyNkZWZpbmUgTExfRE1BX1JFUVVFU1RfMTEgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEJVICAgICAgICAgICAgIC8qITwgRE1BIHBlcmlwaGVyYWwgcmVxdWVzdCAxMSAqLworI2RlZmluZSBMTF9ETUFfUkVRVUVTVF8xMiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQ1UgICAgICAgICAgICAgLyohPCBETUEgcGVyaXBoZXJhbCByZXF1ZXN0IDEyICovCisjZGVmaW5lIExMX0RNQV9SRVFVRVNUXzEzICAgICAgICAgICAgICAgICAweDAwMDAwMDBEVSAgICAgICAgICAgICAvKiE8IERNQSBwZXJpcGhlcmFsIHJlcXVlc3QgMTMgKi8KKyNkZWZpbmUgTExfRE1BX1JFUVVFU1RfMTQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEVVICAgICAgICAgICAgIC8qITwgRE1BIHBlcmlwaGVyYWwgcmVxdWVzdCAxNCAqLworI2RlZmluZSBMTF9ETUFfUkVRVUVTVF8xNSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRlUgICAgICAgICAgICAgLyohPCBETUEgcGVyaXBoZXJhbCByZXF1ZXN0IDE1ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfTExfRXhwb3J0ZWRfTWFjcm9zIERNQSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBETUEgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBETUEgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0RNQV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIERNQSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIERNQSBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9ETUFfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VNX0NPTlZFUlRfRE1BeENIQU5ORUx5IENvbnZlcnQgRE1BeENoYW5uZWx5CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ29udmVydCBETUF4X0NoYW5uZWx5IGludG8gRE1BeAorICAqIEBwYXJhbSAgX19DSEFOTkVMX0lOU1RBTkNFX18gRE1BeF9DaGFubmVseQorICAqIEByZXR2YWwgRE1BeAorICAqLworI2RlZmluZSBfX0xMX0RNQV9HRVRfSU5TVEFOQ0UoX19DSEFOTkVMX0lOU1RBTkNFX18pICAoRE1BMSkKKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IERNQXhfQ2hhbm5lbHkgaW50byBMTF9ETUFfQ0hBTk5FTF95CisgICogQHBhcmFtICBfX0NIQU5ORUxfSU5TVEFOQ0VfXyBETUF4X0NoYW5uZWx5CisgICogQHJldHZhbCBMTF9ETUFfQ0hBTk5FTF95CisgICovCisjaWYgZGVmaW5lZCAoRE1BMV9DaGFubmVsNikgJiYgZGVmaW5lZCAoRE1BMV9DaGFubmVsNykKKyNkZWZpbmUgX19MTF9ETUFfR0VUX0NIQU5ORUwoX19DSEFOTkVMX0lOU1RBTkNFX18pICAgXAorKCgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKSA/IExMX0RNQV9DSEFOTkVMXzEgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpID8gTExfRE1BX0NIQU5ORUxfMiA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgPyBMTF9ETUFfQ0hBTk5FTF8zIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSA/IExMX0RNQV9DSEFOTkVMXzQgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpID8gTExfRE1BX0NIQU5ORUxfNSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSkgPyBMTF9ETUFfQ0hBTk5FTF82IDogXAorIExMX0RNQV9DSEFOTkVMXzcpCisjZWxpZiBkZWZpbmVkIChETUExX0NoYW5uZWw2KQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTChfX0NIQU5ORUxfSU5TVEFOQ0VfXykgICBcCisoKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpID8gTExfRE1BX0NIQU5ORUxfMSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgPyBMTF9ETUFfQ0hBTk5FTF8yIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSA/IExMX0RNQV9DSEFOTkVMXzMgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpID8gTExfRE1BX0NIQU5ORUxfNCA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgPyBMTF9ETUFfQ0hBTk5FTF81IDogXAorIExMX0RNQV9DSEFOTkVMXzYpCisjZWxzZQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTChfX0NIQU5ORUxfSU5TVEFOQ0VfXykgICBcCisoKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpID8gTExfRE1BX0NIQU5ORUxfMSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgPyBMTF9ETUFfQ0hBTk5FTF8yIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSA/IExMX0RNQV9DSEFOTkVMXzMgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpID8gTExfRE1BX0NIQU5ORUxfNCA6IFwKKyBMTF9ETUFfQ0hBTk5FTF81KQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDYgJiYgRE1BMV9DaGFubmVsNyAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnQgRE1BIEluc3RhbmNlIERNQXggYW5kIExMX0RNQV9DSEFOTkVMX3kgaW50byBETUF4X0NoYW5uZWx5CisgICogQHBhcmFtICBfX0RNQV9JTlNUQU5DRV9fIERNQXgKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIExMX0RNQV9DSEFOTkVMX3kKKyAgKiBAcmV0dmFsIERNQXhfQ2hhbm5lbHkKKyAgKi8KKyNpZiBkZWZpbmVkIChETUExX0NoYW5uZWw2KSAmJiBkZWZpbmVkIChETUExX0NoYW5uZWw3KQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShfX0RNQV9JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgICBcCisoKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgPyBETUExX0NoYW5uZWwxIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8yKSkpID8gRE1BMV9DaGFubmVsMiA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSA/IERNQTFfQ2hhbm5lbDMgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgPyBETUExX0NoYW5uZWw0IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF81KSkpID8gRE1BMV9DaGFubmVsNSA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNikpKSA/IERNQTFfQ2hhbm5lbDYgOiBcCisgRE1BMV9DaGFubmVsNykKKyNlbGlmIGRlZmluZWQgKERNQTFfQ2hhbm5lbDYpCisjZGVmaW5lIF9fTExfRE1BX0dFVF9DSEFOTkVMX0lOU1RBTkNFKF9fRE1BX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgIFwKKygoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMSkpKSA/IERNQTFfQ2hhbm5lbDEgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzIpKSkgPyBETUExX0NoYW5uZWwyIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8zKSkpID8gRE1BMV9DaGFubmVsMyA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNCkpKSA/IERNQTFfQ2hhbm5lbDQgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzUpKSkgPyBETUExX0NoYW5uZWw1IDogXAorIERNQTFfQ2hhbm5lbDYpCisjZWxzZQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShfX0RNQV9JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgICBcCisoKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgPyBETUExX0NoYW5uZWwxIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8yKSkpID8gRE1BMV9DaGFubmVsMiA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSA/IERNQTFfQ2hhbm5lbDMgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgPyBETUExX0NoYW5uZWw0IDogXAorIERNQTFfQ2hhbm5lbDUpCisjZW5kaWYgLyogRE1BMV9DaGFubmVsNiAmJiBETUExX0NoYW5uZWw3ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgRE1BIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgRU4gICAgICAgICAgICBMTF9ETUFfRW5hYmxlQ2hhbm5lbAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0VuYWJsZUNoYW5uZWwoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIFNFVF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIEVOICAgICAgICAgICAgTExfRE1BX0Rpc2FibGVDaGFubmVsCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUNoYW5uZWwoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIENMRUFSX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsIERNQV9DQ1JfRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBjaGFubmVsIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgRU4gICAgICAgICAgICBMTF9ETUFfSXNFbmFibGVkQ2hhbm5lbAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRDaGFubmVsKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9FTikgPT0gKERNQV9DQ1JfRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGFsbCBwYXJhbWV0ZXJzIGxpbmsgdG8gRE1BIHRyYW5zZmVyLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBNRU0yTUVNICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgQ0lSQyAgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBNSU5DICAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgUFNJWkUgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIE1TSVpFICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBQTCAgICAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlcgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgQ29uZmlndXJhdGlvbiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgYWxsIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvciBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvciBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX05PUk1BTCBvciBAcmVmIExMX0RNQV9NT0RFX0NJUkNVTEFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9JTkNSRU1FTlQgb3IgQHJlZiBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQgb3IgQHJlZiBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fQllURSBvciBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0hBTEZXT1JEIG9yIEByZWYgTExfRE1BX1BEQVRBQUxJR05fV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0JZVEUgb3IgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRCBvciBAcmVmIExMX0RNQV9NREFUQUFMSUdOX1dPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTE9XIG9yIEByZWYgTExfRE1BX1BSSU9SSVRZX01FRElVTSBvciBAcmVmIExMX0RNQV9QUklPUklUWV9ISUdIIG9yIEByZWYgTExfRE1BX1BSSU9SSVRZX1ZFUllISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ29uZmlnVHJhbnNmZXIoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pCit7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLAorICAgICAgICAgICAgIERNQV9DQ1JfRElSIHwgRE1BX0NDUl9NRU0yTUVNIHwgRE1BX0NDUl9DSVJDIHwgRE1BX0NDUl9QSU5DIHwgRE1BX0NDUl9NSU5DIHwgRE1BX0NDUl9QU0laRSB8IERNQV9DQ1JfTVNJWkUgfCBETUFfQ0NSX1BMLAorICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBEYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiAocmVhZCBmcm9tIHBlcmlwaGVyYWwgb3IgZnJvbSBtZW1vcnkpLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvblxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgTUVNMk1FTSAgICAgICBMTF9ETUFfU2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24oRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IERpcmVjdGlvbikKK3sKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgRE1BX0NDUl9ESVIgfCBETUFfQ0NSX01FTTJNRU0sIERpcmVjdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIChyZWFkIGZyb20gcGVyaXBoZXJhbCBvciBmcm9tIG1lbW9yeSkuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgRElSICAgICAgICAgICBMTF9ETUFfR2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBNRU0yTUVNICAgICAgIExMX0RNQV9HZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBICisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldERhdGFUcmFuc2ZlckRpcmVjdGlvbihETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9ESVIgfCBETUFfQ0NSX01FTTJNRU0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRE1BIG1vZGUgY2lyY3VsYXIgb3Igbm9ybWFsLgorICAqIEBub3RlIFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUgbWVtb3J5LXRvLW1lbW9yeQorICAqIGRhdGEgdHJhbnNmZXIgaXMgY29uZmlndXJlZCBvbiB0aGUgc2VsZWN0ZWQgQ2hhbm5lbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBDSVJDICAgICAgICAgIExMX0RNQV9TZXRNb2RlCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfTk9STUFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfQ0lSQ1VMQVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNb2RlKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBNb2RlKQoreworICBNT0RJRllfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwgRE1BX0NDUl9DSVJDLAorICAgICAgICAgICAgIE1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBETUEgbW9kZSBjaXJjdWxhciBvciBub3JtYWwuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgQ0lSQyAgICAgICAgICBMTF9ETUFfR2V0TW9kZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTU9ERV9OT1JNQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTU9ERV9DSVJDVUxBUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRNb2RlKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX0NJUkMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQSU5DICAgICAgICAgIExMX0RNQV9TZXRQZXJpcGhJbmNNb2RlCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBQZXJpcGhPck0yTVNyY0luY01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUEVSSVBIX0lOQ1JFTUVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfTk9JTkNSRU1FTlQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRQZXJpcGhJbmNNb2RlKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0luY01vZGUpCit7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX1BJTkMsCisgICAgICAgICAgICAgUGVyaXBoT3JNMk1TcmNJbmNNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQSU5DICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhJbmNNb2RlCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRQZXJpcGhJbmNNb2RlKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1BJTkMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTWVtb3J5IGluY3JlbWVudCBtb2RlLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIE1JTkMgICAgICAgICAgTExfRE1BX1NldE1lbW9yeUluY01vZGUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE1lbW9yeU9yTTJNRHN0SW5jTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9OT0lOQ1JFTUVOVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE1lbW9yeUluY01vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1lbW9yeU9yTTJNRHN0SW5jTW9kZSkKK3sKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsIERNQV9DQ1JfTUlOQywKKyAgICAgICAgICAgICBNZW1vcnlPck0yTURzdEluY01vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNZW1vcnkgaW5jcmVtZW50IG1vZGUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgTUlOQyAgICAgICAgICBMTF9ETUFfR2V0TWVtb3J5SW5jTW9kZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTUVNT1JZX0lOQ1JFTUVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NRU1PUllfTk9JTkNSRU1FTlQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TWVtb3J5SW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9NSU5DKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFBlcmlwaGVyYWwgc2l6ZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQU0laRSAgICAgICAgIExMX0RNQV9TZXRQZXJpcGhTaXplCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBQZXJpcGhPck0yTVNyY0RhdGFTaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fQllURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0hBTEZXT1JECisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fV09SRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaFNpemUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IFBlcmlwaE9yTTJNU3JjRGF0YVNpemUpCit7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX1BTSVpFLAorICAgICAgICAgICAgIFBlcmlwaE9yTTJNU3JjRGF0YVNpemUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBQZXJpcGhlcmFsIHNpemUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgUFNJWkUgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoU2l6ZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9CWVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9XT1JECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldFBlcmlwaFNpemUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfUFNJWkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTWVtb3J5IHNpemUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgTVNJWkUgICAgICAgICBMTF9ETUFfU2V0TWVtb3J5U2l6ZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0JZVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX1dPUkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNZW1vcnlTaXplKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBNZW1vcnlPck0yTURzdERhdGFTaXplKQoreworICBNT0RJRllfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwgRE1BX0NDUl9NU0laRSwKKyAgICAgICAgICAgICBNZW1vcnlPck0yTURzdERhdGFTaXplKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTWVtb3J5IHNpemUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgTVNJWkUgICAgICAgICBMTF9ETUFfR2V0TWVtb3J5U2l6ZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9CWVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fSEFMRldPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9XT1JECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1lbW9yeVNpemUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfTVNJWkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQ2hhbm5lbCBwcmlvcml0eSBsZXZlbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQTCAgICAgICAgICAgIExMX0RNQV9TZXRDaGFubmVsUHJpb3JpdHlMZXZlbAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgUHJpb3JpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX01FRElVTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX1ZFUllISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0Q2hhbm5lbFByaW9yaXR5TGV2ZWwoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IFByaW9yaXR5KQoreworICBNT0RJRllfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwgRE1BX0NDUl9QTCwKKyAgICAgICAgICAgICBQcmlvcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgcHJpb3JpdHkgbGV2ZWwuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgUEwgICAgICAgICAgICBMTF9ETUFfR2V0Q2hhbm5lbFByaW9yaXR5TGV2ZWwKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9NRURJVU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9WRVJZSElHSAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRDaGFubmVsUHJpb3JpdHlMZXZlbChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9QTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBOdW1iZXIgb2YgZGF0YSB0byB0cmFuc2Zlci4KKyAgKiBAbm90ZSAgIFRoaXMgYWN0aW9uIGhhcyBubyBlZmZlY3QgaWYKKyAgKiAgICAgICAgIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENORFRSICAgICAgICBORFQgICAgICAgICAgIExMX0RNQV9TZXREYXRhTGVuZ3RoCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBOYkRhdGEgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgwMDAwRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldERhdGFMZW5ndGgoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE5iRGF0YSkKK3sKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DTkRUUiwKKyAgICAgICAgICAgICBETUFfQ05EVFJfTkRULCBOYkRhdGEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBOdW1iZXIgb2YgZGF0YSB0byB0cmFuc2Zlci4KKyAgKiBAbm90ZSAgIE9uY2UgdGhlIGNoYW5uZWwgaXMgZW5hYmxlZCwgdGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZSB0aGUKKyAgKiAgICAgICAgIHJlbWFpbmluZyBieXRlcyB0byBiZSB0cmFuc21pdHRlZC4KKyAgKiBAcm10b2xsIENORFRSICAgICAgICBORFQgICAgICAgICAgIExMX0RNQV9HZXREYXRhTGVuZ3RoCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldERhdGFMZW5ndGgoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q05EVFIsCisgICAgICAgICAgICAgICAgICAgRE1BX0NORFRSX05EVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU291cmNlIGFuZCBEZXN0aW5hdGlvbiBhZGRyZXNzZXMuCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAgKiBAbm90ZSAgIEVhY2ggSVAgdXNpbmcgRE1BIHByb3ZpZGVzIGFuIEFQSSB0byBnZXQgZGlyZWN0bHkgdGhlIHJlZ2lzdGVyIGFkcmVzcyAoTExfUFBQX0RNQV9HZXRSZWdBZGRyKS4KKyAgKiBAcm10b2xsIENQQVIgICAgICAgICBQQSAgICAgICAgICAgIExMX0RNQV9Db25maWdBZGRyZXNzZXNcbgorICAqICAgICAgICAgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX0NvbmZpZ0FkZHJlc3NlcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgU3JjQWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICogQHBhcmFtICBEc3RBZGRyZXNzIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NvbmZpZ0FkZHJlc3NlcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgU3JjQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGlyZWN0aW9uKQoreworICAvKiBEaXJlY3Rpb24gTWVtb3J5IHRvIFBlcmlwaCAqLworICBpZiAoRGlyZWN0aW9uID09IExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCkKKyAgeworICAgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DTUFSLCBTcmNBZGRyZXNzKTsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q1BBUiwgRHN0QWRkcmVzcyk7CisgIH0KKyAgLyogRGlyZWN0aW9uIFBlcmlwaCB0byBNZW1vcnkgYW5kIE1lbW9yeSB0byBNZW1vcnkgKi8KKyAgZWxzZQorICB7CisgICAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNQQVIsIFNyY0FkZHJlc3MpOworICAgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DTUFSLCBEc3RBZGRyZXNzKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgTWVtb3J5IGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvciBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEggb25seS4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX1NldE1lbW9yeUFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE1lbW9yeUFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE1lbW9yeUFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1lbW9yeUFkZHJlc3MpCit7CisgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DTUFSLCBNZW1vcnlBZGRyZXNzKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFBlcmlwaGVyYWwgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvbmx5LgorICAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfU2V0UGVyaXBoQWRkcmVzcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgUGVyaXBoQWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0UGVyaXBoQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUGVyaXBoQWRkcmVzcykKK3sKKyAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNQQVIsIFBlcmlwaEFkZHJlc3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNZW1vcnkgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvbmx5LgorICAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX0dldE1lbW9yeUFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TWVtb3J5QWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DTUFSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvbmx5LgorICAqIEBybXRvbGwgQ1BBUiAgICAgICAgIFBBICAgICAgICAgICAgTExfRE1BX0dldFBlcmlwaEFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DUEFSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IFNvdXJjZSBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkgb25seS4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1BBUiAgICAgICAgIFBBICAgICAgICAgICAgTExfRE1BX1NldE0yTVNyY0FkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE1lbW9yeUFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE0yTVNyY0FkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1lbW9yeUFkZHJlc3MpCit7CisgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DUEFSLCBNZW1vcnlBZGRyZXNzKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIE1lbW9yeSB0byBNZW1vcnkgRGVzdGluYXRpb24gYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIG9ubHkuCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENNQVIgICAgICAgICBNQSAgICAgICAgICAgIExMX0RNQV9TZXRNMk1Ec3RBZGRyZXNzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBNZW1vcnlBZGRyZXNzIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNMk1Ec3RBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBNZW1vcnlBZGRyZXNzKQoreworICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q01BUiwgTWVtb3J5QWRkcmVzcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IFNvdXJjZSBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkgb25seS4KKyAgKiBAcm10b2xsIENQQVIgICAgICAgICBQQSAgICAgICAgICAgIExMX0RNQV9HZXRNMk1TcmNBZGRyZXNzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE0yTVNyY0FkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q1BBUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgTWVtb3J5IHRvIE1lbW9yeSBEZXN0aW5hdGlvbiBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkgb25seS4KKyAgKiBAcm10b2xsIENNQVIgICAgICAgICBNQSAgICAgICAgICAgIExMX0RNQV9HZXRNMk1Ec3RBZGRyZXNzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE0yTURzdEFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q01BUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBETUEgcmVxdWVzdCBmb3IgRE1BIGluc3RhbmNlIG9uIENoYW5uZWwgeC4KKyAgKiBAbm90ZSAgIFBsZWFzZSByZWZlciB0byBSZWZlcmVuY2UgTWFudWFsIHRvIGdldCB0aGUgYXZhaWxhYmxlIG1hcHBpbmcgb2YgUmVxdWVzdCB2YWx1ZSBsaW5rIHRvIENoYW5uZWwgU2VsZWN0aW9uLgorICAqIEBybXRvbGwgQ1NFTFIgICAgICAgIEMxUyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3RcbgorICAqICAgICAgICAgQ1NFTFIgICAgICAgIEMyUyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3RcbgorICAqICAgICAgICAgQ1NFTFIgICAgICAgIEMzUyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3RcbgorICAqICAgICAgICAgQ1NFTFIgICAgICAgIEM0UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3RcbgorICAqICAgICAgICAgQ1NFTFIgICAgICAgIEM1UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3RcbgorICAqICAgICAgICAgQ1NFTFIgICAgICAgIEM2UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3RcbgorICAqICAgICAgICAgQ1NFTFIgICAgICAgIEM3UyAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3QKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIFBlcmlwaFJlcXVlc3QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0UGVyaXBoUmVxdWVzdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUmVxdWVzdCkKK3sKKyAgTU9ESUZZX1JFRygoKERNQV9SZXF1ZXN0X1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIERNQV9DU0VMUl9PRkZTRVQpKSktPkNTRUxSLAorICAgICAgICAgICAgIERNQV9DU0VMUl9DMVMgPDwgKChDaGFubmVsIC0gMVUpICogNFUpLCBSZXF1ZXN0IDw8IERNQV9QT1NJVElPTl9DU0VMUl9DWFMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBETUEgcmVxdWVzdCBmb3IgRE1BIGluc3RhbmNlIG9uIENoYW5uZWwgeC4KKyAgKiBAcm10b2xsIENTRUxSICAgICAgICBDMVMgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhSZXF1ZXN0XG4KKyAgKiAgICAgICAgIENTRUxSICAgICAgICBDMlMgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhSZXF1ZXN0XG4KKyAgKiAgICAgICAgIENTRUxSICAgICAgICBDM1MgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhSZXF1ZXN0XG4KKyAgKiAgICAgICAgIENTRUxSICAgICAgICBDNFMgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhSZXF1ZXN0XG4KKyAgKiAgICAgICAgIENTRUxSICAgICAgICBDNVMgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhSZXF1ZXN0XG4KKyAgKiAgICAgICAgIENTRUxSICAgICAgICBDNlMgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhSZXF1ZXN0XG4KKyAgKiAgICAgICAgIENTRUxSICAgICAgICBDN1MgICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhSZXF1ZXN0CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUkVRVUVTVF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9SRVFVRVNUXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1JFUVVFU1RfMTUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVCgoKERNQV9SZXF1ZXN0X1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIERNQV9DU0VMUl9PRkZTRVQpKSktPkNTRUxSLAorICAgICAgICAgICAgICAgICAgIERNQV9DU0VMUl9DMVMgPDwgKChDaGFubmVsIC0gMVUpICogNFUpKSA+PiBETUFfUE9TSVRJT05fQ1NFTFJfQ1hTKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGMSAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUYxKSA9PSAoRE1BX0lTUl9HSUYxKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDIgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjIgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kyKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGMikgPT0gKERNQV9JU1JfR0lGMikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAzIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUYzICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjMpID09IChETUFfSVNSX0dJRjMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNCBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGNCAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUY0KSA9PSAoRE1BX0lTUl9HSUY0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDUgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjUgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k1KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGNSkgPT0gKERNQV9JU1JfR0lGNSkpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNikKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNiBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGNiAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUY2KSA9PSAoRE1BX0lTUl9HSUY2KSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDcgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjcgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k3KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGNykgPT0gKERNQV9JU1JfR0lGNykpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDEgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGMSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMxCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUYxKSA9PSAoRE1BX0lTUl9UQ0lGMSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAyIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjIgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGMikgPT0gKERNQV9JU1JfVENJRjIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUYzICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMzKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjMpID09IChETUFfSVNSX1RDSUYzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDQgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGNCAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM0CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY0KSA9PSAoRE1BX0lTUl9UQ0lGNCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA1IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjUgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGNSkgPT0gKERNQV9JU1JfVENJRjUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGNiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM2CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY2KSA9PSAoRE1BX0lTUl9UQ0lGNikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQorLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjcgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGNykgPT0gKERNQV9JU1JfVENJRjcpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGMSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQxCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUYxKSA9PSAoRE1BX0lTUl9IVElGMSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAyIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGMiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUYyKSA9PSAoRE1BX0lTUl9IVElGMikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAzIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGMyAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUYzKSA9PSAoRE1BX0lTUl9IVElGMykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGNCAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ0CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUY0KSA9PSAoRE1BX0lTUl9IVElGNCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA1IGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBIVElGNSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0hUSUY1KSA9PSAoRE1BX0lTUl9IVElGNSkpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNikKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNiBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjYgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNikgPT0gKERNQV9JU1JfSFRJRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNyBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjcgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNykgPT0gKERNQV9JU1JfSFRJRjcpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjEgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGMSkgPT0gKERNQV9JU1JfVEVJRjEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMiB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUYyICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUyKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjIpID09IChETUFfSVNSX1RFSUYyKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDMgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGMyAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUYzKSA9PSAoRE1BX0lTUl9URUlGMykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjQgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGNCkgPT0gKERNQV9JU1JfVEVJRjQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNSB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY1ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU1KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjUpID09IChETUFfSVNSX1RFSUY1KSkgPyAxVUwgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw2KQorLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjYgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGNikgPT0gKERNQV9JU1JfVEVJRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNyB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY3ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU3KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjcpID09IChETUFfSVNSX1RFSUY3KSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAxIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGMSAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0kxCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0kxKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMiBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjIgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUYyKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDMgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUYzICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTMoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA0IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGNCAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k0CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0k0KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjUgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUY1KTsKK30KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNikKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGNiAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k2CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0k2KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjYpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNyBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjcgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUY3KTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjEgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEMxCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEMxKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUYxKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDIgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUYyICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAzICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGMyAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzMoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjQgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEM0CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEM0KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUY0KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDUgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY1ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGNSk7Cit9CisKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNiAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjYgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEM2CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEM2KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUY2KTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQorLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDcgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGNyk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDEgIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDSFRJRjEgICAgICAgIExMX0RNQV9DbGVhckZsYWdfSFQxCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfSFQxKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUYxKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDIgIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDSFRJRjIgICAgICAgIExMX0RNQV9DbGVhckZsYWdfSFQyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfSFQyKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUYyKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDMgIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDSFRJRjMgICAgICAgIExMX0RNQV9DbGVhckZsYWdfSFQzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfSFQzKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUYzKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDQgIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDSFRJRjQgICAgICAgIExMX0RNQV9DbGVhckZsYWdfSFQ0CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfSFQ0KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUY0KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDUgIGhhbGYgdHJhbnNmZXIgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDSFRJRjUgICAgICAgIExMX0RNQV9DbGVhckZsYWdfSFQ1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfSFQ1KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0hUSUY1KTsKK30KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNikKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNik7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNyk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDEgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVEVJRjEgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEUxCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEUxKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RFSUYxKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVEVJRjIgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEUyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEUyKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RFSUYyKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDMgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVEVJRjMgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEUzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEUzKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RFSUYzKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDQgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVEVJRjQgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEU0CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEU0KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RFSUY0KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVEVJRjUgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEU1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEU1KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RFSUY1KTsKK30KKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNikKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNik7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNykKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNyk7Cit9CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0RNQV9FbmFibGVJVF9UQworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0VuYWJsZUlUX1RDKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBTRVRfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwgRE1BX0NDUl9UQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgSFRJRSAgICAgICAgICBMTF9ETUFfRW5hYmxlSVRfSFQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVJVF9IVChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsIERNQV9DQ1JfSFRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRyYW5zZmVyIGVycm9yIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBURUlFICAgICAgICAgIExMX0RNQV9FbmFibGVJVF9URQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0VuYWJsZUlUX1RFKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBTRVRfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwgRE1BX0NDUl9URUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0RNQV9EaXNhYmxlSVRfVEMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9EaXNhYmxlSVRfVEMoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIENMRUFSX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsIERNQV9DQ1JfVENJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIYWxmIHRyYW5zZmVyIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBIVElFICAgICAgICAgIExMX0RNQV9EaXNhYmxlSVRfSFQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9EaXNhYmxlSVRfSFQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIENMRUFSX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsIERNQV9DQ1JfSFRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgVEVJRSAgICAgICAgICBMTF9ETUFfRGlzYWJsZUlUX1RFCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUlUX1RFKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBDTEVBUl9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQXggKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpKS0+Q0NSLCBETUFfQ0NSX1RFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFRyYW5zZmVyIGNvbXBsZXRlIEludGVycnVwdCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRDSUUgICAgICAgICAgTExfRE1BX0lzRW5hYmxlZElUX1RDCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzRW5hYmxlZElUX1RDKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BeCArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9UQ0lFKSA9PSAoRE1BX0NDUl9UQ0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEhhbGYgdHJhbnNmZXIgSW50ZXJydXB0IGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgSFRJRSAgICAgICAgICBMTF9ETUFfSXNFbmFibGVkSVRfSFQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNFbmFibGVkSVRfSFQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX0hUSUUpID09IChETUFfQ0NSX0hUSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHJhbnNmZXIgZXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgVEVJRSAgICAgICAgICBMTF9ETUFfSXNFbmFibGVkSVRfVEUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNFbmFibGVkSVRfVEUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUF4ICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKSktPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1RFSUUpID09IChETUFfQ0NSX1RFSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCitFcnJvclN0YXR1cyBMTF9ETUFfSW5pdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9ETUFfRGVJbml0KERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKTsKK3ZvaWQgTExfRE1BX1N0cnVjdEluaXQoTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBETUExICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkwweHhfTExfRE1BX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfZXh0aS5oIGIvSW5jL3N0bTMybDB4eF9sbF9leHRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3NTkwYgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfbGxfZXh0aS5oCkBAIC0wLDAgKzEsMTAxNiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9leHRpLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEVYVEkgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkwweHhfTExfRVhUSV9ICisjZGVmaW5lIF9fU1RNMzJMMHh4X0xMX0VYVElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKEVYVEkpCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTCBFWFRJCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9Qcml2YXRlX01hY3JvcyBFWFRJIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FU19JTklUIEVYVEkgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICB1aW50MzJfdCBMaW5lXzBfMzE7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgRVhUSSBsaW5lcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAcmVmIEVYVElfTExfRUNfTElORSAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBMaW5lQ29tbWFuZDsgIC8qITwgU3BlY2lmaWVzIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEVYVEkgbGluZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCBlaXRoZXIgdG8gRU5BQkxFIG9yIERJU0FCTEUgKi8KKworICB1aW50OF90IE1vZGU7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbW9kZSBmb3IgdGhlIEVYVEkgbGluZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBFWFRJX0xMX0VDX01PREUuICovCisKKyAgdWludDhfdCBUcmlnZ2VyOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHRyaWdnZXIgc2lnbmFsIGFjdGl2ZSBlZGdlIGZvciB0aGUgRVhUSSBsaW5lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfTExfRUNfVFJJR0dFUi4gKi8KK30gTExfRVhUSV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEVYVEkgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VDX0xJTkUgTElORQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0VYVElfTElORV8wICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTAgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAwICovCisjZGVmaW5lIExMX0VYVElfTElORV8xICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTEgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxICovCisjZGVmaW5lIExMX0VYVElfTElORV8yICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTIgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyICovCisjZGVmaW5lIExMX0VYVElfTElORV8zICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTMgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzICovCisjZGVmaW5lIExMX0VYVElfTElORV80ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTQgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA0ICovCisjZGVmaW5lIExMX0VYVElfTElORV81ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTUgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA1ICovCisjZGVmaW5lIExMX0VYVElfTElORV82ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTYgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA2ICovCisjZGVmaW5lIExMX0VYVElfTElORV83ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTcgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA3ICovCisjZGVmaW5lIExMX0VYVElfTElORV84ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTggICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA4ICovCisjZGVmaW5lIExMX0VYVElfTElORV85ICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTkgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA5ICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMCAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTEwICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxMCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTEgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xMSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTEgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzEyICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMTIgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDEyICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMyAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTEzICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxMyAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTQgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xNCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTQgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE1ICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMTUgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDE1ICovCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTE2KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMTYgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xNiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTYgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9FWFRJX0xJTkVfMTcgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xNyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTcgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMTgpCisjZGVmaW5lIExMX0VYVElfTElORV8xOCAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTE4ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxOCAqLworI2VuZGlmCisjZGVmaW5lIExMX0VYVElfTElORV8xOSAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTE5ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxOSAqLworI2lmIGRlZmluZWQoRVhUSV9JTVJfSU0yMCkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzIwICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMjAgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDIwICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMjEpCisjZGVmaW5lIExMX0VYVElfTElORV8yMSAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTIxICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyMSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTIyKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjIgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yMiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjIgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjMgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yMyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjMgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMjQpCisjZGVmaW5lIExMX0VYVElfTElORV8yNCAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTI0ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyNCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTI1KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjUgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yNSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjUgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVJfSU0yNikKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI2ICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMjYgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDI2ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMjcpCisjZGVmaW5lIExMX0VYVElfTElORV8yNyAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTI3ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyNyAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTI4KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjggICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yOCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjggKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVJfSU0yOSkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI5ICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMjkgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDI5ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMzApCisjZGVmaW5lIExMX0VYVElfTElORV8zMCAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTMwICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzMCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTMxKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMzEgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0zMSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzEgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9FWFRJX0xJTkVfQUxMXzBfMzEgICAgICAgICAgRVhUSV9JTVJfSU0gICAgICAgICAgICAvKiE8IEFsbCBFeHRlbmRlZCBsaW5lIG5vdCByZXNlcnZlZCovCisKKworI2RlZmluZSBMTF9FWFRJX0xJTkVfQUxMICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRkZGVSkgIC8qITwgQWxsIEV4dGVuZGVkIGxpbmUgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfTk9ORSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgIC8qITwgTm9uZSBFeHRlbmRlZCBsaW5lICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKioKKyAgKiBAfQorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUNfTU9ERSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRVhUSV9NT0RFX0lUICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpIC8qITwgSW50ZXJydXB0IE1vZGUgKi8KKyNkZWZpbmUgTExfRVhUSV9NT0RFX0VWRU5UICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpIC8qITwgRXZlbnQgTW9kZSAqLworI2RlZmluZSBMTF9FWFRJX01PREVfSVRfRVZFTlQgICAgICAgICAgICgodWludDhfdCkweDAyVSkgLyohPCBJbnRlcnJ1cHQgJiBFdmVudCBNb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUNfVFJJR0dFUiBFZGdlIFRyaWdnZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfTk9ORSAgICAgICAgICAgICgodWludDhfdCkweDAwVSkgLyohPCBObyBUcmlnZ2VyIE1vZGUgKi8KKyNkZWZpbmUgTExfRVhUSV9UUklHR0VSX1JJU0lORyAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpIC8qITwgVHJpZ2dlciBSaXNpbmcgTW9kZSAqLworI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORyAgICAgICAgICgodWludDhfdCkweDAyVSkgLyohPCBUcmlnZ2VyIEZhbGxpbmcgTW9kZSAqLworI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkcgICgodWludDhfdCkweDAzVSkgLyohPCBUcmlnZ2VyIFJpc2luZyAmIEZhbGxpbmcgTW9kZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FeHBvcnRlZF9NYWNyb3MgRVhUSSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBFWFRJIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9FWFRJX1dyaXRlUmVnKF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKEVYVEktPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBFWFRJIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0VYVElfUmVhZFJlZyhfX1JFR19fKSBSRUFEX1JFRyhFWFRJLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgRVhUSSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoZSByZXNldCB2YWx1ZSBmb3IgdGhlIGRpcmVjdCBvciBpbnRlcm5hbCBsaW5lcyAoc2VlIFJNKQorICAqICAgICAgIGlzIHNldCB0byAxIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGJ5IGRlZmF1bHQuCisgICogICAgICAgQml0cyBhcmUgc2V0IGF1dG9tYXRpY2FsbHkgYXQgUG93ZXIgb24uCisgICogQHJtdG9sbCBJTVIgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfRW5hYmxlSVRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPklNUiwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3Qgb3IgaW50ZXJuYWwgbGluZXMgKHNlZSBSTSkKKyAgKiAgICAgICBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0LgorICAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLgorICAqIEBybXRvbGwgSU1SICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+SU1SLCBFeHRpTGluZSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhlIHJlc2V0IHZhbHVlIGZvciB0aGUgZGlyZWN0IG9yIGludGVybmFsIGxpbmVzIChzZWUgUk0pCisgICogICAgICAgaXMgc2V0IHRvIDEgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYnkgZGVmYXVsdC4KKyAgKiAgICAgICBCaXRzIGFyZSBzZXQgYXV0b21hdGljYWxseSBhdCBQb3dlciBvbi4KKyAgKiBAcm10b2xsIElNUiAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRJVF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKFJFQURfQklUKEVYVEktPklNUiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9FdmVudF9NYW5hZ2VtZW50IEV2ZW50X01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQHJtdG9sbCBFTVIgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPkVNUiwgRXh0aUxpbmUpOworCit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIEVNUiAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlRXZlbnRfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgQ0xFQVJfQklUKEVYVEktPkVNUiwgRXh0aUxpbmUpOworfQorCisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQHJtdG9sbCBFTVIgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkRXZlbnRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkRXZlbnRfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChFWFRJLT5FTVIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKTsKKworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9SaXNpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50IFJpc2luZ19UcmlnZ2VyX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSByaXNpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfUlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlRTUiAgICAgICAgUlR4ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPlJUU1IsIEV4dGlMaW5lKTsKKworfQorCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSByaXNpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfUlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlRTUiAgICAgICAgUlR4ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIENMRUFSX0JJVChFWFRJLT5SVFNSLCBFeHRpTGluZSk7CisKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHJpc2luZyBlZGdlIHRyaWdnZXIgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBybXRvbGwgUlRTUiAgICAgICAgUlR4ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZFJpc2luZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZFJpc2luZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChFWFRJLT5SVFNSLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0ZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50IEZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgRmFsbGluZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGUgY29uZmlndXJhYmxlIHdha2V1cCBsaW5lcyBhcmUgZWRnZS10cmlnZ2VyZWQuIE5vIGdsaXRjaCBtdXN0IGJlCisgICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIGZhbGxpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfRlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgRlRTUiAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+RlRTUiwgRXh0aUxpbmUpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBGYWxsaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgRmFsbGluZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdAorICAqICAgICAgIGxpbmUgb2NjdXJzIGR1cmluZyBhIHdyaXRlIG9wZXJhdGlvbiBpbiB0aGUgRVhUSV9GVFNSIHJlZ2lzdGVyLCB0aGUKKyAgKiAgICAgICBwZW5kaW5nIGJpdCBpcyBub3Qgc2V0LgorICAqICAgICAgIFJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJzIGNhbiBiZSBzZXQgZm9yIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLgorICAqICAgICAgIEluIHRoaXMgY2FzZSwgYm90aCBnZW5lcmF0ZSBhIHRyaWdnZXIgY29uZGl0aW9uLgorICAqIEBybXRvbGwgRlRTUiAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgQ0xFQVJfQklUKEVYVEktPkZUU1IsIEV4dGlMaW5lKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIEZUU1IgICAgICAgIEZUeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRGYWxsaW5nVHJpZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkRmFsbGluZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChFWFRJLT5GVFNSLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX1NvZnR3YXJlX0ludGVycnVwdF9NYW5hZ2VtZW50IFNvZnR3YXJlX0ludGVycnVwdF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIEludGVycnVwdCBFdmVudCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIElmIHRoZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvbiB0aGlzIGxpbmUgaW4gdGhlIEVYVElfSU1SLCB3cml0aW5nIGEgMSB0bworICAqICAgICAgIHRoaXMgYml0IHdoZW4gaXQgaXMgYXQgJzAnIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgcGVuZGluZyBiaXQgaW4gRVhUSV9QUgorICAqICAgICAgIHJlc3VsdGluZyBpbiBhbiBpbnRlcnJ1cHQgcmVxdWVzdCBnZW5lcmF0aW9uLgorICAqICAgICAgIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgY2xlYXJpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBFWFRJX1BSCisgICogICAgICAgcmVnaXN0ZXIgKGJ5IHdyaXRpbmcgYSAxIGludG8gdGhlIGJpdCkKKyAgKiBAcm10b2xsIFNXSUVSICAgICAgIFNXSXggICAgICAgICAgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPlNXSUVSLCBFeHRpTGluZSk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0ZsYWdfTWFuYWdlbWVudCBGbGFnX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBFeHRMaW5lIEZsYWcgaXMgc2V0IG9yIG5vdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4KKyAgKiBAcm10b2xsIFBSICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfSXNBY3RpdmVGbGFnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0FjdGl2ZUZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChFWFRJLT5QUiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpOworfQorCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBFeHRMaW5lIENvbWJpbmF0aW9uIEZsYWcgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lLiBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQuCisgICogQHJtdG9sbCBQUiAgICAgICAgICBQSUZ4ICAgICAgICAgICBMTF9FWFRJX1JlYWRGbGFnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX1JlYWRGbGFnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEVYVEktPlBSLCBFeHRpTGluZSkpOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgRXh0TGluZSBGbGFncyAgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lLiBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQuCisgICogQHJtdG9sbCBQUiAgICAgICAgICBQSUZ4ICAgICAgICAgICBMTF9FWFRJX0NsZWFyRmxhZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9DbGVhckZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgV1JJVEVfUkVHKEVYVEktPlBSLCBFeHRpTGluZSk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK3VpbnQzMl90IExMX0VYVElfSW5pdChMTF9FWFRJX0luaXRUeXBlRGVmICpFWFRJX0luaXRTdHJ1Y3QpOwordWludDMyX3QgTExfRVhUSV9EZUluaXQodm9pZCk7Cit2b2lkIExMX0VYVElfU3RydWN0SW5pdChMTF9FWFRJX0luaXRUeXBlRGVmICpFWFRJX0luaXRTdHJ1Y3QpOworCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBFWFRJICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9MTF9FWFRJX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfZ3Bpby5oIGIvSW5jL3N0bTMybDB4eF9sbF9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2ZTczMgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfbGxfZ3Bpby5oCkBAIC0wLDAgKzEsOTQzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX2dwaW8uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgR1BJTyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9MTF9HUElPX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfTExfR1BJT19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoR1BJT0EpIHx8IGRlZmluZWQgKEdQSU9CKSB8fCBkZWZpbmVkIChHUElPQykgfHwgZGVmaW5lZCAoR1BJT0QpIHx8IGRlZmluZWQgKEdQSU9FKSB8fCBkZWZpbmVkIChHUElPSCkKKworLyoqIEBkZWZncm91cCBHUElPX0xMIEdQSU8KKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBHUElPX0xMX1ByaXZhdGVfTWFjcm9zIEdQSU8gUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FU19JTklUIEdQSU8gRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIExMIEdQSU8gSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUGluOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgR1BJTyBwaW5zIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19QSU4gKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpbk1vZGUoKS4qLworCisgIHVpbnQzMl90IFNwZWVkOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNwZWVkIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19TUEVFRC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpblNwZWVkKCkuKi8KKworICB1aW50MzJfdCBPdXRwdXRUeXBlOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgb3V0cHV0IHR5cGUgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX09VVFBVVC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUoKS4qLworCisgIHVpbnQzMl90IFB1bGw7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBQdWxsLXVwL1B1bGwgZG93biBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfUFVMTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpblB1bGwoKS4qLworCisgIHVpbnQzMl90IEFsdGVybmF0ZTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFBlcmlwaGVyYWwgdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX0FGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0dQSU9fU2V0QUZQaW5fMF83KCkgYW5kIExMX0dQSU9fU2V0QUZQaW5fOF8xNSgpLiovCit9IExMX0dQSU9fSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEdQSU8gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX1BJTiBQSU4KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9HUElPX1BJTl8wICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18wIC8qITwgU2VsZWN0IHBpbiAwICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzEgLyohPCBTZWxlY3QgcGluIDEgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMiAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfMiAvKiE8IFNlbGVjdCBwaW4gMiAqLworI2RlZmluZSBMTF9HUElPX1BJTl8zICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18zIC8qITwgU2VsZWN0IHBpbiAzICovCisjZGVmaW5lIExMX0dQSU9fUElOXzQgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzQgLyohPCBTZWxlY3QgcGluIDQgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fNSAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfNSAvKiE8IFNlbGVjdCBwaW4gNSAqLworI2RlZmluZSBMTF9HUElPX1BJTl82ICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU182IC8qITwgU2VsZWN0IHBpbiA2ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzcgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzcgLyohPCBTZWxlY3QgcGluIDcgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fOCAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfOCAvKiE8IFNlbGVjdCBwaW4gOCAqLworI2RlZmluZSBMTF9HUElPX1BJTl85ICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU185IC8qITwgU2VsZWN0IHBpbiA5ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEwICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzEwIC8qITwgU2VsZWN0IHBpbiAxMCAqLworI2RlZmluZSBMTF9HUElPX1BJTl8xMSAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18xMSAvKiE8IFNlbGVjdCBwaW4gMTEgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTIgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfMTIgLyohPCBTZWxlY3QgcGluIDEyICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEzICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzEzIC8qITwgU2VsZWN0IHBpbiAxMyAqLworI2RlZmluZSBMTF9HUElPX1BJTl8xNCAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18xNCAvKiE8IFNlbGVjdCBwaW4gMTQgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTUgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfMTUgLyohPCBTZWxlY3QgcGluIDE1ICovCisjZGVmaW5lIExMX0dQSU9fUElOX0FMTCAgICAgICAgICAgICAgICAgICAgKEdQSU9fQlNSUl9CU18wIHwgR1BJT19CU1JSX0JTXzEgIHwgR1BJT19CU1JSX0JTXzIgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18zICB8IEdQSU9fQlNSUl9CU180ICB8IEdQSU9fQlNSUl9CU181ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfNiAgfCBHUElPX0JTUlJfQlNfNyAgfCBHUElPX0JTUlJfQlNfOCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTXzkgIHwgR1BJT19CU1JSX0JTXzEwIHwgR1BJT19CU1JSX0JTXzExIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CU18xMiB8IEdQSU9fQlNSUl9CU18xMyB8IEdQSU9fQlNSUl9CU18xNCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlNfMTUpIC8qITwgU2VsZWN0IGFsbCBwaW5zICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfTU9ERSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19NT0RFX0lOUFVUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFNlbGVjdCBpbnB1dCBtb2RlICovCisjZGVmaW5lIExMX0dQSU9fTU9ERV9PVVRQVVQgICAgICAgICAgICAgICAgR1BJT19NT0RFUl9NT0RFMF8wICAvKiE8IFNlbGVjdCBvdXRwdXQgbW9kZSAqLworI2RlZmluZSBMTF9HUElPX01PREVfQUxURVJOQVRFICAgICAgICAgICAgIEdQSU9fTU9ERVJfTU9ERTBfMSAgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgKi8KKyNkZWZpbmUgTExfR1BJT19NT0RFX0FOQUxPRyAgICAgICAgICAgICAgICBHUElPX01PREVSX01PREUwICAgIC8qITwgU2VsZWN0IGFuYWxvZyBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfT1VUUFVUIE91dHB1dCBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFNlbGVjdCBwdXNoLXB1bGwgYXMgb3V0cHV0IHR5cGUgKi8KKyNkZWZpbmUgTExfR1BJT19PVVRQVVRfT1BFTkRSQUlOICAgICAgICAgICBHUElPX09UWVBFUl9PVF8wIC8qITwgU2VsZWN0IG9wZW4tZHJhaW4gYXMgb3V0cHV0IHR5cGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19TUEVFRCBPdXRwdXQgU3BlZWQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpIC8qITwgU2VsZWN0IEkvTyBsb3cgb3V0cHV0IHNwZWVkICAgICovCisjZGVmaW5lIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0gICAgICAgICAgR1BJT19PU1BFRURFUl9PU1BFRUQwXzAgLyohPCBTZWxlY3QgSS9PIG1lZGl1bSBvdXRwdXQgc3BlZWQgKi8KKyNkZWZpbmUgTExfR1BJT19TUEVFRF9GUkVRX0hJR0ggICAgICAgICAgICBHUElPX09TUEVFREVSX09TUEVFRDBfMSAvKiE8IFNlbGVjdCBJL08gZmFzdCBvdXRwdXQgc3BlZWQgICAqLworI2RlZmluZSBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdIICAgICAgIEdQSU9fT1NQRUVERVJfT1NQRUVEMCAgIC8qITwgU2VsZWN0IEkvTyBoaWdoIG91dHB1dCBzcGVlZCAgICovCisvKioKKyAgKiBAfQorICAqLworI2RlZmluZSBMTF9HUElPX1NQRUVEX0xPVyAgICAgICAgICAgICAgICAgIExMX0dQSU9fU1BFRURfRlJFUV9MT1cKKyNkZWZpbmUgTExfR1BJT19TUEVFRF9NRURJVU0gICAgICAgICAgICAgICBMTF9HUElPX1NQRUVEX0ZSRVFfTUVESVVNCisjZGVmaW5lIExMX0dQSU9fU1BFRURfRkFTVCAgICAgICAgICAgICAgICAgTExfR1BJT19TUEVFRF9GUkVRX0hJR0gKKyNkZWZpbmUgTExfR1BJT19TUEVFRF9ISUdIICAgICAgICAgICAgICAgICBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19QVUxMIFB1bGwgVXAgUHVsbCBEb3duCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19QVUxMX05PICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IFNlbGVjdCBJL08gbm8gcHVsbCAqLworI2RlZmluZSBMTF9HUElPX1BVTExfVVAgICAgICAgICAgICAgICAgICAgIEdQSU9fUFVQRFJfUFVQRDBfMCAvKiE8IFNlbGVjdCBJL08gcHVsbCB1cCAqLworI2RlZmluZSBMTF9HUElPX1BVTExfRE9XTiAgICAgICAgICAgICAgICAgIEdQSU9fUFVQRFJfUFVQRDBfMSAvKiE8IFNlbGVjdCBJL08gcHVsbCBkb3duICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfQUYgQWx0ZXJuYXRlIEZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19BRl8wICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAwICovCisjZGVmaW5lIExMX0dQSU9fQUZfMSAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDFVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMSAqLworI2RlZmluZSBMTF9HUElPX0FGXzIgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyVSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDIgKi8KKyNkZWZpbmUgTExfR1BJT19BRl8zICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwM1UpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAzICovCisjZGVmaW5lIExMX0dQSU9fQUZfNCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDRVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gNCAqLworI2RlZmluZSBMTF9HUElPX0FGXzUgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA1VSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDUgKi8KKyNkZWZpbmUgTExfR1BJT19BRl82ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNlUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA2ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNyAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDdVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gNyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FeHBvcnRlZF9NYWNyb3MgR1BJTyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBHUElPIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gR1BJTyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEdQSU8gcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBHUElPIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0dQSU9fUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEdQSU8gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VGX1BvcnRfQ29uZmlndXJhdGlvbiBQb3J0IENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIG1vZGUgZm9yIGEgZGVkaWNhdGVkIHBpbiBvbiBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIEkvTyBtb2RlIGNhbiBiZSBJbnB1dCBtb2RlLCBHZW5lcmFsIHB1cnBvc2Ugb3V0cHV0LCBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBvciBBbmFsb2cuCisgICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBNT0RFUiAgICAgICAgTU9ERXkgICAgICAgICBMTF9HUElPX1NldFBpbk1vZGUKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9JTlBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9PVVRQVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQUxURVJOQVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0FOQUxPRworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRQaW5Nb2RlKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwgdWludDMyX3QgTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhHUElPeC0+TU9ERVIsICgoUGluICogUGluKSAqIEdQSU9fTU9ERVJfTU9ERTApLCAoKFBpbiAqIFBpbikgKiBNb2RlKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGdwaW8gbW9kZSBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgSS9PIG1vZGUgY2FuIGJlIElucHV0IG1vZGUsIEdlbmVyYWwgcHVycG9zZSBvdXRwdXQsIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9yIEFuYWxvZy4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIE1PREVSICAgICAgICBNT0RFeSAgICAgICAgIExMX0dQSU9fR2V0UGluTW9kZQorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9JTlBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9PVVRQVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQUxURVJOQVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0FOQUxPRworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0UGluTW9kZShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5NT0RFUiwgKChQaW4gKiBQaW4pICogR1BJT19NT0RFUl9NT0RFMCkpIC8gKFBpbiAqIFBpbikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIG91dHB1dCB0eXBlIGZvciBzZXZlcmFsIHBpbnMgb24gZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBPdXRwdXQgdHlwZSBhcyB0byBiZSBzZXQgd2hlbiBncGlvIHBpbiBpcyBpbiBvdXRwdXQgb3IKKyAgKiAgICAgICAgIGFsdGVybmF0ZSBtb2Rlcy4gUG9zc2libGUgdHlwZSBhcmUgUHVzaC1wdWxsIG9yIE9wZW4tZHJhaW4uCisgICogQHJtdG9sbCBPVFlQRVIgICAgICAgT1R5ICAgICAgICAgICBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHBhcmFtICBPdXRwdXRUeXBlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX09VVFBVVF9PUEVORFJBSU4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluT3V0cHV0VHlwZShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrLCB1aW50MzJfdCBPdXRwdXRUeXBlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5PVFlQRVIsIFBpbk1hc2ssIChQaW5NYXNrICogT3V0cHV0VHlwZSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBncGlvIG91dHB1dCB0eXBlIGZvciBzZXZlcmFsIHBpbnMgb24gZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBPdXRwdXQgdHlwZSBhcyB0byBiZSBzZXQgd2hlbiBncGlvIHBpbiBpcyBpbiBvdXRwdXQgb3IKKyAgKiAgICAgICAgIGFsdGVybmF0ZSBtb2Rlcy4gUG9zc2libGUgdHlwZSBhcmUgUHVzaC1wdWxsIG9yIE9wZW4tZHJhaW4uCisgICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBPVFlQRVIgICAgICAgT1R5ICAgICAgICAgICBMTF9HUElPX0dldFBpbk91dHB1dFR5cGUKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX09VVFBVVF9QVVNIUFVMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fT1VUUFVUX09QRU5EUkFJTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0UGluT3V0cHV0VHlwZShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5PVFlQRVIsIFBpbikgLyBQaW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIHNwZWVkIGZvciBhIGRlZGljYXRlZCBwaW4gb24gZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBJL08gc3BlZWQgY2FuIGJlIExvdywgTWVkaXVtLCBGYXN0IG9yIEhpZ2ggc3BlZWQuCisgICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICogQG5vdGUgICBSZWZlciB0byBkYXRhc2hlZXQgZm9yIGZyZXF1ZW5jeSBzcGVjaWZpY2F0aW9ucyBhbmQgdGhlIHBvd2VyCisgICogICAgICAgICBzdXBwbHkgYW5kIGxvYWQgY29uZGl0aW9ucyBmb3IgZWFjaCBzcGVlZC4KKyAgKiBAcm10b2xsIE9TUEVFRFIgICAgICBPU1BFRUR5ICAgICAgIExMX0dQSU9fU2V0UGluU3BlZWQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqIEBwYXJhbSAgU3BlZWQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX01FRElVTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRQaW5TcGVlZChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sIHVpbnQzMl90ICBTcGVlZCkKK3sKKyAgTU9ESUZZX1JFRyhHUElPeC0+T1NQRUVEUiwgKChQaW4gKiBQaW4pICogR1BJT19PU1BFRURFUl9PU1BFRUQwKSwgKChQaW4gKiBQaW4pICogU3BlZWQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBzcGVlZCBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgSS9PIHNwZWVkIGNhbiBiZSBMb3csIE1lZGl1bSwgRmFzdCBvciBIaWdoIHNwZWVkLgorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBub3RlICAgUmVmZXIgdG8gZGF0YXNoZWV0IGZvciBmcmVxdWVuY3kgc3BlY2lmaWNhdGlvbnMgYW5kIHRoZSBwb3dlcgorICAqICAgICAgICAgc3VwcGx5IGFuZCBsb2FkIGNvbmRpdGlvbnMgZm9yIGVhY2ggc3BlZWQuCisgICogQHJtdG9sbCBPU1BFRURSICAgICAgT1NQRUVEeSAgICAgICBMTF9HUElPX0dldFBpblNwZWVkCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpblNwZWVkKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPk9TUEVFRFIsICgoUGluICogUGluKSAqIEdQSU9fT1NQRUVERVJfT1NQRUVEMCkpIC8gKFBpbiAqIFBpbikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIHB1bGwtdXAgb3IgcHVsbC1kb3duIGZvciBhIGRlZGljYXRlZCBwaW4gb24gYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFBVUERSICAgICAgICBQVVBEeSAgICAgICAgIExMX0dQSU9fU2V0UGluUHVsbAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBQdWxsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX05PCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX0RPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluUHVsbChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sIHVpbnQzMl90IFB1bGwpCit7CisgIE1PRElGWV9SRUcoR1BJT3gtPlBVUERSLCAoKFBpbiAqIFBpbikgKiBHUElPX1BVUERSX1BVUEQwKSwgKChQaW4gKiBQaW4pICogUHVsbCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBncGlvIHB1bGwtdXAgb3IgcHVsbC1kb3duIGZvciBhIGRlZGljYXRlZCBwaW4gb24gYSBkZWRpY2F0ZWQgcG9ydAorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgUFVQRFIgICAgICAgIFBVUER5ICAgICAgICAgTExfR1BJT19HZXRQaW5QdWxsCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX05PCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX0RPV04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpblB1bGwoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChHUElPeC0+UFVQRFIsICgoUGluICogUGluKSAqIEdQSU9fUFVQRFJfUFVQRDApKSAvIChQaW4gKiBQaW4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gb2YgYSBkZWRpY2F0ZWQgcGluIGZyb20gMCB0byA3IGZvciBhIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgUG9zc2libGUgdmFsdWVzIGFyZSBmcm9tIEFGMCB0byBBRjcgZGVwZW5kaW5nIG9uIHRhcmdldC4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIEFGUkwgICAgICAgICBBRlNFTHkgICAgICAgIExMX0dQSU9fU2V0QUZQaW5fMF83CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogQHBhcmFtICBBbHRlcm5hdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0QUZQaW5fMF83KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwgdWludDMyX3QgQWx0ZXJuYXRlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5BRlJbMF0sICgoKChQaW4gKiBQaW4pICogUGluKSAqIFBpbikgKiBHUElPX0FGUkxfQUZTRUwwKSwKKyAgICAgICAgICAgICAoKCgoUGluICogUGluKSAqIFBpbikgKiBQaW4pICogQWx0ZXJuYXRlKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGdwaW8gYWx0ZXJuYXRlIGZ1bmN0aW9uIG9mIGEgZGVkaWNhdGVkIHBpbiBmcm9tIDAgdG8gNyBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAcm10b2xsIEFGUkwgICAgICAgICBBRlNFTHkgICAgICAgIExMX0dQSU9fR2V0QUZQaW5fMF83CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0QUZQaW5fMF83KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPkFGUlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKFBpbiAqIFBpbikgKiBQaW4pICogUGluKSAqIEdQSU9fQUZSTF9BRlNFTDApKSAvICgoKFBpbiAqIFBpbikgKiBQaW4pICogUGluKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGdwaW8gYWx0ZXJuYXRlIGZ1bmN0aW9uIG9mIGEgZGVkaWNhdGVkIHBpbiBmcm9tIDggdG8gMTUgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gQUYwIHRvIEFGNyBkZXBlbmRpbmcgb24gdGFyZ2V0LgorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgQUZSSCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19TZXRBRlBpbl84XzE1CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBBbHRlcm5hdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0QUZQaW5fOF8xNShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sIHVpbnQzMl90IEFsdGVybmF0ZSkKK3sKKyAgTU9ESUZZX1JFRyhHUElPeC0+QUZSWzFdLCAoKCgoKFBpbiA+PiA4VSkgKiAoUGluID4+IDhVKSkgKiAoUGluID4+IDhVKSkgKiAoUGluID4+IDhVKSkgKiBHUElPX0FGUkhfQUZTRUw4KSwKKyAgICAgICAgICAgICAoKCgoKFBpbiA+PiA4VSkgKiAoUGluID4+IDhVKSkgKiAoUGluID4+IDhVKSkgKiAoUGluID4+IDhVKSkgKiBBbHRlcm5hdGUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gb2YgYSBkZWRpY2F0ZWQgcGluIGZyb20gOCB0byAxNSBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIFBvc3NpYmxlIHZhbHVlcyBhcmUgZnJvbSBBRjAgdG8gQUY3IGRlcGVuZGluZyBvbiB0YXJnZXQuCisgICogQHJtdG9sbCBBRlJIICAgICAgICAgQUZTRUx5ICAgICAgICBMTF9HUElPX0dldEFGUGluXzhfMTUKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl83CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRBRlBpbl84XzE1KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPkFGUlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKChQaW4gPj4gOFUpICogKFBpbiA+PiA4VSkpICogKFBpbiA+PiA4VSkpICogKFBpbiA+PiA4VSkpICogR1BJT19BRlJIX0FGU0VMOCkpIC8gKCgoKFBpbiA+PiA4VSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBpbiA+PiA4VSkpICogKFBpbiA+PiA4VSkpICogKFBpbiA+PiA4VSkpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIExvY2sgY29uZmlndXJhdGlvbiBvZiBzZXZlcmFsIHBpbnMgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBXaGVuIHRoZSBsb2NrIHNlcXVlbmNlIGhhcyBiZWVuIGFwcGxpZWQgb24gYSBwb3J0IGJpdCwgdGhlCisgICogICAgICAgICB2YWx1ZSBvZiB0aGlzIHBvcnQgYml0IGNhbiBubyBsb25nZXIgYmUgbW9kaWZpZWQgdW50aWwgdGhlCisgICogICAgICAgICBuZXh0IHJlc2V0LgorICAqIEBub3RlICAgRWFjaCBsb2NrIGJpdCBmcmVlemVzIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiByZWdpc3RlcgorICAqICAgICAgICAgKGNvbnRyb2wgYW5kIGFsdGVybmF0ZSBmdW5jdGlvbiByZWdpc3RlcnMpLgorICAqIEBybXRvbGwgTENLUiAgICAgICAgIExDS0sgICAgICAgICAgTExfR1BJT19Mb2NrUGluCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19Mb2NrUGluKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbk1hc2spCit7CisgIF9fSU8gdWludDMyX3QgdGVtcDsKKyAgV1JJVEVfUkVHKEdQSU94LT5MQ0tSLCBHUElPX0xDS1JfTENLSyB8IFBpbk1hc2spOworICBXUklURV9SRUcoR1BJT3gtPkxDS1IsIFBpbk1hc2spOworICBXUklURV9SRUcoR1BJT3gtPkxDS1IsIEdQSU9fTENLUl9MQ0tLIHwgUGluTWFzayk7CisgIHRlbXAgPSBSRUFEX1JFRyhHUElPeC0+TENLUik7CisgICh2b2lkKSB0ZW1wOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiAxIGlmIGFsbCBwaW5zIHBhc3NlZCBhcyBwYXJhbWV0ZXIsIG9mIGEgZGVkaWNhdGVkIHBvcnQsIGFyZSBsb2NrZWQuIGVsc2UgUmV0dXJuIDAuCisgICogQHJtdG9sbCBMQ0tSICAgICAgICAgTENLeSAgICAgICAgICBMTF9HUElPX0lzUGluTG9ja2VkCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNQaW5Mb2NrZWQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaykKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChHUElPeC0+TENLUiwgUGluTWFzaykgPT0gKFBpbk1hc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gMSBpZiBvbmUgb2YgdGhlIHBpbiBvZiBhIGRlZGljYXRlZCBwb3J0IGlzIGxvY2tlZC4gZWxzZSByZXR1cm4gMC4KKyAgKiBAcm10b2xsIExDS1IgICAgICAgICBMQ0tLICAgICAgICAgIExMX0dQSU9fSXNBbnlQaW5Mb2NrZWQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNBbnlQaW5Mb2NrZWQoR1BJT19UeXBlRGVmICpHUElPeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChHUElPeC0+TENLUiwgR1BJT19MQ0tSX0xDS0spID09IChHUElPX0xDS1JfTENLSykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUZfRGF0YV9BY2Nlc3MgRGF0YSBBY2Nlc3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBmdWxsIGlucHV0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQHJtdG9sbCBJRFIgICAgICAgICAgSUR5ICAgICAgICAgICBMTF9HUElPX1JlYWRJbnB1dFBvcnQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEByZXR2YWwgSW5wdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBvZiBwb3J0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19SZWFkSW5wdXRQb3J0KEdQSU9fVHlwZURlZiAqR1BJT3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKEdQSU94LT5JRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gaWYgaW5wdXQgZGF0YSBsZXZlbCBmb3Igc2V2ZXJhbCBwaW5zIG9mIGRlZGljYXRlZCBwb3J0IGlzIGhpZ2ggb3IgbG93LgorICAqIEBybXRvbGwgSURSICAgICAgICAgIElEeSAgICAgICAgICAgTExfR1BJT19Jc0lucHV0UGluU2V0CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNJbnB1dFBpblNldChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICByZXR1cm4gKFJFQURfQklUKEdQSU94LT5JRFIsIFBpbk1hc2spID09IChQaW5NYXNrKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgb3V0cHV0IGRhdGEgcmVnaXN0ZXIgZm9yIHRoZSBwb3J0LgorICAqIEBybXRvbGwgT0RSICAgICAgICAgIE9EeSAgICAgICAgICAgTExfR1BJT19Xcml0ZU91dHB1dFBvcnQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUG9ydFZhbHVlIExldmVsIHZhbHVlIGZvciBlYWNoIHBpbiBvZiB0aGUgcG9ydAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19Xcml0ZU91dHB1dFBvcnQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUG9ydFZhbHVlKQoreworICBXUklURV9SRUcoR1BJT3gtPk9EUiwgUG9ydFZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZnVsbCBvdXRwdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAcm10b2xsIE9EUiAgICAgICAgICBPRHkgICAgICAgICAgIExMX0dQSU9fUmVhZE91dHB1dFBvcnQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEByZXR2YWwgT3V0cHV0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgb2YgcG9ydAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fUmVhZE91dHB1dFBvcnQoR1BJT19UeXBlRGVmICpHUElPeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoR1BJT3gtPk9EUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBpZiBpbnB1dCBkYXRhIGxldmVsIGZvciBzZXZlcmFsIHBpbnMgb2YgZGVkaWNhdGVkIHBvcnQgaXMgaGlnaCBvciBsb3cuCisgICogQHJtdG9sbCBPRFIgICAgICAgICAgT0R5ICAgICAgICAgICBMTF9HUElPX0lzT3V0cHV0UGluU2V0CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNPdXRwdXRQaW5TZXQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaykKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChHUElPeC0+T0RSLCBQaW5NYXNrKSA9PSAoUGluTWFzaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBzZXZlcmFsIHBpbnMgdG8gaGlnaCBsZXZlbCBvbiBkZWRpY2F0ZWQgZ3BpbyBwb3J0LgorICAqIEBybXRvbGwgQlNSUiAgICAgICAgIEJTeSAgICAgICAgICAgTExfR1BJT19TZXRPdXRwdXRQaW4KKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldE91dHB1dFBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBXUklURV9SRUcoR1BJT3gtPkJTUlIsIFBpbk1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBzZXZlcmFsIHBpbnMgdG8gbG93IGxldmVsIG9uIGRlZGljYXRlZCBncGlvIHBvcnQuCisgICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJ5ICAgICAgICAgICBMTF9HUElPX1Jlc2V0T3V0cHV0UGluCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19SZXNldE91dHB1dFBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBXUklURV9SRUcoR1BJT3gtPkJSUiwgUGluTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVG9nZ2xlIGRhdGEgdmFsdWUgZm9yIHNldmVyYWwgcGluIG9mIGRlZGljYXRlZCBwb3J0LgorICAqIEBybXRvbGwgT0RSICAgICAgICAgIE9EeSAgICAgICAgICAgTExfR1BJT19Ub2dnbGVQaW4KKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBXUklURV9SRUcoR1BJT3gtPk9EUiwgUkVBRF9SRUcoR1BJT3gtPk9EUikgXiBQaW5NYXNrKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBHUElPX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0dQSU9fRGVJbml0KEdQSU9fVHlwZURlZiAqR1BJT3gpOworRXJyb3JTdGF0dXMgTExfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAqR1BJT3gsIExMX0dQSU9fSW5pdFR5cGVEZWYgKkdQSU9fSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9HUElPX1N0cnVjdEluaXQoTExfR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKEdQSU9BKSB8fCBkZWZpbmVkIChHUElPQikgfHwgZGVmaW5lZCAoR1BJT0MpIHx8IGRlZmluZWQgKEdQSU9EKSB8fCBkZWZpbmVkIChHUElPRSkgfHwgZGVmaW5lZCAoR1BJT0gpICovCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfTExfR1BJT19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2xsX2kyYy5oIGIvSW5jL3N0bTMybDB4eF9sbF9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmJlMTQwCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9sbF9pMmMuaApAQCAtMCwwICsxLDIyMjggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfaTJjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEkyQyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0xMX0kyQ19ICisjZGVmaW5lIFNUTTMyTDB4eF9MTF9JMkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKEkyQzEpIHx8IGRlZmluZWQgKEkyQzIpIHx8IGRlZmluZWQgKEkyQzMpCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMIEkyQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfTExfUHJpdmF0ZV9Db25zdGFudHMgSTJDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEkyQ19MTF9Qcml2YXRlX01hY3JvcyBJMkMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FU19JTklUIEkyQyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhlcmFsTW9kZTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGVyaXBoZXJhbCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0xMX0VDX1BFUklQSEVSQUxfTU9ERQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMkNfU2V0TW9kZSgpLiAqLworCisgIHVpbnQzMl90IFRpbWluZzsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTREEgc2V0dXAsIGhvbGQgdGltZSBhbmQgdGhlIFNDTCBoaWdoLCBsb3cgcGVyaW9kIHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIHNldCBieSByZWZlcnJpbmcgdG8gdGhlIFNUTTMyQ3ViZU1YIFRvb2wgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfSTJDX0NPTlZFUlRfVElNSU5HUygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyQ19TZXRUaW1pbmcoKS4gKi8KKworICB1aW50MzJfdCBBbmFsb2dGaWx0ZXI7ICAgICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgYW5hbG9nIG5vaXNlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19MTF9FQ19BTkFMT0dGSUxURVJfU0VMRUNUSU9OCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9JMkNfRW5hYmxlQW5hbG9nRmlsdGVyKCkgb3IgTExfSTJDX0Rpc2FibGVBbmFsb2dGaWx0ZXIoKS4gKi8KKworICB1aW50MzJfdCBEaWdpdGFsRmlsdGVyOyAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIGRpZ2l0YWwgbm9pc2UgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDBGCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyQ19TZXREaWdpdGFsRmlsdGVyKCkuICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczE7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRldmljZSBvd24gYWRkcmVzcyAxLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDNGRgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMkNfU2V0T3duQWRkcmVzczEoKS4gKi8KKworICB1aW50MzJfdCBUeXBlQWNrbm93bGVkZ2U7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgQUNLbm93bGVkZ2Ugb3IgTm9uIEFDS25vd2xlZGdlIGNvbmRpdGlvbiBhZnRlciB0aGUgYWRkcmVzcyByZWNlaXZlIG1hdGNoIGNvZGUgb3IgbmV4dCByZWNlaXZlZCBieXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0xMX0VDX0kyQ19BQ0tOT1dMRURHRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMkNfQWNrbm93bGVkZ2VOZXh0RGF0YSgpLiAqLworCisgIHVpbnQzMl90IE93bkFkZHJTaXplOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBkZXZpY2Ugb3duIGFkZHJlc3MgMSBzaXplICg3LWJpdCBvciAxMC1iaXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0xMX0VDX09XTkFERFJFU1MxCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyQ19TZXRPd25BZGRyZXNzMSgpLiAqLworfSBMTF9JMkNfSW5pdFR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBJMkMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9JMkNfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfSUNSX0FERFJDRiAgICAgICAgICAgICAgICAgICBJMkNfSUNSX0FERFJDRiAgICAgICAgICAvKiE8IEFkZHJlc3MgTWF0Y2hlZCBmbGFnICAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9OQUNLQ0YgICAgICAgICAgICAgICAgICAgSTJDX0lDUl9OQUNLQ0YgICAgICAgICAgLyohPCBOb3QgQWNrbm93bGVkZ2UgZmxhZyAgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfU1RPUENGICAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfU1RPUENGICAgICAgICAgIC8qITwgU3RvcCBkZXRlY3Rpb24gZmxhZyAgICAqLworI2RlZmluZSBMTF9JMkNfSUNSX0JFUlJDRiAgICAgICAgICAgICAgICAgICBJMkNfSUNSX0JFUlJDRiAgICAgICAgICAvKiE8IEJ1cyBlcnJvciBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9BUkxPQ0YgICAgICAgICAgICAgICAgICAgSTJDX0lDUl9BUkxPQ0YgICAgICAgICAgLyohPCBBcmJpdHJhdGlvbiBMb3N0IGZsYWcgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfT1ZSQ0YgICAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfT1ZSQ0YgICAgICAgICAgIC8qITwgT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnICAqLworI2RlZmluZSBMTF9JMkNfSUNSX1BFQ0NGICAgICAgICAgICAgICAgICAgICBJMkNfSUNSX1BFQ0NGICAgICAgICAgICAvKiE8IFBFQyBlcnJvciBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9USU1PVVRDRiAgICAgICAgICAgICAgICAgSTJDX0lDUl9USU1PVVRDRiAgICAgICAgLyohPCBUaW1lb3V0IGRldGVjdGlvbiBmbGFnICovCisjZGVmaW5lIExMX0kyQ19JQ1JfQUxFUlRDRiAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfQUxFUlRDRiAgICAgICAgIC8qITwgQWxlcnQgZmxhZyAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0kyQ19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9UWEUgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UWEUgICAgICAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5ICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX1RYSVMgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RYSVMgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGludGVycnVwdCBzdGF0dXMgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfUlhORSAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfUlhORSAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9BRERSICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BRERSICAgICAgICAgICAgLyohPCBBZGRyZXNzIG1hdGNoZWQgKHNsYXZlIG1vZGUpICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX05BQ0tGICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX05BQ0tGICAgICAgICAgICAvKiE8IE5vdCBBY2tub3dsZWRnZSByZWNlaXZlZCBmbGFnICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfU1RPUEYgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfU1RPUEYgICAgICAgICAgIC8qITwgU3RvcCBkZXRlY3Rpb24gZmxhZyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9UQyAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQyAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBDb21wbGV0ZSAobWFzdGVyIG1vZGUpICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX1RDUiAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RDUiAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIENvbXBsZXRlIFJlbG9hZCAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfQkVSUiAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQkVSUiAgICAgICAgICAgIC8qITwgQnVzIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9BUkxPICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BUkxPICAgICAgICAgICAgLyohPCBBcmJpdHJhdGlvbiBsb3N0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX09WUiAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX09WUiAgICAgICAgICAgICAvKiE8IE92ZXJydW4vVW5kZXJydW4gKHNsYXZlIG1vZGUpICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfUEVDRVJSICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfUEVDRVJSICAgICAgICAgIC8qITwgUEVDIEVycm9yIGluIHJlY2VwdGlvbiAoU01CdXMgbW9kZSkgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9USU1FT1VUICAgICAgICAgICAgICAgICAgSTJDX0lTUl9USU1FT1VUICAgICAgICAgLyohPCBUaW1lb3V0IGRldGVjdGlvbiBmbGFnIChTTUJ1cyBtb2RlKSAqLworI2RlZmluZSBMTF9JMkNfSVNSX0FMRVJUICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0FMRVJUICAgICAgICAgICAvKiE8IFNNQnVzIGFsZXJ0IChTTUJ1cyBtb2RlKSAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfQlVTWSAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQlVTWSAgICAgICAgICAgIC8qITwgQnVzIGJ1c3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0kyQ19SZWFkUmVnIGFuZCAgTExfSTJDX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19DUjFfVFhJRSAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVFhJRSAgICAgICAgICAgIC8qITwgVFggSW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfQ1IxX1JYSUUgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1JYSUUgICAgICAgICAgICAvKiE8IFJYIEludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0NSMV9BRERSSUUgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9BRERSSUUgICAgICAgICAgLyohPCBBZGRyZXNzIG1hdGNoIEludGVycnVwdCBlbmFibGUgKHNsYXZlIG9ubHkpICovCisjZGVmaW5lIExMX0kyQ19DUjFfTkFDS0lFICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfTkFDS0lFICAgICAgICAgIC8qITwgTm90IGFja25vd2xlZGdlIHJlY2VpdmVkIEludGVycnVwdCBlbmFibGUgICAqLworI2RlZmluZSBMTF9JMkNfQ1IxX1NUT1BJRSAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1NUT1BJRSAgICAgICAgICAvKiE8IFNUT1AgZGV0ZWN0aW9uIEludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0NSMV9UQ0lFICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9UQ0lFICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBDb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19DUjFfRVJSSUUgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfRVJSSUUgICAgICAgICAgIC8qITwgRXJyb3IgaW50ZXJydXB0cyBlbmFibGUgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfUEVSSVBIRVJBTF9NT0RFIFBlcmlwaGVyYWwgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX0kyQyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgSTJDIE1hc3RlciBvciBTbGF2ZSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfSE9TVCAgICAgICAgICAgICBJMkNfQ1IxX1NNQkhFTiAgICAgICAgICAgLyohPCBTTUJ1cyBIb3N0IGFkZHJlc3MgYWNrbm93bGVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0UgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IFNNQnVzIERldmljZSBkZWZhdWx0IG1vZGUgKERlZmF1bHQgYWRkcmVzcyBub3QgYWNrbm93bGVkZ2UpICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRV9BUlAgICAgICAgSTJDX0NSMV9TTUJERU4gICAgICAgICAgIC8qITwgU01CdXMgRGV2aWNlIERlZmF1bHQgYWRkcmVzcyBhY2tub3dsZWRnZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0FOQUxPR0ZJTFRFUl9TRUxFQ1RJT04gQW5hbG9nIEZpbHRlciBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfQU5BTE9HRklMVEVSX0VOQUJMRSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEFuYWxvZyBmaWx0ZXIgaXMgZW5hYmxlZC4gICovCisjZGVmaW5lIExMX0kyQ19BTkFMT0dGSUxURVJfRElTQUJMRSAgICAgICAgIEkyQ19DUjFfQU5GT0ZGICAgICAgICAgIC8qITwgQW5hbG9nIGZpbHRlciBpcyBkaXNhYmxlZC4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0FERFJFU1NJTkdfTU9ERSBNYXN0ZXIgQWRkcmVzc2luZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0FERFJFU1NJTkdfTU9ERV83QklUICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgTWFzdGVyIG9wZXJhdGVzIGluIDctYml0IGFkZHJlc3NpbmcgbW9kZS4gKi8KKyNkZWZpbmUgTExfSTJDX0FERFJFU1NJTkdfTU9ERV8xMEJJVCAgICAgICAgSTJDX0NSMl9BREQxMCAgICAgICAgICAgIC8qITwgTWFzdGVyIG9wZXJhdGVzIGluIDEwLWJpdCBhZGRyZXNzaW5nIG1vZGUuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX09XTkFERFJFU1MxIE93biBBZGRyZXNzIDEgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MxXzdCSVQgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBPd24gYWRkcmVzcyAxIGlzIGEgNy1iaXQgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MxXzEwQklUICAgICAgICAgICAgSTJDX09BUjFfT0ExTU9ERSAgICAgICAgLyohPCBPd24gYWRkcmVzcyAxIGlzIGEgMTAtYml0IGFkZHJlc3MuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX09XTkFERFJFU1MyIE93biBBZGRyZXNzIDIgTWFza3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTk9NQVNLICAgICAgICAgICBJMkNfT0FSMl9PQTJOT01BU0sgICAgICAvKiE8IE93biBBZGRyZXNzMiBObyBtYXNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swMSAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzAxICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbNzoyXSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDIgICAgICAgICAgIEkyQ19PQVIyX09BMk1BU0swMiAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzc6M10gYXJlIGNvbXBhcmVkLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzAzICAgICAgICAgICBJMkNfT0FSMl9PQTJNQVNLMDMgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3OjRdIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swNCAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzA0ICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbNzo1XSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDUgICAgICAgICAgIEkyQ19PQVIyX09BMk1BU0swNSAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzc6Nl0gYXJlIGNvbXBhcmVkLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA2ICAgICAgICAgICBJMkNfT0FSMl9PQTJNQVNLMDYgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3XSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swNyAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzA3ICAgICAgLyohPCBObyBjb21wYXJpc29uIGlzIGRvbmUuIEFsbCBBZGRyZXNzMiBhcmUgYWNrbm93bGVkZ2VkLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19JMkNfQUNLTk9XTEVER0UgQWNrbm93bGVkZ2UgR2VuZXJhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IEFDSyBpcyBzZW50IGFmdGVyIGN1cnJlbnQgcmVjZWl2ZWQgYnl0ZS4gKi8KKyNkZWZpbmUgTExfSTJDX05BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMl9OQUNLICAgICAgICAgICAgIC8qITwgTkFDSyBpcyBzZW50IGFmdGVyIGN1cnJlbnQgcmVjZWl2ZWQgYnl0ZS4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfQUREUlNMQVZFIFNsYXZlIEFkZHJlc3MgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0FERFJTTEFWRV83QklUICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgU2xhdmUgQWRkcmVzcyBpbiA3LWJpdC4gKi8KKyNkZWZpbmUgTExfSTJDX0FERFJTTEFWRV8xMEJJVCAgICAgICAgICAgICAgSTJDX0NSMl9BREQxMCAgICAgICAgICAgIC8qITwgU2xhdmUgQWRkcmVzcyBpbiAxMC1iaXQuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX1JFUVVFU1QgVHJhbnNmZXIgUmVxdWVzdCBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfUkVRVUVTVF9XUklURSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgcmVxdWVzdCBhIHdyaXRlIHRyYW5zZmVyLiAqLworI2RlZmluZSBMTF9JMkNfUkVRVUVTVF9SRUFEICAgICAgICAgICAgICAgICBJMkNfQ1IyX1JEX1dSTiAgICAgICAgICAgLyohPCBNYXN0ZXIgcmVxdWVzdCBhIHJlYWQgdHJhbnNmZXIuICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfTU9ERSBUcmFuc2ZlciBFbmQgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1JFTE9BRCAgICAgICAgICAgICAgICAgIEkyQ19DUjJfUkVMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBJMkMgUmVsb2FkIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9BVVRPRU5EICAgICAgICAgICAgICAgICBJMkNfQ1IyX0FVVE9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgSTJDIEF1dG9tYXRpYyBlbmQgbW9kZSB3aXRoIG5vIEhXIFBFQyBjb21wYXJpc29uLiAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU09GVEVORCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEkyQyBTb2Z0d2FyZSBlbmQgbW9kZSB3aXRoIG5vIEhXIFBFQyBjb21wYXJpc29uLiAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX1JFTE9BRCAgICAgICAgICAgIExMX0kyQ19NT0RFX1JFTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBTTUJVUyBBdXRvbWF0aWMgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19BVVRPRU5EX05PX1BFQyAgICBMTF9JMkNfTU9ERV9BVVRPRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgU01CVVMgQXV0b21hdGljIGVuZCBtb2RlIHdpdGggSFcgUEVDIGNvbXBhcmlzb24uICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfU09GVEVORF9OT19QRUMgICAgTExfSTJDX01PREVfU09GVEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIFNNQlVTIFNvZnR3YXJlIGVuZCBtb2RlIHdpdGggSFcgUEVDIGNvbXBhcmlzb24uICAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX0FVVE9FTkRfV0lUSF9QRUMgICh1aW50MzJfdCkoTExfSTJDX01PREVfQVVUT0VORCB8IEkyQ19DUjJfUEVDQllURSkgICAvKiE8IEVuYWJsZSBTTUJVUyBBdXRvbWF0aWMgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19TT0ZURU5EX1dJVEhfUEVDICAodWludDMyX3QpKExMX0kyQ19NT0RFX1NPRlRFTkQgfCBJMkNfQ1IyX1BFQ0JZVEUpICAgLyohPCBFbmFibGUgU01CVVMgU29mdHdhcmUgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0dFTkVSQVRFIFN0YXJ0IEFuZCBTdG9wIEdlbmVyYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfTk9TVEFSVFNUT1AgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERvbid0IEdlbmVyYXRlIFN0b3AgYW5kIFN0YXJ0IGNvbmRpdGlvbi4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1NUT1AgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBTdG9wIGNvbmRpdGlvbiAoU2l6ZSBzaG91bGQgYmUgc2V0IHRvIDApLiAgICAgICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9TVEFSVF9SRUFEICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUIHwgSTJDX0NSMl9SRF9XUk4pICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhdGUgU3RhcnQgZm9yIHJlYWQgcmVxdWVzdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFN0YXJ0IGZvciB3cml0ZSByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfN0JJVF9SRUFEICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1JEX1dSTikgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBSZXN0YXJ0IGZvciByZWFkIHJlcXVlc3QsIHNsYXZlIDdCaXQgYWRkcmVzcy4gICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzdCSVRfV1JJVEUgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhdGUgUmVzdGFydCBmb3Igd3JpdGUgcmVxdWVzdCwgc2xhdmUgN0JpdCBhZGRyZXNzLiAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF8xMEJJVF9SRUFEICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCB8IEkyQ19DUjJfUkRfV1JOIHwgSTJDX0NSMl9IRUFEMTBSKSAvKiE8IEdlbmVyYXRlIFJlc3RhcnQgZm9yIHJlYWQgcmVxdWVzdCwgc2xhdmUgMTBCaXQgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfMTBCSVRfV1JJVEUgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBSZXN0YXJ0IGZvciB3cml0ZSByZXF1ZXN0LCBzbGF2ZSAxMEJpdCBhZGRyZXNzLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19ESVJFQ1RJT04gUmVhZCBXcml0ZSBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfRElSRUNUSU9OX1dSSVRFICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBXcml0ZSB0cmFuc2ZlciByZXF1ZXN0IGJ5IG1hc3Rlciwgc2xhdmUgZW50ZXJzIHJlY2VpdmVyIG1vZGUuICAqLworI2RlZmluZSBMTF9JMkNfRElSRUNUSU9OX1JFQUQgICAgICAgICAgICAgICBJMkNfSVNSX0RJUiAgICAgICAgICAgICAgLyohPCBSZWFkIHRyYW5zZmVyIHJlcXVlc3QgYnkgbWFzdGVyLCBzbGF2ZSBlbnRlcnMgdHJhbnNtaXR0ZXIgbW9kZS4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfRE1BX1JFR19EQVRBIERNQSBSZWdpc3RlciBEYXRhCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0RNQV9SRUdfREFUQV9UUkFOU01JVCAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgR2V0IGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvciB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgTExfSTJDX0RNQV9SRUdfREFUQV9SRUNFSVZFICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgICAgIC8qITwgR2V0IGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvciByZWNlcHRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX1NNQlVTX1RJTUVPVVRBX01PREUgU01CdXMgVGltZW91dEEgTW9kZSBTQ0wgU0RBIFRpbWVvdXQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TQ0xfTE9XICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBUaW1lb3V0QSBpcyB1c2VkIHRvIGRldGVjdCBTQ0wgbG93IGxldmVsIHRpbWVvdXQuICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TREFfU0NMX0hJR0ggSTJDX1RJTUVPVVRSX1RJRExFICAgLyohPCBUaW1lb3V0QSBpcyB1c2VkIHRvIGRldGVjdCBib3RoIFNDTCBhbmQgU0RBIGhpZ2ggbGV2ZWwgdGltZW91dC4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfU01CVVNfVElNRU9VVF9TRUxFQ1RJT04gU01CdXMgVGltZW91dCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfU01CVVNfVElNRU9VVEEgICAgICAgICAgICAgICBJMkNfVElNRU9VVFJfVElNT1VURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZW91dEEgZW5hYmxlIGJpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX1NNQlVTX1RJTUVPVVRCICAgICAgICAgICAgICAgSTJDX1RJTUVPVVRSX1RFWFRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVvdXRCIChleHRlbmRlZCBjbG9jaykgZW5hYmxlIGJpdCAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19TTUJVU19BTExfVElNRU9VVCAgICAgICAgICAgICh1aW50MzJfdCkoSTJDX1RJTUVPVVRSX1RJTU9VVEVOIHwgSTJDX1RJTUVPVVRSX1RFWFRFTikgLyohPCBUaW1lb3V0QSBhbmQgVGltZW91dEIgKGV4dGVuZGVkIGNsb2NrKSBlbmFibGUgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0V4cG9ydGVkX01hY3JvcyBJMkMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBJMkMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJMkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0kyQ19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+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+PiBJMkNfVElNSU5HUl9TQ0xERUxfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgcGVyaXBoZXJhbCBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU01CSEVOICAgICAgICBMTF9JMkNfU2V0TW9kZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgU01CREVOICAgICAgICBMTF9JMkNfU2V0TW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBQZXJpcGhlcmFsTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX0kyQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0hPU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0VfQVJQCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0TW9kZShJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgUGVyaXBoZXJhbE1vZGUpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NNQkhFTiB8IEkyQ19DUjFfU01CREVOLCBQZXJpcGhlcmFsTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHBlcmlwaGVyYWwgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNNQkhFTiAgICAgICAgTExfSTJDX0dldE1vZGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFNNQkRFTiAgICAgICAgTExfSTJDX0dldE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9JMkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19IT1NUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfREVWSUNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfREVWSUNFX0FSUAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfU01CSEVOIHwgSTJDX0NSMV9TTUJERU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU01CdXMgYWxlcnQgKEhvc3Qgb3IgRGV2aWNlIG1vZGUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFNNQnVzIERldmljZSBtb2RlOgorICAqICAgICAgICAgLSBTTUJ1cyBBbGVydCBwaW4gaXMgZHJpdmVkIGxvdyBhbmQKKyAgKiAgICAgICAgICAgQWxlcnQgUmVzcG9uc2UgQWRkcmVzcyBIZWFkZXIgYWNrbm93bGVkZ2UgaXMgZW5hYmxlZC4KKyAgKiAgICAgICAgIFNNQnVzIEhvc3QgbW9kZToKKyAgKiAgICAgICAgIC0gU01CdXMgQWxlcnQgcGluIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFMRVJURU4gICAgICAgTExfSTJDX0VuYWJsZVNNQnVzQWxlcnQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZVNNQnVzQWxlcnQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FMRVJURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU01CdXMgYWxlcnQgKEhvc3Qgb3IgRGV2aWNlIG1vZGUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFNNQnVzIERldmljZSBtb2RlOgorICAqICAgICAgICAgLSBTTUJ1cyBBbGVydCBwaW4gaXMgbm90IGRyaXZlZCAoY2FuIGJlIHVzZWQgYXMgYSBzdGFuZGFyZCBHUElPKSBhbmQKKyAgKiAgICAgICAgICAgQWxlcnQgUmVzcG9uc2UgQWRkcmVzcyBIZWFkZXIgYWNrbm93bGVkZ2UgaXMgZGlzYWJsZWQuCisgICogICAgICAgICBTTUJ1cyBIb3N0IG1vZGU6CisgICogICAgICAgICAtIFNNQnVzIEFsZXJ0IHBpbiBtYW5hZ2VtZW50IGlzIG5vdCBzdXBwb3J0ZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUxFUlRFTiAgICAgICBMTF9JMkNfRGlzYWJsZVNNQnVzQWxlcnQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVTTUJ1c0FsZXJ0KEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FMRVJURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNNQnVzIGFsZXJ0IChIb3N0IG9yIERldmljZSBtb2RlKSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUxFUlRFTiAgICAgICBMTF9JMkNfSXNFbmFibGVkU01CdXNBbGVydAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZFNNQnVzQWxlcnQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9BTEVSVEVOKSA9PSAoSTJDX0NSMV9BTEVSVEVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTTUJ1cyBQYWNrZXQgRXJyb3IgQ2FsY3VsYXRpb24gKFBFQykuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUNFTiAgICAgICAgIExMX0kyQ19FbmFibGVTTUJ1c1BFQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlU01CdXNQRUMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1BFQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNNQnVzIFBhY2tldCBFcnJvciBDYWxjdWxhdGlvbiAoUEVDKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFQ0VOICAgICAgICAgTExfSTJDX0Rpc2FibGVTTUJ1c1BFQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVNNQnVzUEVDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1BFQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTTUJ1cyBQYWNrZXQgRXJyb3IgQ2FsY3VsYXRpb24gKFBFQykgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFQ0VOICAgICAgICAgTExfSTJDX0lzRW5hYmxlZFNNQnVzUEVDCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkU01CdXNQRUMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9QRUNFTikgPT0gKEkyQ19DUjFfUEVDRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTTUJ1cyBDbG9jayBUaW1lb3V0LgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIGFzc29jaWF0ZWQgVGltZW91dCBpcyBkaXNhYmxlZCAoVGltZW91dEEgYW5kL29yVGltZW91dEIpLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRBICAgICAgTExfSTJDX0NvbmZpZ1NNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVElETEUgICAgICAgICBMTF9JMkNfQ29uZmlnU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBUSU1FT1VUQiAgICAgIExMX0kyQ19Db25maWdTTUJ1c1RpbWVvdXQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEEgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGLgorICAqIEBwYXJhbSAgVGltZW91dEFNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0NMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NEQV9TQ0xfSElHSAorICAqIEBwYXJhbSAgVGltZW91dEIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19Db25maWdTTUJ1c1RpbWVvdXQoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRpbWVvdXRBLCB1aW50MzJfdCBUaW1lb3V0QU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXRCKQoreworICBNT0RJRllfUkVHKEkyQ3gtPlRJTUVPVVRSLCBJMkNfVElNRU9VVFJfVElNRU9VVEEgfCBJMkNfVElNRU9VVFJfVElETEUgfCBJMkNfVElNRU9VVFJfVElNRU9VVEIsCisgICAgICAgICAgICAgVGltZW91dEEgfCBUaW1lb3V0QU1vZGUgfCAoVGltZW91dEIgPDwgSTJDX1RJTUVPVVRSX1RJTUVPVVRCX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgKFNDTCBsb3cgdGltZW91dCBvciBTQ0wgYW5kIFNEQSBoaWdoIHRpbWVvdXQgZGVwZW5kcyBvbiBUaW1lb3V0QSBtb2RlKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgVGhlc2UgYml0cyBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gVGltZW91dEEgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNRU9VVEEgICAgICBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUaW1lb3V0QSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAgTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QShJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgVGltZW91dEEpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5USU1FT1VUUiwgVGltZW91dEEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgc2V0dGluZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRBICAgICAgTExfSTJDX0dldFNNQnVzVGltZW91dEEKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRTTUJ1c1RpbWVvdXRBKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5USU1FT1VUUiwgSTJDX1RJTUVPVVRSX1RJTUVPVVRBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBTTUJ1cyBDbG9jayBUaW1lb3V0QSBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gVGltZW91dEEgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElETEUgICAgICAgICBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QU1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEFNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0NMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NEQV9TQ0xfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFNNQnVzVGltZW91dEFNb2RlKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUaW1lb3V0QU1vZGUpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5USU1FT1VUUiwgVGltZW91dEFNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXRBIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSURMRSAgICAgICAgIExMX0kyQ19HZXRTTUJ1c1RpbWVvdXRBTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NDTF9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TREFfU0NMX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QU1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlRJTUVPVVRSLCBJMkNfVElNRU9VVFJfVElETEUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNNQnVzIEV4dGVuZGVkIEN1bXVsYXRpdmUgQ2xvY2sgVGltZW91dEIgKE1hc3RlciBvciBTbGF2ZSBtb2RlKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgVGhlc2UgYml0cyBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gVGltZW91dEIgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNRU9VVEIgICAgICBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUaW1lb3V0QiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAgTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QihJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgVGltZW91dEIpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5USU1FT1VUUiwgVGltZW91dEIgPDwgSTJDX1RJTUVPVVRSX1RJTUVPVVRCX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTTUJ1cyBFeHRlbnRlZCBDdW11bGF0aXZlIENsb2NrIFRpbWVvdXRCIHNldHRpbmcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSU1FT1VUQiAgICAgIExMX0kyQ19HZXRTTUJ1c1RpbWVvdXRCCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+VElNRU9VVFIsIEkyQ19USU1FT1VUUl9USU1FT1VUQikgPj4gSTJDX1RJTUVPVVRSX1RJTUVPVVRCX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBTTUJ1cyBDbG9jayBUaW1lb3V0LgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNT1VURU4gICAgICBMTF9JMkNfRW5hYmxlU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBURVhURU4gICAgICAgIExMX0kyQ19FbmFibGVTTUJ1c1RpbWVvdXQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2xvY2tUaW1lb3V0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX0FMTF9USU1FT1VUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlU01CdXNUaW1lb3V0KEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBDbG9ja1RpbWVvdXQpCit7CisgIFNFVF9CSVQoSTJDeC0+VElNRU9VVFIsIENsb2NrVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgU01CdXMgQ2xvY2sgVGltZW91dC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTU9VVEVOICAgICAgTExfSTJDX0Rpc2FibGVTTUJ1c1RpbWVvdXRcbgorICAqICAgICAgICAgVElNRU9VVFIgICAgIFRFWFRFTiAgICAgICAgTExfSTJDX0Rpc2FibGVTTUJ1c1RpbWVvdXQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2xvY2tUaW1lb3V0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX0FMTF9USU1FT1VUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVNNQnVzVGltZW91dChJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgQ2xvY2tUaW1lb3V0KQoreworICBDTEVBUl9CSVQoSTJDeC0+VElNRU9VVFIsIENsb2NrVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTU9VVEVOICAgICAgTExfSTJDX0lzRW5hYmxlZFNNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVEVYVEVOICAgICAgICBMTF9JMkNfSXNFbmFibGVkU01CdXNUaW1lb3V0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENsb2NrVGltZW91dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19BTExfVElNRU9VVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1RpbWVvdXQoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IENsb2NrVGltZW91dCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+VElNRU9VVFIsIChJMkNfVElNRU9VVFJfVElNT1VURU4gfCBJMkNfVElNRU9VVFJfVEVYVEVOKSkgPT0gKENsb2NrVGltZW91dCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVFhJUyBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhJRSAgICAgICAgICBMTF9JMkNfRW5hYmxlSVRfVFgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX1RYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRYSVMgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYSUUgICAgICAgICAgTExfSTJDX0Rpc2FibGVJVF9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUlUX1RYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RYSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBUWElTIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYSUUgICAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX1RYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkSVRfVFgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWElFKSA9PSAoSTJDX0NSMV9UWElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSWE5FIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWElFICAgICAgICAgIExMX0kyQ19FbmFibGVJVF9SWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlSVRfUlgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1JYSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlhORSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhJRSAgICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX1JYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfUlgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUlhJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFJYTkUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhJRSAgICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfUlgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9SWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1JYSUUpID09IChJMkNfQ1IxX1JYSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IChzbGF2ZSBtb2RlIG9ubHkpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFERFJJRSAgICAgICAgTExfSTJDX0VuYWJsZUlUX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX0FERFIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FERFJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCAoc2xhdmUgbW9kZSBvbmx5KS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBRERSSUUgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfQUREUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUlUX0FERFIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQUREUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFERFJJRSAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9BRERSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQUREUklFKSA9PSAoSTJDX0NSMV9BRERSSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIE5vdCBhY2tub3dsZWRnZSByZWNlaXZlZCBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTkFDS0lFICAgICAgICBMTF9JMkNfRW5hYmxlSVRfTkFDSworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlSVRfTkFDSyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfTkFDS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE5vdCBhY2tub3dsZWRnZSByZWNlaXZlZCBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTkFDS0lFICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX05BQ0sKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVJVF9OQUNLKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX05BQ0tJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTm90IGFja25vd2xlZGdlIHJlY2VpdmVkIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE5BQ0tJRSAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX05BQ0sKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9OQUNLKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfTkFDS0lFKSA9PSAoSTJDX0NSMV9OQUNLSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTVE9QSUUgICAgICAgIExMX0kyQ19FbmFibGVJVF9TVE9QCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVJVF9TVE9QKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9TVE9QSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNUT1BJRSAgICAgICAgTExfSTJDX0Rpc2FibGVJVF9TVE9QCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfU1RPUChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9TVE9QSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNUT1BJRSAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX1NUT1AKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9TVE9QKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfU1RPUElFKSA9PSAoSTJDX0NSMV9TVE9QSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdC4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBldmVudHMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgKFRDKQorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgUmVsb2FkIChUQ1IpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9JMkNfRW5hYmxlSVRfVEMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX1RDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdC4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBldmVudHMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgKFRDKQorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgUmVsb2FkIChUQ1IpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX1RDCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfVEMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfVENJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHJhbnNmZXIgQ29tcGxldGUgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfVEMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9UQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RDSUUpID09IChJMkNfQ1IxX1RDSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEVycm9yIGludGVycnVwdHMuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBlcnJvcnMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgQXJiaXRyYXRpb24gTG9zcyAoQVJMTykKKyAgKiAgICAgICAgIEJ1cyBFcnJvciBkZXRlY3Rpb24gKEJFUlIpCisgICogICAgICAgICBPdmVycnVuL1VuZGVycnVuIChPVlIpCisgICogICAgICAgICBTTUJ1cyBUaW1lb3V0IGRldGVjdGlvbiAoVElNRU9VVCkKKyAgKiAgICAgICAgIFNNQnVzIFBFQyBlcnJvciBkZXRlY3Rpb24gKFBFQ0VSUikKKyAgKiAgICAgICAgIFNNQnVzIEFsZXJ0IHBpbiBldmVudCBkZXRlY3Rpb24gKEFMRVJUKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJDX0VuYWJsZUlUX0VSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlSVRfRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFcnJvciBpbnRlcnJ1cHRzLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBBbnkgb2YgdGhlc2UgZXJyb3JzIHdpbGwgZ2VuZXJhdGUgaW50ZXJydXB0IDoKKyAgKiAgICAgICAgIEFyYml0cmF0aW9uIExvc3MgKEFSTE8pCisgICogICAgICAgICBCdXMgRXJyb3IgZGV0ZWN0aW9uIChCRVJSKQorICAqICAgICAgICAgT3ZlcnJ1bi9VbmRlcnJ1biAoT1ZSKQorICAqICAgICAgICAgU01CdXMgVGltZW91dCBkZXRlY3Rpb24gKFRJTUVPVVQpCisgICogICAgICAgICBTTUJ1cyBQRUMgZXJyb3IgZGV0ZWN0aW9uIChQRUNFUlIpCisgICogICAgICAgICBTTUJ1cyBBbGVydCBwaW4gZXZlbnQgZGV0ZWN0aW9uIChBTEVSVCkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfRVJSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0VSUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFcnJvciBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX0VSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX0VSUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0VSUklFKSA9PSAoSTJDX0NSMV9FUlJJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUZfRkxBR19tYW5hZ2VtZW50IEZMQUdfbWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogV2hlbiBuZXh0IGRhdGEgaXMgd3JpdHRlbiBpbiBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyLgorICAqICAgICAgICAgU0VUOiBXaGVuIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgaXMgZW1wdHkuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhFICAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX1RYRQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19UWEUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9UWEUpID09IChJMkNfSVNSX1RYRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFRyYW5zbWl0IGludGVycnVwdCBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IFdoZW4gbmV4dCBkYXRhIGlzIHdyaXR0ZW4gaW4gVHJhbnNtaXQgZGF0YSByZWdpc3Rlci4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGlzIGVtcHR5LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYSVMgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19UWElTCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX1RYSVMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9UWElTKSA9PSAoSTJDX0lTUl9UWElTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IFdoZW4gUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIGlzIHJlYWQuCisgICogICAgICAgICBTRVQ6IFdoZW4gdGhlIHJlY2VpdmVkIGRhdGEgaXMgY29waWVkIGluIFJlY2VpdmUgZGF0YSByZWdpc3Rlci4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSWE5FICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfUlhORQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19SWE5FKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfUlhORSkgPT0gKEkyQ19JU1JfUlhORSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIEFkZHJlc3MgbWF0Y2hlZCBmbGFnIChzbGF2ZSBtb2RlKS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIHRoZSByZWNlaXZlZCBzbGF2ZSBhZGRyZXNzIG1hdGNoZWQgd2l0aCBvbmUgb2YgdGhlIGVuYWJsZWQgc2xhdmUgYWRkcmVzcy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBRERSICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfQUREUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19BRERSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfQUREUikgPT0gKEkyQ19JU1JfQUREUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIE5vdCBBY2tub3dsZWRnZSByZWNlaXZlZCBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYSBOQUNLIGlzIHJlY2VpdmVkIGFmdGVyIGEgYnl0ZSB0cmFuc21pc3Npb24uCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgTkFDS0YgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX05BQ0sKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfTkFDSyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX05BQ0tGKSA9PSAoSTJDX0lTUl9OQUNLRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFN0b3AgZGV0ZWN0aW9uIGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIFN0b3AgY29uZGl0aW9uIGlzIGRldGVjdGVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFNUT1BGICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19TVE9QCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX1NUT1AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9TVE9QRikgPT0gKEkyQ19JU1JfU1RPUEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBSRUxPQUQ9MCwgQVVUT0VORD0wIGFuZCBOQllURVMgZGF0ZSBoYXZlIGJlZW4gdHJhbnNmZXJyZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEMgICAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX1RDCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX1RDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfVEMpID09IChJMkNfSVNSX1RDKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgVHJhbnNmZXIgY29tcGxldGUgZmxhZyAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gUkVMT0FEPTEgYW5kIE5CWVRFUyBkYXRlIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ1IgICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfVENSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX1RDUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX1RDUikgPT0gKEkyQ19JU1JfVENSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgQnVzIGVycm9yIGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIG1pc3BsYWNlZCBTdGFydCBvciBTdG9wIGNvbmRpdGlvbiBpcyBkZXRlY3RlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBCRVJSICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfQkVSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19CRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfQkVSUikgPT0gKEkyQ19JU1JfQkVSUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIEFyYml0cmF0aW9uIGxvc3QgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIGFyYml0cmF0aW9uIGxvc3QuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQVJMTyAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX0FSTE8KKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfQVJMTyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX0FSTE8pID09IChJMkNfSVNSX0FSTE8pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBPdmVycnVuL1VuZGVycnVuIGZsYWcgKHNsYXZlIG1vZGUpLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYW4gb3ZlcnJ1bi91bmRlcnJ1biBlcnJvciBvY2N1cnMgKENsb2NrIFN0cmV0Y2hpbmcgRGlzYWJsZWQpLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE9WUiAgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19PVlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfT1ZSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfT1ZSKSA9PSAoSTJDX0lTUl9PVlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBTTUJ1cyBQRUMgZXJyb3IgZmxhZyBpbiByZWNlcHRpb24uCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIHRoZSByZWNlaXZlZCBQRUMgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgUEVDIHJlZ2lzdGVyIGNvbnRlbnQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUEVDRVJSICAgICAgICBMTF9JMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfUEVDRVJSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfUEVDRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfUEVDRVJSKSA9PSAoSTJDX0lTUl9QRUNFUlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBTTUJ1cyBUaW1lb3V0IGRldGVjdGlvbiBmbGFnLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIHRpbWVvdXQgb3IgZXh0ZW5kZWQgY2xvY2sgdGltZW91dCBvY2N1cnMuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVElNRU9VVCAgICAgICBMTF9JMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfVElNRU9VVAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlU01CdXNGbGFnX1RJTUVPVVQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9USU1FT1VUKSA9PSAoSTJDX0lTUl9USU1FT1VUKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgU01CdXMgYWxlcnQgZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gU01CdXMgaG9zdCBjb25maWd1cmF0aW9uLCBTTUJ1cyBhbGVydCBlbmFibGVkIGFuZAorICAqICAgICAgICAgICAgICBhIGZhbGxpbmcgZWRnZSBldmVudCBvY2N1cnMgb24gU01CQSBwaW4uCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUxFUlQgICAgICAgICBMTF9JMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfQUxFUlQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZVNNQnVzRmxhZ19BTEVSVChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX0FMRVJUKSA9PSAoSTJDX0lTUl9BTEVSVCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIEJ1cyBCdXN5IGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIFN0YXJ0IGNvbmRpdGlvbiBpcyBkZXRlY3RlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBCVVNZICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfQlVTWQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19CVVNZKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfQlVTWSkgPT0gKEkyQ19JU1JfQlVTWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBBZGRyZXNzIE1hdGNoZWQgZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBBRERSQ0YgICAgICAgIExMX0kyQ19DbGVhckZsYWdfQUREUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJGbGFnX0FERFIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+SUNSLCBJMkNfSUNSX0FERFJDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgTm90IEFja25vd2xlZGdlIGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgTkFDS0NGICAgICAgICBMTF9JMkNfQ2xlYXJGbGFnX05BQ0sKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyRmxhZ19OQUNLKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9OQUNLQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFN0b3AgZGV0ZWN0aW9uIGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgU1RPUENGICAgICAgICBMTF9JMkNfQ2xlYXJGbGFnX1NUT1AKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyRmxhZ19TVE9QKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9TVE9QQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZyAoVFhFKS4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNhbiBiZSBjbGVhciBieSBzb2Z0d2FyZSBpbiBvcmRlciB0byBmbHVzaCB0aGUgdHJhbnNtaXQgZGF0YSByZWdpc3RlciAoVFhEUikuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhFICAgICAgICAgICBMTF9JMkNfQ2xlYXJGbGFnX1RYRQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJGbGFnX1RYRShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgV1JJVEVfUkVHKEkyQ3gtPklTUiwgSTJDX0lTUl9UWEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEJ1cyBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEJFUlJDRiAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19CRVJSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfQkVSUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfQkVSUkNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBBcmJpdHJhdGlvbiBsb3N0IGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQVJMT0NGICAgICAgICBMTF9JMkNfQ2xlYXJGbGFnX0FSTE8KKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyRmxhZ19BUkxPKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9BUkxPQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE92ZXJydW4vVW5kZXJydW4gZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBPVlJDRiAgICAgICAgIExMX0kyQ19DbGVhckZsYWdfT1ZSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfT1ZSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9PVlJDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU01CdXMgUEVDIGVycm9yIGZsYWcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBQRUNDRiAgICAgICAgIExMX0kyQ19DbGVhclNNQnVzRmxhZ19QRUNFUlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyU01CdXNGbGFnX1BFQ0VSUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfUEVDQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFNNQnVzIFRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUSU1PVVRDRiAgICAgIExMX0kyQ19DbGVhclNNQnVzRmxhZ19USU1FT1VUCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhclNNQnVzRmxhZ19USU1FT1VUKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9USU1PVVRDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU01CdXMgQWxlcnQgZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEFMRVJUQ0YgICAgICAgTExfSTJDX0NsZWFyU01CdXNGbGFnX0FMRVJUCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhclNNQnVzRmxhZ19BTEVSVChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfQUxFUlRDRik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhdXRvbWF0aWMgU1RPUCBjb25kaXRpb24gZ2VuZXJhdGlvbiAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgQXV0b21hdGljIGVuZCBtb2RlIDogYSBTVE9QIGNvbmRpdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgd2hlbiBOQllURVMgZGF0YSBhcmUgdHJhbnNmZXJyZWQuCisgICogICAgICAgICBUaGlzIGJpdCBoYXMgbm8gZWZmZWN0IGluIHNsYXZlIG1vZGUgb3Igd2hlbiBSRUxPQUQgYml0IGlzIHNldC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBVVRPRU5EICAgICAgIExMX0kyQ19FbmFibGVBdXRvRW5kTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlQXV0b0VuZE1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX0FVVE9FTkQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYXV0b21hdGljIFNUT1AgY29uZGl0aW9uIGdlbmVyYXRpb24gKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFNvZnR3YXJlIGVuZCBtb2RlIDogVEMgZmxhZyBpcyBzZXQgd2hlbiBOQllURVMgZGF0YSBhcmUgdHJhbnNmZXJyZSwgc3RyZXRjaGluZyBTQ0wgbG93LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFVVE9FTkQgICAgICAgTExfSTJDX0Rpc2FibGVBdXRvRW5kTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUF1dG9FbmRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX0FVVE9FTkQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGF1dG9tYXRpYyBTVE9QIGNvbmRpdGlvbiBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFVVE9FTkQgICAgICAgTExfSTJDX0lzRW5hYmxlZEF1dG9FbmRNb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkQXV0b0VuZE1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9BVVRPRU5EKSA9PSAoSTJDX0NSMl9BVVRPRU5EKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByZWxvYWQgbW9kZSAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgVGhlIHRyYW5zZmVyIGlzIG5vdCBjb21wbGV0ZWQgYWZ0ZXIgdGhlIE5CWVRFUyBkYXRhIHRyYW5zZmVyLCBOQllURVMgd2lsbCBiZSByZWxvYWRlZCB3aGVuIFRDUiBmbGFnIGlzIHNldC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSRUxPQUQgICAgICAgTExfSTJDX0VuYWJsZVJlbG9hZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZVJlbG9hZE1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1JFTE9BRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSByZWxvYWQgbW9kZSAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgVGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlZCBhZnRlciB0aGUgTkJZVEVTIGRhdGEgdHJhbnNmZXIoU1RPUCBvciBSRVNUQVJUIHdpbGwgZm9sbG93KS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSRUxPQUQgICAgICAgTExfSTJDX0Rpc2FibGVSZWxvYWRNb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlUmVsb2FkTW9kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9SRUxPQUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHJlbG9hZCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkVMT0FEICAgICAgIExMX0kyQ19Jc0VuYWJsZWRSZWxvYWRNb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkUmVsb2FkTW9kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1JFTE9BRCkgPT0gKEkyQ19DUjJfUkVMT0FEKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvciB0cmFuc2Zlci4KKyAgKiBAbm90ZSAgIENoYW5naW5nIHRoZXNlIGJpdHMgd2hlbiBTVEFSVCBiaXQgaXMgc2V0IGlzIG5vdCBhbGxvd2VkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE5CWVRFUyAgICAgICAgICAgTExfSTJDX1NldFRyYW5zZmVyU2l6ZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUcmFuc2ZlclNpemUgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRUcmFuc2ZlclNpemUoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRyYW5zZmVyU2l6ZSkKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjIsIEkyQ19DUjJfTkJZVEVTLCBUcmFuc2ZlclNpemUgPDwgSTJDX0NSMl9OQllURVNfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25maWd1cmVkIGZvciB0cmFuc2Zlci4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBOQllURVMgICAgICAgICAgIExMX0kyQ19HZXRUcmFuc2ZlclNpemUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0VHJhbnNmZXJTaXplKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfTkJZVEVTKSA+PiBJMkNfQ1IyX05CWVRFU19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByZXBhcmUgdGhlIGdlbmVyYXRpb24gb2YgYSBBQ0tub3dsZWRnZSBvciBOb24gQUNLbm93bGVkZ2UgY29uZGl0aW9uIGFmdGVyIHRoZSBhZGRyZXNzIHJlY2VpdmUgbWF0Y2ggY29kZSBvciBuZXh0IHJlY2VpdmVkIGJ5dGUuCisgICogQG5vdGUgICBVc2FnZSBpbiBTbGF2ZSBtb2RlIG9ubHkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTkFDSyAgICAgICAgICBMTF9JMkNfQWNrbm93bGVkZ2VOZXh0RGF0YQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUeXBlQWNrbm93bGVkZ2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUNLCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX05BQ0sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19BY2tub3dsZWRnZU5leHREYXRhKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUeXBlQWNrbm93bGVkZ2UpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IyLCBJMkNfQ1IyX05BQ0ssIFR5cGVBY2tub3dsZWRnZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBTVEFSVCBvciBSRVNUQVJUIGNvbmRpdGlvbgorICAqIEBub3RlICAgVGhlIFNUQVJUIGJpdCBjYW4gYmUgc2V0IGV2ZW4gaWYgYnVzIGlzIEJVU1kgb3IgSTJDIGlzIGluIHNsYXZlIG1vZGUuCisgICogICAgICAgICBUaGlzIGFjdGlvbiBoYXMgbm8gZWZmZWN0IHdoZW4gUkVMT0FEIGlzIHNldC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTVEFSVCAgICAgICAgICAgTExfSTJDX0dlbmVyYXRlU3RhcnRDb25kaXRpb24KKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0dlbmVyYXRlU3RhcnRDb25kaXRpb24oSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1NUQVJUKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIFNUT1AgY29uZGl0aW9uIGFmdGVyIHRoZSBjdXJyZW50IGJ5dGUgdHJhbnNmZXIgKG1hc3RlciBtb2RlKS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX0kyQ19HZW5lcmF0ZVN0b3BDb25kaXRpb24KKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0dlbmVyYXRlU3RvcENvbmRpdGlvbihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfU1RPUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGF1dG9tYXRpYyBSRVNUQVJUIFJlYWQgcmVxdWVzdCBjb25kaXRpb24gZm9yIDEwYml0IGFkZHJlc3MgaGVhZGVyIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBUaGUgbWFzdGVyIHNlbmRzIHRoZSBjb21wbGV0ZSAxMGJpdCBzbGF2ZSBhZGRyZXNzIHJlYWQgc2VxdWVuY2UgOgorICAqICAgICAgICAgU3RhcnQgKyAyIGJ5dGVzIDEwYml0IGFkZHJlc3MgaW4gV3JpdGUgZGlyZWN0aW9uICsgUmVzdGFydCArIGZpcnN0IDcgYml0cyBvZiAxMGJpdCBhZGRyZXNzIGluIFJlYWQgZGlyZWN0aW9uLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEhFQUQxMFIgICAgICAgTExfSTJDX0VuYWJsZUF1dG8xMEJpdFJlYWQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUF1dG8xMEJpdFJlYWQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfSEVBRDEwUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhdXRvbWF0aWMgUkVTVEFSVCBSZWFkIHJlcXVlc3QgY29uZGl0aW9uIGZvciAxMGJpdCBhZGRyZXNzIGhlYWRlciAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgVGhlIG1hc3RlciBvbmx5IHNlbmRzIHRoZSBmaXJzdCA3IGJpdHMgb2YgMTBiaXQgYWRkcmVzcyBpbiBSZWFkIGRpcmVjdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBIRUFEMTBSICAgICAgIExMX0kyQ19EaXNhYmxlQXV0bzEwQml0UmVhZAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUF1dG8xMEJpdFJlYWQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX0hFQUQxMFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGF1dG9tYXRpYyBSRVNUQVJUIFJlYWQgcmVxdWVzdCBjb25kaXRpb24gZm9yIDEwYml0IGFkZHJlc3MgaGVhZGVyIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgSEVBRDEwUiAgICAgICBMTF9JMkNfSXNFbmFibGVkQXV0bzEwQml0UmVhZAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZEF1dG8xMEJpdFJlYWQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9IRUFEMTBSKSAhPSAoSTJDX0NSMl9IRUFEMTBSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgdHJhbnNmZXIgZGlyZWN0aW9uIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBDaGFuZ2luZyB0aGVzZSBiaXRzIHdoZW4gU1RBUlQgYml0IGlzIHNldCBpcyBub3QgYWxsb3dlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSRF9XUk4gICAgICAgICAgIExMX0kyQ19TZXRUcmFuc2ZlclJlcXVlc3QKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVHJhbnNmZXJSZXF1ZXN0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1JFUVVFU1RfV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfUkVRVUVTVF9SRUFECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0VHJhbnNmZXJSZXF1ZXN0KEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUcmFuc2ZlclJlcXVlc3QpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IyLCBJMkNfQ1IyX1JEX1dSTiwgVHJhbnNmZXJSZXF1ZXN0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHRyYW5zZmVyIGRpcmVjdGlvbiByZXF1ZXN0ZWQgKG1hc3RlciBtb2RlKS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSRF9XUk4gICAgICAgICAgIExMX0kyQ19HZXRUcmFuc2ZlclJlcXVlc3QKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfUkVRVUVTVF9XUklURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19SRVFVRVNUX1JFQUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0VHJhbnNmZXJSZXF1ZXN0KEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfUkRfV1JOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBzbGF2ZSBhZGRyZXNzIGZvciB0cmFuc2ZlciAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgQ2hhbmdpbmcgdGhlc2UgYml0cyB3aGVuIFNUQVJUIGJpdCBpcyBzZXQgaXMgbm90IGFsbG93ZWQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU0FERCAgICAgICAgICAgTExfSTJDX1NldFNsYXZlQWRkcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBTbGF2ZUFkZHIgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgzRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRTbGF2ZUFkZHIoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFNsYXZlQWRkcikKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjIsIEkyQ19DUjJfU0FERCwgU2xhdmVBZGRyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNsYXZlIGFkZHJlc3MgcHJvZ3JhbW1lZCBmb3IgdHJhbnNmZXIuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU0FERCAgICAgICAgICAgTExfSTJDX0dldFNsYXZlQWRkcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MCBhbmQgTWF4X0RhdGE9MHgzRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRTbGF2ZUFkZHIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9TQUREKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBJMkN4IGNvbW11bmljYXRpb24gd2hlbiBzdGFydGluZyB0cmFuc2ZlciBvciBkdXJpbmcgdHJhbnNmZXIgKFRDIG9yIFRDUiBmbGFnIGFyZSBzZXQpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNBREQgICAgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBBREQxMCAgICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgUkRfV1JOICAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFNUQVJUICAgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgUkVMT0FEICAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIE5CWVRFUyAgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBBVVRPRU5EICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgSEVBRDEwUiAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2xhdmVBZGRyIFNwZWNpZmllcyB0aGUgc2xhdmUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLgorICAqIEBwYXJhbSAgU2xhdmVBZGRyU2l6ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BRERSU0xBVkVfN0JJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BRERSU0xBVkVfMTBCSVQKKyAgKiBAcGFyYW0gIFRyYW5zZmVyU2l6ZSBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9ncmFtbWVkLgorICAqICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUuCisgICogQHBhcmFtICBFbmRNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfUkVMT0FECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfQVVUT0VORAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NPRlRFTkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19SRUxPQUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19BVVRPRU5EX05PX1BFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX1NPRlRFTkRfTk9fUEVDCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfQVVUT0VORF9XSVRIX1BFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX1NPRlRFTkRfV0lUSF9QRUMKKyAgKiBAcGFyYW0gIFJlcXVlc3QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfTk9TVEFSVFNUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9TVEFSVF9SRUFECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfN0JJVF9SRUFECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfN0JJVF9XUklURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzEwQklUX1JFQUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF8xMEJJVF9XUklURQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0hhbmRsZVRyYW5zZmVyKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBTbGF2ZUFkZHIsIHVpbnQzMl90IFNsYXZlQWRkclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHJhbnNmZXJTaXplLCB1aW50MzJfdCBFbmRNb2RlLCB1aW50MzJfdCBSZXF1ZXN0KQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMiwgSTJDX0NSMl9TQUREIHwgSTJDX0NSMl9BREQxMCB8IChJMkNfQ1IyX1JEX1dSTiAmICh1aW50MzJfdCkoUmVxdWVzdCA+PiAoMzFVIC0gSTJDX0NSMl9SRF9XUk5fUG9zKSkpIHwgSTJDX0NSMl9TVEFSVCB8IEkyQ19DUjJfU1RPUCB8IEkyQ19DUjJfUkVMT0FEIHwKKyAgICAgICAgICAgICBJMkNfQ1IyX05CWVRFUyB8IEkyQ19DUjJfQVVUT0VORCB8IEkyQ19DUjJfSEVBRDEwUiwKKyAgICAgICAgICAgICBTbGF2ZUFkZHIgfCBTbGF2ZUFkZHJTaXplIHwgKFRyYW5zZmVyU2l6ZSA8PCBJMkNfQ1IyX05CWVRFU19Qb3MpIHwgRW5kTW9kZSB8IFJlcXVlc3QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSB2YWx1ZSBvZiB0cmFuc2ZlciBkaXJlY3Rpb24gKHNsYXZlIG1vZGUpLgorICAqIEBub3RlICAgUkVTRVQ6IFdyaXRlIHRyYW5zZmVyLCBTbGF2ZSBlbnRlcnMgaW4gcmVjZWl2ZXIgbW9kZS4KKyAgKiAgICAgICAgIFNFVDogUmVhZCB0cmFuc2ZlciwgU2xhdmUgZW50ZXJzIGluIHRyYW5zbWl0dGVyIG1vZGUuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRElSICAgICAgICAgICBMTF9JMkNfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfRElSRUNUSU9OX1dSSVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0RJUkVDVElPTl9SRUFECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFRyYW5zZmVyRGlyZWN0aW9uKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfRElSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBzbGF2ZSBtYXRjaGVkIGFkZHJlc3MuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUREQ09ERSAgICAgICBMTF9JMkNfR2V0QWRkcmVzc01hdGNoQ29kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4M0YKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0QWRkcmVzc01hdGNoQ29kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX0FERENPREUpID4+IEkyQ19JU1JfQUREQ09ERV9Qb3MgPDwgMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVybmFsIGNvbXBhcmlzb24gb2YgdGhlIFNNQnVzIFBhY2tldCBFcnJvciBieXRlICh0cmFuc21pc3Npb24gb3IgcmVjZXB0aW9uIG1vZGUpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGZlYXR1cmUgaXMgY2xlYXJlZCBieSBoYXJkd2FyZSB3aGVuIHRoZSBQRUMgYnl0ZSBpcyB0cmFuc2ZlcnJlZCwgb3Igd2hlbiBhIFNUT1AgY29uZGl0aW9uIG9yIGFuIEFkZHJlc3MgTWF0Y2hlZCBpcyByZWNlaXZlZC4KKyAgKiAgICAgICAgIFRoaXMgYml0IGhhcyBubyBlZmZlY3Qgd2hlbiBSRUxPQUQgYml0IGlzIHNldC4KKyAgKiAgICAgICAgIFRoaXMgYml0IGhhcyBubyBlZmZlY3QgaW4gZGV2aWNlIG1vZGUgd2hlbiBTQkMgYml0IGlzIG5vdCBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUEVDQllURSAgICAgICBMTF9JMkNfRW5hYmxlU01CdXNQRUNDb21wYXJlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVTTUJ1c1BFQ0NvbXBhcmUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1BFQ0JZVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTTUJ1cyBQYWNrZXQgRXJyb3IgYnl0ZSBpbnRlcm5hbCBjb21wYXJpc29uIGlzIHJlcXVlc3RlZCBvciBub3QuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQRUNCWVRFICAgICAgIExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1BFQ0NvbXBhcmUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1BFQ0NvbXBhcmUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9QRUNCWVRFKSA9PSAoSTJDX0NSMl9QRUNCWVRFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgUGFja2V0IEVycm9yIGJ5dGUgY2FsY3VsYXRlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgUEVDUiAgICAgICAgIFBFQyAgICAgICAgICAgTExfSTJDX0dldFNNQnVzUEVDCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U01CdXNQRUMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlBFQ1IsIEkyQ19QRUNSX1BFQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgUlhEUiAgICAgICAgIFJYREFUQSAgICAgICAgTExfSTJDX1JlY2VpdmVEYXRhOAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX0kyQ19SZWNlaXZlRGF0YTgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoSTJDeC0+UlhEUiwgSTJDX1JYRFJfUlhEQVRBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgaW4gVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAuCisgICogQHJtdG9sbCBUWERSICAgICAgICAgVFhEQVRBICAgICAgICBMTF9JMkNfVHJhbnNtaXREYXRhOAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1RyYW5zbWl0RGF0YTgoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQ4X3QgRGF0YSkKK3sKKyAgV1JJVEVfUkVHKEkyQ3gtPlRYRFIsIERhdGEpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9JMkNfSW5pdChJMkNfVHlwZURlZiAqSTJDeCwgTExfSTJDX0luaXRUeXBlRGVmICpJMkNfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9JMkNfRGVJbml0KEkyQ19UeXBlRGVmICpJMkN4KTsKK3ZvaWQgTExfSTJDX1N0cnVjdEluaXQoTExfSTJDX0luaXRUeXBlRGVmICpJMkNfSW5pdFN0cnVjdCk7CisKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEkyQzEgfHwgSTJDMiB8fCBJMkMzICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkwweHhfTExfSTJDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfaXdkZy5oIGIvSW5jL3N0bTMybDB4eF9sbF9pd2RnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyMDBlMQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfbGxfaXdkZy5oCkBAIC0wLDAgKzEsMzQ1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX2l3ZGcuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSVdERyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9MTF9JV0RHX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfTExfSVdER19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChJV0RHKQorCisvKiogQGRlZmdyb3VwIElXREdfTEwgSVdERworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0xMX1ByaXZhdGVfQ29uc3RhbnRzIElXREcgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisjZGVmaW5lIExMX0lXREdfS0VZX1JFTE9BRCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDBBQUFBVSkgICAgICAgICAgICAgICAvKiE8IElXREcgUmVsb2FkIENvdW50ZXIgRW5hYmxlICAgKi8KKyNkZWZpbmUgTExfSVdER19LRVlfRU5BQkxFICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMENDQ0NVKSAgICAgICAgICAgICAgIC8qITwgSVdERyBQZXJpcGhlcmFsIEVuYWJsZSAgICAgICAqLworI2RlZmluZSBMTF9JV0RHX0tFWV9XUl9BQ0NFU1NfRU5BQkxFICAgICAgICgodWludDMyX3QpMHgwMDAwNTU1NVUpICAgICAgICAgICAgICAgLyohPCBJV0RHIEtSIFdyaXRlIEFjY2VzcyBFbmFibGUgICovCisjZGVmaW5lIExMX0lXREdfS0VZX1dSX0FDQ0VTU19ESVNBQkxFICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAvKiE8IElXREcgS1IgV3JpdGUgQWNjZXNzIERpc2FibGUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIElXREcgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9JV0RHX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JV0RHX1NSX1BWVSAgICAgICAgICAgICAgICAgICAgIElXREdfU1JfUFZVICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYXRjaGRvZyBwcmVzY2FsZXIgdmFsdWUgdXBkYXRlICovCisjZGVmaW5lIExMX0lXREdfU1JfUlZVICAgICAgICAgICAgICAgICAgICAgSVdER19TUl9SVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdhdGNoZG9nIGNvdW50ZXIgcmVsb2FkIHZhbHVlIHVwZGF0ZSAqLworI2RlZmluZSBMTF9JV0RHX1NSX1dWVSAgICAgICAgICAgICAgICAgICAgIElXREdfU1JfV1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYXRjaGRvZyBjb3VudGVyIHdpbmRvdyB2YWx1ZSB1cGRhdGUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX0xMX0VDX1BSRVNDQUxFUiAgUHJlc2NhbGVyIERpdmlkZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl80ICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDQgICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl84ICAgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDggICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8xNiAgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzEpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDE2ICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8zMiAgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzEgfCBJV0RHX1BSX1BSXzApICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDMyICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl82NCAgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzIpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDY0ICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8xMjggICAgICAgICAgICAgIChJV0RHX1BSX1BSXzIgfCBJV0RHX1BSX1BSXzApICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDEyOCAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8yNTYgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzIgfCBJV0RHX1BSX1BSXzEpICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FeHBvcnRlZF9NYWNyb3MgSVdERyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElXREdfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBJV0RHIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gSVdERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfSVdER19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIElXREcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0lXREdfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgSVdERyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIEluZGVwZW5kZW50IFdhdGNoZG9nCisgICogQG5vdGUgICBFeGNlcHQgaWYgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9wdGlvbiBpcyBzZWxlY3RlZAorICAqIEBybXRvbGwgS1IgICAgICAgICAgIEtFWSAgICAgICAgICAgTExfSVdER19FbmFibGUKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfRW5hYmxlKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIFdSSVRFX1JFRyhJV0RHLT5LUiwgTExfSVdER19LRVlfRU5BQkxFKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxvYWRzIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4gdGhlIHJlbG9hZCByZWdpc3RlcgorICAqIEBybXRvbGwgS1IgICAgICAgICAgIEtFWSAgICAgICAgICAgTExfSVdER19SZWxvYWRDb3VudGVyCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JV0RHX1JlbG9hZENvdW50ZXIoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgV1JJVEVfUkVHKElXREctPktSLCBMTF9JV0RHX0tFWV9SRUxPQUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMKKyAgKiBAcm10b2xsIEtSICAgICAgICAgICBLRVkgICAgICAgICAgIExMX0lXREdfRW5hYmxlV3JpdGVBY2Nlc3MKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfRW5hYmxlV3JpdGVBY2Nlc3MoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgV1JJVEVfUkVHKElXREctPktSLCBMTF9JV0RHX0tFWV9XUl9BQ0NFU1NfRU5BQkxFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHdyaXRlIGFjY2VzcyB0byBJV0RHX1BSLCBJV0RHX1JMUiBhbmQgSVdER19XSU5SIHJlZ2lzdGVycworICAqIEBybXRvbGwgS1IgICAgICAgICAgIEtFWSAgICAgICAgICAgTExfSVdER19EaXNhYmxlV3JpdGVBY2Nlc3MKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfRGlzYWJsZVdyaXRlQWNjZXNzKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIFdSSVRFX1JFRyhJV0RHLT5LUiwgTExfSVdER19LRVlfV1JfQUNDRVNTX0RJU0FCTEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgcHJlc2NhbGVyIG9mIHRoZSBJV0RHCisgICogQHJtdG9sbCBQUiAgICAgICAgICAgUFIgICAgICAgICAgICBMTF9JV0RHX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8yNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfU2V0UHJlc2NhbGVyKElXREdfVHlwZURlZiAqSVdER3gsIHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgV1JJVEVfUkVHKElXREd4LT5QUiwgSVdER19QUl9QUiAmIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBwcmVzY2FsZXIgb2YgdGhlIElXREcKKyAgKiBAcm10b2xsIFBSICAgICAgICAgICBQUiAgICAgICAgICAgIExMX0lXREdfR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMjU2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19HZXRQcmVzY2FsZXIoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoSVdER3gtPlBSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3BlY2lmeSB0aGUgSVdERyBkb3duLWNvdW50ZXIgcmVsb2FkIHZhbHVlCisgICogQHJtdG9sbCBSTFIgICAgICAgICAgUkwgICAgICAgICAgICBMTF9JV0RHX1NldFJlbG9hZENvdW50ZXIKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvdW50ZXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDBGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfU2V0UmVsb2FkQ291bnRlcihJV0RHX1R5cGVEZWYgKklXREd4LCB1aW50MzJfdCBDb3VudGVyKQoreworICBXUklURV9SRUcoSVdER3gtPlJMUiwgSVdER19STFJfUkwgJiBDb3VudGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNwZWNpZmllZCBJV0RHIGRvd24tY291bnRlciByZWxvYWQgdmFsdWUKKyAgKiBAcm10b2xsIFJMUiAgICAgICAgICBSTCAgICAgICAgICAgIExMX0lXREdfR2V0UmVsb2FkQ291bnRlcgorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDBGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0dldFJlbG9hZENvdW50ZXIoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoSVdER3gtPlJMUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNwZWNpZnkgaGlnaCBsaW1pdCBvZiB0aGUgd2luZG93IHZhbHVlIHRvIGJlIGNvbXBhcmVkIHRvIHRoZSBkb3duLWNvdW50ZXIuCisgICogQHJtdG9sbCBXSU5SICAgICAgICAgV0lOICAgICAgICAgICBMTF9JV0RHX1NldFdpbmRvdworICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgV2luZG93IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHgwRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JV0RHX1NldFdpbmRvdyhJV0RHX1R5cGVEZWYgKklXREd4LCB1aW50MzJfdCBXaW5kb3cpCit7CisgIFdSSVRFX1JFRyhJV0RHeC0+V0lOUiwgSVdER19XSU5SX1dJTiAmIFdpbmRvdyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBoaWdoIGxpbWl0IG9mIHRoZSB3aW5kb3cgdmFsdWUgc3BlY2lmaWVkLgorICAqIEBybXRvbGwgV0lOUiAgICAgICAgIFdJTiAgICAgICAgICAgTExfSVdER19HZXRXaW5kb3cKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHgwRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19HZXRXaW5kb3coSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoSVdER3gtPldJTlIpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGZsYWcgUHJlc2NhbGVyIFZhbHVlIFVwZGF0ZSBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgUFZVICAgICAgICAgICBMTF9JV0RHX0lzQWN0aXZlRmxhZ19QVlUKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzQWN0aXZlRmxhZ19QVlUoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChJV0RHeC0+U1IsIElXREdfU1JfUFZVKSA9PSAoSVdER19TUl9QVlUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBmbGFnIFJlbG9hZCBWYWx1ZSBVcGRhdGUgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFJWVSAgICAgICAgICAgTExfSVdER19Jc0FjdGl2ZUZsYWdfUlZVCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19Jc0FjdGl2ZUZsYWdfUlZVKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSVdER3gtPlNSLCBJV0RHX1NSX1JWVSkgPT0gKElXREdfU1JfUlZVKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgZmxhZyBXaW5kb3cgVmFsdWUgVXBkYXRlIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBXVlUgICAgICAgICAgIExMX0lXREdfSXNBY3RpdmVGbGFnX1dWVQorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0lXREdfSXNBY3RpdmVGbGFnX1dWVShJV0RHX1R5cGVEZWYgKklXREd4KQoreworICByZXR1cm4gKFJFQURfQklUKElXREd4LT5TUiwgSVdER19TUl9XVlUpID09IChJV0RHX1NSX1dWVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGFsbCBmbGFncyBQcmVzY2FsZXIsIFJlbG9hZCAmIFdpbmRvdyBWYWx1ZSBVcGRhdGUgYXJlIHJlc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFBWVSAgICAgICAgICAgTExfSVdER19Jc1JlYWR5XG4KKyAgKiAgICAgICAgIFNSICAgICAgICAgICBXVlUgICAgICAgICAgIExMX0lXREdfSXNSZWFkeVxuCisgICogICAgICAgICBTUiAgICAgICAgICAgUlZVICAgICAgICAgICBMTF9JV0RHX0lzUmVhZHkKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdHMgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19Jc1JlYWR5KElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoSVdER3gtPlNSLCBJV0RHX1NSX1BWVSB8IElXREdfU1JfUlZVIHwgSVdER19TUl9XVlUpID09IDBVKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSVdERykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0xMX0lXREdfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9sbF9scHRpbS5oIGIvSW5jL3N0bTMybDB4eF9sbF9scHRpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMWY5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2xsX2xwdGltLmgKQEAgLTAsMCArMSwxMzYxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX2xwdGltLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIExQVElNIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkwweHhfTExfTFBUSU1fSAorI2RlZmluZSBTVE0zMkwweHhfTExfTFBUSU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKExQVElNMSkKKworLyoqIEBkZWZncm91cCBMUFRJTV9MTCBMUFRJTQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBMUFRJTV9MTF9Qcml2YXRlX01hY3JvcyBMUFRJTSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRVNfSU5JVCBMUFRJTSBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTFBUSU0gSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tTb3VyY2U7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgdGhlIGNsb2NrIHVzZWQgYnkgdGhlIExQVElNIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0xMX0VDX0NMS19TT1VSQ0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9MUFRJTV9TZXRDbG9ja1NvdXJjZSgpLiovCisKKyAgdWludDMyX3QgUHJlc2NhbGVyOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgZGl2aXNpb24gcmF0aW8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fTExfRUNfUFJFU0NBTEVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBUSU1fU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdCBXYXZlZm9ybTsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHdhdmVmb3JtIHNoYXBlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0xMX0VDX09VVFBVVF9XQVZFRk9STS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVElNX0NvbmZpZ091dHB1dCgpLiovCisKKyAgdWludDMyX3QgUG9sYXJpdHk7ICAgICAgIC8qITwgU3BlY2lmaWVzIHdhdmVmb3JtIHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0xMX0VDX09VVFBVVF9QT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVElNX0NvbmZpZ091dHB1dCgpLiovCit9IExMX0xQVElNX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FeHBvcnRlZF9Db25zdGFudHMgTFBUSU0gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfTFBUSU1fUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX0lTUl9DTVBNICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX0NNUE0gICAgIC8qITwgQ29tcGFyZSBtYXRjaCAqLworI2RlZmluZSBMTF9MUFRJTV9JU1JfQVJSTSAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9BUlJNICAgICAvKiE8IEF1dG9yZWxvYWQgbWF0Y2ggKi8KKyNkZWZpbmUgTExfTFBUSU1fSVNSX0VYVFRSSUcgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfRVhUVFJJRyAgLyohPCBFeHRlcm5hbCB0cmlnZ2VyIGVkZ2UgZXZlbnQgKi8KKyNkZWZpbmUgTExfTFBUSU1fSVNSX0NNUE9LICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfQ01QT0sgICAgLyohPCBDb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBPSyAqLworI2RlZmluZSBMTF9MUFRJTV9JU1JfQVJST0sgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9BUlJPSyAgICAvKiE8IEF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIE9LICovCisjZGVmaW5lIExMX0xQVElNX0lTUl9VUCAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX1VQICAgICAgIC8qITwgQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgKi8KKyNkZWZpbmUgTExfTFBUSU1fSVNSX0RPV04gICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfRE9XTiAgICAgLyohPCBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgdG8gZG93biAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFRJTV9SZWFkUmVnIGFuZCAgTExfTFBUSU1fV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fSUVSX0NNUE1JRSAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfQ01QTUlFICAgICAgIC8qITwgQ29tcGFyZSBtYXRjaCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX0xQVElNX0lFUl9BUlJNSUUgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0FSUk1JRSAgICAgICAvKiE8IEF1dG9yZWxvYWQgbWF0Y2ggSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9MUFRJTV9JRVJfRVhUVFJJR0lFICAgICAgICAgICAgICAgIExQVElNX0lFUl9FWFRUUklHSUUgICAgLyohPCBFeHRlcm5hbCB0cmlnZ2VyIHZhbGlkIGVkZ2UgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9MUFRJTV9JRVJfQ01QT0tJRSAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9DTVBPS0lFICAgICAgLyohPCBDb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBPSyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX0xQVElNX0lFUl9BUlJPS0lFICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0FSUk9LSUUgICAgICAvKiE8IEF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIE9LIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfTFBUSU1fSUVSX1VQSUUgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfVVBJRSAgICAgICAgIC8qITwgRGlyZWN0aW9uIGNoYW5nZSB0byBVUCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX0xQVElNX0lFUl9ET1dOSUUgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0RPV05JRSAgICAgICAvKiE8IERpcmVjdGlvbiBjaGFuZ2UgdG8gZG93biBJbnRlcnJ1cHQgRW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX09QRVJBVElOR19NT0RFIE9wZXJhdGluZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfQ09OVElOVU9VUyAgICBMUFRJTV9DUl9DTlRTVFJUIC8qITxMUCBUaW1lciBzdGFydHMgaW4gY29udGludW91cyBtb2RlKi8KKyNkZWZpbmUgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfT05FU0hPVCAgICAgICBMUFRJTV9DUl9TTkdTVFJUIC8qITxMUCBUaWxtZXIgc3RhcnRzIGluIHNpbmdsZSBtb2RlKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfVVBEQVRFX01PREUgVXBkYXRlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9VUERBVEVfTU9ERV9JTU1FRElBVEUgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8UHJlbG9hZCBpcyBkaXNhYmxlZDogcmVnaXN0ZXJzIGFyZSB1cGRhdGVkIGFmdGVyIGVhY2ggQVBCIGJ1cyB3cml0ZSBhY2Nlc3MqLworI2RlZmluZSBMTF9MUFRJTV9VUERBVEVfTU9ERV9FTkRPRlBFUklPRCAgICAgIExQVElNX0NGR1JfUFJFTE9BRCAvKiE8cHJlbG9hZCBpcyBlbmFibGVkOiByZWdpc3RlcnMgYXJlIHVwZGF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBMUFRJTSBwZXJpb2QqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19DT1VOVEVSX01PREUgQ291bnRlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fQ09VTlRFUl9NT0RFX0lOVEVSTkFMICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8VGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZm9sbG93aW5nIGVhY2ggaW50ZXJuYWwgY2xvY2sgcHVsc2UqLworI2RlZmluZSBMTF9MUFRJTV9DT1VOVEVSX01PREVfRVhURVJOQUwgICAgICAgIExQVElNX0NGR1JfQ09VTlRNT0RFIC8qITxUaGUgY291bnRlciBpcyBpbmNyZW1lbnRlZCBmb2xsb3dpbmcgZWFjaCB2YWxpZCBjbG9jayBwdWxzZSBvbiB0aGUgTFBUSU0gZXh0ZXJuYWwgSW5wdXQxKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfT1VUUFVUX1dBVkVGT1JNIE91dHB1dCBXYXZlZm9ybSBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1BXTSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgLyohPExQVElNICBnZW5lcmF0ZXMgZWl0aGVyIGEgUFdNIHdhdmVmb3JtIG9yIGEgT25lIHB1bHNlIHdhdmVmb3JtIGRlcGVuZGluZyBvbiBjaG9zZW4gb3BlcmF0aW5nIG1vZGUgQ09OVElOT1VTIG9yIFNJTkdMRSovCisjZGVmaW5lIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9TRVRPTkNFICAgICAgTFBUSU1fQ0ZHUl9XQVZFIC8qITxMUFRJTSAgZ2VuZXJhdGVzIGEgU2V0IE9uY2Ugd2F2ZWZvcm0qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19PVVRQVVRfUE9MQVJJVFkgT3V0cHV0IFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX1JFR1VMQVIgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8VGhlIExQVElNIG91dHB1dCByZWZsZWN0cyB0aGUgY29tcGFyZSByZXN1bHRzIGJldHdlZW4gTFBUSU14X0FSUiBhbmQgTFBUSU14X0NNUCByZWdpc3RlcnMqLworI2RlZmluZSBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfSU5WRVJTRSAgICAgIExQVElNX0NGR1JfV0FWUE9MICAgICAgIC8qITxUaGUgTFBUSU0gb3V0cHV0IHJlZmxlY3RzIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wYXJlIHJlc3VsdHMgYmV0d2VlbiBMUFRJTXhfQVJSIGFuZCBMUFRJTXhfQ01QIHJlZ2lzdGVycyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX1BSRVNDQUxFUiBQcmVzY2FsZXIgVmFsdWUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxQcmVzY2FsZXIgZGl2aXNpb24gZmFjdG9yIGlzIHNldCB0byAxKi8KKyNkZWZpbmUgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRVNDXzAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8UHJlc2NhbGVyIGRpdmlzaW9uIGZhY3RvciBpcyBzZXQgdG8gMiovCisjZGVmaW5lIExMX0xQVElNX1BSRVNDQUxFUl9ESVY0ICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQ18xICAgICAgICAgICAgICAgICAgICAgICAgLyohPFByZXNjYWxlciBkaXZpc2lvbiBmYWN0b3IgaXMgc2V0IHRvIDQqLworI2RlZmluZSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1BSRVNDXzEgfCBMUFRJTV9DRkdSX1BSRVNDXzApIC8qITxQcmVzY2FsZXIgZGl2aXNpb24gZmFjdG9yIGlzIHNldCB0byA4Ki8KKyNkZWZpbmUgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjE2ICAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRVNDXzIgICAgICAgICAgICAgICAgICAgICAgICAvKiE8UHJlc2NhbGVyIGRpdmlzaW9uIGZhY3RvciBpcyBzZXQgdG8gMTYqLworI2RlZmluZSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMzIgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1BSRVNDXzIgfCBMUFRJTV9DRkdSX1BSRVNDXzApIC8qITxQcmVzY2FsZXIgZGl2aXNpb24gZmFjdG9yIGlzIHNldCB0byAzMiovCisjZGVmaW5lIExMX0xQVElNX1BSRVNDQUxFUl9ESVY2NCAgICAgICAgICAgICAgKExQVElNX0NGR1JfUFJFU0NfMiB8IExQVElNX0NGR1JfUFJFU0NfMSkgLyohPFByZXNjYWxlciBkaXZpc2lvbiBmYWN0b3IgaXMgc2V0IHRvIDY0Ki8KKyNkZWZpbmUgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEyOCAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRVNDICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8UHJlc2NhbGVyIGRpdmlzaW9uIGZhY3RvciBpcyBzZXQgdG8gMTI4Ki8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfVFJJR19TT1VSQ0UgVHJpZ2dlciBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9HUElPICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8RXh0ZXJuYWwgaW5wdXQgdHJpZ2dlciBpcyBjb25uZWN0ZWQgdG8gVElNeF9FVFIgaW5wdXQqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENBTEFSTUEgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8RXh0ZXJuYWwgaW5wdXQgdHJpZ2dlciBpcyBjb25uZWN0ZWQgdG8gUlRDIEFsYXJtIEEqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENBTEFSTUIgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8RXh0ZXJuYWwgaW5wdXQgdHJpZ2dlciBpcyBjb25uZWN0ZWQgdG8gUlRDIEFsYXJtIEIqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDEgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzEgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMCkgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBUYW1wZXIgMSovCisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMiAgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8RXh0ZXJuYWwgaW5wdXQgdHJpZ2dlciBpcyBjb25uZWN0ZWQgdG8gUlRDIFRhbXBlciAyKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAzICAgICAgICAgKExQVElNX0NGR1JfVFJJR1NFTF8yIHwgTFBUSU1fQ0ZHUl9UUklHU0VMXzApIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBSVEMgVGFtcGVyIDMqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfQ09NUDEgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzIgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMSkgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dCovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX0NPTVAyICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19UUklHX0ZJTFRFUiBUcmlnZ2VyIEZpbHRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSX05PTkUgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAvKiE8QW55IHRyaWdnZXIgYWN0aXZlIGxldmVsIGNoYW5nZSBpcyBjb25zaWRlcmVkIGFzIGEgdmFsaWQgdHJpZ2dlciovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSXzIgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFRfMCAvKiE8VHJpZ2dlciBhY3RpdmUgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCAyIGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJpZ2dlciovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSXzQgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFRfMSAvKiE8VHJpZ2dlciBhY3RpdmUgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA0IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJpZ2dlciovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSXzggICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFQgICAvKiE8VHJpZ2dlciBhY3RpdmUgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA4IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJpZ2dlciovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX1RSSUdfUE9MQVJJVFkgVHJpZ2dlciBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfUE9MQVJJVFlfUklTSU5HICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHRU5fMCAvKiE8TFBUSU0gY291bnRlciBzdGFydHMgd2hlbiBhIHJpc2luZyBlZGdlIGlzIGRldGVjdGVkKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19QT0xBUklUWV9GQUxMSU5HICAgICAgICBMUFRJTV9DRkdSX1RSSUdFTl8xIC8qITxMUFRJTSBjb3VudGVyIHN0YXJ0cyB3aGVuIGEgZmFsbGluZyBlZGdlIGlzIGRldGVjdGVkKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkdfRkFMTElORyBMUFRJTV9DRkdSX1RSSUdFTiAgIC8qITxMUFRJTSBjb3VudGVyIHN0YXJ0cyB3aGVuIGEgcmlzaW5nIG9yIGEgZmFsbGluZyBlZGdlIGlzIGRldGVjdGVkKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfQ0xLX1NPVVJDRSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMICAgICAgICAgIDB4MDAwMDAwMDBVIC8qITxMUFRJTSBpcyBjbG9ja2VkIGJ5IGludGVybmFsIGNsb2NrIHNvdXJjZSAoQVBCIGNsb2NrIG9yIGFueSBvZiB0aGUgZW1iZWRkZWQgb3NjaWxsYXRvcnMpKi8KKyNkZWZpbmUgTExfTFBUSU1fQ0xLX1NPVVJDRV9FWFRFUk5BTCAgICAgICAgICBMUFRJTV9DRkdSX0NLU0VMIC8qITxMUFRJTSBpcyBjbG9ja2VkIGJ5IGFuIGV4dGVybmFsIGNsb2NrIHNvdXJjZSB0aHJvdWdoIHRoZSBMUFRJTSBleHRlcm5hbCBJbnB1dDEqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19DTEtfRklMVEVSIENsb2NrIEZpbHRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITxBbnkgZXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGxldmVsIGNoYW5nZSBpcyBjb25zaWRlcmVkIGFzIGEgdmFsaWQgdHJhbnNpdGlvbiovCisjZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfMiAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8wIC8qITxFeHRlcm5hbCBjbG9jayBzaWduYWwgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCAyIGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJhbnNpdGlvbiovCisjZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfNCAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8xIC8qITxFeHRlcm5hbCBjbG9jayBzaWduYWwgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA0IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJhbnNpdGlvbiovCisjZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfOCAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVCAgIC8qITxFeHRlcm5hbCBjbG9jayBzaWduYWwgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA4IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJhbnNpdGlvbiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX0NMS19QT0xBUklUWSBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX0NMS19QT0xBUklUWV9SSVNJTkcgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgVGhlIHJpc2luZyBlZGdlIGlzIHRoZSBhY3RpdmUgZWRnZSB1c2VkIGZvciBjb3VudGluZyovCisjZGVmaW5lIExMX0xQVElNX0NMS19QT0xBUklUWV9GQUxMSU5HICAgICAgICAgTFBUSU1fQ0ZHUl9DS1BPTF8wIC8qITwgVGhlIGZhbGxpbmcgZWRnZSBpcyB0aGUgYWN0aXZlIGVkZ2UgdXNlZCBmb3IgY291bnRpbmcqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfUE9MQVJJVFlfUklTSU5HX0ZBTExJTkcgIExQVElNX0NGR1JfQ0tQT0xfMSAvKiE8IEJvdGggZWRnZXMgYXJlIGFjdGl2ZSBlZGdlcyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX0VOQ09ERVJfTU9ERSBFbmNvZGVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9FTkNPREVSX01PREVfUklTSU5HICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IFRoZSByaXNpbmcgZWRnZSBpcyB0aGUgYWN0aXZlIGVkZ2UgdXNlZCBmb3IgY291bnRpbmcqLworI2RlZmluZSBMTF9MUFRJTV9FTkNPREVSX01PREVfRkFMTElORyAgICAgICAgIExQVElNX0NGR1JfQ0tQT0xfMCAvKiE8IFRoZSBmYWxsaW5nIGVkZ2UgaXMgdGhlIGFjdGl2ZSBlZGdlIHVzZWQgZm9yIGNvdW50aW5nKi8KKyNkZWZpbmUgTExfTFBUSU1fRU5DT0RFUl9NT0RFX1JJU0lOR19GQUxMSU5HICBMUFRJTV9DRkdSX0NLUE9MXzEgLyohPCBCb3RoIGVkZ2VzIGFyZSBhY3RpdmUgZWRnZXMqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRXhwb3J0ZWRfTWFjcm9zIExQVElNIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBMUFRJTSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIExQVElNIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9MUFRJTV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKChfX0lOU1RBTkNFX18pLT4oX19SRUdfXyksIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBMUFRJTSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIExQVElNIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0xQVElNX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRygoX19JTlNUQU5DRV9fKS0+KF9fUkVHX18pKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRXhwb3J0ZWRfRnVuY3Rpb25zIExQVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfSW5pdCBJbml0aWFsaXNhdGlvbiBhbmQgZGVpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9MUFRJTV9EZUluaXQoTFBUSU1fVHlwZURlZiAqTFBUSU14KTsKK3ZvaWQgTExfTFBUSU1fU3RydWN0SW5pdChMTF9MUFRJTV9Jbml0VHlwZURlZiAqTFBUSU1fSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9MUFRJTV9Jbml0KExQVElNX1R5cGVEZWYgKkxQVElNeCwgTExfTFBUSU1fSW5pdFR5cGVEZWYgKkxQVElNX0luaXRTdHJ1Y3QpOwordm9pZCBMTF9MUFRJTV9EaXNhYmxlKExQVElNX1R5cGVEZWYgKkxQVElNeCk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VGX0xQVElNX0NvbmZpZ3VyYXRpb24gTFBUSU0gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBMUFRJTSBpbnN0YW5jZQorICAqIEBub3RlIEFmdGVyIHNldHRpbmcgdGhlIEVOQUJMRSBiaXQsIGEgZGVsYXkgb2YgdHdvIGNvdW50ZXIgY2xvY2sgaXMgbmVlZGVkCisgICogICAgICAgYmVmb3JlIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBhY3R1YWxseSBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVOQUJMRSAgICAgICAgTExfTFBUSU1fRW5hYmxlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+Q1IsIExQVElNX0NSX0VOQUJMRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIExQVElNIGluc3RhbmNlIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRU5BQkxFICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5DUiwgTFBUSU1fQ1JfRU5BQkxFKSA9PSBMUFRJTV9DUl9FTkFCTEUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIExQVElNIGNvdW50ZXIgaW4gdGhlIGRlc2lyZWQgbW9kZS4KKyAgKiBAbm90ZSBMUFRJTSBpbnN0YW5jZSBtdXN0IGJlIGVuYWJsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb3VudGVyLgorICAqIEBub3RlIEl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSBvbiB0aGUgZmx5IGZyb20gT25lIFNob3QgbW9kZSB0bworICAqICAgICAgIENvbnRpbnVvdXMgbW9kZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBDTlRTVFJUICAgICAgIExMX0xQVElNX1N0YXJ0Q291bnRlclxuCisgICogICAgICAgICBDUiAgICAgICAgICAgU05HU1RSVCAgICAgICBMTF9MUFRJTV9TdGFydENvdW50ZXIKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9wZXJhdGluZ01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PUEVSQVRJTkdfTU9ERV9DT05USU5VT1VTCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfT05FU0hPVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU3RhcnRDb3VudGVyKExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgT3BlcmF0aW5nTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNSLCBMUFRJTV9DUl9DTlRTVFJUIHwgTFBUSU1fQ1JfU05HU1RSVCwgT3BlcmF0aW5nTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBMUFRJTSByZWdpc3RlcnMgdXBkYXRlIG1vZGUgKGVuYWJsZS9kaXNhYmxlIHJlZ2lzdGVyIHByZWxvYWQpCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUkVMT0FEICAgICAgIExMX0xQVElNX1NldFVwZGF0ZU1vZGUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFVwZGF0ZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9VUERBVEVfTU9ERV9JTU1FRElBVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9VUERBVEVfTU9ERV9FTkRPRlBFUklPRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0VXBkYXRlTW9kZShMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IFVwZGF0ZU1vZGUpCit7CisgIE1PRElGWV9SRUcoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1BSRUxPQUQsIFVwZGF0ZU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgTFBUSU0gcmVnaXN0ZXJzIHVwZGF0ZSBtb2RlCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUFJFTE9BRCAgICAgICBMTF9MUFRJTV9HZXRVcGRhdGVNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1VQREFURV9NT0RFX0lNTUVESUFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1VQREFURV9NT0RFX0VORE9GUEVSSU9ECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0VXBkYXRlTW9kZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9QUkVMT0FEKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBhdXRvIHJlbG9hZCB2YWx1ZQorICAqIEBub3RlIFRoZSBMUFRJTXhfQVJSIHJlZ2lzdGVyIGNvbnRlbnQgbXVzdCBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlIExQVElNIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSBBZnRlciBhIHdyaXRlIHRvIHRoZSBMUFRJTXhfQVJSIHJlZ2lzdGVyIGEgbmV3IHdyaXRlIG9wZXJhdGlvbiB0byB0aGUKKyAgKiAgICAgICBzYW1lIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBwcmV2aW91cyB3cml0ZSBvcGVyYXRpb24KKyAgKiAgICAgICBpcyBjb21wbGV0ZWQuIEFueSBzdWNjZXNzaXZlIHdyaXRlIGJlZm9yZSAgdGhlIEFSUk9LIGZsYWcgYmUgc2V0LCB3aWxsCisgICogICAgICAgbGVhZCB0byB1bnByZWRpY3RhYmxlIHJlc3VsdHMuCisgICogQG5vdGUgYXV0b3JlbG9hZCB2YWx1ZSBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gdGhlIGNvbXBhcmUgdmFsdWUuCisgICogQHJtdG9sbCBBUlIgICAgICAgICAgQVJSICAgICAgICAgICBMTF9MUFRJTV9TZXRBdXRvUmVsb2FkCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBBdXRvUmVsb2FkIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRBdXRvUmVsb2FkKExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgQXV0b1JlbG9hZCkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkFSUiwgTFBUSU1fQVJSX0FSUiwgQXV0b1JlbG9hZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBhdXRvIHJlbG9hZCB2YWx1ZQorICAqIEBybXRvbGwgQVJSICAgICAgICAgIEFSUiAgICAgICAgICAgTExfTFBUSU1fR2V0QXV0b1JlbG9hZAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQXV0b1JlbG9hZCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldEF1dG9SZWxvYWQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkFSUiwgTFBUSU1fQVJSX0FSUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY29tcGFyZSB2YWx1ZQorICAqIEBub3RlIEFmdGVyIGEgd3JpdGUgdG8gdGhlIExQVElNeF9DTVAgcmVnaXN0ZXIgYSBuZXcgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZQorICAqICAgICAgIHNhbWUgcmVnaXN0ZXIgY2FuIG9ubHkgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIHByZXZpb3VzIHdyaXRlIG9wZXJhdGlvbgorICAqICAgICAgIGlzIGNvbXBsZXRlZC4gQW55IHN1Y2Nlc3NpdmUgd3JpdGUgYmVmb3JlIHRoZSBDTVBPSyBmbGFnIGJlIHNldCwgd2lsbAorICAqICAgICAgIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSByZXN1bHRzLgorICAqIEBybXRvbGwgQ01QICAgICAgICAgIENNUCAgICAgICAgICAgTExfTFBUSU1fU2V0Q29tcGFyZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRDb21wYXJlKExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgQ29tcGFyZVZhbHVlKQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q01QLCBMUFRJTV9DTVBfQ01QLCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY29tcGFyZSB2YWx1ZQorICAqIEBybXRvbGwgQ01QICAgICAgICAgIENNUCAgICAgICAgICAgTExfTFBUSU1fR2V0Q29tcGFyZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0Q29tcGFyZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q01QLCBMUFRJTV9DTVBfQ01QKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBjb3VudGVyIHZhbHVlCisgICogQG5vdGUgV2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgcnVubmluZyB3aXRoIGFuIGFzeW5jaHJvbm91cyBjbG9jaywgcmVhZGluZworICAqICAgICAgIHRoZSBMUFRJTXhfQ05UIHJlZ2lzdGVyIG1heSByZXR1cm4gdW5yZWxpYWJsZSB2YWx1ZXMuIFNvIGluIHRoaXMgY2FzZQorICAqICAgICAgIGl0IGlzIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHR3byBjb25zZWN1dGl2ZSByZWFkIGFjY2Vzc2VzIGFuZCB2ZXJpZnkKKyAgKiAgICAgICB0aGF0IHRoZSB0d28gcmV0dXJuZWQgdmFsdWVzIGFyZSBpZGVudGljYWwuCisgICogQHJtdG9sbCBDTlQgICAgICAgICAgQ05UICAgICAgICAgICBMTF9MUFRJTV9HZXRDb3VudGVyCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb3VudGVyIHZhbHVlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0Q291bnRlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q05ULCBMUFRJTV9DTlRfQ05UKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBjb3VudGVyIG1vZGUgKHNlbGVjdGlvbiBvZiB0aGUgTFBUSU0gY291bnRlciBjbG9jayBzb3VyY2UpLgorICAqIEBub3RlIFRoZSBjb3VudGVyIG1vZGUgY2FuIGJlIHNldCBvbmx5IHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIENPVU5UTU9ERSAgICAgTExfTFBUSU1fU2V0Q291bnRlck1vZGUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvdW50ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ09VTlRFUl9NT0RFX0lOVEVSTkFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ09VTlRFUl9NT0RFX0VYVEVSTkFMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRDb3VudGVyTW9kZShMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IENvdW50ZXJNb2RlKQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9DT1VOVE1PREUsIENvdW50ZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGNvdW50ZXIgbW9kZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIENPVU5UTU9ERSAgICAgTExfTFBUSU1fR2V0Q291bnRlck1vZGUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ09VTlRFUl9NT0RFX0lOVEVSTkFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ09VTlRFUl9NT0RFX0VYVEVSTkFMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0Q291bnRlck1vZGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ09VTlRNT0RFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBMUFRJTSBpbnN0YW5jZSBvdXRwdXQgKExQVElNeF9PVVQpCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSBSZWdhcmRpbmcgdGhlIExQVElNIG91dHB1dCBwb2xhcml0eSB0aGUgY2hhbmdlIHRha2VzIGVmZmVjdAorICAqICAgICAgIGltbWVkaWF0ZWx5LCBzbyB0aGUgb3V0cHV0IGRlZmF1bHQgdmFsdWUgd2lsbCBjaGFuZ2UgaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgKiAgICAgICB0aGUgcG9sYXJpdHkgaXMgcmUtY29uZmlndXJlZCwgZXZlbiBiZWZvcmUgdGhlIHRpbWVyIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgV0FWRSAgICAgICAgICBMTF9MUFRJTV9Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0ZHUiAgICAgICAgIFdBVlBPTCAgICAgICAgTExfTFBUSU1fQ29uZmlnT3V0cHV0CisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBXYXZlZm9ybSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fU0VUT05DRQorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfUkVHVUxBUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9JTlZFUlNFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9Db25maWdPdXRwdXQoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBXYXZlZm9ybSwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1dBVkUgfCBMUFRJTV9DRkdSX1dBVlBPTCwgV2F2ZWZvcm0gfCBQb2xhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0ICB3YXZlZm9ybSBzaGFwZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFdBVkUgICAgICAgICAgTExfTFBUSU1fU2V0V2F2ZWZvcm0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdhdmVmb3JtIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1BXTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9TRVRPTkNFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRXYXZlZm9ybShMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IFdhdmVmb3JtKQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9XQVZFLCBXYXZlZm9ybSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCB3YXZlZm9ybSBzaGFwZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFdBVkUgICAgICAgICAgTExfTFBUSU1fR2V0V2F2ZWZvcm0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1BXTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9TRVRPTkNFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0V2F2ZWZvcm0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfV0FWRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCAgb3V0cHV0IHBvbGFyaXR5CisgICogQHJtdG9sbCBDRkdSICAgICAgICAgV0FWUE9MICAgICAgICBMTF9MUFRJTV9TZXRQb2xhcml0eQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfUkVHVUxBUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9JTlZFUlNFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRQb2xhcml0eShMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IFBvbGFyaXR5KQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9XQVZQT0wsIFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIG91dHB1dCBwb2xhcml0eQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFdBVlBPTCAgICAgICAgTExfTFBUSU1fR2V0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX1JFR1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfSU5WRVJTRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldFBvbGFyaXR5KExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1dBVlBPTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBhY3R1YWwgcHJlc2NhbGVyIGRpdmlzaW9uIHJhdGlvLgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgV2hlbiB0aGUgTFBUSU0gaXMgY29uZmlndXJlZCB0byBiZSBjbG9ja2VkIGJ5IGFuIGludGVybmFsIGNsb2NrIHNvdXJjZQorICAqICAgICAgIGFuZCB0aGUgTFBUSU0gY291bnRlciBpcyBjb25maWd1cmVkIHRvIGJlIHVwZGF0ZWQgYnkgYWN0aXZlIGVkZ2VzCisgICogICAgICAgZGV0ZWN0ZWQgb24gdGhlIExQVElNIGV4dGVybmFsIElucHV0MSwgdGhlIGludGVybmFsIGNsb2NrIHByb3ZpZGVkIHRvCisgICogICAgICAgdGhlIExQVElNIG11c3QgYmUgbm90IGJlIHByZXNjYWxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUkVTQyAgICAgICAgIExMX0xQVElNX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMTI4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRQcmVzY2FsZXIoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1BSRVNDLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgcHJlc2NhbGVyIGRpdmlzaW9uIHJhdGlvLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBSRVNDICAgICAgICAgTExfTFBUSU1fR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEyOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldFByZXNjYWxlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9QUkVTQykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VGX1RyaWdnZXJfQ29uZmlndXJhdGlvbiBUcmlnZ2VyIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgVGhlIGZpcnN0IHRyaWdnZXIgZXZlbnQgd2lsbCBzdGFydCB0aGUgdGltZXIsIGFueSBzdWNjZXNzaXZlIHRyaWdnZXIKKyAgKiAgICAgICBldmVudCB3aWxsIHJlc2V0IHRoZSBjb3VudGVyIGFuZCB0aGUgdGltZXIgd2lsbCByZXN0YXJ0LgorICAqIEBub3RlIFRoZSB0aW1lb3V0IHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBjb21wYXJlIHZhbHVlOyBpZiBubyB0cmlnZ2VyCisgICogICAgICAgb2NjdXJzIHdpdGhpbiB0aGUgZXhwZWN0ZWQgdGltZSBmcmFtZSwgdGhlIE1DVSBpcyB3YWtlZC11cCBieSB0aGUKKyAgKiAgICAgICBjb21wYXJlIG1hdGNoIGV2ZW50LgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFRJTU9VVCAgICAgICAgTExfTFBUSU1fRW5hYmxlVGltZW91dAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlVGltZW91dChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RJTU9VVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgQSB0cmlnZ2VyIGV2ZW50IGFycml2aW5nIHdoZW4gdGhlIHRpbWVyIGlzIGFscmVhZHkgc3RhcnRlZCB3aWxsIGJlCisgICogICAgICAgaWdub3JlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBUSU1PVVQgICAgICAgIExMX0xQVElNX0Rpc2FibGVUaW1lb3V0CisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlVGltZW91dChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVElNT1VUKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSB0aW1lb3V0IGZ1bmN0aW9uIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgVElNT1VUICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRUaW1lb3V0CisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkVGltZW91dChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVElNT1VUKSA9PSBMUFRJTV9DRkdSX1RJTU9VVCk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBjb3VudGVyCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBUUklHRU4gICAgICAgIExMX0xQVElNX1RyaWdTdworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fVHJpZ1N3KExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9UUklHRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgZXh0ZXJuYWwgdHJpZ2dlciB1c2VkIGFzIGEgdHJpZ2dlciBldmVudCBmb3IgdGhlIExQVElNLgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgQW4gaW50ZXJuYWwgY2xvY2sgc291cmNlIG11c3QgYmUgcHJlc2VudCB3aGVuIGEgZGlnaXRhbCBmaWx0ZXIgaXMKKyAgKiAgICAgICByZXF1aXJlZCBmb3IgdGhlIHRyaWdnZXIuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgVFJJR1NFTCAgICAgICBMTF9MUFRJTV9Db25maWdUcmlnZ2VyXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBUUkdGTFQgICAgICAgIExMX0xQVElNX0NvbmZpZ1RyaWdnZXJcbgorICAqICAgICAgICAgQ0ZHUiAgICAgICAgIFRSSUdFTiAgICAgICAgTExfTFBUSU1fQ29uZmlnVHJpZ2dlcgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfR1BJTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ0FMQVJNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ0FMQVJNQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDMgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfQ09NUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9DT01QMgorICAqCisgICogICAgICAgICAoKikgIFZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLiBcbgorICAqCisgICogQHBhcmFtICBGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfRklMVEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl84CisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19QT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkdfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ29uZmlnVHJpZ2dlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IFNvdXJjZSwgdWludDMyX3QgRmlsdGVyLCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVFJJR1NFTCB8IExQVElNX0NGR1JfVFJHRkxUIHwgTFBUSU1fQ0ZHUl9UUklHRU4sIFNvdXJjZSB8IEZpbHRlciB8IFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGV4dGVybmFsIHRyaWdnZXIgc291cmNlLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFRSSUdTRUwgICAgICAgTExfTFBUSU1fR2V0VHJpZ2dlclNvdXJjZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9HUElPCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1BCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1CCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDEgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMyAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9DT01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX0NPTVAyCisgICoKKyAgKiAgICAgICAgICgqKSAgVmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuIFxuCisgICoKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRUcmlnZ2VyU291cmNlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RSSUdTRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGV4dGVybmFsIHRyaWdnZXIgZmlsdGVyLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFRSR0ZMVCAgICAgICAgTExfTFBUSU1fR2V0VHJpZ2dlckZpbHRlcgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfRklMVEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl84CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0VHJpZ2dlckZpbHRlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9UUkdGTFQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGV4dGVybmFsIHRyaWdnZXIgcG9sYXJpdHkuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgVFJJR0VOICAgICAgICBMTF9MUFRJTV9HZXRUcmlnZ2VyUG9sYXJpdHkKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0VHJpZ2dlclBvbGFyaXR5KExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RSSUdFTikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VGX0Nsb2NrX0NvbmZpZ3VyYXRpb24gQ2xvY2sgQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGNsb2NrIHVzZWQgYnkgdGhlIExQVElNIGluc3RhbmNlLgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgQ0tTRUwgICAgICAgICBMTF9MUFRJTV9TZXRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1NPVVJDRV9FWFRFUk5BTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0Q2xvY2tTb3VyY2UoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBDbG9ja1NvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tTRUwsIENsb2NrU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIExQVElNIGluc3RhbmNlIGNsb2NrIHNvdXJjZS4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS1NFTCAgICAgICAgIExMX0xQVElNX0dldENsb2NrU291cmNlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19TT1VSQ0VfSU5URVJOQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DTEtfU09VUkNFX0VYVEVSTkFMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0Q2xvY2tTb3VyY2UoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tTRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGFjdGl2ZSBlZGdlIG9yIGVkZ2VzIHVzZWQgYnkgdGhlIGNvdW50ZXIgd2hlbiB0aGUgTFBUSU0gaXMgY2xvY2tlZCBieSBhbiBleHRlcm5hbCBjbG9jayBzb3VyY2UuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSBXaGVuIGJvdGggZXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGVkZ2VzIGFyZSBjb25zaWRlcmVkIGFjdGl2ZSBvbmVzLAorICAqICAgICAgIHRoZSBMUFRJTSBtdXN0IGFsc28gYmUgY2xvY2tlZCBieSBhbiBpbnRlcm5hbCBjbG9jayBzb3VyY2Ugd2l0aCBhCisgICogICAgICAgZnJlcXVlbmN5IGVxdWFsIHRvIGF0IGxlYXN0IGZvdXIgdGltZXMgdGhlIGV4dGVybmFsIGNsb2NrIGZyZXF1ZW5jeS4KKyAgKiBAbm90ZSBBbiBpbnRlcm5hbCBjbG9jayBzb3VyY2UgbXVzdCBiZSBwcmVzZW50IHdoZW4gYSBkaWdpdGFsIGZpbHRlciBpcworICAqICAgICAgIHJlcXVpcmVkIGZvciBleHRlcm5hbCBjbG9jay4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS0ZMVCAgICAgICAgIExMX0xQVElNX0NvbmZpZ0Nsb2NrXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBDS1BPTCAgICAgICAgIExMX0xQVElNX0NvbmZpZ0Nsb2NrCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfOAorICAqIEBwYXJhbSAgQ2xvY2tQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19QT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DTEtfUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19QT0xBUklUWV9SSVNJTkdfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ29uZmlnQ2xvY2soTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBDbG9ja0ZpbHRlciwgdWludDMyX3QgQ2xvY2tQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tGTFQgfCBMUFRJTV9DRkdSX0NLUE9MLCBDbG9ja0ZpbHRlciB8IENsb2NrUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY2xvY2sgcG9sYXJpdHkKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS1BPTCAgICAgICAgIExMX0xQVElNX0dldENsb2NrUG9sYXJpdHkKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19QT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0Q2xvY2tQb2xhcml0eShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9DS1BPTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY2xvY2sgZGlnaXRhbCBmaWx0ZXIKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS0ZMVCAgICAgICAgIExMX0xQVElNX0dldENsb2NrRmlsdGVyCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldENsb2NrRmlsdGVyKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0NLRkxUKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfRW5jb2Rlcl9Nb2RlIEVuY29kZXIgTW9kZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBlbmNvZGVyIG1vZGUuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS1BPTCAgICAgICAgIExMX0xQVElNX1NldEVuY29kZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFbmNvZGVyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9FTkNPREVSX01PREVfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkdfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0RW5jb2Rlck1vZGUoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBFbmNvZGVyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tQT0wsIEVuY29kZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGVuY29kZXIgbW9kZS4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS1BPTCAgICAgICAgIExMX0xQVElNX0dldEVuY29kZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9FTkNPREVSX01PREVfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkdfRkFMTElORworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldEVuY29kZXJNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0NLUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBlbmNvZGVyIG1vZGUKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIEluIHRoaXMgbW9kZSB0aGUgTFBUSU0gaW5zdGFuY2UgbXVzdCBiZSBjbG9ja2VkIGJ5IGFuIGludGVybmFsIGNsb2NrCisgICogICAgICAgc291cmNlLiBBbHNvLCB0aGUgcHJlc2NhbGVyIGRpdmlzaW9uIHJhdGlvIG11c3QgYmUgZXF1YWwgdG8gMS4KKyAgKiBAbm90ZSBMUFRJTSBpbnN0YW5jZSBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gY29udGludW91cyBtb2RlIHByaW9yIGVuYWJsaW5nCisgICogICAgICAgdGhlIGVuY29kZXIgbW9kZS4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBFTkMgICAgICAgICAgIExMX0xQVElNX0VuYWJsZUVuY29kZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGVFbmNvZGVyTW9kZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0VOQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgZW5jb2RlciBtb2RlCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBFTkMgICAgICAgICAgIExMX0xQVElNX0Rpc2FibGVFbmNvZGVyTW9kZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZUVuY29kZXJNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9FTkMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBMUFRJTSBvcGVyYXRlcyBpbiBlbmNvZGVyIG1vZGUuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgRU5DICAgICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRFbmNvZGVyTW9kZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZEVuY29kZXJNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9FTkMpID09IExQVElNX0NGR1JfRU5DKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUcgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGNvbXBhcmUgbWF0Y2ggZmxhZyAoQ01QTUNGKQorICAqIEBybXRvbGwgSUNSICAgICAgICAgIENNUE1DRiAgICAgICAgTExfTFBUSU1fQ2xlYXJGTEFHX0NNUE0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0NsZWFyRkxBR19DTVBNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklDUiwgTFBUSU1fSUNSX0NNUE1DRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5mb3JtIGFwcGxpY2F0aW9uIHdoZXRoZXIgYSBjb21wYXJlIG1hdGNoIGludGVycnVwdCBoYXMgb2NjdXJyZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQ01QTSAgICAgICAgICBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQ01QTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19DTVBNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfQ01QTSkgPT0gTFBUSU1fSVNSX0NNUE0pPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgYXV0b3JlbG9hZCBtYXRjaCBmbGFnIChBUlJNQ0YpCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQVJSTUNGICAgICAgICBMTF9MUFRJTV9DbGVhckZMQUdfQVJSTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ2xlYXJGTEFHX0FSUk0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUNSLCBMUFRJTV9JQ1JfQVJSTUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmZvcm0gYXBwbGljYXRpb24gd2hldGhlciBhIGF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0IGhhcyBvY2N1cmVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFSUk0gICAgICAgICAgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0FSUk0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQVJSTShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0FSUk0pID09IExQVElNX0lTUl9BUlJNKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGV4dGVybmFsIHRyaWdnZXIgdmFsaWQgZWRnZSBmbGFnKEVYVFRSSUdDRikuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgRVhUVFJJR0NGICAgICBMTF9MUFRJTV9DbGVhckZsYWdfRVhUVFJJRworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ2xlYXJGbGFnX0VYVFRSSUcoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUNSLCBMUFRJTV9JQ1JfRVhUVFJJR0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmZvcm0gYXBwbGljYXRpb24gd2hldGhlciBhIHZhbGlkIGVkZ2Ugb24gdGhlIHNlbGVjdGVkIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQgaGFzIG9jY3VycmVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEVYVFRSSUcgICAgICAgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0VYVFRSSUcKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfRVhUVFJJRyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0VYVFRSSUcpID09IExQVElNX0lTUl9FWFRUUklHKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGNvbXBhcmUgcmVnaXN0ZXIgdXBkYXRlIGludGVycnVwdCBmbGFnIChDTVBPS0NGKS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBDTVBPS0NGICAgICAgIExMX0xQVElNX0NsZWFyRmxhZ19DTVBPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ2xlYXJGbGFnX0NNUE9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklDUiwgTFBUSU1fSUNSX0NNUE9LQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZm9ybXMgYXBwbGljYXRpb24gd2hldGhlciB0aGUgQVBCIGJ1cyB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNeF9DTVAgcmVnaXN0ZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4gSWYgc28sIGEgbmV3IG9uZSBjYW4gYmUgaW5pdGlhdGVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIENNUE9LICAgICAgICAgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0NNUE9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0NNUE9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfQ01QT0spID09IExQVElNX0lTUl9DTVBPSyk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoQVJST0tDRikuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQVJST0tDRiAgICAgICBMTF9MUFRJTV9DbGVhckZsYWdfQVJST0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0NsZWFyRmxhZ19BUlJPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JQ1IsIExQVElNX0lDUl9BUlJPS0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmZvcm1zIGFwcGxpY2F0aW9uIHdoZXRoZXIgdGhlIEFQQiBidXMgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTXhfQVJSIHJlZ2lzdGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuIElmIHNvLCBhIG5ldyBvbmUgY2FuIGJlIGluaXRpYXRlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBUlJPSyAgICAgICAgIExMX0xQVElNX0lzQWN0aXZlRmxhZ19BUlJPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19BUlJPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0FSUk9LKSA9PSBMUFRJTV9JU1JfQVJST0spPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgY291bnRlciBkaXJlY3Rpb24gY2hhbmdlIHRvIHVwIGludGVycnVwdCBmbGFnIChVUENGKS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBVUENGICAgICAgICAgIExMX0xQVElNX0NsZWFyRmxhZ19VUAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ2xlYXJGbGFnX1VQKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklDUiwgTFBUSU1fSUNSX1VQQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZm9ybXMgdGhlIGFwcGxpY2F0aW9uIHdoZXRoZXIgdGhlIGNvdW50ZXIgZGlyZWN0aW9uIGhhcyBjaGFuZ2VkIGZyb20gZG93biB0byB1cCAod2hlbiB0aGUgTFBUSU0gaW5zdGFuY2Ugb3BlcmF0ZXMgaW4gZW5jb2RlciBtb2RlKS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBVUCAgICAgICAgICAgIExMX0xQVElNX0lzQWN0aXZlRmxhZ19VUAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19VUChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX1VQKSA9PSBMUFRJTV9JU1JfVVApPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgY291bnRlciBkaXJlY3Rpb24gY2hhbmdlIHRvIGRvd24gaW50ZXJydXB0IGZsYWcgKERPV05DRikuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgRE9XTkNGICAgICAgICBMTF9MUFRJTV9DbGVhckZsYWdfRE9XTgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ2xlYXJGbGFnX0RPV04oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUNSLCBMUFRJTV9JQ1JfRE9XTkNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmZvcm1zIHRoZSBhcHBsaWNhdGlvbiB3aGV0aGVyIHRoZSBjb3VudGVyIGRpcmVjdGlvbiBoYXMgY2hhbmdlZCBmcm9tIHVwIHRvIGRvd24gKHdoZW4gdGhlIExQVElNIGluc3RhbmNlIG9wZXJhdGVzIGluIGVuY29kZXIgbW9kZSkuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRE9XTiAgICAgICAgICBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfRE9XTgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19ET1dOKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfRE9XTikgPT0gTFBUSU1fSVNSX0RPV04pPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FRl9JVF9NYW5hZ2VtZW50IEludGVycnVwdCBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKENNUE1JRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQ01QTUlFICAgICAgICBMTF9MUFRJTV9FbmFibGVJVF9DTVBNCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGVJVF9DTVBNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0NNUE1JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjb21wYXJlIG1hdGNoIGludGVycnVwdCAoQ01QTUlFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBDTVBNSUUgICAgICAgIExMX0xQVElNX0Rpc2FibGVJVF9DTVBNCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlSVRfQ01QTShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0NNUE1JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbXBhcmUgbWF0Y2ggaW50ZXJydXB0IChDTVBNSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQ01QTUlFICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9DTVBNCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkSVRfQ01QTShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0NNUE1JRSkgPT0gTFBUSU1fSUVSX0NNUE1JRSk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAoQVJSTUlFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBBUlJNSUUgICAgICAgIExMX0xQVElNX0VuYWJsZUlUX0FSUk0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZUlUX0FSUk0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQVJSTUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0IChBUlJNSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIEFSUk1JRSAgICAgICAgTExfTFBUSU1fRGlzYWJsZUlUX0FSUk0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0Rpc2FibGVJVF9BUlJNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQVJSTUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKEFSUk1JRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBBUlJNSUUgICAgICAgIExMX0xQVElNX0lzRW5hYmxlZElUX0FSUk0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9BUlJNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQVJSTUlFKSA9PSBMUFRJTV9JRVJfQVJSTUlFKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgdmFsaWQgZWRnZSBpbnRlcnJ1cHQgKEVYVFRSSUdJRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgRVhUVFJJR0lFICAgICBMTF9MUFRJTV9FbmFibGVJVF9FWFRUUklHCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGVJVF9FWFRUUklHKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0VYVFRSSUdJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBleHRlcm5hbCB0cmlnZ2VyIHZhbGlkIGVkZ2UgaW50ZXJydXB0IChFWFRUUklHSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIEVYVFRSSUdJRSAgICAgTExfTFBUSU1fRGlzYWJsZUlUX0VYVFRSSUcKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0Rpc2FibGVJVF9FWFRUUklHKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfRVhUVFJJR0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgZXh0ZXJuYWwgdHJpZ2dlciB2YWxpZCBlZGdlIGludGVycnVwdCAoRVhUVFJJR0lFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIEVYVFRSSUdJRSAgICAgTExfTFBUSU1fSXNFbmFibGVkSVRfRVhUVFJJRworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX0VYVFRSSUcoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9FWFRUUklHSUUpID09IExQVElNX0lFUl9FWFRUUklHSUUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZWQgaW50ZXJydXB0IChDTVBPS0lFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBDTVBPS0lFICAgICAgIExMX0xQVElNX0VuYWJsZUlUX0NNUE9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGVJVF9DTVBPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9DTVBPS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGVkIGludGVycnVwdCAoQ01QT0tJRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQ01QT0tJRSAgICAgICBMTF9MUFRJTV9EaXNhYmxlSVRfQ01QT0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0Rpc2FibGVJVF9DTVBPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0NNUE9LSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlZCBpbnRlcnJ1cHQgKENNUE9LSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQ01QT0tJRSAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9DTVBPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX0NNUE9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQ01QT0tJRSkgPT0gTFBUSU1fSUVSX0NNUE9LSUUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYXV0b3JlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZWQgaW50ZXJydXB0IChBUlJPS0lFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBBUlJPS0lFICAgICAgIExMX0xQVElNX0VuYWJsZUlUX0FSUk9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGVJVF9BUlJPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9BUlJPS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGVkIGludGVycnVwdCAoQVJST0tJRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQVJST0tJRSAgICAgICBMTF9MUFRJTV9EaXNhYmxlSVRfQVJST0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0Rpc2FibGVJVF9BUlJPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0FSUk9LSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlZCBpbnRlcnJ1cHQgKEFSUk9LSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQVJST0tJRSAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9BUlJPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX0FSUk9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQVJST0tJRSkgPT0gTFBUSU1fSUVSX0FSUk9LSUUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZGlyZWN0aW9uIGNoYW5nZSB0byB1cCBpbnRlcnJ1cHQgKFVQSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIFVQSUUgICAgICAgICAgTExfTFBUSU1fRW5hYmxlSVRfVVAKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZUlUX1VQKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX1VQSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZGlyZWN0aW9uIGNoYW5nZSB0byB1cCBpbnRlcnJ1cHQgKFVQSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIFVQSUUgICAgICAgICAgTExfTFBUSU1fRGlzYWJsZUlUX1VQCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlSVRfVVAoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9VUElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlyZWN0aW9uIGNoYW5nZSB0byB1cCBpbnRlcnJ1cHQgKFVQSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgVVBJRSAgICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9VUAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX1VQKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfVVBJRSkgPT0gTFBUSU1fSUVSX1VQSUUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZGlyZWN0aW9uIGNoYW5nZSB0byBkb3duIGludGVycnVwdCAoRE9XTklFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBET1dOSUUgICAgICAgIExMX0xQVElNX0VuYWJsZUlUX0RPV04KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZUlUX0RPV04oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfRE9XTklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGRpcmVjdGlvbiBjaGFuZ2UgdG8gZG93biBpbnRlcnJ1cHQgKERPV05JRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgRE9XTklFICAgICAgICBMTF9MUFRJTV9EaXNhYmxlSVRfRE9XTgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZUlUX0RPV04oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9ET1dOSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkaXJlY3Rpb24gY2hhbmdlIHRvIGRvd24gaW50ZXJydXB0IChET1dOSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgRE9XTklFICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9ET1dOCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkSVRfRE9XTihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfRE9XTklFKSA9PSBMUFRJTV9JRVJfRE9XTklFKT8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIExQVElNMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0xMX0xQVElNX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfbHB1YXJ0LmggYi9JbmMvc3RtMzJsMHh4X2xsX2xwdWFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YWZkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2xsX2xwdWFydC5oCkBAIC0wLDAgKzEsMjE4NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9scHVhcnQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgTFBVQVJUIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9MTF9MUFVBUlRfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9MTF9MUFVBUlRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKExQVUFSVDEpCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMIExQVUFSVAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfUHJpdmF0ZV9Db25zdGFudHMgTFBVQVJUIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIERlZmluZXMgdXNlZCBpbiBCYXVkIFJhdGUgcmVsYXRlZCBtYWNyb3MgYW5kIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgc2V0dGluZyBjb21wdXRhdGlvbiAqLworI2RlZmluZSBMUFVBUlRfTFBVQVJURElWX0ZSRVFfTVVMICAgICAyNTZVCisjZGVmaW5lIExQVUFSVF9CUlJfTUFTSyAgICAgICAgICAgICAgIDB4MDAwRkZGRkZVCisjZGVmaW5lIExQVUFSVF9CUlJfTUlOX1ZBTFVFICAgICAgICAgIDB4MDAwMDAzMDBVCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9Qcml2YXRlX01hY3JvcyBMUFVBUlQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FU19JTklUIExQVUFSVCBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgTEwgTFBVQVJUIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEJhdWRSYXRlOyAgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBmaWVsZCBkZWZpbmVzIGV4cGVjdGVkIExQVUFSVCBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldEJhdWRSYXRlKCkuKi8KKworICB1aW50MzJfdCBEYXRhV2lkdGg7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0RBVEFXSURUSC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldERhdGFXaWR0aCgpLiovCisKKyAgdWludDMyX3QgU3RvcEJpdHM7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFVBUlRfTExfRUNfU1RPUEJJVFMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aCgpLiovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX1BBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldFBhcml0eSgpLiovCisKKyAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb247ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBhbmQvb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0RJUkVDVElPTi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uKCkuKi8KKworICB1aW50MzJfdCBIYXJkd2FyZUZsb3dDb250cm9sOyAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0hXQ09OVFJPTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldEhXRmxvd0N0cmwoKS4qLworCit9IExMX0xQVUFSVF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBMUFVBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFVBUlRfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX1BFQ0YgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lDUl9GRUNGICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAgICAgICAgICAgICAvKiE8IEZyYW1pbmcgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX05DRiAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgICAgIC8qITwgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX09SRUNGICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfSURMRUNGICAgICAgICAgICAgICAgVVNBUlRfSUNSX0lETEVDRiAgICAgICAgICAgICAgLyohPCBJZGxlIGxpbmUgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX1RDQ0YgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0NGICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lDUl9DVFNDRiAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ1RTQ0YgICAgICAgICAgICAgICAvKiE8IENUUyBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfQ01DRiAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0NNQ0YgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX1dVQ0YgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9XVUNGICAgICAgICAgICAgICAgIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFVBUlRfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUEUgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1BFICAgICAgICAgICAgICAgICAgLyohPCBQYXJpdHkgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX0ZFICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgICAgICAgICAgIC8qITwgRnJhbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfTkUgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX05FICAgICAgICAgICAgICAgICAgLyohPCBOb2lzZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfT1JFICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX09SRSAgICAgICAgICAgICAgICAgLyohPCBPdmVycnVuIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9JRExFICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfSURMRSAgICAgICAgICAgICAgICAvKiE8IElkbGUgbGluZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUlhORSAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYTkUgICAgICAgICAgICAgICAgLyohPCBSZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9UQyAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEMgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVFhFICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9DVFNJRiAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQ1RTSUYgICAgICAgICAgICAgICAvKiE8IENUUyBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX0NUUyAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DVFMgICAgICAgICAgICAgICAgIC8qITwgQ1RTIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9CVVNZICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQlVTWSAgICAgICAgICAgICAgICAvKiE8IEJ1c3kgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX0NNRiAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DTUYgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9TQktGICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfU0JLRiAgICAgICAgICAgICAgICAvKiE8IFNlbmQgYnJlYWsgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1JXVSAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SV1UgICAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZXIgd2FrZXVwIGZyb20gTXV0ZSBtb2RlIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9XVUYgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfV1VGICAgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVEVBQ0sgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RFQUNLICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1JFQUNLICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SRUFDSyAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfTFBVQVJUX1JlYWRSZWcgYW5kICBMTF9MUFVBUlRfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSMV9JRExFSUUgICAgICAgICAgICAgICBVU0FSVF9DUjFfSURMRUlFICAgICAgICAgICAgICAvKiE8IElETEUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1JYTkVJRSAgICAgICAgICAgICAgIFVTQVJUX0NSMV9SWE5FSUUgICAgICAgICAgICAgIC8qITwgUmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfVENJRSAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RDSUUgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1RYRUlFICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UWEVJRSAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfUEVJRSAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BFSUUgICAgICAgICAgICAgICAgLyohPCBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSMV9DTUlFICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfQ01JRSAgICAgICAgICAgICAgICAvKiE8IENoYXJhY3RlciBtYXRjaCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjNfRUlFICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0VJRSAgICAgICAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjNfQ1RTSUUgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0NUU0lFICAgICAgICAgICAgICAgLyohPCBDVFMgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IzX1dVRklFICAgICAgICAgICAgICAgIFVTQVJUX0NSM19XVUZJRSAgICAgICAgICAgICAgIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBlbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0RJUkVDVElPTiBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfRElSRUNUSU9OX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fUlggICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGlzIGRpc2FibGVkIGFuZCBSZWNlaXZlciBpcyBlbmFibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fVFggICAgICAgICAgICAgVVNBUlRfQ1IxX1RFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgYW5kIFJlY2VpdmVyIGlzIGRpc2FibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlggICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlciBhcmUgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfUEFSSVRZIFBhcml0eSBDb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9OT05FICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9FVkVOICAgICAgICAgICAgICBVU0FSVF9DUjFfUENFICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgRXZlbiBQYXJpdHkgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9PREQgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgT2RkIFBhcml0eSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfV0FLRVVQIFdha2V1cAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfSURMRUxJTkUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8ICBMUFVBUlQgd2FrZSB1cCBmcm9tIE11dGUgbW9kZSBvbiBJZGxlIExpbmUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dBS0VVUF9BRERSRVNTTUFSSyAgICAgICBVU0FSVF9DUjFfV0FLRSAgICAgICAgICAgICAgICAgICAgIC8qITwgIExQVUFSVCB3YWtlIHVwIGZyb20gTXV0ZSBtb2RlIG9uIEFkZHJlc3MgTWFyayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfREFUQVdJRFRIIERhdGF3aWR0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfN0IgICAgICAgICAgICAgVVNBUlRfQ1IxX00xICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDcgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgNyBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDggYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOCBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIgICAgICAgICAgICAgVVNBUlRfQ1IxX00wICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDkgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOSBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19TVE9QQklUUyBTdG9wIEJpdHMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfU1RPUEJJVFNfMSAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAxIHN0b3AgYml0ICovCisjZGVmaW5lIExMX0xQVUFSVF9TVE9QQklUU18yICAgICAgICAgICAgICAgVVNBUlRfQ1IyX1NUT1BfMSAgICAgICAgICAgICAgICAgICAvKiE8IDIgc3RvcCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19UWFJYIFRYIFJYIFBpbnMgU3dhcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9UWFJYX1NUQU5EQVJEICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgYXJlIHVzZWQgYXMgZGVmaW5lZCBpbiBzdGFuZGFyZCBwaW5vdXQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1RYUlhfU1dBUFBFRCAgICAgICAgICAgICAoVVNBUlRfQ1IyX1NXQVApICAgICAgICAgICAgICAgICAgIC8qITwgVFggYW5kIFJYIHBpbnMgZnVuY3Rpb25zIGFyZSBzd2FwcGVkLiAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfUlhQSU5fTEVWRUwgUlggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWCBwaW4gc2lnbmFsIHdvcmtzIHVzaW5nIHRoZSBzdGFuZGFyZCBsb2dpYyBsZXZlbHMgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1JYUElOX0xFVkVMX0lOVkVSVEVEICAgICAoVVNBUlRfQ1IyX1JYSU5WKSAgICAgICAgICAgICAgICAgIC8qITwgUlggcGluIHNpZ25hbCB2YWx1ZXMgYXJlIGludmVydGVkLiAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19UWFBJTl9MRVZFTCBUWCBQaW4gQWN0aXZlIExldmVsIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9UWFBJTl9MRVZFTF9TVEFOREFSRCAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRYIHBpbiBzaWduYWwgd29ya3MgdXNpbmcgdGhlIHN0YW5kYXJkIGxvZ2ljIGxldmVscyAqLworI2RlZmluZSBMTF9MUFVBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQgICAgIChVU0FSVF9DUjJfVFhJTlYpICAgICAgICAgICAgICAgICAgLyohPCBUWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0JJTkFSWV9MT0dJQyBCaW5hcnkgRGF0YSBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX1BPU0lUSVZFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBpbiBwb3NpdGl2ZS9kaXJlY3QgbG9naWMuICgxPUgsIDA9TCkgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRSAgICBVU0FSVF9DUjJfREFUQUlOViAgICAgICAgICAgICAgICAgIC8qITwgTG9naWNhbCBkYXRhIGZyb20gdGhlIGRhdGEgcmVnaXN0ZXIgYXJlIHNlbmQvcmVjZWl2ZWQgaW4gbmVnYXRpdmUvaW52ZXJzZSBsb2dpYy4gKDE9TCwgMD1IKS4gVGhlIHBhcml0eSBiaXQgaXMgYWxzbyBpbnZlcnRlZC4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0JJVE9SREVSIEJpdCBPcmRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9CSVRPUkRFUl9MU0JGSVJTVCAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLworI2RlZmluZSBMTF9MUFVBUlRfQklUT1JERVJfTVNCRklSU1QgICAgICAgIFVTQVJUX0NSMl9NU0JGSVJTVCAgICAgICAgICAgICAgICAgLyohPCBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0FERFJFU1NfREVURUNUIEFkZHJlc3MgTGVuZ3RoIERldGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF80QiAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDQtYml0IGFkZHJlc3MgZGV0ZWN0aW9uIG1ldGhvZCBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9MUFVBUlRfQUREUkVTU19ERVRFQ1RfN0IgICAgICAgIFVTQVJUX0NSMl9BRERNNyAgICAgICAgICAgICAgICAgICAgLyohPCA3LWJpdCBhZGRyZXNzIGRldGVjdGlvbiAoaW4gOC1iaXQgZGF0YSBtb2RlKSBtZXRob2Qgc2VsZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0hXQ09OVFJPTCBIYXJkd2FyZSBDb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0hXQ09OVFJPTF9OT05FICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ1RTIGFuZCBSVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sIGRpc2FibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTICAgICAgICAgICAgVVNBUlRfQ1IzX1JUU0UgICAgICAgICAgICAgICAgICAgICAvKiE8IFJUUyBvdXRwdXQgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHJlcXVlc3RlZCB3aGVuIHRoZXJlIGlzIHNwYWNlIGluIHRoZSByZWNlaXZlIGJ1ZmZlciAqLworI2RlZmluZSBMTF9MUFVBUlRfSFdDT05UUk9MX0NUUyAgICAgICAgICAgIFVTQVJUX0NSM19DVFNFICAgICAgICAgICAgICAgICAgICAgLyohPCBDVFMgbW9kZSBlbmFibGVkLCBkYXRhIGlzIG9ubHkgdHJhbnNtaXR0ZWQgd2hlbiB0aGUgbkNUUyBpbnB1dCBpcyBhc3NlcnRlZCAodGllZCB0byAwKSAqLworI2RlZmluZSBMTF9MUFVBUlRfSFdDT05UUk9MX1JUU19DVFMgICAgICAgIChVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFKSAgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfV0FLRVVQX09OIFdha2V1cCBBY3RpdmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dBS0VVUF9PTl9BRERSRVNTICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBhZGRyZXNzIG1hdGNoICovCisjZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQgICAgICAgVVNBUlRfQ1IzX1dVU18xICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2FrZSB1cCBhY3RpdmUgb24gU3RhcnQgYml0IGRldGVjdGlvbiAqLworI2RlZmluZSBMTF9MUFVBUlRfV0FLRVVQX09OX1JYTkUgICAgICAgICAgIChVU0FSVF9DUjNfV1VTXzAgfCBVU0FSVF9DUjNfV1VTXzEpICAgICAvKiE8IFdha2UgdXAgYWN0aXZlIG9uIFJYTkUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0RFX1BPTEFSSVRZIERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfREVfUE9MQVJJVFlfSElHSCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgTExfTFBVQVJUX0RFX1BPTEFSSVRZX0xPVyAgICAgICAgICBVU0FSVF9DUjNfREVQICAgICAgICAgICAgICAgICAgICAgIC8qITwgREUgc2lnbmFsIGlzIGFjdGl2ZSBsb3cgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0RNQV9SRUdfREFUQSBETUEgUmVnaXN0ZXIgRGF0YQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2V0IGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvciB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgTExfTFBVQVJUX0RNQV9SRUdfREFUQV9SRUNFSVZFICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHJlY2VwdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0V4cG9ydGVkX01hY3JvcyBMUFVBUlQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBMUFVBUlQgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0xQVUFSVF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIExQVUFSVCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9MUFVBUlRfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VNX0V4cG9ydGVkX01hY3Jvc19IZWxwZXIgSGVscGVyIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29tcHV0ZSBMUFVBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kCisgICogICAgICAgICBleHBlY3RlZCBCYXVkIFJhdGUgKDIwLWJpdCB2YWx1ZSBvZiBMUFVBUlRESVYgaXMgcmV0dXJuZWQpCisgICogQHBhcmFtICBfX1BFUklQSENMS19fIFBlcmlwaGVyYWwgQ2xvY2sgZnJlcXVlbmN5IHVzZWQgZm9yIExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWQgUmF0ZSB2YWx1ZSB0byBhY2hpZXZlCisgICogQHJldHZhbCBMUFVBUlRESVYgdmFsdWUgdG8gYmUgdXNlZCBmb3IgQlJSIHJlZ2lzdGVyIGZpbGxpbmcKKyAgKi8KKyNkZWZpbmUgX19MTF9MUFVBUlRfRElWKF9fUEVSSVBIQ0xLX18sIF9fQkFVRFJBVEVfXykgKCgoKCh1aW50NjRfdCkoX19QRVJJUEhDTEtfXykqTFBVQVJUX0xQVUFSVERJVl9GUkVRX01VTCkgKyAoKF9fQkFVRFJBVEVfXykvMlUpKS8oX19CQVVEUkFURV9fKSkgJiBMUFVBUlRfQlJSX01BU0spCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgTFBVQVJUIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIExQVUFSVCBFbmFibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIExQVUFSVCBEaXNhYmxlCisgICogQG5vdGUgICBXaGVuIExQVUFSVCBpcyBkaXNhYmxlZCwgTFBVQVJUIHByZXNjYWxlcnMgYW5kIG91dHB1dHMgYXJlIHN0b3BwZWQgaW1tZWRpYXRlbHksCisgICogICAgICAgICBhbmQgY3VycmVudCBvcGVyYXRpb25zIGFyZSBkaXNjYXJkZWQuIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBMUFVBUlQgaXMga2VwdCwgYnV0IGFsbCB0aGUgc3RhdHVzCisgICogICAgICAgICBmbGFncywgaW4gdGhlIExQVUFSVHhfSVNSIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQG5vdGUgICBJbiBvcmRlciB0byBnbyBpbnRvIGxvdy1wb3dlciBtb2RlIHdpdGhvdXQgZ2VuZXJhdGluZyBlcnJvcnMgb24gdGhlIGxpbmUsCisgICogICAgICAgICB0aGUgVEUgYml0IG11c3QgYmUgcmVzZXQgYmVmb3JlIGFuZCB0aGUgc29mdHdhcmUgbXVzdCB3YWl0CisgICogICAgICAgICBmb3IgdGhlIFRDIGJpdCBpbiB0aGUgTFBVQVJUX0lTUiB0byBiZSBzZXQgYmVmb3JlIHJlc2V0dGluZyB0aGUgVUUgYml0LgorICAqICAgICAgICAgVGhlIERNQSByZXF1ZXN0cyBhcmUgYWxzbyByZXNldCB3aGVuIFVFID0gMCBzbyB0aGUgRE1BIGNoYW5uZWwgbXVzdAorICAqICAgICAgICAgYmUgZGlzYWJsZWQgYmVmb3JlIHJlc2V0dGluZyB0aGUgVUUgYml0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIExQVUFSVCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSkgPT0gKFVTQVJUX0NSMV9VRSkpOworfQorCisKKy8qKgorICAqIEBicmllZiAgTFBVQVJUIGVuYWJsZWQgaW4gU1RPUCBNb2RlCisgICogQG5vdGUgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgZW5hYmxlZCwgTFBVQVJUIGlzIGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gU3RvcCBtb2RlLCBwcm92aWRlZCB0aGF0CisgICogICAgICAgICBMUFVBUlQgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSBvciBMU0UgaW4gUkNDLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIExQVUFSVCBkaXNhYmxlZCBpbiBTVE9QIE1vZGUKKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBkaXNhYmxlZCwgTFBVQVJUIGlzIG5vdCBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJblN0b3BNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJblN0b3BNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBMUFVBUlQgaXMgZW5hYmxlZCBpbiBTVE9QIE1vZGUKKyAgKiAgICAgICAgIChhYmxlIHRvIHdha2UgdXAgTUNVIGZyb20gU3RvcCBtb2RlIG9yIG5vdCkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJblN0b3BNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJblN0b3BNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSkgPT0gKFVTQVJUX0NSMV9VRVNNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTFBVQVJUIENsb2NrIGVuYWJsZWQgaW4gU1RPUCBNb2RlCisgICogQG5vdGUgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBMUFVBUlQgQ2xvY2sgaXMgZW5hYmxlZCB3aGlsZSBpbiBTVE9QIG1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBVQ0VTTSAgICAgICAgIExMX0xQVUFSVF9FbmFibGVDbG9ja0luU3RvcE1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlQ2xvY2tJblN0b3BNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVUNFU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIExQVUFSVCBjbG9jayBkaXNhYmxlZCBpbiBTVE9QIE1vZGUKKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIExQVUFSVCBDbG9jayBpcyBkaXNhYmxlZCB3aGlsZSBpbiBTVE9QIG1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBVQ0VTTSAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlQ2xvY2tJblN0b3BNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVDbG9ja0luU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1VDRVNNKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBMUFVBUlQgY2xvY2sgaXMgZW5hYmxlZCBpbiBTVE9QIE1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBVQ0VTTSAgICAgICAgIExMX0xQVUFSVF9Jc0Nsb2NrRW5hYmxlZEluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQ2xvY2tFbmFibGVkSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1VDRVNNKSA9PSAoVVNBUlRfQ1IzX1VDRVNNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZXIgRW5hYmxlIChSZWNlaXZlciBpcyBlbmFibGVkIGFuZCBiZWdpbnMgc2VhcmNoaW5nIGZvciBhIHN0YXJ0IGJpdCkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25SeAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25SeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlciBEaXNhYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZURpcmVjdGlvblJ4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVEaXJlY3Rpb25SeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0dGVyIEVuYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURpcmVjdGlvblR4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURpcmVjdGlvblR4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0dGVyIERpc2FibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRGlyZWN0aW9uVHgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZURpcmVjdGlvblR4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9URSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHNpbXVsdGFuZW91c2x5IGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVzCisgICogICAgICAgICBvZiBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX0xQVUFSVF9TZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgICogICAgICAgICBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9MUFVBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUcmFuc2ZlckRpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9UWF9SWAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFRyYW5zZmVyRGlyZWN0aW9uKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1RFLCBUcmFuc2ZlckRpcmVjdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVzIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfTFBVQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX0xQVUFSVF9HZXRUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX1RYX1JYCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1RFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFBhcml0eSAoZW5hYmxlZC9kaXNhYmxlZCBhbmQgcGFyaXR5IG1vZGUgaWYgZW5hYmxlZCkKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBpZiBoYXJkd2FyZSBwYXJpdHkgY29udHJvbCAoZ2VuZXJhdGlvbiBhbmQgZGV0ZWN0aW9uKSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqICAgICAgICAgV2hlbiB0aGUgcGFyaXR5IGNvbnRyb2wgaXMgZW5hYmxlZCAoT2RkIG9yIEV2ZW4pLCBjb21wdXRlZCBwYXJpdHkgYml0IGlzIGluc2VydGVkIGF0IHRoZSBNU0IgcG9zaXRpb24KKyAgKiAgICAgICAgIChkZXBlbmRpbmcgb24gZGF0YSB3aWR0aCkgYW5kIHBhcml0eSBpcyBjaGVja2VkIG9uIHRoZSByZWNlaXZlZCBkYXRhLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfTFBVQVJUX1NldFBhcml0eVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgUENFICAgICAgICAgICBMTF9MUFVBUlRfU2V0UGFyaXR5CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BBUklUWV9PREQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRQYXJpdHkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgUGFyaXR5KQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1BDRSwgUGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUGFyaXR5IGNvbmZpZ3VyYXRpb24gKGVuYWJsZWQvZGlzYWJsZWQgYW5kIHBhcml0eSBtb2RlIGlmIGVuYWJsZWQpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9MUFVBUlRfR2V0UGFyaXR5XG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX0xQVUFSVF9HZXRQYXJpdHkKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfRVZFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfT0RECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFBhcml0eShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUmVjZWl2ZXIgV2FrZSBVcCBtZXRob2QgZnJvbSBNdXRlIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgV0FLRSAgICAgICAgICBMTF9MUFVBUlRfU2V0V2FrZVVwTWV0aG9kCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9JRExFTElORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfQUREUkVTU01BUksKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRXYWtlVXBNZXRob2QoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgTWV0aG9kKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1dBS0UsIE1ldGhvZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFJlY2VpdmVyIFdha2UgVXAgbWV0aG9kIGZyb20gTXV0ZSBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgV0FLRSAgICAgICAgICBMTF9MUFVBUlRfR2V0V2FrZVVwTWV0aG9kCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX0lETEVMSU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9BRERSRVNTTUFSSworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRXYWtlVXBNZXRob2QoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfV0FLRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBXb3JkIGxlbmd0aCAobmIgb2YgZGF0YSBiaXRzLCBleGNsdWRpbmcgc3RhcnQgYW5kIHN0b3AgYml0cykKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBNICAgICAgICAgICAgIExMX0xQVUFSVF9TZXREYXRhV2lkdGgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzdCCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXREYXRhV2lkdGgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgRGF0YVdpZHRoKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX00sIERhdGFXaWR0aCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFdvcmQgbGVuZ3RoIChpLmUuIG5iIG9mIGRhdGEgYml0cywgZXhjbHVkaW5nIHN0YXJ0IGFuZCBzdG9wIGJpdHMpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTSAgICAgICAgICAgICBMTF9MUFVBUlRfR2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzdCCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX00pKTsKK30KKworLyoqCisgICogQGJyaWVmICBBbGxvdyBzd2l0Y2ggYmV0d2VlbiBNdXRlIE1vZGUgYW5kIEFjdGl2ZSBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTU1FICAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByZXZlbnQgTXV0ZSBNb2RlIHVzZS4gU2V0IFJlY2VpdmVyIGluIGFjdGl2ZSBtb2RlIHBlcm1hbmVudGx5LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVNdXRlTW9kZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgc3dpdGNoIGJldHdlZW4gTXV0ZSBNb2RlIGFuZCBBY3RpdmUgbW9kZSBpcyBhbGxvd2VkCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTU1FICAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZE11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTU1FKSA9PSAoVVNBUlRfQ1IxX01NRSkpOworfQorCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBsZW5ndGggb2YgdGhlIHN0b3AgYml0cworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfTFBVQVJUX1NldFN0b3BCaXRzTGVuZ3RoCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3RvcEJpdHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfU1RPUEJJVFNfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0U3RvcEJpdHNMZW5ndGgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgU3RvcEJpdHMpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIHN0b3AgYml0cworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfTFBVQVJUX0dldFN0b3BCaXRzTGVuZ3RoCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfU1RPUEJJVFNfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18yCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFN0b3BCaXRzTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1NUT1ApKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQ2hhcmFjdGVyIGZyYW1lIGZvcm1hdCAoRGF0YXdpZHRoLCBQYXJpdHkgY29udHJvbCwgU3RvcCBCaXRzKQorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBEYXRhIFdpZHRoIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9MUFVBUlRfU2V0RGF0YVdpZHRoKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gUGFyaXR5IENvbnRyb2wgYW5kIG1vZGUgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX0xQVUFSVF9TZXRQYXJpdHkoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBTdG9wIGJpdHMgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aCgpIGZ1bmN0aW9uCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9MUFVBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXJcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIE0gICAgICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ0NoYXJhY3RlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9MUFVBUlRfQ29uZmlnQ2hhcmFjdGVyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF0YVdpZHRoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF83QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzlCCisgICogQHBhcmFtICBQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX09ERAorICAqIEBwYXJhbSAgU3RvcEJpdHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfU1RPUEJJVFNfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ29uZmlnQ2hhcmFjdGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IERhdGFXaWR0aCwgdWludDMyX3QgUGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdG9wQml0cykKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfTSwgUGFyaXR5IHwgRGF0YVdpZHRoKTsKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QLCBTdG9wQml0cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRYL1JYIHBpbnMgc3dhcHBpbmcgc2V0dGluZy4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTV0FQICAgICAgICAgIExMX0xQVUFSVF9TZXRUWFJYU3dhcAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN3YXBDb25maWcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhSWF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFJYX1NXQVBQRUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRUWFJYU3dhcChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBTd2FwQ29uZmlnKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1NXQVAsIFN3YXBDb25maWcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFRYL1JYIHBpbnMgc3dhcHBpbmcgY29uZmlndXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTV0FQICAgICAgICAgIExMX0xQVUFSVF9HZXRUWFJYU3dhcAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUlhfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhSWF9TV0FQUEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1NXQVApKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUlggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYSU5WICAgICAgICAgTExfTFBVQVJUX1NldFJYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQaW5JbnZNZXRob2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRSWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFBpbkludk1ldGhvZCkKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9SWElOViwgUGluSW52TWV0aG9kKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBSWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljIGNvbmZpZ3VyYXRpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWElOViAgICAgICAgIExMX0xQVUFSVF9HZXRSWFBpbkxldmVsCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0UlhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9SWElOVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhJTlYgICAgICAgICBMTF9MUFVBUlRfU2V0VFhQaW5MZXZlbAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBpbkludk1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgUGluSW52TWV0aG9kKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1RYSU5WLCBQaW5JbnZNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMgY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYSU5WICAgICAgICAgTExfTFBVQVJUX0dldFRYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRUWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1RYSU5WKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIEJpbmFyeSBkYXRhIGxvZ2ljLgorICAqCisgICogQG5vdGUgICBBbGxvdyB0byBkZWZpbmUgaG93IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZSBzZW5kL3JlY2VpdmVkIDoKKyAgKiAgICAgICAgIGVpdGhlciBpbiBwb3NpdGl2ZS9kaXJlY3QgbG9naWMgKDE9SCwgMD1MKSBvciBpbiBuZWdhdGl2ZS9pbnZlcnNlIGxvZ2ljICgxPUwsIDA9SCkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBEQVRBSU5WICAgICAgIExMX0xQVUFSVF9TZXRCaW5hcnlEYXRhTG9naWMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhTG9naWMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX1BPU0lUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldEJpbmFyeURhdGFMb2dpYyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBEYXRhTG9naWMpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfREFUQUlOViwgRGF0YUxvZ2ljKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBCaW5hcnkgZGF0YSBjb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgREFUQUlOViAgICAgICBMTF9MUFVBUlRfR2V0QmluYXJ5RGF0YUxvZ2ljCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX1BPU0lUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRCaW5hcnlEYXRhTG9naWMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfREFUQUlOVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0cmFuc2ZlciBiaXQgb3JkZXIgKGVpdGhlciBMZXNzIG9yIE1vc3QgU2lnbmlmaWNhbnQgQml0IEZpcnN0KQorICAqIEBub3RlICAgTVNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiAgICAgICAgIExTQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTVNCRklSU1QgICAgICBMTF9MUFVBUlRfU2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJpdE9yZGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJVE9SREVSX0xTQkZJUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJVE9SREVSX01TQkZJUlNUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0VHJhbnNmZXJCaXRPcmRlcihVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBCaXRPcmRlcikKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCwgQml0T3JkZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0cmFuc2ZlciBiaXQgb3JkZXIgKGVpdGhlciBMZXNzIG9yIE1vc3QgU2lnbmlmaWNhbnQgQml0IEZpcnN0KQorICAqIEBub3RlICAgTVNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiAgICAgICAgIExTQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTVNCRklSU1QgICAgICBMTF9MUFVBUlRfR2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJVE9SREVSX0xTQkZJUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0JJVE9SREVSX01TQkZJUlNUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFRyYW5zZmVyQml0T3JkZXIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWRkcmVzcyBvZiB0aGUgTFBVQVJUIG5vZGUuCisgICogQG5vdGUgICBUaGlzIGlzIHVzZWQgaW4gbXVsdGlwcm9jZXNzb3IgY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AgbW9kZSwKKyAgKiAgICAgICAgIGZvciB3YWtlIHVwIHdpdGggYWRkcmVzcyBtYXJrIGRldGVjdGlvbi4KKyAgKiBAbm90ZSAgIDRiaXRzIGFkZHJlc3Mgbm9kZSBpcyB1c2VkIHdoZW4gNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcuCisgICogICAgICAgICAoYjctYjQgc2hvdWxkIGJlIHNldCB0byAwKQorICAqICAgICAgICAgOGJpdHMgYWRkcmVzcyBub2RlIGlzIHVzZWQgd2hlbiA3LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNy4KKyAgKiAgICAgICAgIChUaGlzIGlzIHVzZWQgaW4gbXVsdGlwcm9jZXNzb3IgY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AgbW9kZSwKKyAgKiAgICAgICAgIGZvciB3YWtlIHVwIHdpdGggNy1iaXQgYWRkcmVzcyBtYXJrIGRldGVjdGlvbi4KKyAgKiAgICAgICAgIFRoZSBNU0Igb2YgdGhlIGNoYXJhY3RlciBzZW50IGJ5IHRoZSB0cmFuc21pdHRlciBzaG91bGQgYmUgZXF1YWwgdG8gMS4KKyAgKiAgICAgICAgIEl0IG1heSBhbHNvIGJlIHVzZWQgZm9yIGNoYXJhY3RlciBkZXRlY3Rpb24gZHVyaW5nIG5vcm1hbCByZWNlcHRpb24sCisgICogICAgICAgICBNdXRlIG1vZGUgaW5hY3RpdmUgKGZvciBleGFtcGxlLCBlbmQgb2YgYmxvY2sgZGV0ZWN0aW9uIGluIE1vZEJ1cyBwcm90b2NvbCkuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB3aG9sZSByZWNlaXZlZCBjaGFyYWN0ZXIgKDgtYml0KSBpcyBjb21wYXJlZCB0byB0aGUgQUREWzc6MF0KKyAgKiAgICAgICAgIHZhbHVlIGFuZCBDTUYgZmxhZyBpcyBzZXQgb24gbWF0Y2gpCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREICAgICAgICAgICBMTF9MUFVBUlRfQ29uZmlnTm9kZUFkZHJlc3NcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIEFERE03ICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ05vZGVBZGRyZXNzCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQWRkcmVzc0xlbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF80QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF83QgorICAqIEBwYXJhbSAgTm9kZUFkZHJlc3MgNCBvciA3IGJpdCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9Db25maWdOb2RlQWRkcmVzcyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBBZGRyZXNzTGVuLCB1aW50MzJfdCBOb2RlQWRkcmVzcykKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9BREQgfCBVU0FSVF9DUjJfQURETTcsCisgICAgICAgICAgICAgKHVpbnQzMl90KShBZGRyZXNzTGVuIHwgKE5vZGVBZGRyZXNzIDw8IFVTQVJUX0NSMl9BRERfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiA4IGJpdCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZSBhcyBzZXQgaW4gQUREIGZpZWxkIG9mIENSMi4KKyAgKiBAbm90ZSAgIElmIDQtYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LAorICAqICAgICAgICAgb25seSA0Yml0cyAoYjMtYjApIG9mIHJldHVybmVkIHZhbHVlIGFyZSByZWxldmFudCAoYjMxLWI0IGFyZSBub3QgcmVsZXZhbnQpCisgICogICAgICAgICBJZiA3LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNywKKyAgKiAgICAgICAgIG9ubHkgOGJpdHMgKGI3LWIwKSBvZiByZXR1cm5lZCB2YWx1ZSBhcmUgcmVsZXZhbnQgKGIzMS1iOCBhcmUgbm90IHJlbGV2YW50KQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERCAgICAgICAgICAgTExfTFBVQVJUX0dldE5vZGVBZGRyZXNzCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgQWRkcmVzcyBvZiB0aGUgTFBVQVJUIG5vZGUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXROb2RlQWRkcmVzcyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9BREQpID4+IFVTQVJUX0NSMl9BRERfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gTGVuZ3RoIG9mIE5vZGUgQWRkcmVzcyB1c2VkIGluIEFkZHJlc3MgRGV0ZWN0aW9uIG1vZGUgKDctYml0IG9yIDQtYml0KQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERE03ICAgICAgICAgTExfTFBVQVJUX0dldE5vZGVBZGRyZXNzTGVuCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQUREUkVTU19ERVRFQ1RfNEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQUREUkVTU19ERVRFQ1RfN0IKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0Tm9kZUFkZHJlc3NMZW4oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQURETTcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUlRTIEhXIEZsb3cgQ29udHJvbAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZVJUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlUlRTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlRTIEhXIEZsb3cgQ29udHJvbAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ1RTIEhXIEZsb3cgQ29udHJvbAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUNUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlQ1RTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ1RTIEhXIEZsb3cgQ29udHJvbAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVDVFNIV0Zsb3dDdHJsCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVDVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgSFcgRmxvdyBDb250cm9sIG1vZGUgKGJvdGggQ1RTIGFuZCBSVFMpCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfU2V0SFdGbG93Q3RybFxuCisgICogICAgICAgICBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfU2V0SFdGbG93Q3RybAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhhcmR3YXJlRmxvd0NvbnRyb2wgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX1JUUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfQ1RTCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0SFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBIYXJkd2FyZUZsb3dDb250cm9sKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSwgSGFyZHdhcmVGbG93Q29udHJvbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIEhXIEZsb3cgQ29udHJvbCBjb25maWd1cmF0aW9uIChib3RoIENUUyBhbmQgUlRTKQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfTFBVQVJUX0dldEhXRmxvd0N0cmxcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfTFBVQVJUX0dldEhXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9DVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX1JUU19DVFMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0SFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgT3ZlcnJ1biBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX0xQVUFSVF9FbmFibGVPdmVycnVuRGV0ZWN0CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZU92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBPdmVycnVuIGRldGVjdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVPdmVycnVuRGV0ZWN0CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBPdmVycnVuIGRldGVjdGlvbiBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT1ZSRElTICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkT3ZlcnJ1bkRldGVjdAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUykgIT0gVVNBUlRfQ1IzX09WUkRJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IGV2ZW50IHR5cGUgZm9yIFdha2UgVVAgSW50ZXJydXB0IEZsYWcgKFdVU1sxOjBdIGJpdHMpCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VTICAgICAgICAgICBMTF9MUFVBUlRfU2V0V0tVUFR5cGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUeXBlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9PTl9BRERSRVNTCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9PTl9TVEFSVEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fUlhORQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFdLVVBUeXBlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFR5cGUpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VTLCBUeXBlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZXZlbnQgdHlwZSBmb3IgV2FrZSBVUCBJbnRlcnJ1cHQgRmxhZyAoV1VTWzE6MF0gYml0cykKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVVMgICAgICAgICAgIExMX0xQVUFSVF9HZXRXS1VQVHlwZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9PTl9BRERSRVNTCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9PTl9TVEFSVEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fUlhORQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRXS1VQVHlwZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgTFBVQVJUIEJSUiByZWdpc3RlciBmb3IgYWNoaWV2aW5nIGV4cGVjdGVkIEJhdWQgUmF0ZSB2YWx1ZS4KKyAgKgorICAqIEBub3RlICAgQ29tcHV0ZSBhbmQgc2V0IExQVUFSVERJViB2YWx1ZSBpbiBCUlIgUmVnaXN0ZXIgKGZ1bGwgQlJSIGNvbnRlbnQpCisgICogICAgICAgICBhY2NvcmRpbmcgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIGFuZCBleHBlY3RlZCBCYXVkIFJhdGUgdmFsdWVzCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGFuZCBCYXVkIFJhdGUgdmFsdWVzIHByb3ZpZGVkIGFzIGZ1bmN0aW9uIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHZhbGlkCisgICogICAgICAgICAoQmF1ZCByYXRlIHZhbHVlICE9IDApLgorICAqIEBub3RlICAgUHJvdmlkZWQgdGhhdCBMUFVBUlR4X0JSUiBtdXN0IGJlID4gPSAweDMwMCBhbmQgTFBVQVJUX0JSUiBpcyAyMC1iaXQsCisgICogICAgICAgICBhIGNhcmUgc2hvdWxkIGJlIHRha2VuIHdoZW4gZ2VuZXJhdGluZyBoaWdoIGJhdWQgcmF0ZXMgdXNpbmcgaGlnaCBQZXJpcGhDbGsKKyAgKiAgICAgICAgIHZhbHVlcy4gUGVyaXBoQ2xrIG11c3QgYmUgaW4gdGhlIHJhbmdlIFszIHggQmF1ZFJhdGUsIDQwOTYgeCBCYXVkUmF0ZV0uCisgICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJSICAgICAgICAgICBMTF9MUFVBUlRfU2V0QmF1ZFJhdGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQZXJpcGhDbGsgUGVyaXBoZXJhbCBDbG9jaworICAqIEBwYXJhbSAgQmF1ZFJhdGUgQmF1ZCBSYXRlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0QmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgUGVyaXBoQ2xrLCB1aW50MzJfdCBCYXVkUmF0ZSkKK3sKKyAgTFBVQVJUeC0+QlJSID0gX19MTF9MUFVBUlRfRElWKFBlcmlwaENsaywgQmF1ZFJhdGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IEJhdWQgUmF0ZSB2YWx1ZSwgYWNjb3JkaW5nIHRvIExQVUFSVERJViBwcmVzZW50IGluIEJSUiByZWdpc3RlcgorICAqICAgICAgICAgKGZ1bGwgQlJSIGNvbnRlbnQpLCBhbmQgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIHZhbHVlcworICAqIEBub3RlICAgSW4gY2FzZSBvZiBub24taW5pdGlhbGl6ZWQgb3IgaW52YWxpZCB2YWx1ZSBzdG9yZWQgaW4gQlJSIHJlZ2lzdGVyLCB2YWx1ZSAwIHdpbGwgYmUgcmV0dXJuZWQuCisgICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJSICAgICAgICAgICBMTF9MUFVBUlRfR2V0QmF1ZFJhdGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQZXJpcGhDbGsgUGVyaXBoZXJhbCBDbG9jaworICAqIEByZXR2YWwgQmF1ZCBSYXRlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldEJhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFBlcmlwaENsaykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgbHB1YXJ0ZGl2ID0gMHgwVTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYnJycmVzdWx0ID0gMHgwVTsKKworICBscHVhcnRkaXYgPSBMUFVBUlR4LT5CUlIgJiBMUFVBUlRfQlJSX01BU0s7CisKKyAgaWYgKGxwdWFydGRpdiA+PSBMUFVBUlRfQlJSX01JTl9WQUxVRSkKKyAgeworICAgIGJycnJlc3VsdCA9ICh1aW50MzJfdCkoKCh1aW50NjRfdCkoUGVyaXBoQ2xrKSAqIExQVUFSVF9MUFVBUlRESVZfRlJFUV9NVUwpIC8gbHB1YXJ0ZGl2KTsKKyAgfQorCisgIHJldHVybiAoYnJycmVzdWx0KTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9IYWxmRHVwbGV4IENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8gSGFsZiBEdXBsZXggZmVhdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX0xQVUFSVF9FbmFibGVIYWxmRHVwbGV4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRIYWxmRHVwbGV4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRIYWxmRHVwbGV4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpID09IChVU0FSVF9DUjNfSERTRUwpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9ERSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERyaXZlciBFbmFibGUgZmVhdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IERFRFQgKERyaXZlciBFbmFibGUgRGUtQXNzZXJ0aW9uIFRpbWUpLCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFRFQgICAgICAgICAgTExfTFBVQVJUX1NldERFRGVhc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0REVEZWFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgVGltZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERURULCBUaW1lIDw8IFVTQVJUX0NSMV9ERURUX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIERFRFQgKERyaXZlciBFbmFibGUgRGUtQXNzZXJ0aW9uIFRpbWUpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREVEVCAgICAgICAgICBMTF9MUFVBUlRfR2V0REVEZWFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogYworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRERURlYXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERURUKSA+PiBVU0FSVF9DUjFfREVEVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBERUFUIChEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lKSwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERUFUICAgICAgICAgIExMX0xQVUFSVF9TZXRERUFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRERUFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgVGltZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERUFULCBUaW1lIDw8IFVTQVJUX0NSMV9ERUFUX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIERFQVQgKERyaXZlciBFbmFibGUgQXNzZXJ0aW9uIFRpbWUpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREVBVCAgICAgICAgICBMTF9MUFVBUlRfR2V0REVBc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKSA6IFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRERUFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVBVCkgPj4gVVNBUlRfQ1IxX0RFQVRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVERU1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlREVNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVNKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERyaXZlciBFbmFibGUgKERFKSBNb2RlCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgREVNICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZURFTW9kZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlREVNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIERyaXZlciBFbmFibGUgKERFKSBNb2RlIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRERU1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZERFTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSkgPT0gKFVTQVJUX0NSM19ERU0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFUCAgICAgICAgICAgTExfTFBVQVJUX1NldERFU2lnbmFsUG9sYXJpdHkKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ERV9QT0xBUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RFX1BPTEFSSVRZX0xPVworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldERFU2lnbmFsUG9sYXJpdHkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERVAgICAgICAgICAgIExMX0xQVUFSVF9HZXRERVNpZ25hbFBvbGFyaXR5CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREVfUE9MQVJJVFlfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ERV9QT0xBUklUWV9MT1cKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0REVTaWduYWxQb2xhcml0eShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ERVApKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBQYXJpdHkgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUEUgICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1BFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9QRSkgPT0gKFVTQVJUX0lTUl9QRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgRnJhbWluZyBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBGRSAgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfRkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19GRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0ZFKSA9PSAoVVNBUlRfSVNSX0ZFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBOb2lzZSBlcnJvciBkZXRlY3RlZCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBORSAgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfTkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19ORShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX05FKSA9PSAoVVNBUlRfSVNSX05FKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBPdmVyUnVuIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE9SRSAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19PUkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19PUkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9PUkUpID09IChVU0FSVF9JU1JfT1JFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBJRExFIGxpbmUgZGV0ZWN0ZWQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSURMRSAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0lETEUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19JRExFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfSURMRSkgPT0gKFVTQVJUX0lTUl9JRExFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSZWFkIERhdGEgUmVnaXN0ZXIgTm90IEVtcHR5IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYTkUgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWE5FCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhORShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1JYTkUpID09IChVU0FSVF9JU1JfUlhORSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDICAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UQworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfVEMpID09IChVU0FSVF9JU1JfVEMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhFICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1RYRSkgPT0gKFVTQVJUX0lTUl9UWEUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENUUyBpbnRlcnJ1cHQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQ1RTSUYgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX25DVFMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19uQ1RTKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTSUYpID09IChVU0FSVF9JU1JfQ1RTSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENUUyBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDVFMgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQ1RTCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQ1RTKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTKSA9PSAoVVNBUlRfSVNSX0NUUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgQnVzeSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBCVVNZICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQlVTWQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0JVU1koVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9CVVNZKSA9PSAoVVNBUlRfSVNSX0JVU1kpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENoYXJhY3RlciBNYXRjaCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDTUYgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQ00KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19DTShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0NNRikgPT0gKFVTQVJUX0lTUl9DTUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFNlbmQgQnJlYWsgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgU0JLRiAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1NCSworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1NCSyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1NCS0YpID09IChVU0FSVF9JU1JfU0JLRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUmVjZWl2ZSBXYWtlIFVwIGZyb20gbXV0ZSBtb2RlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJXVSAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SV1UKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SV1UoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SV1UpID09IChVU0FSVF9JU1JfUldVKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVRiAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19XS1VQCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfV0tVUChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1dVRikgPT0gKFVTQVJUX0lTUl9XVUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRyYW5zbWl0IEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUFDSyAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVEVBQ0sKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19URUFDSyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1RFQUNLKSA9PSAoVVNBUlRfSVNSX1RFQUNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSZWNlaXZlIEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSRUFDSyAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUkVBQ0sKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SRUFDSyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1JFQUNLKSA9PSAoVVNBUlRfSVNSX1JFQUNLKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDbGVhciBQYXJpdHkgRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIFBFQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19QRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfUEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX1BFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEZyYW1pbmcgRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIEZFQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19GRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfRkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX0ZFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE5vaXNlIGRldGVjdGVkIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBOQ0YgICAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfTkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX05FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9OQ0YgKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBPdmVyUnVuIEVycm9yIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBPUkVDRiAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfT1JFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19PUkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX09SRUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBJRExFIGxpbmUgZGV0ZWN0ZWQgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIElETEVDRiAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19JRExFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19JRExFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9JRExFQ0YpOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUQ0NGICAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfVEMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9UQ0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDVFMgSW50ZXJydXB0IEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBDVFNDRiAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfbkNUUworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfbkNUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfQ1RTQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYXJhY3RlciBNYXRjaCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ01DRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX0NNCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19DTShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfQ01DRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgV1VDRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX1dLVVAKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX1dVQ0YpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJRExFIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX0lETEUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfSURMRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUlggTm90IEVtcHR5IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1JYTkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9UQworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9UQyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRYIEVtcHR5IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRUlFICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9UWEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUlFICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9QRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9QRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfQ00KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFcnJvciBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIFdoZW4gc2V0LCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIEJpdCBpcyBlbmFibGluZyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIGEgZnJhbWluZworICAqICAgICAgICAgZXJyb3IsIG92ZXJydW4gZXJyb3Igb3Igbm9pc2UgZmxhZyAoRkU9MSBvciBPUkU9MSBvciBORj0xIGluIHRoZSBMUFVBUlR4X0lTUiByZWdpc3RlcikuCisgICogICAgICAgICAtIDA6IEludGVycnVwdCBpcyBpbmhpYml0ZWQKKyAgKiAgICAgICAgIC0gMTogQW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuIEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgTFBVQVJUeF9JU1IgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfRVJST1IKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDVFMgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTSUUgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfQ1RTCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9XS1VQCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1dLVVAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19XVUZJRSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIElETEUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX0lETEUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX0lETEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJYIE5vdCBFbXB0eSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWE5FSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhORQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhORShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfVEMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFggRW1wdHkgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQYXJpdHkgRXJyb3IgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX1BFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9QRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX0NNCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9DTShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEVycm9yIEludGVycnVwdAorICAqIEBub3RlICAgV2hlbiBzZXQsIEVycm9yIEludGVycnVwdCBFbmFibGUgQml0IGlzIGVuYWJsaW5nIGludGVycnVwdCBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgYSBmcmFtaW5nCisgICogICAgICAgICBlcnJvciwgb3ZlcnJ1biBlcnJvciBvciBub2lzZSBmbGFnIChGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIExQVUFSVHhfSVNSIHJlZ2lzdGVyKS4KKyAgKiAgICAgICAgIC0gMDogSW50ZXJydXB0IGlzIGluaGliaXRlZAorICAqICAgICAgICAgLSAxOiBBbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW4gRkU9MSBvciBPUkU9MSBvciBORj0xIGluIHRoZSBMUFVBUlR4X0lTUiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfRVJST1IKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ1RTIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9DVFMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfV0tVUAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfV0tVUChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBJRExFIEludGVycnVwdCAgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfSURMRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfSURMRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSkgPT0gKFVTQVJUX0NSMV9JRExFSUUpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUlggTm90IEVtcHR5IEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYTkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYTkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUUpID09IChVU0FSVF9DUjFfUlhORUlFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVEMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSkgPT0gKFVTQVJUX0NSMV9UQ0lFKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRYIEVtcHR5IEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRUlFICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhFSUUpID09IChVU0FSVF9DUjFfVFhFSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUlFICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9QRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfUEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKSA9PSAoVVNBUlRfQ1IxX1BFSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9DTQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKSA9PSAoVVNBUlRfQ1IxX0NNSUUpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgRXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfRVJST1IKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKSA9PSAoVVNBUlRfQ1IzX0VJRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgQ1RTIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX0NUUworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfQ1RTKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpID09IChVU0FSVF9DUjNfQ1RTSUUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfV0tVUAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfV0tVUChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKSA9PSAoVVNBUlRfQ1IzX1dVRklFKSk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfRE1BX01hbmFnZW1lbnQgRE1BX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgTW9kZSBmb3IgcmVjZXB0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BUiAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfUlgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZURNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIE1vZGUgaXMgZW5hYmxlZCBmb3IgcmVjZXB0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BUiAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKSA9PSAoVVNBUlRfQ1IzX0RNQVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHRyYW5zbWlzc2lvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBNb2RlIGZvciB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBNb2RlIGlzIGVuYWJsZWQgZm9yIHRyYW5zbWlzc2lvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkgPT0gKFVTQVJUX0NSM19ETUFUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRE1BRGVhY3RPblJ4RXJyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURNQURlYWN0T25SeEVycihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yIGlzIGRpc2FibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkRE1BRGVhY3RPblJ4RXJyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKSA9PSAoVVNBUlRfQ1IzX0REUkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIExQVUFSVCBkYXRhIHJlZ2lzdGVyIGFkZHJlc3MgdXNlZCBmb3IgRE1BIHRyYW5zZmVyCisgICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9MUFVBUlRfRE1BX0dldFJlZ0FkZHJcbgorICAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfTFBVQVJUX0RNQV9HZXRSZWdBZGRyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ETUFfUkVHX0RBVEFfUkVDRUlWRQorICAqIEByZXR2YWwgQWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0RNQV9HZXRSZWdBZGRyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IERpcmVjdGlvbikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgZGF0YV9yZWdfYWRkciA9IDBVOworCisgIGlmIChEaXJlY3Rpb24gPT0gTExfTFBVQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCkKKyAgeworICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFREUiByZWdpc3RlciAqLworICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKExQVUFSVHgtPlREUik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgUkRSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoTFBVQVJUeC0+UkRSKTsKKyAgfQorCisgIHJldHVybiBkYXRhX3JlZ19hZGRyOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9EYXRhX01hbmFnZW1lbnQgRGF0YV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWFkIFJlY2VpdmVyIERhdGEgcmVnaXN0ZXIgKFJlY2VpdmUgRGF0YSB2YWx1ZSwgOCBiaXRzKQorICAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfTFBVQVJUX1JlY2VpdmVEYXRhOAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9MUFVBUlRfUmVjZWl2ZURhdGE4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoTFBVQVJUeC0+UkRSLCBVU0FSVF9SRFJfUkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBSZWNlaXZlciBEYXRhIHJlZ2lzdGVyIChSZWNlaXZlIERhdGEgdmFsdWUsIDkgYml0cykKKyAgKiBAcm10b2xsIFJEUiAgICAgICAgICBSRFIgICAgICAgICAgIExMX0xQVUFSVF9SZWNlaXZlRGF0YTkKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9MUFVBUlRfUmVjZWl2ZURhdGE5KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDE2X3QpKFJFQURfQklUKExQVUFSVHgtPlJEUiwgVVNBUlRfUkRSX1JEUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGluIFRyYW5zbWl0dGVyIERhdGEgUmVnaXN0ZXIgKFRyYW5zbWl0IERhdGEgdmFsdWUsIDggYml0cykKKyAgKiBAcm10b2xsIFREUiAgICAgICAgICBURFIgICAgICAgICAgIExMX0xQVUFSVF9UcmFuc21pdERhdGE4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfVHJhbnNtaXREYXRhOChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50OF90IFZhbHVlKQoreworICBMUFVBUlR4LT5URFIgPSBWYWx1ZTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBpbiBUcmFuc21pdHRlciBEYXRhIFJlZ2lzdGVyIChUcmFuc21pdCBEYXRhIHZhbHVlLCA5IGJpdHMpCisgICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9MUFVBUlRfVHJhbnNtaXREYXRhOQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9UcmFuc21pdERhdGE5KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQxNl90IFZhbHVlKQoreworICBMUFVBUlR4LT5URFIgPSBWYWx1ZSAmIDB4MUZGVTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfRXhlY3V0aW9uIEV4ZWN1dGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVxdWVzdCBCcmVhayBzZW5kaW5nCisgICogQHJtdG9sbCBSUVIgICAgICAgICAgU0JLUlEgICAgICAgICBMTF9MUFVBUlRfUmVxdWVzdEJyZWFrU2VuZGluZworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9SZXF1ZXN0QnJlYWtTZW5kaW5nKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+UlFSLCBVU0FSVF9SUVJfU0JLUlEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFB1dCBMUFVBUlQgaW4gbXV0ZSBtb2RlIGFuZCBzZXQgdGhlIFJXVSBmbGFnCisgICogQHJtdG9sbCBSUVIgICAgICAgICAgTU1SUSAgICAgICAgICBMTF9MUFVBUlRfUmVxdWVzdEVudGVyTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfUmVxdWVzdEVudGVyTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5SUVIsIFVTQVJUX1JRUl9NTVJRKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXF1ZXN0IGEgUmVjZWl2ZSBEYXRhIGZsdXNoCisgICogQG5vdGUgICBBbGxvd3MgdG8gZGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSB3aXRob3V0IHJlYWRpbmcgdGhlbSwgYW5kIGF2b2lkIGFuIG92ZXJydW4KKyAgKiAgICAgICAgIGNvbmRpdGlvbi4KKyAgKiBAcm10b2xsIFJRUiAgICAgICAgICBSWEZSUSAgICAgICAgIExMX0xQVUFSVF9SZXF1ZXN0UnhEYXRhRmx1c2gKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfUmVxdWVzdFJ4RGF0YUZsdXNoKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+UlFSLCBVU0FSVF9SUVJfUlhGUlEpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfTFBVQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KTsKK0Vycm9yU3RhdHVzIExMX0xQVUFSVF9Jbml0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIExMX0xQVUFSVF9Jbml0VHlwZURlZiAqTFBVQVJUX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfTFBVQVJUX1N0cnVjdEluaXQoTExfTFBVQVJUX0luaXRUeXBlRGVmICpMUFVBUlRfSW5pdFN0cnVjdCk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogTFBVQVJUMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfTExfTFBVQVJUX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfcHdyLmggYi9JbmMvc3RtMzJsMHh4X2xsX3B3ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjJlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2xsX3B3ci5oCkBAIC0wLDAgKzEsNzQzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3B3ci5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQV1IgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkwweHhfTExfUFdSX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfTExfUFdSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFBXUikKKworLyoqIEBkZWZncm91cCBQV1JfTEwgUFdSCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFBXUiBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1BXUl9Xcml0ZVJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9DUl9DU0JGICAgICAgICAgICAgICAgICAgICAgUFdSX0NSX0NTQkYgICAgICAgICAgICAvKiE8IENsZWFyIHN0YW5kYnkgZmxhZyAqLworI2RlZmluZSBMTF9QV1JfQ1JfQ1dVRiAgICAgICAgICAgICAgICAgICAgIFBXUl9DUl9DV1VGICAgICAgICAgICAgLyohPCBDbGVhciB3YWtldXAgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1BXUl9SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX0NTUl9XVUYgICAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX1dVRiAgICAgICAgICAgIC8qITwgV2FrZXVwIGZsYWcgKi8KKyNkZWZpbmUgTExfUFdSX0NTUl9TQkYgICAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX1NCRiAgICAgICAgICAgIC8qITwgU3RhbmRieSBmbGFnICovCisjaWYgZGVmaW5lZChQV1JfUFZEX1NVUFBPUlQpCisjZGVmaW5lIExMX1BXUl9DU1JfUFZETyAgICAgICAgICAgICAgICAgICAgUFdSX0NTUl9QVkRPICAgICAgICAgICAvKiE8IFBvd2VyIHZvbHRhZ2UgZGV0ZWN0b3Igb3V0cHV0IGZsYWcgKi8KKyNlbmRpZiAvKiBQV1JfUFZEX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFBXUl9DU1JfVlJFRklOVFJEWUYpCisjZGVmaW5lIExMX1BXUl9DU1JfVlJFRklOVFJEWUYgICAgICAgICAgICAgUFdSX0NTUl9WUkVGSU5UUkRZRiAgICAvKiE8IFZSRUZJTlQgcmVhZHkgZmxhZyAqLworI2VuZGlmIC8qIFBXUl9DU1JfVlJFRklOVFJEWUYgKi8KKyNkZWZpbmUgTExfUFdSX0NTUl9WT1MgICAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX1ZPU0YgICAgICAgICAgIC8qITwgVm9sdGFnZSBzY2FsaW5nIHNlbGVjdCBmbGFnICovCisjZGVmaW5lIExMX1BXUl9DU1JfUkVHTFBGICAgICAgICAgICAgICAgICAgUFdSX0NTUl9SRUdMUEYgICAgICAgICAvKiE8IFJlZ3VsYXRvciBsb3cgcG93ZXIgZmxhZyAqLworI2RlZmluZSBMTF9QV1JfQ1NSX0VXVVAxICAgICAgICAgICAgICAgICAgIFBXUl9DU1JfRVdVUDEgICAgICAgICAgLyohPCBFbmFibGUgV0tVUCBwaW4gMSAqLworI2RlZmluZSBMTF9QV1JfQ1NSX0VXVVAyICAgICAgICAgICAgICAgICAgIFBXUl9DU1JfRVdVUDIgICAgICAgICAgLyohPCBFbmFibGUgV0tVUCBwaW4gMiAqLworI2lmIGRlZmluZWQoUFdSX0NTUl9FV1VQMykKKyNkZWZpbmUgTExfUFdSX0NTUl9FV1VQMyAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX0VXVVAzICAgICAgICAgIC8qITwgRW5hYmxlIFdLVVAgcGluIDMgKi8KKyNlbmRpZiAvKiBQV1JfQ1NSX0VXVVAzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19SRUdVX1ZPTFRBR0UgUmVndWxhdG9yIFZvbHRhZ2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMSAgICAgICAgIChQV1JfQ1JfVk9TXzApICAgICAgICAgICAgICAgICAgIC8qITwgMS44ViAocmFuZ2UgMSkgKi8KKyNkZWZpbmUgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTIgICAgICAgICAoUFdSX0NSX1ZPU18xKSAgICAgICAgICAgICAgICAgICAvKiE8IDEuNVYgKHJhbmdlIDIpICovCisjZGVmaW5lIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUzICAgICAgICAgKFBXUl9DUl9WT1NfMCB8IFBXUl9DUl9WT1NfMSkgICAgLyohPCAxLjJWIChyYW5nZSAzKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfTU9ERV9QV1IgTW9kZSBQb3dlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9NT0RFX1NUT1AgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgIC8qITwgRW50ZXIgU3RvcCBtb2RlIHdoZW4gdGhlIENQVSBlbnRlcnMgZGVlcHNsZWVwICovCisjZGVmaW5lIExMX1BXUl9NT0RFX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgKFBXUl9DUl9QRERTKSAgICAgICAgICAgICAgICAgIC8qITwgRW50ZXIgU3RhbmRieSBtb2RlIHdoZW4gdGhlIENQVSBlbnRlcnMgZGVlcHNsZWVwICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19SRUdVX01PREVfTFBfTU9ERVMgIFJlZ3VsYXRvciBNb2RlIEluIExvdyBQb3dlciBNb2RlcworICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9SRUdVX0xQTU9ERVNfTUFJTiAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgVm9sdGFnZSByZWd1bGF0b3IgaW4gbWFpbiBtb2RlIGR1cmluZyBkZWVwc2xlZXAvc2xlZXAvbG93LXBvd2VyIHJ1biBtb2RlICovCisjZGVmaW5lIExMX1BXUl9SRUdVX0xQTU9ERVNfTE9XX1BPV0VSICAgICAgKFBXUl9DUl9MUFNEU1IpICAgIC8qITwgVm9sdGFnZSByZWd1bGF0b3IgaW4gbG93LXBvd2VyIG1vZGUgZHVyaW5nIGRlZXBzbGVlcC9zbGVlcC9sb3ctcG93ZXIgcnVuIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisjaWYgZGVmaW5lZChQV1JfQ1JfTFBEUykKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX1JFR1VfTU9ERV9EU19NT0RFICBSZWd1bGF0b3IgTW9kZSBJbiBEZWVwIFNsZWVwIE1vZGUKKyAqIEB7CisgKi8KKyNkZWZpbmUgTExfUFdSX1JFR1VfRFNNT0RFX01BSU4gICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFZvbHRhZ2UgcmVndWxhdG9yIGluIG1haW4gbW9kZSBkdXJpbmcgZGVlcHNsZWVwIG1vZGUgd2hlbiBQV1JfQ1JfTFBTRFNSID0gMCAqLworI2RlZmluZSBMTF9QV1JfUkVHVV9EU01PREVfTE9XX1BPV0VSICAgKFBXUl9DUl9MUERTKSAgICAgICAgIC8qITwgVm9sdGFnZSByZWd1bGF0b3IgaW4gbG93LXBvd2VyIG1vZGUgZHVyaW5nIGRlZXBzbGVlcCBtb2RlIHdoZW4gUFdSX0NSX0xQU0RTUiA9IDAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUFdSX0NSX0xQRFMgKi8KKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyoqIEBkZWZncm91cCBQV1JfTExfRUNfUFZETEVWRUwgUG93ZXIgVm9sdGFnZSBEZXRlY3RvciBMZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9QVkRMRVZFTF8wICAgICAgICAgICAgICAgICAgKFBXUl9DUl9QTFNfTEVWMCkgICAgICAvKiE8IFZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IFBWRCAxLjkgViAqLworI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfMSAgICAgICAgICAgICAgICAgIChQV1JfQ1JfUExTX0xFVjEpICAgICAgLyohPCBWb2x0YWdlIHRocmVzaG9sZCBkZXRlY3RlZCBieSBQVkQgMi4xIFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzIgICAgICAgICAgICAgICAgICAoUFdSX0NSX1BMU19MRVYyKSAgICAgIC8qITwgVm9sdGFnZSB0aHJlc2hvbGQgZGV0ZWN0ZWQgYnkgUFZEIDIuMyBWICovCisjZGVmaW5lIExMX1BXUl9QVkRMRVZFTF8zICAgICAgICAgICAgICAgICAgKFBXUl9DUl9QTFNfTEVWMykgICAgICAvKiE8IFZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IFBWRCAyLjUgViAqLworI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfNCAgICAgICAgICAgICAgICAgIChQV1JfQ1JfUExTX0xFVjQpICAgICAgLyohPCBWb2x0YWdlIHRocmVzaG9sZCBkZXRlY3RlZCBieSBQVkQgMi43IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzUgICAgICAgICAgICAgICAgICAoUFdSX0NSX1BMU19MRVY1KSAgICAgIC8qITwgVm9sdGFnZSB0aHJlc2hvbGQgZGV0ZWN0ZWQgYnkgUFZEIDIuOSBWICovCisjZGVmaW5lIExMX1BXUl9QVkRMRVZFTF82ICAgICAgICAgICAgICAgICAgKFBXUl9DUl9QTFNfTEVWNikgICAgICAvKiE8IFZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IFBWRCAzLjEgViAqLworI2RlZmluZSBMTF9QV1JfUFZETEVWRUxfNyAgICAgICAgICAgICAgICAgIChQV1JfQ1JfUExTX0xFVjcpICAgICAgLyohPCBFeHRlcm5hbCBpbnB1dCBhbmFsb2cgdm9sdGFnZSAgIChDb21wYXJlIGludGVybmFsbHkgdG8gVlJFRklOVCkgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUFdSX1BWRF9TVVBQT1JUICovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19XQUtFVVBfUElOICBXYWtldXAgUGlucworICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMSAgICAgICAgICAgICAgICAgKFBXUl9DU1JfRVdVUDEpICAgICAgICAvKiE8IFdLVVAgcGluIDEgOiBQQTAgKi8KKyNkZWZpbmUgTExfUFdSX1dBS0VVUF9QSU4yICAgICAgICAgICAgICAgICAoUFdSX0NTUl9FV1VQMikgICAgICAgIC8qITwgV0tVUCBwaW4gMiA6IFBDMTMgKi8KKyNpZiBkZWZpbmVkKFBXUl9DU1JfRVdVUDMpCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMyAgICAgICAgICAgICAgICAgKFBXUl9DU1JfRVdVUDMpICAgICAgICAvKiE8IFdLVVAgcGluIDMgOiBQRTYgb3IgUEEyIGFjY29yZGluZyB0byBkZXZpY2UgKi8KKyNlbmRpZiAvKiBQV1JfQ1NSX0VXVVAzICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FeHBvcnRlZF9NYWNyb3MgUFdSIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIHdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gUFdSIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9QV1JfV3JpdGVSZWcoX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoUFdSLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gUFdSIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1BXUl9SZWFkUmVnKF9fUkVHX18pIFJFQURfUkVHKFBXUi0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUFdSIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFN3aXRjaCB0aGUgcmVndWxhdG9yIGZyb20gbWFpbiBtb2RlIHRvIGxvdy1wb3dlciBtb2RlCisgICogQHJtdG9sbCBDUiAgICBMUFJVTiAgICAgICBMTF9QV1JfRW5hYmxlTG93UG93ZXJSdW5Nb2RlCisgICogQG5vdGUgICBSZW1pbmQgdG8gc2V0IHRoZSByZWd1bGF0b3IgdG8gbG93IHBvd2VyIGJlZm9yZSBlbmFibGluZworICAqICAgICAgICAgTG93UG93ZXIgcnVuIG1vZGUgKGJpdCBAcmVmIExMX1BXUl9SRUdVX0xQTU9ERVNfTE9XX1BPV0VSKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVMb3dQb3dlclJ1bk1vZGUodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSLCBQV1JfQ1JfTFBSVU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN3aXRjaCB0aGUgcmVndWxhdG9yIGZyb20gbG93LXBvd2VyIG1vZGUgdG8gbWFpbiBtb2RlCisgICogQHJtdG9sbCBDUiAgICBMUFJVTiAgICAgICBMTF9QV1JfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IsIFBXUl9DUl9MUFJVTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIHJlZ3VsYXRvciBpcyBpbiBsb3ctcG93ZXIgbW9kZQorICAqIEBybXRvbGwgQ1IgICAgTFBSVU4gICAgICAgTExfUFdSX0lzRW5hYmxlZExvd1Bvd2VyUnVuTW9kZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRMb3dQb3dlclJ1bk1vZGUodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChQV1ItPkNSLCBQV1JfQ1JfTFBSVU4pID09IChQV1JfQ1JfTFBSVU4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdm9sdGFnZSByZWd1bGF0b3IgdG8gbG93LXBvd2VyIGFuZCBzd2l0Y2ggZnJvbSAKKyAgKiAgICAgICAgIHJ1biBtYWluIG1vZGUgdG8gcnVuIGxvdy1wb3dlciBtb2RlLgorICAqIEBybXRvbGwgQ1IgICAgTFBTRFNSICAgICAgIExMX1BXUl9FbnRlckxvd1Bvd2VyUnVuTW9kZVxuCisgICogICAgICAgICBDUiAgICBMUFJVTiAgICAgICAgTExfUFdSX0VudGVyTG93UG93ZXJSdW5Nb2RlCisgICogQG5vdGUgICBUaGlzICJoaWdoIGxldmVsIiBmdW5jdGlvbiBpcyBpbnRyb2R1Y2VkIHRvIHByb3ZpZGUgZnVuY3Rpb25hbAorICAqICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGZhbWlsaWVzLiBOb3RpY2UgdGhhdCB0aGUgdHdvIHJlZ2lzdGVycworICAqICAgICAgICAgaGF2ZSB0byBiZSB3cml0dGVuIHNlcXVlbnRpYWxseSwgc28gdGhpcyBmdW5jdGlvbiBpcyBub3QgYXRvbWljLgorICAqICAgICAgICAgVG8gYXNzdXJlIGF0b21pY2l0eSB5b3UgY2FuIGNhbGwgc2VwYXJhdGVseSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgKiAgICAgICAgIC0gQHJlZiBMTF9QV1JfU2V0UmVndWxNb2RlTFAoQHJlZiBMTF9QV1JfUkVHVV9MUE1PREVTX0xPV19QT1dFUik7CisgICogICAgICAgICAtIEByZWYgTExfUFdSX0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSgpOworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VudGVyTG93UG93ZXJSdW5Nb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUiwgUFdSX0NSX0xQU0RTUik7IC8qID0+IExMX1BXUl9TZXRSZWd1bE1vZGVMUChMTF9QV1JfUkVHVV9MUE1PREVTX0xPV19QT1dFUikgKi8KKyAgU0VUX0JJVChQV1ItPkNSLCBQV1JfQ1JfTFBSVU4pOyAgLyogPT4gTExfUFdSX0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSgpICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHZvbHRhZ2UgcmVndWxhdG9yIHRvIG1haW4gYW5kIHN3aXRjaCBmcm9tIAorICAqICAgICAgICAgcnVuIG1haW4gbW9kZSB0byBsb3ctcG93ZXIgbW9kZS4KKyAgKiBAcm10b2xsIENSICAgIExQU0RTUiAgICAgICBMTF9QV1JfRXhpdExvd1Bvd2VyUnVuTW9kZVxuCisgICogICAgICAgICBDUiAgICBMUFJVTiAgICAgICAgTExfUFdSX0V4aXRMb3dQb3dlclJ1bk1vZGUKKyAgKiBAbm90ZSAgIFRoaXMgImhpZ2ggbGV2ZWwiIGZ1bmN0aW9uIGlzIGludHJvZHVjZWQgdG8gcHJvdmlkZSBmdW5jdGlvbmFsICAgCisgICogICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgZmFtaWxpZXMuIE5vdGljZSB0aGF0IHRoZSB0d28gcmVnaXN0ZXJzIAorICAqICAgICAgICAgaGF2ZSB0byBiZSB3cml0dGVuIHNlcXVlbnRpYWxseSwgc28gdGhpcyBmdW5jdGlvbiBpcyBub3QgYXRvbWljLgorICAqICAgICAgICAgVG8gYXNzdXJlIGF0b21pY2l0eSB5b3UgY2FuIGNhbGwgc2VwYXJhdGVseSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgKiAgICAgICAgIC0gQHJlZiBMTF9QV1JfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSgpOworICAqICAgICAgICAgLSBAcmVmIExMX1BXUl9TZXRSZWd1bE1vZGVMUChAcmVmIExMX1BXUl9SRUdVX0xQTU9ERVNfTUFJTik7CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRXhpdExvd1Bvd2VyUnVuTW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUiwgUFdSX0NSX0xQUlVOKTsgICAvKiA9PiBMTF9QV1JfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSgpICovCisgIENMRUFSX0JJVChQV1ItPkNSLCBQV1JfQ1JfTFBTRFNSKTsgIC8qID0+IExMX1BXUl9TZXRSZWd1bE1vZGVMUChMTF9QV1JfUkVHVV9MUE1PREVTX01BSU4pICovCit9CisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgbWFpbiBpbnRlcm5hbCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UKKyAgKiBAcm10b2xsIENSICAgIFZPUyAgICAgICBMTF9QV1JfU2V0UmVndWxWb2x0YWdlU2NhbGluZworICAqIEBwYXJhbSAgVm9sdGFnZVNjYWxpbmcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRSZWd1bFZvbHRhZ2VTY2FsaW5nKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKQoreworICBNT0RJRllfUkVHKFBXUi0+Q1IsIFBXUl9DUl9WT1MsIFZvbHRhZ2VTY2FsaW5nKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIG1haW4gaW50ZXJuYWwgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlCisgICogQHJtdG9sbCBDUiAgICBWT1MgICAgICAgTExfUFdSX0dldFJlZ3VsVm9sdGFnZVNjYWxpbmcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0dldFJlZ3VsVm9sdGFnZVNjYWxpbmcodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUiwgUFdSX0NSX1ZPUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4KKyAgKiBAcm10b2xsIENSICAgIERCUCAgICAgICBMTF9QV1JfRW5hYmxlQmtVcEFjY2VzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUJrVXBBY2Nlc3Modm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSLCBQV1JfQ1JfREJQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGFjY2VzcyB0byB0aGUgYmFja3VwIGRvbWFpbgorICAqIEBybXRvbGwgQ1IgICAgREJQICAgICAgIExMX1BXUl9EaXNhYmxlQmtVcEFjY2VzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSLCBQV1JfQ1JfREJQKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgYmFja3VwIGRvbWFpbiBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUiAgICBEQlAgICAgICAgTExfUFdSX0lzRW5hYmxlZEJrVXBBY2Nlc3MKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkQmtVcEFjY2Vzcyh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1IsIFBXUl9DUl9EQlApID09IChQV1JfQ1JfREJQKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHZvbHRhZ2UgcmVndWxhdG9yIG1vZGUgZHVyaW5nIGxvdyBwb3dlciBtb2RlcworICAqIEBybXRvbGwgQ1IgICAgTFBTRFNSICAgICAgIExMX1BXUl9TZXRSZWd1bE1vZGVMUAorICAqIEBwYXJhbSAgUmVndWxNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfTFBNT0RFU19NQUlOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfTFBNT0RFU19MT1dfUE9XRVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRSZWd1bE1vZGVMUCh1aW50MzJfdCBSZWd1bE1vZGUpCit7CisgIE1PRElGWV9SRUcoUFdSLT5DUiwgUFdSX0NSX0xQU0RTUiwgUmVndWxNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdm9sdGFnZSByZWd1bGF0b3IgbW9kZSBkdXJpbmcgbG93IHBvd2VyIG1vZGVzCisgICogQHJtdG9sbCBDUiAgICBMUFNEU1IgICAgICAgTExfUFdSX0dldFJlZ3VsTW9kZUxQCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX0xQTU9ERVNfTUFJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX0xQTU9ERVNfTE9XX1BPV0VSCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0dldFJlZ3VsTW9kZUxQKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+Q1IsIFBXUl9DUl9MUFNEU1IpKTsKK30KKworI2lmIGRlZmluZWQoUFdSX0NSX0xQRFMpCisvKioKKyAgKiBAYnJpZWYgIFNldCB2b2x0YWdlIHJlZ3VsYXRvciBtb2RlIGR1cmluZyBkZWVwIHNsZWVwIG1vZGUKKyAgKiBAcm10b2xsIENSICAgIExQRFMgICAgICAgICBMTF9QV1JfU2V0UmVndWxNb2RlRFMKKyAgKiBAcGFyYW0gIFJlZ3VsTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX0RTTU9ERV9NQUlOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfRFNNT0RFX0xPV19QT1dFUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFJlZ3VsTW9kZURTKHVpbnQzMl90IFJlZ3VsTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhQV1ItPkNSLCBQV1JfQ1JfTFBEUywgUmVndWxNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdm9sdGFnZSByZWd1bGF0b3IgbW9kZSBkdXJpbmcgZGVlcCBzbGVlcCBtb2RlCisgICogQHJtdG9sbCBDUiAgICBMUERTICAgICAgICAgTExfUFdSX0dldFJlZ3VsTW9kZURTCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX0RTTU9ERV9NQUlOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfRFNNT0RFX0xPV19QT1dFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRSZWd1bE1vZGVEUyh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkNSLCBQV1JfQ1JfTFBEUykpOworfQorI2VuZGlmIC8qIFBXUl9DUl9MUERTICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHBvd2VyIGRvd24gbW9kZSB3aGVuIENQVSBlbnRlcnMgZGVlcHNsZWVwCisgICogQHJtdG9sbCBDUiAgICBQRERTICAgICAgICAgTExfUFdSX1NldFBvd2VyTW9kZQorICAqIEBwYXJhbSAgUERNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUQU5EQlkKKyAgKiBAbm90ZSAgIFNldCB0aGUgcmVndWxhdG9yIHRvIGxvdyBwb3dlciAoYml0IEByZWYgTExfUFdSX1JFR1VfTFBNT0RFU19MT1dfUE9XRVIpICAKKyAgKiAgICAgICAgIGJlZm9yZSBzZXR0aW5nIE1PREVfU1RPUC4gSWYgdGhlIHJlZ3VsYXRvciByZW1haW5zIGluICJtYWluIG1vZGUiLCAgIAorICAqICAgICAgICAgaXQgY29uc3VtZXMgbW9yZSBwb3dlciB3aXRob3V0IHByb3ZpZGluZyBhbnkgYWRkaXRpb25hbCBmZWF0dXJlLiAKKyAgKiAgICAgICAgIEluIE1PREVfU1RBTkRCWSB0aGUgcmVndWxhdG9yIGlzIGF1dG9tYXRpY2FsbHkgb2ZmLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFBvd2VyTW9kZSh1aW50MzJfdCBQRE1vZGUpCit7CisgIE1PRElGWV9SRUcoUFdSLT5DUiwgUFdSX0NSX1BERFMsIFBETW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHBvd2VyIGRvd24gbW9kZSB3aGVuIENQVSBlbnRlcnMgZGVlcHNsZWVwCisgICogQHJtdG9sbCBDUiAgICBQRERTICAgICAgICAgTExfUFdSX0dldFBvd2VyTW9kZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RBTkRCWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRQb3dlck1vZGUodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUiwgUFdSX0NSX1BERFMpKTsKK30KKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yCisgICogQHJtdG9sbCBDUiAgICBQTFMgICAgICAgTExfUFdSX1NldFBWRExldmVsCisgICogQHBhcmFtICBQVkRMZXZlbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRQVkRMZXZlbCh1aW50MzJfdCBQVkRMZXZlbCkKK3sKKyAgTU9ESUZZX1JFRyhQV1ItPkNSLCBQV1JfQ1JfUExTLCBQVkRMZXZlbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSB2b2x0YWdlIHRocmVzaG9sZCBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIENSICAgIFBMUyAgICAgICBMTF9QV1JfR2V0UFZETGV2ZWwKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRQVkRMZXZlbCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkNSLCBQV1JfQ1JfUExTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IKKyAgKiBAcm10b2xsIENSICAgIFBWREUgICAgICAgTExfUFdSX0VuYWJsZVBWRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVBWRCh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9QVkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IKKyAgKiBAcm10b2xsIENSICAgIFBWREUgICAgICAgTExfUFdSX0Rpc2FibGVQVkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlUFZEKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSLCBQV1JfQ1JfUFZERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUG93ZXIgVm9sdGFnZSBEZXRlY3RvciBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUiAgICBQVkRFICAgICAgIExMX1BXUl9Jc0VuYWJsZWRQVkQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUFZEKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DUiwgUFdSX0NSX1BWREUpID09IChQV1JfQ1JfUFZERSkpOworfQorI2VuZGlmIC8qIFBXUl9QVkRfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eQorICAqIEBybXRvbGwgQ1NSICAgRVdVUDEgICAgICAgTExfUFdSX0VuYWJsZVdha2VVcFBpblxuCisgICogQHJtdG9sbCBDU1IgICBFV1VQMiAgICAgICBMTF9QV1JfRW5hYmxlV2FrZVVwUGluXG4KKyAgKiBAcm10b2xsIENTUiAgIEVXVVAzICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW4KKyAgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMyAoKikKKyAgKgorICAqICAgICAgICAgKCopIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGluKQoreworICBTRVRfQklUKFBXUi0+Q1NSLCBXYWtlVXBQaW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFdha2VVcCBQSU54IGZ1bmN0aW9uYWxpdHkKKyAgKiBAcm10b2xsIENTUiAgIEVXVVAxICAgICAgIExMX1BXUl9EaXNhYmxlV2FrZVVwUGluXG4KKyAgKiBAcm10b2xsIENTUiAgIEVXVVAyICAgICAgIExMX1BXUl9EaXNhYmxlV2FrZVVwUGluXG4KKyAgKiBAcm10b2xsIENTUiAgIEVXVVAzICAgICAgIExMX1BXUl9EaXNhYmxlV2FrZVVwUGluCisgICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMgKCopCisgICoKKyAgKiAgICAgICAgICgqKSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW4pCit7CisgIENMRUFSX0JJVChQV1ItPkNTUiwgV2FrZVVwUGluKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDU1IgICBFV1VQMSAgICAgICBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4KKyAgKiBAcm10b2xsIENTUiAgIEVXVVAyICAgICAgIExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW5cbgorICAqIEBybXRvbGwgQ1NSICAgRVdVUDMgICAgICAgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpbgorICAqIEBwYXJhbSAgV2FrZVVwUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4zICgqKQorICAqCisgICogICAgICAgICAoKikgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGluKQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1NSLCBXYWtlVXBQaW4pID09IChXYWtlVXBQaW4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdWx0cmEgbG93LXBvd2VyIG1vZGUgYnkgZW5hYmxpbmcgVlJFRklOVCBzd2l0Y2ggb2ZmIGluIGxvdy1wb3dlciBtb2RlcworICAqIEBybXRvbGwgQ1IgICAgVUxQICAgICAgIExMX1BXUl9FbmFibGVVbHRyYUxvd1Bvd2VyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlVWx0cmFMb3dQb3dlcih2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9VTFApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdWx0cmEgbG93LXBvd2VyIG1vZGUgYnkgZGlzYWJsaW5nIFZSRUZJTlQgc3dpdGNoIG9mZiBpbiBsb3ctcG93ZXIgbW9kZXMKKyAgKiBAcm10b2xsIENSICAgIFVMUCAgICAgICBMTF9QV1JfRGlzYWJsZVVsdHJhTG93UG93ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlVWx0cmFMb3dQb3dlcih2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUiwgUFdSX0NSX1VMUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdWx0cmEgbG93LXBvd2VyIG1vZGUgaXMgZW5hYmxlZCBieSBjaGVja2luZyBpZiBWUkVGSU5UIHN3aXRjaCBvZmYgaW4gbG93LXBvd2VyIG1vZGVzIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSICAgIFVMUCAgICAgICBMTF9QV1JfSXNFbmFibGVkVWx0cmFMb3dQb3dlcgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRVbHRyYUxvd1Bvd2VyKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DUiwgUFdSX0NSX1VMUCkgPT0gKFBXUl9DUl9VTFApKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZmFzdCB3YWtldXAgYnkgaWdub3JpbmcgVlJFRklOVCBzdGFydHVwIHRpbWUgd2hlbiBleGl0aW5nIGZyb20gbG93LXBvd2VyIG1vZGUKKyAgKiBAcm10b2xsIENSICAgIEZXVSAgICAgICBMTF9QV1JfRW5hYmxlRmFzdFdha2VVcAorICAqIEBub3RlICAgV29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB1bHRyYSBsb3cgcG93ZXIgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVGYXN0V2FrZVVwKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUiwgUFdSX0NSX0ZXVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBmYXN0IHdha2V1cCBieSB3YWl0aW5nIFZSRUZJTlQgc3RhcnR1cCB0aW1lIHdoZW4gZXhpdGluZyBmcm9tIGxvdy1wb3dlciBtb2RlCisgICogQHJtdG9sbCBDUiAgICBGV1UgICAgICAgTExfUFdSX0Rpc2FibGVGYXN0V2FrZVVwCisgICogQG5vdGUgICBXb3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHVsdHJhIGxvdyBwb3dlciBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVGYXN0V2FrZVVwKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSLCBQV1JfQ1JfRldVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBmYXN0IHdha2V1cCBpcyBlbmFibGVkIGJ5IGNoZWNraW5nIGlmIFZSRUZJTlQgc3RhcnR1cCB0aW1lIHdoZW4gZXhpdGluZyBmcm9tIGxvdy1wb3dlciBtb2RlIGlzIGlnbm9yZWQKKyAgKiBAcm10b2xsIENSICAgIEZXVSAgICAgICBMTF9QV1JfSXNFbmFibGVkRmFzdFdha2VVcAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRGYXN0V2FrZVVwKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DUiwgUFdSX0NSX0ZXVSkgPT0gKFBXUl9DUl9GV1UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgbm9uLXZvbGF0aWxlIG1lbW9yeSAoRmxhc2ggYW5kIEVFUFJPTSkga2VlcGluZyBvZmYgZmVhdHVyZSB3aGVuIGV4aXRpbmcgZnJvbSBsb3ctcG93ZXIgbW9kZQorICAqIEBybXRvbGwgQ1IgICAgRFNfRUVfS09GRiAgICAgICBMTF9QV1JfRW5hYmxlTlZNS2VwdE9mZgorICAqIEBub3RlICAgV2hlbiBlbmFibGVkLCBhZnRlciBlbnRlcmluZyBsb3ctcG93ZXIgbW9kZSAoU3RvcCBvciBTdGFuZGJ5IG9ubHkpLCBpZiBSVU5fUEQgb2YgRkxBU0hfQUNSIHJlZ2lzdGVyCisgICogICAgICAgICBpcyBhbHNvIHNldCwgdGhlIEZsYXNoIG1lbW9yeSB3aWxsIG5vdCBiZSB3b2tlbiB1cCB3aGVuIGV4aXRpbmcgZnJvbSBkZWVwc2xlZXAgbW9kZS4KKyAgKiAgICAgICAgIFdoZW4gZW5hYmxlZCwgdGhlIEVFUFJPTSB3aWxsIG5vdCBiZSB3b2tlbiB1cCB3aGVuIGV4aXRpbmcgZnJvbSBsb3ctcG93ZXIgbW9kZSAoaWYgdGhlIGJpdCBSVU5fUEQgaXMgc2V0KQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZU5WTUtlcHRPZmYodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSLCBQV1JfQ1JfRFNFRUtPRkYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgbm9uLXZvbGF0aWxlIG1lbW9yeSAoRmxhc2ggYW5kIEVFUFJPTSkga2VlcGluZyBvZmYgZmVhdHVyZSB3aGVuIGV4aXRpbmcgZnJvbSBsb3ctcG93ZXIgbW9kZQorICAqIEBybXRvbGwgQ1IgICAgRFNfRUVfS09GRiAgICAgICBMTF9QV1JfRGlzYWJsZU5WTUtlcHRPZmYKKyAgKiBAbm90ZSAgIFdoZW4gZGlzYWJsZWQsIEZsYXNoIG1lbW9yeSBpcyB3b2tlbiB1cCB3aGVuIGV4aXRpbmcgZnJvbSBkZWVwc2xlZXAgbW9kZSBldmVuIGlmIHRoZSBiaXQgUlVOX1BEIGlzIHNldAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVOVk1LZXB0T2ZmKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSLCBQV1JfQ1JfRFNFRUtPRkYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIG5vbi12b2xhdGlsZSBtZW1vcnkgKEZsYXNoIGFuZCBFRVBST00pIGtlZXBpbmcgb2ZmIGZlYXR1cmUgd2hlbiBleGl0aW5nIGZyb20gbG93LXBvd2VyIG1vZGUgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IgICAgRFNfRUVfS09GRiAgICAgICBMTF9QV1JfSXNFbmFibGVkTlZNS2VwdE9mZgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWROVk1LZXB0T2ZmKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DUiwgUFdSX0NSX0RTRUVLT0ZGKSA9PSAoUFdSX0NSX0RTRUVLT0ZGKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcKKyAgKiBAcm10b2xsIENTUiAgIFdVRiAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19XVSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1NSLCBQV1JfQ1NSX1dVRikgPT0gKFBXUl9DU1JfV1VGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN0YW5kYnkgRmxhZworICAqIEBybXRvbGwgQ1NSICAgU0JGICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfU0IKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1NCKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DU1IsIFBXUl9DU1JfU0JGKSA9PSAoUFdSX0NTUl9TQkYpKTsKK30KKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIFZERCB2b2x0YWdlIGlzIGJlbG93IHRoZSBzZWxlY3RlZCBQVkQgdGhyZXNob2xkCisgICogQHJtdG9sbCBDU1IgICBQVkRPICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETyh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1NSLCBQV1JfQ1NSX1BWRE8pID09IChQV1JfQ1NSX1BWRE8pKTsKK30KKyNlbmRpZiAvKiBQV1JfUFZEX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUFdSX0NTUl9WUkVGSU5UUkRZRikKKy8qKgorICAqIEBicmllZiAgR2V0IEludGVybmFsIFJlZmVyZW5jZSBWcmVmSW50IEZsYWcKKyAgKiBAcm10b2xsIENTUiAgIFZSRUZJTlRSRFlGICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfVlJFRklOVFJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfVlJFRklOVFJEWSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1NSLCBQV1JfQ1NSX1ZSRUZJTlRSRFlGKSA9PSAoUFdSX0NTUl9WUkVGSU5UUkRZRikpOworfQorI2VuZGlmIC8qIFBXUl9DU1JfVlJFRklOVFJEWUYgKi8KKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgcmVndWxhdG9yIGlzIHJlYWR5IGluIHRoZSBzZWxlY3RlZCB2b2x0YWdlIHJhbmdlIG9yIGlmIGl0cyBvdXRwdXQgdm9sdGFnZSBpcyBzdGlsbCBjaGFuZ2luZyB0byB0aGUgcmVxdWlyZWQgdm9sdGFnZSBsZXZlbAorICAqIEBybXRvbGwgQ1NSICAgVk9TRiAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1ZPUworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfVk9TKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DU1IsIExMX1BXUl9DU1JfVk9TKSA9PSAoTExfUFdSX0NTUl9WT1MpKTsKK30KKy8qKgorICAqIEBicmllZiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSByZWd1bGF0b3IgaXMgcmVhZHkgaW4gbWFpbiBtb2RlIG9yIGlzIGluIGxvdy1wb3dlciBtb2RlCisgICogQHJtdG9sbCBDU1IgICBSRUdMUEYgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19SRUdMUEYKKyAgKiBAbm90ZSBUYWtlIGNhcmUsIHJldHVybiB2YWx1ZSAiMCIgbWVhbnMgdGhlIHJlZ3VsYXRvciBpcyByZWFkeS4gIFJldHVybiB2YWx1ZSAiMSIgbWVhbnMgdGhlIG91dHB1dCB2b2x0YWdlIHJhbmdlIGlzIHN0aWxsIGNoYW5naW5nLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUkVHTFBGKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoUFdSLT5DU1IsIFBXUl9DU1JfUkVHTFBGKSA9PSAoUFdSX0NTUl9SRUdMUEYpKTsKK30KKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3RhbmRieSBGbGFnCisgICogQHJtdG9sbCBDUiAgIENTQkYgICAgICAgTExfUFdSX0NsZWFyRmxhZ19TQgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19TQih2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9DU0JGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWdzCisgICogQHJtdG9sbCBDUiAgIENXVUYgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVSh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9DV1VGKTsKK30KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0luaXQgRGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfUFdSX0RlSW5pdCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFBXUikgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0xMX1BXUl9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2xsX3JjYy5oIGIvSW5jL3N0bTMybDB4eF9sbF9yY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGU2NGMzCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9sbF9yY2MuaApAQCAtMCwwICsxLDI0OTcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfcmNjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJDQyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9MTF9SQ0NfSAorI2RlZmluZSBfX1NUTTMyTDB4eF9MTF9SQ0NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUkNDKQorCisvKiogQGRlZmdyb3VwIFJDQ19MTCBSQ0MKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX1ByaXZhdGVfVmFyaWFibGVzIFJDQyBQcml2YXRlIFZhcmlhYmxlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19MTF9Qcml2YXRlX0NvbnN0YW50cyBSQ0MgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSQ0NfTExfUHJpdmF0ZV9NYWNyb3MgUkNDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0V4cG9ydGVkX1R5cGVzIFJDQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTExfRVNfQ0xPQ0tfRlJFUSBDbG9ja3MgRnJlcXVlbmN5IFN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUkNDIENsb2NrcyBGcmVxdWVuY3kgU3RydWN0dXJlCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTWVNDTEtfRnJlcXVlbmN5OyAgICAgICAgLyohPCBTWVNDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIHVpbnQzMl90IEhDTEtfRnJlcXVlbmN5OyAgICAgICAgICAvKiE8IEhDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIHVpbnQzMl90IFBDTEsxX0ZyZXF1ZW5jeTsgICAgICAgICAvKiE8IFBDTEsxIGNsb2NrIGZyZXF1ZW5jeSAqLworICB1aW50MzJfdCBQQ0xLMl9GcmVxdWVuY3k7ICAgICAgICAgLyohPCBQQ0xLMiBjbG9jayBmcmVxdWVuY3kgKi8KK30gTExfUkNDX0Nsb2Nrc1R5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgUkNDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX09TQ19WQUxVRVMgT3NjaWxsYXRvciBWYWx1ZXMgYWRhcHRhdGlvbgorICAqIEBicmllZiAgICBEZWZpbmVzIHVzZWQgdG8gYWRhcHQgdmFsdWVzIG9mIGRpZmZlcmVudCBvc2NpbGxhdG9ycworICAqIEBub3RlICAgICBUaGVzZSB2YWx1ZXMgY291bGQgYmUgbW9kaWZpZWQgaW4gdGhlIHVzZXIgZW52aXJvbm1lbnQgYWNjb3JkaW5nIHRvCisgICogICAgICAgICAgIEhXIHNldC11cC4KKyAgKiBAeworICAqLworI2lmICFkZWZpbmVkICAoSFNFX1ZBTFVFKQorI2RlZmluZSBIU0VfVkFMVUUgICAgKCh1aW50MzJfdCk4MDAwMDAwVSkgIC8qITwgVmFsdWUgb2YgdGhlIEhTRSBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgLyogSFNFX1ZBTFVFICovCisKKyNpZiAhZGVmaW5lZCAgKEhTSV9WQUxVRSkKKyNkZWZpbmUgSFNJX1ZBTFVFICAgICgodWludDMyX3QpMTYwMDAwMDBVKSAvKiE8IFZhbHVlIG9mIHRoZSBIU0kgb3NjaWxsYXRvciBpbiBIeiAqLworI2VuZGlmIC8qIEhTSV9WQUxVRSAqLworCisjaWYgIWRlZmluZWQgIChMU0VfVkFMVUUpCisjZGVmaW5lIExTRV9WQUxVRSAgICAoKHVpbnQzMl90KTMyNzY4VSkgICAgLyohPCBWYWx1ZSBvZiB0aGUgTFNFIG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAvKiBMU0VfVkFMVUUgKi8KKworI2lmICFkZWZpbmVkICAoTFNJX1ZBTFVFKQorI2RlZmluZSBMU0lfVkFMVUUgICAgKCh1aW50MzJfdCkzNzAwMFUpICAgIC8qITwgVmFsdWUgb2YgdGhlIExTSSBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgLyogTFNJX1ZBTFVFICovCisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKworI2lmICFkZWZpbmVkICAoSFNJNDhfVkFMVUUpCisjZGVmaW5lIEhTSTQ4X1ZBTFVFICAoKHVpbnQzMl90KTQ4MDAwMDAwVSkgLyohPCBWYWx1ZSBvZiB0aGUgSFNJNDggb3NjaWxsYXRvciBpbiBIeiAqLworI2VuZGlmIC8qIEhTSTQ4X1ZBTFVFICovCisjZW5kaWYgLyogUkNDX0hTSTQ4X1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0NMRUFSX0ZMQUcgQ2xlYXIgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUkNDX1dyaXRlUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfTFNJUkRZQyAgICAgICAgICAgICAgICBSQ0NfQ0lDUl9MU0lSRFlDICAgICAvKiE8IExTSSBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfTFNFUkRZQyAgICAgICAgICAgICAgICBSQ0NfQ0lDUl9MU0VSRFlDICAgICAvKiE8IExTRSBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfSFNJUkRZQyAgICAgICAgICAgICAgICBSQ0NfQ0lDUl9IU0lSRFlDICAgICAvKiE8IEhTSSBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfSFNFUkRZQyAgICAgICAgICAgICAgICBSQ0NfQ0lDUl9IU0VSRFlDICAgICAvKiE8IEhTRSBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfUExMUkRZQyAgICAgICAgICAgICAgICBSQ0NfQ0lDUl9QTExSRFlDICAgICAvKiE8IFBMTCBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfTVNJUkRZQyAgICAgICAgICAgICAgICBSQ0NfQ0lDUl9NU0lSRFlDICAgICAvKiE8IE1TSSBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNpZiBkZWZpbmVkKFJDQ19IU0k0OF9TVVBQT1JUKQorI2RlZmluZSBMTF9SQ0NfQ0lDUl9IU0k0OFJEWUMgICAgICAgICAgICAgICBSQ0NfQ0lDUl9IU0k0OFJEWUMgIC8qITwgSFNJNDggUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZW5kaWYgLyogUkNDX0hTSTQ4X1NVUFBPUlQgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfTFNFQ1NTQyAgICAgICAgICAgICAgICBSQ0NfQ0lDUl9MU0VDU1NDICAgICAvKiE8IExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0NTU0MgICAgICAgICAgICAgICAgICAgUkNDX0NJQ1JfQ1NTQyAgICAgICAgLyohPCBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IENsZWFyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUkNDX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9MU0lSRFlGICAgICAgICAgICAgICAgIFJDQ19DSUZSX0xTSVJEWUYgICAgIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSUZSX0xTRVJEWUYgICAgICAgICAgICAgICAgUkNDX0NJRlJfTFNFUkRZRiAgICAgLyohPCBMU0UgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfSFNJUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9IU0lSRFlGICAgICAvKiE8IEhTSSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9IU0VSRFlGICAgICAgICAgICAgICAgIFJDQ19DSUZSX0hTRVJEWUYgICAgIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSUZSX1BMTFJEWUYgICAgICAgICAgICAgICAgUkNDX0NJRlJfUExMUkRZRiAgICAgLyohPCBQTEwgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfTVNJUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9NU0lSRFlGICAgICAvKiE8IE1TSSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2lmIGRlZmluZWQoUkNDX0hTSTQ4X1NVUFBPUlQpCisjZGVmaW5lIExMX1JDQ19DSUZSX0hTSTQ4UkRZRiAgICAgICAgICAgICAgIFJDQ19DSUZSX0hTSTQ4UkRZRiAgLyohPCBIU0k0OCBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2VuZGlmIC8qIFJDQ19IU0k0OF9TVVBQT1JUICovCisjZGVmaW5lIExMX1JDQ19DSUZSX0xTRUNTU0YgICAgICAgICAgICAgICAgUkNDX0NJRlJfTFNFQ1NTRiAgICAvKiE8IExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfQ1NTRiAgICAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9DU1NGICAgICAgIC8qITwgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfRldSU1RGICAgICAgICAgICAgICAgICBSQ0NfQ1NSX0ZXUlNURiAgICAgICAgICAvKiE8IEZpcmV3YWxsIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9PQkxSU1RGICAgICAgICAgICAgICAgIFJDQ19DU1JfT0JMUlNURiAgICAgICAgIC8qITwgT0JMIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9QSU5SU1RGICAgICAgICAgICAgICAgIFJDQ19DU1JfUElOUlNURiAgICAgICAgIC8qITwgUElOIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9QT1JSU1RGICAgICAgICAgICAgICAgIFJDQ19DU1JfUE9SUlNURiAgICAgICAgIC8qITwgUE9SL1BEUiByZXNldCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfU0ZUUlNURiAgICAgICAgICAgICAgICBSQ0NfQ1NSX1NGVFJTVEYgICAgICAgICAvKiE8IFNvZnR3YXJlIFJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9JV0RHUlNURiAgICAgICAgICAgICAgIFJDQ19DU1JfSVdER1JTVEYgICAgICAgIC8qITwgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ1NSX1dXREdSU1RGICAgICAgICAgICAgICAgUkNDX0NTUl9XV0RHUlNURiAgICAgICAgLyohPCBXaW5kb3cgd2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ1NSX0xQV1JSU1RGICAgICAgICAgICAgICAgUkNDX0NTUl9MUFdSUlNURiAgICAgICAgLyohPCBMb3ctUG93ZXIgcmVzZXQgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUkNDX1JlYWRSZWcgYW5kICBMTF9SQ0NfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfTFNJUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9MU0lSRFlJRSAgICAgIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfTFNFUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9MU0VSRFlJRSAgICAgIC8qITwgTFNFIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfSFNJUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9IU0lSRFlJRSAgICAgIC8qITwgSFNJIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfSFNFUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9IU0VSRFlJRSAgICAgIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfUExMUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9QTExSRFlJRSAgICAgIC8qITwgUExMIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfTVNJUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9NU0lSRFlJRSAgICAgIC8qITwgTVNJIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNpZiBkZWZpbmVkKFJDQ19IU0k0OF9TVVBQT1JUKQorI2RlZmluZSBMTF9SQ0NfQ0lFUl9IU0k0OFJEWUlFICAgICAgICAgICAgICBSQ0NfQ0lFUl9IU0k0OFJEWUlFICAgLyohPCBIU0k0OCBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZW5kaWYgLyogUkNDX0hTSTQ4X1NVUFBPUlQgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfTFNFQ1NTSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9MU0VDU1NJRSAgICAgIC8qITwgTFNFIENTUyBJbnRlcnJ1cHQgRW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MU0VEUklWRSAgTFNFIG9zY2lsbGF0b3IgZHJpdmUgY2FwYWJpbGl0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19MU0VEUklWRV9MT1cgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBYdGFsIG1vZGUgbG93ZXIgZHJpdmluZyBjYXBhYmlsaXR5ICovCisjZGVmaW5lIExMX1JDQ19MU0VEUklWRV9NRURJVU1MT1cgICAgICAgICAgUkNDX0NTUl9MU0VEUlZfMCAvKiE8IFh0YWwgbW9kZSBtZWRpdW0gbG93IGRyaXZpbmcgY2FwYWJpbGl0eSAqLworI2RlZmluZSBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNSElHSCAgICAgICAgIFJDQ19DU1JfTFNFRFJWXzEgLyohPCBYdGFsIG1vZGUgbWVkaXVtIGhpZ2ggZHJpdmluZyBjYXBhYmlsaXR5ICovCisjZGVmaW5lIExMX1JDQ19MU0VEUklWRV9ISUdIICAgICAgICAgICAgICAgUkNDX0NTUl9MU0VEUlYgICAvKiE8IFh0YWwgbW9kZSBoaWdoZXIgZHJpdmluZyBjYXBhYmlsaXR5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19SVENfSFNFX0RJViBSVEMgSFNFIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19SVENfSFNFX0RJVl8yICAgICAgICAgICAgICAgKHVpbnQzMl90KTB4MDAwMDAwMDBVLyohPCBIU0UgaXMgZGl2aWRlZCBieSAyIGZvciBSVEMgY2xvY2sgICovCisjZGVmaW5lIExMX1JDQ19SVENfSFNFX0RJVl80ICAgICAgICAgICAgICAgUkNDX0NSX1JUQ1BSRV8wICAgICAgLyohPCBIU0UgaXMgZGl2aWRlZCBieSA0IGZvciBSVEMgY2xvY2sgICovCisjZGVmaW5lIExMX1JDQ19SVENfSFNFX0RJVl84ICAgICAgICAgICAgICAgUkNDX0NSX1JUQ1BSRV8xICAgICAgLyohPCBIU0UgaXMgZGl2aWRlZCBieSA4IGZvciBSVEMgY2xvY2sgICovCisjZGVmaW5lIExMX1JDQ19SVENfSFNFX0RJVl8xNiAgICAgICAgICAgICAgUkNDX0NSX1JUQ1BSRSAgICAgICAgLyohPCBIU0UgaXMgZGl2aWRlZCBieSAxNiBmb3IgUlRDIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19NU0lSQU5HRSAgTVNJIGNsb2NrIHJhbmdlcworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19NU0lSQU5HRV8wICAgICAgICAgICAgICAgICAgUkNDX0lDU0NSX01TSVJBTkdFXzAgIC8qITwgTVNJID0gNjUuNTM2IEtIeiAqLworI2RlZmluZSBMTF9SQ0NfTVNJUkFOR0VfMSAgICAgICAgICAgICAgICAgIFJDQ19JQ1NDUl9NU0lSQU5HRV8xICAvKiE8IE1TSSA9IDEzMS4wNzIgS0h6Ki8KKyNkZWZpbmUgTExfUkNDX01TSVJBTkdFXzIgICAgICAgICAgICAgICAgICBSQ0NfSUNTQ1JfTVNJUkFOR0VfMiAgLyohPCBNU0kgPSAyNjIuMTQ0IEtIeiAqLworI2RlZmluZSBMTF9SQ0NfTVNJUkFOR0VfMyAgICAgICAgICAgICAgICAgIFJDQ19JQ1NDUl9NU0lSQU5HRV8zICAvKiE8IE1TSSA9IDUyNC4yODggS0h6ICovCisjZGVmaW5lIExMX1JDQ19NU0lSQU5HRV80ICAgICAgICAgICAgICAgICAgUkNDX0lDU0NSX01TSVJBTkdFXzQgIC8qITwgTVNJID0gMS4wNDggTUh6ICovCisjZGVmaW5lIExMX1JDQ19NU0lSQU5HRV81ICAgICAgICAgICAgICAgICAgUkNDX0lDU0NSX01TSVJBTkdFXzUgIC8qITwgTVNJID0gMi4wOTcgTUh6ICovCisjZGVmaW5lIExMX1JDQ19NU0lSQU5HRV82ICAgICAgICAgICAgICAgICAgUkNDX0lDU0NSX01TSVJBTkdFXzYgIC8qITwgTVNJID0gNC4xOTQgTUh6ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TWVNfQ0xLU09VUkNFICBTeXN0ZW0gY2xvY2sgc3dpdGNoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfTVNJICAgICAgICAgICBSQ0NfQ0ZHUl9TV19NU0kgICAgLyohPCBNU0kgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0kgICAgICAgICAgIFJDQ19DRkdSX1NXX0hTSSAgICAvKiE8IEhTSSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX0hTRSAgICAgICAgICAgUkNDX0NGR1JfU1dfSFNFICAgIC8qITwgSFNFIHNlbGVjdGlvbiBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfUExMICAgICAgICAgICBSQ0NfQ0ZHUl9TV19QTEwgICAgLyohPCBQTEwgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfU1lTX0NMS1NPVVJDRV9TVEFUVVMgIFN5c3RlbSBjbG9jayBzd2l0Y2ggc3RhdHVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX01TSSAgICBSQ0NfQ0ZHUl9TV1NfTVNJICAgLyohPCBNU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTSSAgICBSQ0NfQ0ZHUl9TV1NfSFNJICAgLyohPCBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTRSAgICBSQ0NfQ0ZHUl9TV1NfSFNFICAgLyohPCBIU0UgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX1BMTCAgICBSQ0NfQ0ZHUl9TV1NfUExMICAgLyohPCBQTEwgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NZU0NMS19ESVYgIEFIQiBwcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl8xICAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWMSAgIC8qITwgU1lTQ0xLIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzIgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVYyICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzQgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVY0ICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzggICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVY4ICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzE2ICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVYxNiAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl82NCAgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWNjQgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMTI4ICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFX0RJVjEyOCAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDEyOCAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYgICAgICAgICAgICAgIFJDQ19DRkdSX0hQUkVfRElWMjU2IC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMjU2ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzUxMiAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV9ESVY1MTIgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA1MTIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FQQjFfRElWICBBUEIgbG93LXNwZWVkIHByZXNjYWxlciAoQVBCMSkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQVBCMV9ESVZfMSAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUxX0RJVjEgIC8qITwgSENMSyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBMTF9SQ0NfQVBCMV9ESVZfMiAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUxX0RJVjIgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzQgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMV9ESVY0ICAvKiE8IEhDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19BUEIxX0RJVl84ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTFfRElWOCAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBMTF9SQ0NfQVBCMV9ESVZfMTYgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUxX0RJVjE2IC8qITwgSENMSyBkaXZpZGVkIGJ5IDE2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19BUEIyX0RJViAgQVBCIGhpZ2gtc3BlZWQgcHJlc2NhbGVyIChBUEIyKQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19BUEIyX0RJVl8xICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTJfRElWMSAgLyohPCBIQ0xLIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19BUEIyX0RJVl8yICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTJfRElWMiAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfNCAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkUyX0RJVjQgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjJfRElWXzggICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMl9ESVY4ICAvKiE8IEhDTEsgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19BUEIyX0RJVl8xNiAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTJfRElWMTYgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NUT1BfV0FLRVVQQ0xPQ0sgIFdha2V1cCBmcm9tIFN0b3AgYW5kIENTUyBiYWNrdXAgY2xvY2sgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfTVNJICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IE1TSSBzZWxlY3Rpb24gYWZ0ZXIgd2FrZS11cCBmcm9tIFNUT1AgKi8KKyNkZWZpbmUgTExfUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfSFNJICAgICAgICBSQ0NfQ0ZHUl9TVE9QV1VDSyAgICAgICAvKiE8IEhTSSBzZWxlY3Rpb24gYWZ0ZXIgd2FrZS11cCBmcm9tIFNUT1AgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX01DTzFTT1VSQ0UgIE1DTzEgU09VUkNFIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX05PQ0xPQ0sgICAgICAgICAgUkNDX0NGR1JfTUNPU0VMX05PQ0xPQ0sgICAgICAvKiE8IE1DTyBvdXRwdXQgZGlzYWJsZWQsIG5vIGNsb2NrIG9uIE1DTyAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9TWVNDTEsgICAgICAgICAgIFJDQ19DRkdSX01DT1NFTF9TWVNDTEsgICAgICAgLyohPCBTWVNDTEsgc2VsZWN0aW9uIGFzIE1DTyBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfSFNJICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09TRUxfSFNJICAgICAgICAgIC8qITwgSFNJIHNlbGVjdGlvbiBhcyBNQ08gc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX01TSSAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPU0VMX01TSSAgICAgICAgICAvKiE8IE1TSSBzZWxlY3Rpb24gYXMgTUNPIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9IU0UgICAgICAgICAgICAgIFJDQ19DRkdSX01DT1NFTF9IU0UgICAgICAgICAgLyohPCBIU0Ugc2VsZWN0aW9uIGFzIE1DTyBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfTFNJICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09TRUxfTFNJICAgICAgICAgIC8qITwgTFNJIHNlbGVjdGlvbiBhcyBNQ08gc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0xTRSAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPU0VMX0xTRSAgICAgICAgICAvKiE8IExTRSBzZWxlY3Rpb24gYXMgTUNPIHNvdXJjZSAqLworI2lmIGRlZmluZWQoUkNDX0NGR1JfTUNPU0VMX0hTSTQ4KQorI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9IU0k0OCAgICAgICAgICAgIFJDQ19DRkdSX01DT1NFTF9IU0k0OCAgICAgICAgLyohPCBIU0k0OCBzZWxlY3Rpb24gYXMgTUNPIHNvdXJjZSAqLworI2VuZGlmIC8qIFJDQ19DRkdSX01DT1NFTF9IU0k0OCAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9QTExDTEsgICAgICAgICAgIFJDQ19DRkdSX01DT1NFTF9QTEwgICAgICAgICAgLyohPCBQTExDTEsgc2VsZWN0aW9uIGFzIE1DTyBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX01DTzFfRElWICBNQ08xIHByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8xICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFX0RJVjEgIC8qITwgTUNPIENsb2NrIGRpdmlkZWQgYnkgMSAgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzIgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09QUkVfRElWMiAgLyohPCBNQ08gQ2xvY2sgZGl2aWRlZCBieSAyICAqLworI2RlZmluZSBMTF9SQ0NfTUNPMV9ESVZfNCAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT1BSRV9ESVY0ICAvKiE8IE1DTyBDbG9jayBkaXZpZGVkIGJ5IDQgICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl84ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFX0RJVjggIC8qITwgTUNPIENsb2NrIGRpdmlkZWQgYnkgOCAgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzE2ICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09QUkVfRElWMTYgLyohPCBNQ08gQ2xvY2sgZGl2aWRlZCBieSAxNiAqLworLyoqCisgICogQH0KKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BFUklQSF9GUkVRVUVOQ1kgUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyAgICAgICAgICh1aW50MzJfdCkweDAwMDAwMDAwVSAgICAgIC8qITwgTm8gY2xvY2sgZW5hYmxlZCBmb3IgdGhlIHBlcmlwaGVyYWwgICAgICAgICAgICAqLworI2RlZmluZSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OQSAgICAgICAgICh1aW50MzJfdCkweEZGRkZGRkZGVSAgICAgIC8qITwgRnJlcXVlbmN5IGNhbm5vdCBiZSBwcm92aWRlZCBhcyBleHRlcm5hbCBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfVVNBUlQxX0NMS1NPVVJDRSAgUGVyaXBoZXJhbCBVU0FSVCBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9VU0FSVDFTRUwpCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1BDTEsyICAgICAgKHVpbnQzMl90KSgoUkNDX0NDSVBSX1VTQVJUMVNFTCA8PCAxNlUpIHwgMHgwMDAwMDAwMFUpICAgICAgICAgICAgIC8qITwgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1NZU0NMSyAgICAgKHVpbnQzMl90KSgoUkNDX0NDSVBSX1VTQVJUMVNFTCA8PCAxNlUpIHwgUkNDX0NDSVBSX1VTQVJUMVNFTF8wKSAgIC8qITwgU1lTQ0xLIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9IU0kgICAgICAgICh1aW50MzJfdCkoKFJDQ19DQ0lQUl9VU0FSVDFTRUwgPDwgMTZVKSB8IFJDQ19DQ0lQUl9VU0FSVDFTRUxfMSkgICAvKiE8IEhTSSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFICAgICAgICAodWludDMyX3QpKChSQ0NfQ0NJUFJfVVNBUlQxU0VMIDw8IDE2VSkgfCBSQ0NfQ0NJUFJfVVNBUlQxU0VMKSAgICAgLyohPCBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrKi8KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQxU0VMICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1BDTEsxICAgICAgKHVpbnQzMl90KSgoUkNDX0NDSVBSX1VTQVJUMlNFTCA8PCAxNlUpIHwgMHgwMDAwMDAwMFUpICAgICAgICAgICAgIC8qITwgUENMSzEgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1NZU0NMSyAgICAgKHVpbnQzMl90KSgoUkNDX0NDSVBSX1VTQVJUMlNFTCA8PCAxNlUpIHwgUkNDX0NDSVBSX1VTQVJUMlNFTF8wKSAgIC8qITwgU1lTQ0xLIHNlbGVjdGVkIGFzIFVTQVJUMiBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9IU0kgICAgICAgICh1aW50MzJfdCkoKFJDQ19DQ0lQUl9VU0FSVDJTRUwgPDwgMTZVKSB8IFJDQ19DQ0lQUl9VU0FSVDJTRUxfMSkgICAvKiE8IEhTSSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfTFNFICAgICAgICAodWludDMyX3QpKChSQ0NfQ0NJUFJfVVNBUlQyU0VMIDw8IDE2VSkgfCBSQ0NfQ0NJUFJfVVNBUlQyU0VMKSAgICAgLyohPCBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrKi8KKy8qKgorICAqIEB9CisgICovCisKKworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MUFVBUlQxX0NMS1NPVVJDRSAgUGVyaXBoZXJhbCBMUFVBUlQgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9QQ0xLMSAgICAgKHVpbnQzMl90KTB4MDAwMDAwMDBVICAgLyohPCBQQ0xLMSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9TWVNDTEsgICAgUkNDX0NDSVBSX0xQVUFSVDFTRUxfMCAgLyohPCBTWVNDTEsgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJICAgICAgIFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzEgIC8qITwgSFNJIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0xTRSAgICAgICBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCAgICAvKiE8IExTRSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0kyQzFfQ0xLU09VUkNFICBQZXJpcGhlcmFsIEkyQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1BDTEsxICAgICAgICAodWludDMyX3QpKChSQ0NfQ0NJUFJfSTJDMVNFTCA8PCA0VSkgfCAoMHgwMDAwMDAwMFUgPj4gNFUpKSAgICAgICAgICAgLyohPCBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9TWVNDTEsgICAgICAgKHVpbnQzMl90KSgoUkNDX0NDSVBSX0kyQzFTRUwgPDwgNFUpIHwgKFJDQ19DQ0lQUl9JMkMxU0VMXzAgPj4gNFUpKSAgLyohPCBTWVNDTEsgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJICAgICAgICAgICh1aW50MzJfdCkoKFJDQ19DQ0lQUl9JMkMxU0VMIDw8IDRVKSB8IChSQ0NfQ0NJUFJfSTJDMVNFTF8xID4+IDRVKSkgIC8qITwgSFNJIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9JMkMzU0VMKQorI2RlZmluZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfUENMSzEgICAgICAgICh1aW50MzJfdCkoKFJDQ19DQ0lQUl9JMkMzU0VMIDw8IDRVKSB8ICgweDAwMDAwMDAwVSA+PiA0VSkpICAgICAgICAgICAvKiE8IFBDTEsxIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzNfQ0xLU09VUkNFX1NZU0NMSyAgICAgICAodWludDMyX3QpKChSQ0NfQ0NJUFJfSTJDM1NFTCA8PCA0VSkgfCAoUkNDX0NDSVBSX0kyQzNTRUxfMCA+PiA0VSkpICAvKiE8IFNZU0NMSyBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9IU0kgICAgICAgICAgKHVpbnQzMl90KSgoUkNDX0NDSVBSX0kyQzNTRUwgPDwgNFUpIHwgKFJDQ19DQ0lQUl9JMkMzU0VMXzEgPj4gNFUpKSAgLyohPCBIU0kgc2VsZWN0ZWQgYXMgSTJDMyBjbG9jayAqLworI2VuZGlmIC8qUkNDX0NDSVBSX0kyQzNTRUwqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfTFBUSU0xX0NMS1NPVVJDRSAgUGVyaXBoZXJhbCBMUFRJTSBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfUENMSzEgICAgICAodWludDMyX3QpKDB4MDAwMDAwMDBVKSAgICAgICAgICAvKiE8IFBDTEsxIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0kgICAgICAgICh1aW50MzJfdClSQ0NfQ0NJUFJfTFBUSU0xU0VMXzAgIC8qITwgTFNJIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9IU0kgICAgICAgICh1aW50MzJfdClSQ0NfQ0NJUFJfTFBUSU0xU0VMXzEgIC8qITwgSFNJIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0UgICAgICAgICh1aW50MzJfdClSQ0NfQ0NJUFJfTFBUSU0xU0VMICAgIC8qITwgTFNFIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jayovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfSFNJNDhTRUwpCisKKyNpZiBkZWZpbmVkKFJORykKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1JOR19DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgUk5HIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9QTEwgICAgICAgICAgICh1aW50MzJfdCkoMHgwMDAwMDAwMFUpICAgICAgICAgIC8qITwgUExMIHNlbGVjdGVkIGFzIFJORyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9IU0k0OCAgICAgICAgICh1aW50MzJfdCkoUkNDX0NDSVBSX0hTSTQ4U0VMKSAgIC8qITwgSFNJNDggc2VsZWN0ZWQgYXMgUk5HIGNsb2NrKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUk5HICovCisjaWYgZGVmaW5lZChVU0IpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VU0JfQ0xLU09VUkNFICBQZXJpcGhlcmFsIFVTQiBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0VfUExMICAgICAgICAgICAodWludDMyX3QpKDB4MDAwMDAwMDBVKSAgICAgICAgICAvKiE8IFBMTCBzZWxlY3RlZCBhcyBVU0IgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0VfSFNJNDggICAgICAgICAodWludDMyX3QpKFJDQ19DQ0lQUl9IU0k0OFNFTCkgICAvKiE8IEhTSTQ4IHNlbGVjdGVkIGFzIFVTQiBjbG9jayovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNCICovCisjZW5kaWYgLyogUkNDX0NDSVBSX0hTSTQ4U0VMICovCisKKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfVVNBUlQxIFBlcmlwaGVyYWwgVVNBUlQgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQxU0VMKQorI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRSAgICAgICAgICAgIFJDQ19DQ0lQUl9VU0FSVDFTRUwgICAgLyohPCBVU0FSVDEgY2xvY2sgc291cmNlIHNlbGVjdGlvbiBiaXRzICovCisjZW5kaWYgLyogUkNDX0NDSVBSX1VTQVJUMVNFTCAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRSAgICAgICAgICAgIFJDQ19DQ0lQUl9VU0FSVDJTRUwgICAgLyohPCBVU0FSVDIgY2xvY2sgc291cmNlIHNlbGVjdGlvbiBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xQVUFSVDEgUGVyaXBoZXJhbCBMUFVBUlQgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRSAgICAgICAgICAgUkNDX0NDSVBSX0xQVUFSVDFTRUwgICAvKiE8IExQVUFSVDEgY2xvY2sgc291cmNlIHNlbGVjdGlvbiBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19JMkMxIFBlcmlwaGVyYWwgSTJDIGdldCBjbG9jayBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0UgICAgICAgICAgICAgIFJDQ19DQ0lQUl9JMkMxU0VMICAgLyohPCBJMkMxIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gYml0cyAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0kyQzNTRUwpCisjZGVmaW5lIExMX1JDQ19JMkMzX0NMS1NPVVJDRSAgICAgICAgICAgICAgUkNDX0NDSVBSX0kyQzNTRUwgICAvKiE8IEkyQzMgY2xvY2sgc291cmNlIHNlbGVjdGlvbiBiaXRzICovCisjZW5kaWYgLypSQ0NfQ0NJUFJfSTJDM1NFTCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MUFRJTTEgUGVyaXBoZXJhbCBMUFRJTSBnZXQgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0UgICAgICAgICAgICBSQ0NfQ0NJUFJfTFBUSU0xU0VMICAvKiE8IExQVElNMSBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9IU0k0OFNFTCkKKyNpZiBkZWZpbmVkKFJORykKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1JORyAgUGVyaXBoZXJhbCBSTkcgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19STkdfQ0xLU09VUkNFICAgICAgICAgICAgICAgUkNDX0NDSVBSX0hTSTQ4U0VMICAgLyohPCBIU0k0OCBSQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGJpdCBmb3IgUk5HKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUk5HICovCisKKyNpZiBkZWZpbmVkKFVTQikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VTQiAgUGVyaXBoZXJhbCBVU0IgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19VU0JfQ0xLU09VUkNFICAgICAgICAgICAgICAgUkNDX0NDSVBSX0hTSTQ4U0VMICAvKiE8IEhTSTQ4IFJDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gYml0IGZvciBVU0IqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTQiAqLworI2VuZGlmIC8qIFJDQ19DQ0lQUl9IU0k0OFNFTCAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19SVENfQ0xLU09VUkNFICBSVEMgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkUgICAgICAgICAgKHVpbnQzMl90KTB4MDAwMDAwMDBVICAgICAgICAgLyohPCBObyBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0UgICAgICAgICAgIFJDQ19DU1JfUlRDU0VMX0xTRSAgICAgICAgICAgIC8qITwgTFNFIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJICAgICAgICAgICBSQ0NfQ1NSX1JUQ1NFTF9MU0kgICAgICAgICAgICAvKiE8IExTSSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19SVENfQ0xLU09VUkNFX0hTRSAgICAgICAgICAgUkNDX0NTUl9SVENTRUxfSFNFICAgICAgICAgICAgLyohPCBIU0Ugb3NjaWxsYXRvciBjbG9jayBkaXZpZGVkIGJ5IGEgcHJvZ3JhbW1hYmxlIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uIHRocm91Z2ggQHJlZiBMTF9SQ0NfU2V0UlRDX0hTRVByZXNjYWxlciBmdW5jdGlvbiApICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExfTVVMIFBMTCBNdWx0aXBsaWNhdG9yIGZhY3RvcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzMgICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMyAgLyohPCBQTEwgaW5wdXQgY2xvY2sgKiAzICAqLworI2RlZmluZSBMTF9SQ0NfUExMX01VTF80ICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDQgIC8qITwgUExMIGlucHV0IGNsb2NrICogNCAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTF9NVUxfNiAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUw2ICAvKiE8IFBMTCBpbnB1dCBjbG9jayAqIDYgICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzggICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMOCAgLyohPCBQTEwgaW5wdXQgY2xvY2sgKiA4ICAqLworI2RlZmluZSBMTF9SQ0NfUExMX01VTF8xMiAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDEyIC8qITwgUExMIGlucHV0IGNsb2NrICogMTIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTF9NVUxfMTYgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUwxNiAvKiE8IFBMTCBpbnB1dCBjbG9jayAqIDE2ICovCisjZGVmaW5lIExMX1JDQ19QTExfTVVMXzI0ICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMTVVMMjQgLyohPCBQTEwgaW5wdXQgY2xvY2sgKiAyNCAqLworI2RlZmluZSBMTF9SQ0NfUExMX01VTF8zMiAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTE1VTDMyIC8qITwgUExMIGlucHV0IGNsb2NrICogMzIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTF9NVUxfNDggICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QTExNVUw0OCAvKiE8IFBMTCBpbnB1dCBjbG9jayAqIDQ4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExfRElWIFBMTCBkaXZpc2lvbiBmYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMX0RJVl8yICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTERJVjIgLyohPCBQTEwgY2xvY2sgb3V0cHV0ID0gUExMVkNPIC8gMiAqLworI2RlZmluZSBMTF9SQ0NfUExMX0RJVl8zICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTERJVjMgLyohPCBQTEwgY2xvY2sgb3V0cHV0ID0gUExMVkNPIC8gMyAqLworI2RlZmluZSBMTF9SQ0NfUExMX0RJVl80ICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTERJVjQgLyohPCBQTEwgY2xvY2sgb3V0cHV0ID0gUExMVkNPIC8gNCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUExMU09VUkNFIFBMTCBTT1VSQ0UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTSSAgICAgICAgICAgICAgIFJDQ19DRkdSX1BMTFNSQ19IU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTSSBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfSFNFICAgICAgICAgICAgICAgUkNDX0NGR1JfUExMU1JDX0hTRSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNFIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FeHBvcnRlZF9NYWNyb3MgUkNDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gUkNDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9SQ0NfV3JpdGVSZWcoX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoUkNDLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gUkNDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1JDQ19SZWFkUmVnKF9fUkVHX18pIFJFQURfUkVHKFJDQy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VNX0NBTENfRlJFUSBDYWxjdWxhdGUgZnJlcXVlbmNpZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTENMSyBmcmVxdWVuY3kKKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1JDQ19DQUxDX1BMTENMS19GUkVRIChIU0VfVkFMVUUsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9HZXRNdWx0aXBsaWNhdG9yICgpLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfR2V0RGl2aWRlciAoKSk7CisgICogQHBhcmFtICBfX0lOUFVURlJFUV9fIFBMTCBJbnB1dCBmcmVxdWVuY3kgKGJhc2VkIG9uIE1TSS9IU0UvSFNJKQorICAqIEBwYXJhbSAgX19QTExNVUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzQ4CisgICogQHBhcmFtICBfX1BMTERJVl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX0RJVl80CisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19QTExDTEtfRlJFUShfX0lOUFVURlJFUV9fLCBfX1BMTE1VTF9fLCAgX19QTExESVZfXykgKChfX0lOUFVURlJFUV9fKSAqIChQTExNdWxUYWJsZVsoX19QTExNVUxfXykgPj4gUkNDX0NGR1JfUExMTVVMX1Bvc10pIC8gKCgoX19QTExESVZfXykgPj4gUkNDX0NGR1JfUExMRElWX1BvcykrMVVMKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBIQ0xLIGZyZXF1ZW5jeQorICAqIEBub3RlOiBfX0FIQlBSRVNDQUxFUl9fIGJlIHJldHJpZXZlZCBieSBAcmVmIExMX1JDQ19HZXRBSEJQcmVzY2FsZXIKKyAgKiAgICAgICAgZXg6IF9fTExfUkNDX0NBTENfSENMS19GUkVRKExMX1JDQ19HZXRBSEJQcmVzY2FsZXIoKSkKKyAgKiBAcGFyYW0gIF9fU1lTQ0xLRlJFUV9fIFNZU0NMSyBmcmVxdWVuY3kgKGJhc2VkIG9uIE1TSS9IU0UvSFNJL1BMTENMSykKKyAgKiBAcGFyYW0gIF9fQUhCUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzI1NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMgorICAqIEByZXR2YWwgSENMSyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX0hDTEtfRlJFUShfX1NZU0NMS0ZSRVFfXywgX19BSEJQUkVTQ0FMRVJfXykgKChfX1NZU0NMS0ZSRVFfXykgPj4gQUhCUHJlc2NUYWJsZVsoKF9fQUhCUFJFU0NBTEVSX18pICYgUkNDX0NGR1JfSFBSRSkgPj4gIFJDQ19DRkdSX0hQUkVfUG9zXSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQQ0xLMSBmcmVxdWVuY3kgKEFCUDEpCisgICogQG5vdGU6IF9fQVBCMVBSRVNDQUxFUl9fIGJlIHJldHJpZXZlZCBieSBAcmVmIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyCisgICogICAgICAgIGV4OiBfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoTExfUkNDX0dldEFQQjFQcmVzY2FsZXIoKSkKKyAgKiBAcGFyYW0gIF9fSENMS0ZSRVFfXyBIQ0xLIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgX19BUEIxUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xNgorICAqIEByZXR2YWwgUENMSzEgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19QQ0xLMV9GUkVRKF9fSENMS0ZSRVFfXywgX19BUEIxUFJFU0NBTEVSX18pICgoX19IQ0xLRlJFUV9fKSA+PiBBUEJQcmVzY1RhYmxlWyhfX0FQQjFQUkVTQ0FMRVJfXykgPj4gIFJDQ19DRkdSX1BQUkUxX1Bvc10pCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgUENMSzIgZnJlcXVlbmN5IChBQlAyKQorICAqIEBub3RlOiBfX0FQQjJQUkVTQ0FMRVJfXyBiZSByZXRyaWV2ZWQgYnkgQHJlZiBMTF9SQ0NfR2V0QVBCMlByZXNjYWxlcgorICAqICAgICAgICBleDogX19MTF9SQ0NfQ0FMQ19QQ0xLMl9GUkVRKExMX1JDQ19HZXRBUEIyUHJlc2NhbGVyKCkpCisgICogQHBhcmFtICBfX0hDTEtGUkVRX18gSENMSyBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIF9fQVBCMlBSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMTYKKyAgKiBAcmV0dmFsIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUENMSzJfRlJFUShfX0hDTEtGUkVRX18sIF9fQVBCMlBSRVNDQUxFUl9fKSAoKF9fSENMS0ZSRVFfXykgPj4gQVBCUHJlc2NUYWJsZVsoX19BUEIyUFJFU0NBTEVSX18pID4+ICBSQ0NfQ0ZHUl9QUFJFMl9Qb3NdKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIE1TSSBmcmVxdWVuY3kgKGluIEh6KQorICAqIEBub3RlOiBfX01TSVJBTkdFX19jYW4gYmUgcmV0cmlldmVkIGJ5IEByZWYgTExfUkNDX01TSV9HZXRSYW5nZQorICAqICAgICAgICBleDogX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpCisgICogQHBhcmFtICBfX01TSVJBTkdFX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfNgorICAqIEByZXR2YWwgTVNJIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoX19NU0lSQU5HRV9fKSAoMzI3NjhVTCAqICggMVVMIDw8ICgoKF9fTVNJUkFOR0VfXykgPj4gUkNDX0lDU0NSX01TSVJBTkdFX1BvcykgKyAxVUwpICkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUkNDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0hTRSBIU0UKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSQ0NfSFNFQ1NTX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIENTU0hTRU9OICAgICAgICAgTExfUkNDX0hTRV9FbmFibGVDU1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0VfRW5hYmxlQ1NTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0NTU09OKTsKK30KKyNlbmRpZiAvKiBSQ0NfSFNFQ1NTX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNFIGV4dGVybmFsIG9zY2lsbGF0b3IgKEhTRSBCeXBhc3MpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFQllQICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZUJ5cGFzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9FbmFibGVCeXBhc3Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTRSBleHRlcm5hbCBvc2NpbGxhdG9yIChIU0UgQnlwYXNzKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRUJZUCAgICAgICAgTExfUkNDX0hTRV9EaXNhYmxlQnlwYXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VCWVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0UgY3J5c3RhbCBvc2NpbGxhdG9yIChIU0UgT04pCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFT04gICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNFIGNyeXN0YWwgb3NjaWxsYXRvciAoSFNFIE9OKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRU9OICAgICAgICAgTExfUkNDX0hTRV9EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNFIG9zY2lsbGF0b3IgUmVhZHkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0VSRFkgICAgICAgIExMX1JDQ19IU0VfSXNSZWFkeQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0VfSXNSZWFkeSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFUkRZKSA9PSBSQ0NfQ1JfSFNFUkRZKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBSVEMgcHJlc2NhbGVyIChkaXZpZGVyKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJUQ1BSRSAgICAgICAgTExfUkNDX1NldFJUQ19IU0VQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIERpdiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfSFNFX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19IU0VfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0hTRV9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfSFNFX0RJVl8xNgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFJUQ19IU0VQcmVzY2FsZXIodWludDMyX3QgRGl2KQoreworICBNT0RJRllfUkVHKFJDQy0+Q1IsIFJDQ19DUl9SVENQUkUsIERpdik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBSVEMgZGl2aWRlciAocHJlc2NhbGVyKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJUQ1BSRSAgICAgICAgTExfUkNDX0dldFJUQ19IU0VQcmVzY2FsZXIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19IU0VfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0hTRV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfSFNFX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19IU0VfRElWXzE2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFJUQ19IU0VQcmVzY2FsZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX1JUQ1BSRSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9IU0kgSFNJCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNJIG9zY2lsbGF0b3IKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lPTiAgICAgICAgIExMX1JDQ19IU0lfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0VuYWJsZSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIU0kgb3NjaWxsYXRvcgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSU9OICAgICAgICAgTExfUkNDX0hTSV9EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNJIGNsb2NrIGlzIHJlYWR5CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJUkRZICAgICAgICBMTF9SQ0NfSFNJX0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJX0lzUmVhZHkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkgPT0gUkNDX0NSX0hTSVJEWSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0kgZXZlbiBpbiBzdG9wIG1vZGUKKyAgKiBAbm90ZSBIU0kgb3NjaWxsYXRvciBpcyBmb3JjZWQgT04gZXZlbiBpbiBTdG9wIG1vZGUKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lLRVJPTiAgICAgIExMX1JDQ19IU0lfRW5hYmxlSW5TdG9wTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTSV9FbmFibGVJblN0b3BNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSUtFUk9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTSSBpbiBzdG9wIG1vZGUKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lLRVJPTiAgICAgIExMX1JDQ19IU0lfRGlzYWJsZUluU3RvcE1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRGlzYWJsZUluU3RvcE1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lLRVJPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhTSSBEaXZpZGVyIChpdCBkaXZpZGVzIGJ5IDQpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJRElWRU4gICAgICAgTExfUkNDX0hTSV9FbmFibGVEaXZpZGVyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0VuYWJsZURpdmlkZXIodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJRElWRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNJIERpdmlkZXIgKGl0IGRpdmlkZXMgYnkgNCkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lESVZFTiAgICAgICBMTF9SQ0NfSFNJX0Rpc2FibGVEaXZpZGVyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0Rpc2FibGVEaXZpZGVyKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJRElWRU4pOworfQorCisKKworI2lmIGRlZmluZWQoUkNDX0NSX0hTSU9VVEVOKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNJIE91dHB1dAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSU9VVEVOICAgICAgIExMX1JDQ19IU0lfRW5hYmxlT3V0cHV0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0VuYWJsZU91dHB1dCh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPVVRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIU0kgT3V0cHV0CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJT1VURU4gICAgICAgTExfUkNDX0hTSV9EaXNhYmxlT3V0cHV0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0Rpc2FibGVPdXRwdXQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPVVRFTik7Cit9CisjZW5kaWYgLyogUkNDX0NSX0hTSU9VVEVOICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IEhTSSBDYWxpYnJhdGlvbiB2YWx1ZQorICAqIEBub3RlIFdoZW4gSFNJVFJJTSBpcyB3cml0dGVuLCBIU0lDQUwgaXMgdXBkYXRlZCB3aXRoIHRoZSBzdW0gb2YKKyAgKiAgICAgICBIU0lUUklNIGFuZCB0aGUgZmFjdG9yeSB0cmltIHZhbHVlCisgICogQHJtdG9sbCBJQ1NDUiAgICAgICAgSFNJQ0FMICAgICAgICBMTF9SQ0NfSFNJX0dldENhbGlicmF0aW9uCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9HZXRDYWxpYnJhdGlvbih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPklDU0NSLCBSQ0NfSUNTQ1JfSFNJQ0FMKSA+PiBSQ0NfSUNTQ1JfSFNJQ0FMX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEhTSSBDYWxpYnJhdGlvbiB0cmltbWluZworICAqIEBub3RlIHVzZXItcHJvZ3JhbW1hYmxlIHRyaW1taW5nIHZhbHVlIHRoYXQgaXMgYWRkZWQgdG8gdGhlIEhTSUNBTAorICAqIEBub3RlIERlZmF1bHQgdmFsdWUgaXMgMTYsIHdoaWNoLCB3aGVuIGFkZGVkIHRvIHRoZSBIU0lDQUwgdmFsdWUsCisgICogICAgICAgc2hvdWxkIHRyaW0gdGhlIEhTSSB0byAxNiBNSHogKy8tIDEgJQorICAqIEBybXRvbGwgSUNTQ1IgICAgICAgIEhTSVRSSU0gICAgICAgTExfUkNDX0hTSV9TZXRDYWxpYlRyaW1taW5nCisgICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDFGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX1NldENhbGliVHJpbW1pbmcodWludDMyX3QgVmFsdWUpCit7CisgIE1PRElGWV9SRUcoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX0hTSVRSSU0sIFZhbHVlIDw8IFJDQ19JQ1NDUl9IU0lUUklNX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhTSSBDYWxpYnJhdGlvbiB0cmltbWluZworICAqIEBybXRvbGwgSUNTQ1IgICAgICAgIEhTSVRSSU0gICAgICAgTExfUkNDX0hTSV9HZXRDYWxpYlRyaW1taW5nCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDFGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9HZXRDYWxpYlRyaW1taW5nKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+SUNTQ1IsIFJDQ19JQ1NDUl9IU0lUUklNKSA+PiBSQ0NfSUNTQ1JfSFNJVFJJTV9Qb3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0hTSTQ4IEhTSTQ4CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNJNDgKKyAgKiBAcm10b2xsIENSUkNSICAgICAgICAgIEhTSTQ4T04gICAgICAgTExfUkNDX0hTSTQ4X0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTSTQ4X0VuYWJsZSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OE9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTSTQ4CisgICogQHJtdG9sbCBDUlJDUiAgICAgICAgICBIU0k0OE9OICAgICAgIExMX1JDQ19IU0k0OF9EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJNDhfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4T04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEhTSTQ4IG9zY2lsbGF0b3IgUmVhZHkKKyAgKiBAcm10b2xsIENSUkNSICAgICAgICAgIEhTSTQ4UkRZICAgICAgTExfUkNDX0hTSTQ4X0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJNDhfSXNSZWFkeSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhSRFkpID09IFJDQ19DUlJDUl9IU0k0OFJEWSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBIU0k0OCBDYWxpYnJhdGlvbiB2YWx1ZQorICAqIEBybXRvbGwgQ1JSQ1IgICAgICAgICAgSFNJNDhDQUwgICAgICBMTF9SQ0NfSFNJNDhfR2V0Q2FsaWJyYXRpb24KKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJNDhfR2V0Q2FsaWJyYXRpb24odm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4Q0FMKSA+PiBSQ0NfQ1JSQ1JfSFNJNDhDQUxfUG9zKTsKK30KKworI2lmIGRlZmluZWQoUkNDX0NSUkNSX0hTSTQ4RElWNk9VVEVOKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNJNDggRGl2aWRlciAoaXQgZGl2aWRlcyBieSA2KQorICAqIEBybXRvbGwgQ1JSQ1IgICAgICAgICAgIEhTSTQ4RElWNk9VVEVOICAgICAgIExMX1JDQ19IU0k0OF9FbmFibGVEaXZpZGVyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJNDhfRW5hYmxlRGl2aWRlcih2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OERJVjZPVVRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIU0k0OCBEaXZpZGVyIChpdCBkaXZpZGVzIGJ5IDYpCisgICogQHJtdG9sbCBDUlJDUiAgICAgICAgICAgSFNJNDhESVY2T1VURU4gICAgICAgTExfUkNDX0hTSTQ4X0Rpc2FibGVEaXZpZGVyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJNDhfRGlzYWJsZURpdmlkZXIodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OERJVjZPVVRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNJNDggRGl2aWRlciBpcyBlbmFibGVkIChpdCBkaXZpZGVzIGJ5IDYpCisgICogQHJtdG9sbCBDUlJDUiAgICAgICAgSFNJNDhESVY2T1VURU4gICAgICAgIExMX1JDQ19IU0k0OF9Jc0RpdmlkZWQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJNDhfSXNEaXZpZGVkKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OERJVjZPVVRFTikgPT0gUkNDX0NSUkNSX0hTSTQ4RElWNk9VVEVOKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNlbmRpZiAvKlJDQ19DUlJDUl9IU0k0OERJVjZPVVRFTiovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBSQ0NfSFNJNDhfU1VQUE9SVCAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9MU0UgTFNFCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgIExvdyBTcGVlZCBFeHRlcm5hbCAoTFNFKSBjcnlzdGFsLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgTFNFT04gICAgICAgICBMTF9SQ0NfTFNFX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0VPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSAgTG93IFNwZWVkIEV4dGVybmFsIChMU0UpIGNyeXN0YWwuCisgICogQHJtdG9sbCBDU1IgICAgICAgICBMU0VPTiAgICAgICAgIExMX1JDQ19MU0VfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0VPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAoTFNFIGJ5cGFzcykuCisgICogQHJtdG9sbCBDU1IgICAgICAgICBMU0VCWVAgICAgICAgIExMX1JDQ19MU0VfRW5hYmxlQnlwYXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX0VuYWJsZUJ5cGFzcyh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTRUJZUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBleHRlcm5hbCBjbG9jayBzb3VyY2UgKExTRSBieXBhc3MpLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgTFNFQllQICAgICAgICBMTF9SQ0NfTFNFX0Rpc2FibGVCeXBhc3MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfRGlzYWJsZUJ5cGFzcyh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNFQllQKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTFNFIG9zY2lsbGF0b3IgZHJpdmUgY2FwYWJpbGl0eQorICAqIEBub3RlIFRoZSBvc2NpbGxhdG9yIGlzIGluIFh0YWwgbW9kZSB3aGVuIGl0IGlzIG5vdCBpbiBieXBhc3MgbW9kZS4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgIExTRURSViAgICAgICAgTExfUkNDX0xTRV9TZXREcml2ZUNhcGFiaWxpdHkKKyAgKiBAcGFyYW0gIExTRURyaXZlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9NRURJVU1MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX1NldERyaXZlQ2FwYWJpbGl0eSh1aW50MzJfdCBMU0VEcml2ZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNTUiwgUkNDX0NTUl9MU0VEUlYsIExTRURyaXZlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTFNFIG9zY2lsbGF0b3IgZHJpdmUgY2FwYWJpbGl0eQorICAqIEBybXRvbGwgQ1NSICAgICAgICAgTFNFRFJWICAgICAgICBMTF9SQ0NfTFNFX0dldERyaXZlQ2FwYWJpbGl0eQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9NRURJVU1ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNFX0dldERyaXZlQ2FwYWJpbGl0eSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0VEUlYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIG9uIExTRS4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgIExTRUNTU09OICAgICAgTExfUkNDX0xTRV9FbmFibGVDU1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfRW5hYmxlQ1NTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNFQ1NTT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIG9uIExTRS4KKyAgKiBAbm90ZSAgIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBjYW4gYmUgZGlzYWJsZWQgb25seSBhZnRlciBhIExTRQorICAqICAgICAgICAgZmFpbHVyZSBkZXRlY3Rpb24uIEluIHRoYXQgY2FzZSBpdCBNVVNUIGJlIGRpc2FibGVkIGJ5IHNvZnR3YXJlLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTRUNTU09OICAgICAgTExfUkNDX0xTRV9EaXNhYmxlQ1NTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX0Rpc2FibGVDU1Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTRUNTU09OKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMU0Ugb3NjaWxsYXRvciBSZWFkeQorICAqIEBybXRvbGwgQ1NSICAgICAgICAgTFNFUkRZICAgICAgICBMTF9SQ0NfTFNFX0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNFX0lzUmVhZHkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNFUkRZKSA9PSBSQ0NfQ1NSX0xTRVJEWSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIENTUyBvbiBMU0UgZmFpbHVyZSBEZXRlY3Rpb24KKyAgKiBAcm10b2xsIENTUiAgICAgICAgIExTRUNTU0QgICAgICAgTExfUkNDX0xTRV9Jc0NTU0RldGVjdGVkCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTRV9Jc0NTU0RldGVjdGVkKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTRUNTU0QpID09IFJDQ19DU1JfTFNFQ1NTRCkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9MU0kgTFNJCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTFNJIE9zY2lsbGF0b3IKKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBMU0lPTiAgICAgICAgIExMX1JDQ19MU0lfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNJX0VuYWJsZSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTSSBPc2NpbGxhdG9yCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgTFNJT04gICAgICAgICBMTF9SQ0NfTFNJX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0lfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExTSSBpcyBSZWFkeQorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSVJEWSAgICAgICAgTExfUkNDX0xTSV9Jc1JlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTSV9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSVJEWSkgPT0gUkNDX0NTUl9MU0lSRFkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfTVNJIE1TSQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIE1TSSBvc2NpbGxhdG9yCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgTVNJT04gICAgICAgICBMTF9SQ0NfTVNJX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX01TSV9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfTVNJT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTVNJIG9zY2lsbGF0b3IKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBNU0lPTiAgICAgICAgIExMX1JDQ19NU0lfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX01TSV9EaXNhYmxlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfTVNJT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIE1TSSBvc2NpbGxhdG9yIFJlYWR5CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgTVNJUkRZICAgICAgICBMTF9SQ0NfTVNJX0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTVNJX0lzUmVhZHkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX01TSVJEWSkgPT0gUkNDX0NSX01TSVJEWSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgSW50ZXJuYWwgTXVsdGkgU3BlZWQgb3NjaWxsYXRvciAoTVNJKSBjbG9jayByYW5nZSBpbiBydW4gbW9kZS4KKyAgKiBAcm10b2xsIElDU0NSICAgICAgICAgICBNU0lSQU5HRSAgICAgIExMX1JDQ19NU0lfU2V0UmFuZ2UKKyAgKiBAcGFyYW0gIFJhbmdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19NU0lfU2V0UmFuZ2UodWludDMyX3QgUmFuZ2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX01TSVJBTkdFLCBSYW5nZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBJbnRlcm5hbCBNdWx0aSBTcGVlZCBvc2NpbGxhdG9yIChNU0kpIGNsb2NrIHJhbmdlIGluIHJ1biBtb2RlLgorICAqIEBybXRvbGwgSUNTQ1IgICAgICAgICAgIE1TSVJBTkdFICAgICAgTExfUkNDX01TSV9HZXRSYW5nZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfNgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19NU0lfR2V0UmFuZ2Uodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX01TSVJBTkdFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1TSSBDYWxpYnJhdGlvbiB2YWx1ZQorICAqIEBub3RlIFdoZW4gTVNJVFJJTSBpcyB3cml0dGVuLCBNU0lDQUwgaXMgdXBkYXRlZCB3aXRoIHRoZSBzdW0gb2YKKyAgKiAgICAgICBNU0lUUklNIGFuZCB0aGUgZmFjdG9yeSB0cmltIHZhbHVlCisgICogQHJtdG9sbCBJQ1NDUiAgICAgICAgTVNJQ0FMICAgICAgICBMTF9SQ0NfTVNJX0dldENhbGlicmF0aW9uCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX01TSV9HZXRDYWxpYnJhdGlvbih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPklDU0NSLCBSQ0NfSUNTQ1JfTVNJQ0FMKSA+PiBSQ0NfSUNTQ1JfTVNJQ0FMX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE1TSSBDYWxpYnJhdGlvbiB0cmltbWluZworICAqIEBub3RlIHVzZXItcHJvZ3JhbW1hYmxlIHRyaW1taW5nIHZhbHVlIHRoYXQgaXMgYWRkZWQgdG8gdGhlIE1TSUNBTAorICAqIEBybXRvbGwgSUNTQ1IgICAgICAgIE1TSVRSSU0gICAgICAgTExfUkNDX01TSV9TZXRDYWxpYlRyaW1taW5nCisgICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTVNJX1NldENhbGliVHJpbW1pbmcodWludDMyX3QgVmFsdWUpCit7CisgIE1PRElGWV9SRUcoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX01TSVRSSU0sIFZhbHVlIDw8IFJDQ19JQ1NDUl9NU0lUUklNX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1TSSBDYWxpYnJhdGlvbiB0cmltbWluZworICAqIEBybXRvbGwgSUNTQ1IgICAgICAgIE1TSVRSSU0gICAgICAgTExfUkNDX01TSV9HZXRDYWxpYlRyaW1taW5nCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX01TSV9HZXRDYWxpYlRyaW1taW5nKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+SUNTQ1IsIFJDQ19JQ1NDUl9NU0lUUklNKSA+PiBSQ0NfSUNTQ1JfTVNJVFJJTV9Qb3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9TeXN0ZW0gU3lzdGVtCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHN5c3RlbSBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTVyAgICAgICAgICAgIExMX1JDQ19TZXRTeXNDbGtTb3VyY2UKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX01TSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX0hTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1BMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFN5c0Nsa1NvdXJjZSh1aW50MzJfdCBTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TVywgU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHN5c3RlbSBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTV1MgICAgICAgICAgIExMX1JDQ19HZXRTeXNDbGtTb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX01TSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfSFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX1BMTAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRTeXNDbGtTb3VyY2Uodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TV1MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUhCIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEhQUkUgICAgICAgICAgTExfUkNDX1NldEFIQlByZXNjYWxlcgorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81MTIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBSEJQcmVzY2FsZXIodWludDMyX3QgUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSwgUHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQVBCMSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMSAgICAgICAgIExMX1JDQ19TZXRBUEIxUHJlc2NhbGVyCisgICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xNgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldEFQQjFQcmVzY2FsZXIodWludDMyX3QgUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFQQjIgcHJlc2NhbGVyCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUFBSRTIgICAgICAgICBMTF9SQ0NfU2V0QVBCMlByZXNjYWxlcgorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBUEIyUHJlc2NhbGVyKHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUyLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBSEIgcHJlc2NhbGVyCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgSFBSRSAgICAgICAgICBMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMjU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNTEyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFIQlByZXNjYWxlcih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX0hQUkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQVBCMSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMSAgICAgICAgIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzE2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFQQjFQcmVzY2FsZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBUEIyIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBQUkUyICAgICAgICAgTExfUkNDX0dldEFQQjJQcmVzY2FsZXIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0QVBCMlByZXNjYWxlcih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IENsb2NrIEFmdGVyIFdha2UtVXAgRnJvbSBTdG9wIG1vZGUKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTVE9QV1VDSyAgICAgIExMX1JDQ19TZXRDbGtBZnRlcldha2VGcm9tU3RvcAorICAqIEBwYXJhbSAgQ2xvY2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1RPUF9XQUtFVVBDTE9DS19NU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1RPUF9XQUtFVVBDTE9DS19IU0kKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRDbGtBZnRlcldha2VGcm9tU3RvcCh1aW50MzJfdCBDbG9jaykKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1NUT1BXVUNLLCBDbG9jayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENsb2NrIEFmdGVyIFdha2UtVXAgRnJvbSBTdG9wIG1vZGUKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTVE9QV1VDSyAgICAgIExMX1JDQ19HZXRDbGtBZnRlcldha2VGcm9tU3RvcAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1RPUF9XQUtFVVBDTE9DS19NU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1RPUF9XQUtFVVBDTE9DS19IU0kKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0Q2xrQWZ0ZXJXYWtlRnJvbVN0b3Aodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TVE9QV1VDSykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9NQ08gTUNPCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgTUNPeAorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIE1DT1NFTCAgICAgICAgTExfUkNDX0NvbmZpZ01DT1xuCisgICogICAgICAgICBDRkdSICAgICAgICAgTUNPUFJFICAgICAgICBMTF9SQ0NfQ29uZmlnTUNPCisgICogQHBhcmFtICBNQ094U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfTk9DTE9DSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX01TSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX0hTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX1BMTENMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX0hTSTQ4ICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHBhcmFtICBNQ094UHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfMTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19Db25maWdNQ08odWludDMyX3QgTUNPeFNvdXJjZSwgdWludDMyX3QgTUNPeFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX01DT1NFTCB8IFJDQ19DRkdSX01DT1BSRSwgTUNPeFNvdXJjZSB8IE1DT3hQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9QZXJpcGhlcmFsX0Nsb2NrX1NvdXJjZSBQZXJpcGhlcmFsIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFVTQVJUeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBVU0FSVHhTRUwgICAgIExMX1JDQ19TZXRVU0FSVENsb2NrU291cmNlCisgICogQHBhcmFtICBVU0FSVHhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9QQ0xLMiAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9TWVNDTEsgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfSFNJICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0xTRSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0xTRQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0VVNBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBVU0FSVHhTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgKFVTQVJUeFNvdXJjZSA+PiAxNlUpLCAoVVNBUlR4U291cmNlICYgMHgwMDAwRkZGRlUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgTFBVQVJUMXggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgTFBVQVJUMVNFTCAgICBMTF9SQ0NfU2V0TFBVQVJUQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIExQVUFSVHhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9MU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRMUFVBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBMUFVBUlR4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9MUFVBUlQxU0VMLCBMUFVBUlR4U291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgSTJDeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBJMkN4U0VMICAgICAgIExMX1JDQ19TZXRJMkNDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgSTJDeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9TWVNDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFX1BDTEsxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9TWVNDTEsgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFX0hTSSAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldEkyQ0Nsb2NrU291cmNlKHVpbnQzMl90IEkyQ3hTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgKChJMkN4U291cmNlID4+IDRVKSAmIDB4MDAwRkYwMDBVKSwgKChJMkN4U291cmNlIDw8IDRVKSAmIDB4MDAwRkYwMDBVKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIExQVElNeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBMUFRJTXhTRUwgICAgIExMX1JDQ19TZXRMUFRJTUNsb2NrU291cmNlCisgICogQHBhcmFtICBMUFRJTXhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldExQVElNQ2xvY2tTb3VyY2UodWludDMyX3QgTFBUSU14U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9MUFRJTTFTRUwsIExQVElNeFNvdXJjZSk7Cit9CisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9IU0k0OFNFTCkKKyNpZiBkZWZpbmVkKFJORykKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFJORyBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBIU0k0OFNFTCAgICAgIExMX1JDQ19TZXRSTkdDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgUk5HeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX0hTSTQ4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0Uk5HQ2xvY2tTb3VyY2UodWludDMyX3QgUk5HeFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfSFNJNDhTRUwsIFJOR3hTb3VyY2UpOworfQorI2VuZGlmIC8qIFJORyAqLworCisjaWYgZGVmaW5lZChVU0IpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0IgY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgSFNJNDhTRUwgICAgICBMTF9SQ0NfU2V0VVNCQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFVTQnhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9IU0k0OAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFVTQkNsb2NrU291cmNlKHVpbnQzMl90IFVTQnhTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0hTSTQ4U0VMLCBVU0J4U291cmNlKTsKK30KKyNlbmRpZiAvKiBVU0IgKi8KKworI2VuZGlmIC8qIFJDQ19DQ0lQUl9IU0k0OFNFTCAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBVU0FSVHggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgVVNBUlR4U0VMICAgICBMTF9SQ0NfR2V0VVNBUlRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVVNBUlR4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0UgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0hTSSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9MU0UgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9TWVNDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9MU0UKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRVU0FSVENsb2NrU291cmNlKHVpbnQzMl90IFVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgVVNBUlR4KSB8IChVU0FSVHggPDwgMTZVKSk7Cit9CisKKworCisvKioKKyAgKiBAYnJpZWYgIEdldCBMUFVBUlR4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIExQVUFSVDFTRUwgICAgTExfUkNDX0dldExQVUFSVENsb2NrU291cmNlCisgICogQHBhcmFtICBMUFVBUlR4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9TWVNDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0xTRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRMUFVBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBMUFVBUlR4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEkyQ3ggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgSTJDeFNFTCAgICAgICBMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIEkyQ3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfUENMSzEgICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9TWVNDTEsgICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9IU0kgICAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRJMkNDbG9ja1NvdXJjZSh1aW50MzJfdCBJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgSTJDeCkgPj4gNFUpIHwgKEkyQ3ggPDwgNFUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTFBUSU14IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIExQVElNeFNFTCAgICAgTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIExQVElNeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UodWludDMyX3QgTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBMUFRJTXgpKTsKK30KKworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0hTSTQ4U0VMKQorI2lmIGRlZmluZWQoUk5HKQorLyoqCisgICogQGJyaWVmICBHZXQgUk5HeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBDTEs0OFNFTCAgICAgIExMX1JDQ19HZXRSTkdDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgUk5HeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX0hTSTQ4CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFJOR0Nsb2NrU291cmNlKHVpbnQzMl90IFJOR3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJOR3gpKTsKK30KKyNlbmRpZiAvKiBSTkcgKi8KKworI2lmIGRlZmluZWQoVVNCKQorLyoqCisgICogQGJyaWVmICBHZXQgVVNCeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBDTEs0OFNFTCAgICAgIExMX1JDQ19HZXRVU0JDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVVNCeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX0hTSTQ4CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFVTQkNsb2NrU291cmNlKHVpbnQzMl90IFVTQngpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFVTQngpKTsKK30KKyNlbmRpZiAvKiBVU0IgKi8KKworI2VuZGlmIC8qIFJDQ19DQ0lQUl9IU0k0OFNFTCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9SVEMgUlRDCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgUlRDIENsb2NrIFNvdXJjZQorICAqIEBub3RlIE9uY2UgdGhlIFJUQyBjbG9jayBzb3VyY2UgaGFzIGJlZW4gc2VsZWN0ZWQsIGl0IGNhbm5vdCBiZSBjaGFuZ2VkIGFueSBtb3JlIHVubGVzcworICAqICAgICAgIHRoZSBCYWNrdXAgZG9tYWluIGlzIHJlc2V0LCBvciB1bmxlc3MgYSBmYWlsdXJlIGlzIGRldGVjdGVkIG9uIExTRSAoTFNFQ1NTRCBpcworICAqICAgICAgIHNldCkuIFRoZSBSVENSU1QgYml0IGNhbiBiZSB1c2VkIHRvIHJlc2V0IHRoZW0uCisgICogQHJtdG9sbCBDU1IgICAgICAgICBSVENTRUwgICAgICAgIExMX1JDQ19TZXRSVENDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0hTRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFJUQ0Nsb2NrU291cmNlKHVpbnQzMl90IFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNTUiwgUkNDX0NTUl9SVENTRUwsIFNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJUQyBDbG9jayBTb3VyY2UKKyAgKiBAcm10b2xsIENTUiAgICAgICAgIFJUQ1NFTCAgICAgICAgTExfUkNDX0dldFJUQ0Nsb2NrU291cmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0UlRDQ2xvY2tTb3VyY2Uodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUlRDU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJUQworICAqIEBybXRvbGwgQ1NSICAgICAgICAgUlRDRU4gICAgICAgICBMTF9SQ0NfRW5hYmxlUlRDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlUlRDKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUlRDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlRDCisgICogQHJtdG9sbCBDU1IgICAgICAgICBSVENFTiAgICAgICAgIExMX1JDQ19EaXNhYmxlUlRDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZVJUQyh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUlRDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJUQyBoYXMgYmVlbiBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQ1NSICAgICAgICAgUlRDRU4gICAgICAgICBMTF9SQ0NfSXNFbmFibGVkUlRDCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZFJUQyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9SVENFTikgPT0gUkNDX0NTUl9SVENFTikgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZvcmNlIHRoZSBCYWNrdXAgZG9tYWluIHJlc2V0CisgICogQHJtdG9sbCBDU1IgICAgICAgICBSVENSU1QgICAgICAgICBMTF9SQ0NfRm9yY2VCYWNrdXBEb21haW5SZXNldAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0ZvcmNlQmFja3VwRG9tYWluUmVzZXQodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9SVENSU1QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQKKyAgKiBAcm10b2xsIENTUiAgICAgICAgIFJUQ1JTVCAgICAgICAgIExMX1JDQ19SZWxlYXNlQmFja3VwRG9tYWluUmVzZXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19SZWxlYXNlQmFja3VwRG9tYWluUmVzZXQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX1JUQ1JTVCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX1BMTCBQTEwKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBQTEwKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQTExPTiAgICAgICAgIExMX1JDQ19QTExfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0VuYWJsZSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQTEwKKyAgKiBAbm90ZSBDYW5ub3QgYmUgZGlzYWJsZWQgaWYgdGhlIFBMTCBjbG9jayBpcyB1c2VkIGFzIHRoZSBzeXN0ZW0gY2xvY2sKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQTExPTiAgICAgICAgIExMX1JDQ19QTExfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9EaXNhYmxlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFBMTCBSZWFkeQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBMTFJEWSAgICAgICAgTExfUkNDX1BMTF9Jc1JlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpID09IFJDQ19DUl9QTExSRFkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUExMIHVzZWQgZm9yIFNZU0NMSyBEb21haW4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZU1xuCisgICogICAgICAgICBDRkdSICAgICAgICAgUExMTVVMICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVNcbgorICAqICAgICAgICAgQ0ZHUiAgICAgICAgIFBMTERJViAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFCisgICogQHBhcmFtICBQTExNdWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF80OAorICAqIEBwYXJhbSAgUExMRGl2IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX0RJVl80CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVModWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNdWwsIHVpbnQzMl90IFBMTERpdikKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BMTFNSQyB8IFJDQ19DRkdSX1BMTE1VTCB8IFJDQ19DRkdSX1BMTERJViwgU291cmNlIHwgUExMTXVsIHwgUExMRGl2KTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUExMIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBMTFNSQyAgICAgICAgTExfUkNDX1BMTF9TZXRNYWluU291cmNlCisgICogQHBhcmFtICBQTExTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX1NldE1haW5Tb3VyY2UodWludDMyX3QgUExMU291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUExMU1JDLCBQTExTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgb3NjaWxsYXRvciB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1BMTFNSQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBQTEwgbXVsdGlwbGljYXRpb24gRmFjdG9yCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUExMTVVMICAgICAgICBMTF9SQ0NfUExMX0dldE11bHRpcGxpY2F0b3IKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX01VTF8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfTVVMXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9NVUxfNDgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldE11bHRpcGxpY2F0b3Iodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QTExNVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRGl2aXNpb24gZmFjdG9yIGZvciB0aGUgbWFpbiBQTEwgYW5kIG90aGVyIFBMTAorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBMTERJViAgICAgICAgTExfUkNDX1BMTF9HZXREaXZpZGVyCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTF9ESVZfNAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0RGl2aWRlcih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1BMTERJVikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBRyBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDbGVhciBMU0kgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBMU0lSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfTFNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX0xTSVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfTFNJUkRZQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgTFNFIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSUNSICAgICAgICAgTFNFUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0xTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19MU0VSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0xTRVJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE1TSSByZWFkeSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lDUiAgICAgICAgIE1TSVJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19NU0lSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfTVNJUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9NU0lSRFlDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBIU0kgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBIU0lSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfSFNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX0hTSVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfSFNJUkRZQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgSFNFIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSUNSICAgICAgICAgSFNFUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0VSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0hTRVJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFBMTCByZWFkeSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lDUiAgICAgICAgIFBMTFJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19QTExSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfUExMUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9QTExSRFlDKTsKK30KKworI2lmIGRlZmluZWQoUkNDX0hTSTQ4X1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEhTSTQ4IHJlYWR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSUNSICAgICAgICAgIEhTSTQ4UkRZQyAgICAgTExfUkNDX0NsZWFyRmxhZ19IU0k0OFJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0k0OFJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfSFNJNDhSRFlDKTsKK30KKyNlbmRpZiAvKiBSQ0NfSFNJNDhfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSQ0NfSFNFQ1NTX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lDUiAgICAgICAgIENTU0MgICAgICAgICAgTExfUkNDX0NsZWFyRmxhZ19IU0VDU1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfSFNFQ1NTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9DU1NDKTsKK30KKyNlbmRpZiAvKiBSQ0NfSFNFQ1NTX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBDbGVhciBMU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSUNSICAgICAgICAgTFNFQ1NTQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0xTRUNTUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19MU0VDU1Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0xTRUNTU0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExTSSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgTFNJUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTSVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNJUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfTFNJUkRZRikgPT0gUkNDX0NJRlJfTFNJUkRZRikgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExTRSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgTFNFUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTRVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfTFNFUkRZRikgPT0gUkNDX0NJRlJfTFNFUkRZRikgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIE1TSSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgTVNJUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX01TSVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTVNJUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfTVNJUkRZRikgPT0gUkNDX0NJRlJfTVNJUkRZRikgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEhTSSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgSFNJUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNJUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfSFNJUkRZRikgPT0gUkNDX0NJRlJfSFNJUkRZRikgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEhTRSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgSFNFUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTRVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfSFNFUkRZRikgPT0gUkNDX0NJRlJfSFNFUkRZRikgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFBMTCByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgUExMUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BMTFJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUExMUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfUExMUkRZRikgPT0gUkNDX0NJRlJfUExMUkRZRikgPyAxVUwgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNJNDggcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdAorICAqIEBybXRvbGwgQ0lGUiAgICAgICAgICBIU0k0OFJEWUYgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNJNDhSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSTQ4UkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfSFNJNDhSRFlGKSA9PSBSQ0NfQ0lGUl9IU0k0OFJEWUYpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBSQ0NfSFNJNDhfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSQ0NfSFNFQ1NTX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgQ1NTRiAgICAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTRUNTUworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNFQ1NTKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfQ1NTRikgPT0gUkNDX0NJRlJfQ1NTRikgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFJDQ19IU0VDU1NfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdAorICAqIEBybXRvbGwgQ0lGUiAgICAgICAgIExTRUNTU0YgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19MU0VDU1MKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTRUNTUyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRlIsIFJDQ19DSUZSX0xTRUNTU0YpID09IFJDQ19DSUZSX0xTRUNTU0YpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBIU0kgRGl2aWRlciBpcyBlbmFibGVkIChpdCBkaXZpZGVzIGJ5IDQpCisgICogQHJtdG9sbCBDUiAgICAgICAgSFNJRElWRiAgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0lESVYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSURJVih2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJRElWRikgPT0gUkNDX0NSX0hTSURJVkYpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoUkNDX0NTUl9GV1JTVEYpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJDQyBmbGFnIEZXIHJlc2V0IGlzIHNldCBvciBub3QuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgRldSU1RGICAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0ZXUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19GV1JTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9GV1JTVEYpID09IFJDQ19DU1JfRldSU1RGKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogUkNDX0NTUl9GV1JTVEYgKi8KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBJbmRlcGVuZGVudCBXYXRjaGRvZyByZXNldCBpcyBzZXQgb3Igbm90LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIElXREdSU1RGICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19JV0RHUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19JV0RHUlNUKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0lXREdSU1RGKSA9PSBSQ0NfQ1NSX0lXREdSU1RGKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgTG93IFBvd2VyIHJlc2V0IGlzIHNldCBvciBub3QuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgTFBXUlJTVEYgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xQV1JSU1QKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xQV1JSU1Qodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFBXUlJTVEYpID09IFJDQ19DU1JfTFBXUlJTVEYpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIE9CTFJTVEYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19PQkxSU1QKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX09CTFJTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9PQkxSU1RGKSA9PSBSQ0NfQ1NSX09CTFJTVEYpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBQaW4gcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBQSU5SU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfUElOUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19QSU5SU1Qodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUElOUlNURikgPT0gUkNDX0NTUl9QSU5SU1RGKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgUE9SL1BEUiByZXNldCBpcyBzZXQgb3Igbm90LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFBPUlJTVEYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19QT1JSU1QKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BPUlJTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9QT1JSU1RGKSA9PSBSQ0NfQ1NSX1BPUlJTVEYpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBTb2Z0d2FyZSByZXNldCBpcyBzZXQgb3Igbm90LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNGVFJTVEYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19TRlRSU1QKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1NGVFJTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9TRlRSU1RGKSA9PSBSQ0NfQ1NSX1NGVFJTVEYpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBXaW5kb3cgV2F0Y2hkb2cgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBXV0RHUlNURiAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfV1dER1JTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfV1dER1JTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9XV0RHUlNURikgPT0gUkNDX0NTUl9XV0RHUlNURikgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSTVZGIGJpdCB0byBjbGVhciB0aGUgcmVzZXQgZmxhZ3MuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgUk1WRiAgICAgICAgICBMTF9SQ0NfQ2xlYXJSZXNldEZsYWdzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJSZXNldEZsYWdzKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUk1WRik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0lUX01hbmFnZW1lbnQgSVQgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0lSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9MU0lSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9MU0lSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTSVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTRVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0xTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0xTRVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBNU0kgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTVNJUkRZSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfTVNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfTVNJUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9NU0lSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9IU0lSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9IU0lSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTRVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0hTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0hTRVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNFUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBQTEwgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgUExMUkRZSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfUExMUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfUExMUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9QTExSRFlJRSk7Cit9CisKKyNpZiBkZWZpbmVkKFJDQ19IU0k0OF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNJNDggcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgIEhTSTQ4UkRZSUUgICAgTExfUkNDX0VuYWJsZUlUX0hTSTQ4UkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfSFNJNDhSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSTQ4UkRZSUUpOworfQorI2VuZGlmIC8qIFJDQ19IU0k0OF9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExTRSBjbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNFQ1NTSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfTFNFQ1NTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfTFNFQ1NTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0VDU1NJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBMU0kgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNJUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0xTSVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9MU0lSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNJUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTRVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9MU0VSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfTFNFUkRZKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTRVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE1TSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBNU0lSRFlJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfTVNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX01TSVJEWSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9NU0lSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIU0kgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgSFNJUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0hTSVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9IU0lSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTRVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9IU0VSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfSFNFUkRZKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTRVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBQTExSRFlJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfUExMUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX1BMTFJEWSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9QTExSRFlJRSk7Cit9CisKKyNpZiBkZWZpbmVkKFJDQ19IU0k0OF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTSTQ4IHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgICBIU0k0OFJEWUlFICAgIExMX1JDQ19EaXNhYmxlSVRfSFNJNDhSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfSFNJNDhSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJNDhSRFlJRSk7Cit9CisjZW5kaWYgLyogUkNDX0hTSTQ4X1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTRSBjbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNFQ1NTSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0xTRUNTUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9MU0VDU1Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFQ1NTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyBpZiBMU0kgcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTSVJEWUlFICAgICAgTExfUkNDX0lzRW5hYmxlZElUX0xTSVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRJVF9MU0lSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0lSRFlJRSkgPT0gUkNDX0NJRVJfTFNJUkRZSUUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgTFNFIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9MU0VSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfTFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFUkRZSUUpID09IFJDQ19DSUVSX0xTRVJEWUlFKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIE1TSSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTVNJUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfTVNJUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX01TSVJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX01TSVJEWUlFKSA9PSBSQ0NfQ0lFUl9NU0lSRFlJRSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyBpZiBIU0kgcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTSVJEWUlFICAgICAgTExfUkNDX0lzRW5hYmxlZElUX0hTSVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRJVF9IU0lSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9IU0lSRFlJRSkgPT0gUkNDX0NJRVJfSFNJUkRZSUUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgSFNFIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBIU0VSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9IU0VSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfSFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNFUkRZSUUpID09IFJDQ19DSUVSX0hTRVJEWUlFKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIFBMTCByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSUVSICAgICAgICAgUExMUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfUExMUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX1BMTFJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX1BMTFJEWUlFKSA9PSBSQ0NfQ0lFUl9QTExSRFlJRSkgPyAxVUwgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIEhTSTQ4IHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICAgSFNJNDhSRFlJRSAgICBMTF9SQ0NfSXNFbmFibGVkSVRfSFNJNDhSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfSFNJNDhSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9IU0k0OFJEWUlFKSA9PSBSQ0NfQ0lFUl9IU0k0OFJEWUlFKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogUkNDX0hTSTQ4X1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgTFNFQ1NTIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VDU1NJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9MU0VDU1MKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfTFNFQ1NTKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFQ1NTSUUpID09IFJDQ19DSUVSX0xTRUNTU0lFKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0luaXQgRGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfUkNDX0RlSW5pdCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0dldF9GcmVxIEdldCBzeXN0ZW0gYW5kIHBlcmlwaGVyYWxzIGNsb2NrcyBmcmVxdWVuY3kgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3ZvaWQgICAgICAgIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKExMX1JDQ19DbG9ja3NUeXBlRGVmICpSQ0NfQ2xvY2tzKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRVU0FSVENsb2NrRnJlcSh1aW50MzJfdCBVU0FSVHhTb3VyY2UpOwordWludDMyX3QgICAgTExfUkNDX0dldEkyQ0Nsb2NrRnJlcSh1aW50MzJfdCBJMkN4U291cmNlKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRMUFVBUlRDbG9ja0ZyZXEodWludDMyX3QgTFBVQVJUeFNvdXJjZSk7Cit1aW50MzJfdCAgICBMTF9SQ0NfR2V0TFBUSU1DbG9ja0ZyZXEodWludDMyX3QgTFBUSU14U291cmNlKTsKKyNpZiBkZWZpbmVkKFVTQl9PVEdfRlMpIHx8IGRlZmluZWQoVVNCKQordWludDMyX3QgICAgTExfUkNDX0dldFVTQkNsb2NrRnJlcSh1aW50MzJfdCBVU0J4U291cmNlKTsKKyNlbmRpZiAvKiBVU0JfT1RHX0ZTIHx8IFVTQiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFJDQyAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfTExfUkNDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfcm5nLmggYi9JbmMvc3RtMzJsMHh4X2xsX3JuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYmU1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2xsX3JuZy5oCkBAIC0wLDAgKzEsMzM3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3JuZy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBSTkcgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0xMX1JOR19ICisjZGVmaW5lIFNUTTMyTDB4eF9MTF9STkdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFJORykKKworLyoqIEBkZWZncm91cCBSTkdfTEwgUk5HCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19MTF9FeHBvcnRlZF9Db25zdGFudHMgUk5HIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKworLyoqIEBkZWZncm91cCBSTkdfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JOR19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUk5HX1NSX0RSRFkgUk5HX1NSX0RSRFkgICAgLyohPCBSZWdpc3RlciBjb250YWlucyB2YWxpZCByYW5kb20gZGF0YSAqLworI2RlZmluZSBMTF9STkdfU1JfQ0VDUyBSTkdfU1JfQ0VDUyAgICAvKiE8IENsb2NrIGVycm9yIGN1cnJlbnQgc3RhdHVzICovCisjZGVmaW5lIExMX1JOR19TUl9TRUNTIFJOR19TUl9TRUNTICAgIC8qITwgU2VlZCBlcnJvciBjdXJyZW50IHN0YXR1cyAqLworI2RlZmluZSBMTF9STkdfU1JfQ0VJUyBSTkdfU1JfQ0VJUyAgICAvKiE8IENsb2NrIGVycm9yIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgTExfUk5HX1NSX1NFSVMgUk5HX1NSX1NFSVMgICAgLyohPCBTZWVkIGVycm9yIGludGVycnVwdCBzdGF0dXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JOR19SZWFkUmVnIGFuZCAgTExfUk5HX1dyaXRlUmVnIG1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JOR19DUl9JRSAgIFJOR19DUl9JRSAgICAgIC8qITwgUk5HIEludGVycnVwdCBlbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19MTF9FeHBvcnRlZF9NYWNyb3MgUk5HIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gUk5HIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gUk5HIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9STkdfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBSTkcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBSTkcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfUk5HX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUk5HIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIFJOR19MTF9FRl9Db25maWd1cmF0aW9uIFJORyBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJOR0VOICAgICAgICAgTExfUk5HX0VuYWJsZQorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JOR19FbmFibGUoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIFNFVF9CSVQoUk5HeC0+Q1IsIFJOR19DUl9STkdFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSTkdFTiAgICAgICAgIExMX1JOR19EaXNhYmxlCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUk5HX0Rpc2FibGUoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIENMRUFSX0JJVChSTkd4LT5DUiwgUk5HX0NSX1JOR0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUk5HRU4gICAgICAgICBMTF9STkdfSXNFbmFibGVkCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19Jc0VuYWJsZWQoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPkNSLCBSTkdfQ1JfUk5HRU4pID09IChSTkdfQ1JfUk5HRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHRoZSBSTkcgRGF0YSByZWFkeSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBEUkRZICAgICAgICAgIExMX1JOR19Jc0FjdGl2ZUZsYWdfRFJEWQorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9STkdfSXNBY3RpdmVGbGFnX0RSRFkoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPlNSLCBSTkdfU1JfRFJEWSkgPT0gKFJOR19TUl9EUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHRoZSBDbG9jayBFcnJvciBDdXJyZW50IFN0YXR1cyBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDRUNTICAgICAgICAgIExMX1JOR19Jc0FjdGl2ZUZsYWdfQ0VDUworICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9STkdfSXNBY3RpdmVGbGFnX0NFQ1MoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPlNSLCBSTkdfU1JfQ0VDUykgPT0gKFJOR19TUl9DRUNTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHRoZSBTZWVkIEVycm9yIEN1cnJlbnQgU3RhdHVzIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFNFQ1MgICAgICAgICAgTExfUk5HX0lzQWN0aXZlRmxhZ19TRUNTCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19Jc0FjdGl2ZUZsYWdfU0VDUyhSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUk5HeC0+U1IsIFJOR19TUl9TRUNTKSA9PSAoUk5HX1NSX1NFQ1MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgdGhlIENsb2NrIEVycm9yIEludGVycnVwdCBTdGF0dXMgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0VJUyAgICAgICAgICBMTF9STkdfSXNBY3RpdmVGbGFnX0NFSVMKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUk5HX0lzQWN0aXZlRmxhZ19DRUlTKFJOR19UeXBlRGVmICpSTkd4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSTkd4LT5TUiwgUk5HX1NSX0NFSVMpID09IChSTkdfU1JfQ0VJUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiB0aGUgU2VlZCBFcnJvciBJbnRlcnJ1cHQgU3RhdHVzIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFNFSVMgICAgICAgICAgTExfUk5HX0lzQWN0aXZlRmxhZ19TRUlTCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19Jc0FjdGl2ZUZsYWdfU0VJUyhSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUk5HeC0+U1IsIFJOR19TUl9TRUlTKSA9PSAoUk5HX1NSX1NFSVMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2xvY2sgRXJyb3IgaW50ZXJydXB0IFN0YXR1cyAoQ0VJUykgRmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIENFSVMgICAgICAgICAgTExfUk5HX0NsZWFyRmxhZ19DRUlTCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUk5HX0NsZWFyRmxhZ19DRUlTKFJOR19UeXBlRGVmICpSTkd4KQoreworICBXUklURV9SRUcoUk5HeC0+U1IsIH5STkdfU1JfQ0VJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU2VlZCBFcnJvciBpbnRlcnJ1cHQgU3RhdHVzIChTRUlTKSBGbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgU0VJUyAgICAgICAgICBMTF9STkdfQ2xlYXJGbGFnX1NFSVMKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9STkdfQ2xlYXJGbGFnX1NFSVMoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIFdSSVRFX1JFRyhSTkd4LT5TUiwgflJOR19TUl9TRUlTKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfTExfRUZfSVRfTWFuYWdlbWVudCBJVCBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgSW50ZXJydXB0CisgICogICAgICAgICAoYXBwbGllcyBmb3IgZWl0aGVyIFNlZWQgZXJyb3IsIENsb2NrIEVycm9yIG9yIERhdGEgcmVhZHkgaW50ZXJydXB0cykKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBJRSAgICAgICAgICAgIExMX1JOR19FbmFibGVJVAorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JOR19FbmFibGVJVChSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgU0VUX0JJVChSTkd4LT5DUiwgUk5HX0NSX0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIEludGVycnVwdAorICAqICAgICAgICAgKGFwcGxpZXMgZm9yIGVpdGhlciBTZWVkIGVycm9yLCBDbG9jayBFcnJvciBvciBEYXRhIHJlYWR5IGludGVycnVwdHMpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSUUgICAgICAgICAgICBMTF9STkdfRGlzYWJsZUlUCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUk5HX0Rpc2FibGVJVChSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgQ0xFQVJfQklUKFJOR3gtPkNSLCBSTkdfQ1JfSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIEludGVycnVwdCBpcyBlbmFibGVkCisgICogICAgICAgICAoYXBwbGllcyBmb3IgZWl0aGVyIFNlZWQgZXJyb3IsIENsb2NrIEVycm9yIG9yIERhdGEgcmVhZHkgaW50ZXJydXB0cykKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBJRSAgICAgICAgICAgIExMX1JOR19Jc0VuYWJsZWRJVAorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9STkdfSXNFbmFibGVkSVQoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPkNSLCBSTkdfQ1JfSUUpID09IChSTkdfQ1JfSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybjMyLWJpdCBSYW5kb20gTnVtYmVyIHZhbHVlCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgUk5EQVRBICAgICAgICBMTF9STkdfUmVhZFJhbmREYXRhMzIKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBHZW5lcmF0ZWQgMzItYml0IHJhbmRvbSB2YWx1ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19SZWFkUmFuZERhdGEzMihSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoUk5HeC0+RFIpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSTkdfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JOR19EZUluaXQoUk5HX1R5cGVEZWYgKlJOR3gpOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogUk5HICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9MTF9STkdfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9sbF9ydGMuaCBiL0luYy9zdG0zMmwweHhfbGxfcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0YWZlYQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfbGxfcnRjLmgKQEAgLTAsMCArMSwzODA5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3J0Yy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBSVEMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyTDB4eF9MTF9SVENfSAorI2RlZmluZSBTVE0zMkwweHhfTExfUlRDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFJUQykKKworLyoqIEBkZWZncm91cCBSVENfTEwgUlRDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfTExfUHJpdmF0ZV9Db25zdGFudHMgUlRDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIE1hc2tzIERlZmluaXRpb24gKi8KKyNkZWZpbmUgUlRDX0xMX0lOSVRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRlUKKyNkZWZpbmUgUlRDX0xMX1JTRl9NQVNLICAgICAgICAgICAgICAgICAgMHhGRkZGRkY1RlUKKworLyogV3JpdGUgcHJvdGVjdGlvbiBkZWZpbmVzICovCisjZGVmaW5lIFJUQ19XUklURV9QUk9URUNUSU9OX0RJU0FCTEUgICgodWludDhfdCkweEZGVSkKKyNkZWZpbmUgUlRDX1dSSVRFX1BST1RFQ1RJT05fRU5BQkxFXzEgKCh1aW50OF90KTB4Q0FVKQorI2RlZmluZSBSVENfV1JJVEVfUFJPVEVDVElPTl9FTkFCTEVfMiAoKHVpbnQ4X3QpMHg1M1UpCisKKy8qIERlZmluZXMgdXNlZCB0byBjb21iaW5lIGRhdGUgJiB0aW1lICovCisjZGVmaW5lIFJUQ19PRkZTRVRfV0VFS0RBWSAgICAgICAgICAgICh1aW50MzJfdCkyNFUKKyNkZWZpbmUgUlRDX09GRlNFVF9EQVkgICAgICAgICAgICAgICAgKHVpbnQzMl90KTE2VQorI2RlZmluZSBSVENfT0ZGU0VUX01PTlRIICAgICAgICAgICAgICAodWludDMyX3QpOFUKKyNkZWZpbmUgUlRDX09GRlNFVF9IT1VSICAgICAgICAgICAgICAgKHVpbnQzMl90KTE2VQorI2RlZmluZSBSVENfT0ZGU0VUX01JTlVURSAgICAgICAgICAgICAodWludDMyX3QpOFUKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX1ByaXZhdGVfTWFjcm9zIFJUQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VTX0lOSVQgUlRDIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSVEMgSW5pdCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEhvdXJGb3JtYXQ7ICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBIb3VycyBGb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19IT1VSRk9STUFUCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JUQ19TZXRIb3VyRm9ybWF0KCkuICovCisKKyAgdWludDMyX3QgQXN5bmNoUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFzeW5jaHJvbm91cyBQcmVkaXZpZGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDdGCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JUQ19TZXRBc3luY2hQcmVzY2FsZXIoKS4gKi8KKworICB1aW50MzJfdCBTeW5jaFByZXNjYWxlcjsgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgU3luY2hyb25vdXMgUHJlZGl2aWRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHg3RkZGCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JUQ19TZXRTeW5jaFByZXNjYWxlcigpLiAqLworfSBMTF9SVENfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUlRDIFRpbWUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRpbWVGb3JtYXQ7IC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQU0vUE0gVGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19USU1FX0ZPUk1BVAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfVElNRV9TZXRGb3JtYXQoKS4gKi8KKworICB1aW50OF90IEhvdXJzOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgSG91cnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxMiBpZiB0aGUgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfUE0gaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyMyBpZiB0aGUgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQgaXMgc2VsZWN0ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19USU1FX1NldEhvdXIoKS4gKi8KKworICB1aW50OF90IE1pbnV0ZXM7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgTWludXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDU5CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19USU1FX1NldE1pbnV0ZSgpLiAqLworCisgIHVpbnQ4X3QgU2Vjb25kczsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgVGltZSBTZWNvbmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNTkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX1RJTUVfU2V0U2Vjb25kKCkuICovCit9IExMX1JUQ19UaW1lVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSVEMgRGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCBXZWVrRGF5OyAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIFdlZWtEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfTExfRUNfV0VFS0RBWQorCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfREFURV9TZXRXZWVrRGF5KCkuICovCisKKyAgdWludDhfdCBNb250aDsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIE1vbnRoLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0xMX0VDX01PTlRICisKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19EQVRFX1NldE1vbnRoKCkuICovCisKKyAgdWludDhfdCBEYXk7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIERheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMxCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19EQVRFX1NldERheSgpLiAqLworCisgIHVpbnQ4X3QgWWVhcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZSBZZWFyLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gOTkKKworICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0RBVEVfU2V0WWVhcigpLiAqLworfSBMTF9SVENfRGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUlRDIEFsYXJtIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICBMTF9SVENfVGltZVR5cGVEZWYgQWxhcm1UaW1lOyAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBUaW1lIG1lbWJlcnMuICovCisKKyAgdWludDMyX3QgQWxhcm1NYXNrOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gTWFza3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0xMX0VDX0FMTUFfTUFTSyBmb3IgQUxBUk0gQSBvciBAcmVmIFJUQ19MTF9FQ19BTE1CX01BU0sgZm9yIEFMQVJNIEIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfQUxNQV9TZXRNYXNrKCkgZm9yIEFMQVJNIEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgQHJlZiBMTF9SVENfQUxNQl9TZXRNYXNrKCkgZm9yIEFMQVJNIEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgQWxhcm1EYXRlV2Vla0RheVNlbDsgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gaXMgb24gZGF5IG9yIFdlZWtEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0xMX0VDX0FMTUFfV0VFS0RBWV9TRUxFQ1RJT04gZm9yIEFMQVJNIEEgb3IgQHJlZiBSVENfTExfRUNfQUxNQl9XRUVLREFZX1NFTEVDVElPTiBmb3IgQUxBUk0gQgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0FMTUFfRW5hYmxlV2Vla2RheSgpIG9yIEByZWYgTExfUlRDX0FMTUFfRGlzYWJsZVdlZWtkYXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQUxBUk0gQSBvciBAcmVmIExMX1JUQ19BTE1CX0VuYWJsZVdlZWtkYXkoKSBvciBAcmVmIExMX1JUQ19BTE1CX0Rpc2FibGVXZWVrZGF5KCkgZm9yIEFMQVJNIEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDhfdCBBbGFybURhdGVXZWVrRGF5OyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gRGF5L1dlZWtEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIEFsYXJtRGF0ZVdlZWtEYXlTZWwgc2V0IHRvIGRheSwgdGhpcyBwYXJhbWV0ZXIgIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzEuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfQUxNQV9TZXREYXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQUxBUk0gQSBvciBAcmVmIExMX1JUQ19BTE1CX1NldERheSgpIGZvciBBTEFSTSBCLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIEFsYXJtRGF0ZVdlZWtEYXlTZWwgc2V0IHRvIFdlZWtkYXksIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0xMX0VDX1dFRUtEQVkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfQUxNQV9TZXRXZWVrRGF5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEFMQVJNIEEgb3IgQHJlZiBMTF9SVENfQUxNQl9TZXRXZWVrRGF5KCkgZm9yIEFMQVJNIEIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMTF9SVENfQWxhcm1UeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFJUQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19GT1JNQVQgRk9STUFUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0ZPUk1BVF9CSU4gICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMFUgLyohPCBCaW5hcnkgZGF0YSBmb3JtYXQgKi8KKyNkZWZpbmUgTExfUlRDX0ZPUk1BVF9CQ0QgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMVUgLyohPCBCQ0QgZGF0YSBmb3JtYXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMTUFfV0VFS0RBWV9TRUxFQ1RJT04gUlRDIEFsYXJtIEEgRGF0ZSBXZWVrRGF5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfREFURSAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEFsYXJtIEEgRGF0ZSBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9XRUVLREFZIFJUQ19BTFJNQVJfV0RTRUwgICAgICAgIC8qITwgQWxhcm0gQSBXZWVrRGF5IGlzIHNlbGVjdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19BTE1CX1dFRUtEQVlfU0VMRUNUSU9OIFJUQyBBbGFybSBCIERhdGUgV2Vla0RheQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX0RBVEUgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBBbGFybSBCIERhdGUgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfV0VFS0RBWSBSVENfQUxSTUJSX1dEU0VMICAgICAgICAvKiE8IEFsYXJtIEIgV2Vla0RheSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUlRDX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfSVNSX0lUU0YgICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfSVRTRgorI2RlZmluZSBMTF9SVENfSVNSX1JFQ0FMUEYgICAgICAgICAgICAgICAgIFJUQ19JU1JfUkVDQUxQRgorI2RlZmluZSBMTF9SVENfSVNSX1RBTVAzRiAgICAgICAgICAgICAgICAgIFJUQ19JU1JfVEFNUDNGCisjZGVmaW5lIExMX1JUQ19JU1JfVEFNUDJGICAgICAgICAgICAgICAgICAgUlRDX0lTUl9UQU1QMkYKKyNkZWZpbmUgTExfUlRDX0lTUl9UQU1QMUYgICAgICAgICAgICAgICAgICBSVENfSVNSX1RBTVAxRgorI2RlZmluZSBMTF9SVENfSVNSX1RTT1ZGICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfVFNPVkYKKyNkZWZpbmUgTExfUlRDX0lTUl9UU0YgICAgICAgICAgICAgICAgICAgICBSVENfSVNSX1RTRgorI2RlZmluZSBMTF9SVENfSVNSX1dVVEYgICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfV1VURgorI2RlZmluZSBMTF9SVENfSVNSX0FMUkJGICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfQUxSQkYKKyNkZWZpbmUgTExfUlRDX0lTUl9BTFJBRiAgICAgICAgICAgICAgICAgICBSVENfSVNSX0FMUkFGCisjZGVmaW5lIExMX1JUQ19JU1JfSU5JVEYgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9JTklURgorI2RlZmluZSBMTF9SVENfSVNSX1JTRiAgICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfUlNGCisjZGVmaW5lIExMX1JUQ19JU1JfSU5JVFMgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9JTklUUworI2RlZmluZSBMTF9SVENfSVNSX1NIUEYgICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfU0hQRgorI2RlZmluZSBMTF9SVENfSVNSX1dVVFdGICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfV1VUV0YKKyNkZWZpbmUgTExfUlRDX0lTUl9BTFJCV0YgICAgICAgICAgICAgICAgICBSVENfSVNSX0FMUkJXRgorI2RlZmluZSBMTF9SVENfSVNSX0FMUkFXRiAgICAgICAgICAgICAgICAgIFJUQ19JU1JfQUxSQVdGCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9SVENfUmVhZFJlZyBhbmQgIExMX1JUQ19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQ1JfVFNJRSAgICAgICAgICAgICAgICAgICAgIFJUQ19DUl9UU0lFCisjZGVmaW5lIExMX1JUQ19DUl9XVVRJRSAgICAgICAgICAgICAgICAgICAgUlRDX0NSX1dVVElFCisjZGVmaW5lIExMX1JUQ19DUl9BTFJCSUUgICAgICAgICAgICAgICAgICAgUlRDX0NSX0FMUkJJRQorI2RlZmluZSBMTF9SVENfQ1JfQUxSQUlFICAgICAgICAgICAgICAgICAgIFJUQ19DUl9BTFJBSUUKKyNkZWZpbmUgTExfUlRDX1RBTVBDUl9UQU1QM0lFICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAzSUUKKyNkZWZpbmUgTExfUlRDX1RBTVBDUl9UQU1QMklFICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAySUUKKyNkZWZpbmUgTExfUlRDX1RBTVBDUl9UQU1QMUlFICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAxSUUKKyNkZWZpbmUgTExfUlRDX1RBTVBDUl9UQU1QSUUgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVBJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfV0VFS0RBWSAgV0VFSyBEQVkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9NT05EQVkgICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkgLyohPCBNb25kYXkgICAgKi8KKyNkZWZpbmUgTExfUlRDX1dFRUtEQVlfVFVFU0RBWSAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpIC8qITwgVHVlc2RheSAgICovCisjZGVmaW5lIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWSAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAvKiE8IFdlZG5lc2RheSAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9USFVSU0RBWSAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgLyohPCBUaHJ1c2RheSAgKi8KKyNkZWZpbmUgTExfUlRDX1dFRUtEQVlfRlJJREFZICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpIC8qITwgRnJpZGF5ICAgICovCisjZGVmaW5lIExMX1JUQ19XRUVLREFZX1NBVFVSREFZICAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAvKiE8IFNhdHVyZGF5ICAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9TVU5EQVkgICAgICAgICAgICAgICgodWludDhfdCkweDA3VSkgLyohPCBTdW5kYXkgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX01PTlRIICBNT05USAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9KQU5VQVJZICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyohPCBKYW51YXJ5ICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX0ZFQlJVQVJZICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiE8IEZlYnJ1YXJ5ICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfTUFSQ0ggICAgICAgICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qITwgTWFyY2ggICAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9BUFJJTCAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyohPCBBcHJpbCAgICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX01BWSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiE8IE1heSAgICAgICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfSlVORSAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qITwgSnVuZSAgICAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9KVUxZICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyohPCBKdWx5ICAgICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX0FVR1VTVCAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiE8IEF1Z3VzdCAgICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfU0VQVEVNQkVSICAgICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qITwgU2VwdGVtYmVyICovCisjZGVmaW5lIExMX1JUQ19NT05USF9PQ1RPQkVSICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTBVKSAgLyohPCBPY3RvYmVyICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX05PVkVNQkVSICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMVUpICAvKiE8IE5vdmVtYmVyICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfREVDRU1CRVIgICAgICAgICAgICAgICgodWludDhfdCkweDEyVSkgIC8qITwgRGVjZW1iZXIgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19IT1VSRk9STUFUICBIT1VSIEZPUk1BVAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUiAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgMjQgaG91ci9kYXkgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19IT1VSRk9STUFUX0FNUE0gICAgICAgICAgICAgUlRDX0NSX0ZNVCAgICAgICAgICAgIC8qITwgQU0vUE0gaG91ciBmb3JtYXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMQVJNT1VUICBBTEFSTSBPVVRQVVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxBUk1PVVRfRElTQUJMRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgT3V0cHV0IGRpc2FibGVkICovCisjZGVmaW5lIExMX1JUQ19BTEFSTU9VVF9BTE1BICAgICAgICAgICAgICAgUlRDX0NSX09TRUxfMCAgICAgICAgICAgLyohPCBBbGFybSBBIG91dHB1dCBlbmFibGVkICovCisjZGVmaW5lIExMX1JUQ19BTEFSTU9VVF9BTE1CICAgICAgICAgICAgICAgUlRDX0NSX09TRUxfMSAgICAgICAgICAgLyohPCBBbGFybSBCIG91dHB1dCBlbmFibGVkICovCisjZGVmaW5lIExMX1JUQ19BTEFSTU9VVF9XQUtFVVAgICAgICAgICAgICAgUlRDX0NSX09TRUwgICAgICAgICAgICAgLyohPCBXYWtldXAgb3V0cHV0IGVuYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMQVJNX09VVFBVVFRZUEUgIEFMQVJNIE9VVFBVVCBUWVBFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMQVJNX09VVFBVVFRZUEVfT1BFTkRSQUlOICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSVENfQUxBUk0sIHdoZW4gbWFwcGVkIG9uIFBDMTMsIGlzIG9wZW4tZHJhaW4gb3V0cHV0ICovCisjZGVmaW5lIExMX1JUQ19BTEFSTV9PVVRQVVRUWVBFX1BVU0hQVUxMICAgUlRDX09SX0FMQVJNT1VUVFlQRSAvKiE8IFJUQ19BTEFSTSwgd2hlbiBtYXBwZWQgb24gUEMxMywgaXMgcHVzaC1wdWxsIG91dHB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfT1VUUFVUUE9MQVJJVFlfUElOICBPVVRQVVQgUE9MQVJJVFkgUElOCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX09VVFBVVFBPTEFSSVRZX1BJTl9ISUdIICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBQaW4gaXMgaGlnaCB3aGVuIEFMUkFGL0FMUkJGL1dVVEYgaXMgYXNzZXJ0ZWQgKGRlcGVuZGluZyBvbiBPU0VMKSovCisjZGVmaW5lIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fTE9XICAgICAgUlRDX0NSX1BPTCAgICAgICAgICAgIC8qITwgUGluIGlzIGxvdyB3aGVuIEFMUkFGL0FMUkJGL1dVVEYgaXMgYXNzZXJ0ZWQgKGRlcGVuZGluZyBvbiBPU0VMKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfVElNRV9GT1JNQVQgVElNRSBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEFNIG9yIDI0LWhvdXIgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19USU1FX0ZPUk1BVF9QTSAgICAgICAgICAgICAgUlRDX1RSX1BNICAgICAgICAgICAgIC8qITwgUE0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1NISUZUX1NFQ09ORCAgU0hJRlQgU0VDT05ECisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1NISUZUX1NFQ09ORF9ERUxBWSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyogRGVsYXkgKHNlY29uZHMpID0gU1VCRlMgLyAoUFJFRElWX1MgKyAxKSAqLworI2RlZmluZSBMTF9SVENfU0hJRlRfU0VDT05EX0FEVkFOQ0UgICAgICAgIFJUQ19TSElGVFJfQUREMVMgICAgICAvKiBBZHZhbmNlIChzZWNvbmRzKSA9ICgxIC0gKFNVQkZTIC8gKFBSRURJVl9TICsgMSkpKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQV9NQVNLICBBTEFSTUEgTUFTSworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBObyBtYXNrcyBhcHBsaWVkIG9uIEFsYXJtIEEqLworI2RlZmluZSBMTF9SVENfQUxNQV9NQVNLX0RBVEVXRUVLREFZICAgICAgIFJUQ19BTFJNQVJfTVNLNCAgICAgICAgIC8qITwgRGF0ZS9kYXkgZG8gbm90IGNhcmUgaW4gQWxhcm0gQSBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfSE9VUlMgICAgICAgICAgICAgUlRDX0FMUk1BUl9NU0szICAgICAgICAgLyohPCBIb3VycyBkbyBub3QgY2FyZSBpbiBBbGFybSBBIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUlRDX0FMTUFfTUFTS19NSU5VVEVTICAgICAgICAgICBSVENfQUxSTUFSX01TSzIgICAgICAgICAvKiE8IE1pbnV0ZXMgZG8gbm90IGNhcmUgaW4gQWxhcm0gQSBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfU0VDT05EUyAgICAgICAgICAgUlRDX0FMUk1BUl9NU0sxICAgICAgICAgLyohPCBTZWNvbmRzIGRvIG5vdCBjYXJlIGluIEFsYXJtIEEgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQV9NQVNLX0FMTCAgICAgICAgICAgICAgIChSVENfQUxSTUFSX01TSzQgfCBSVENfQUxSTUFSX01TSzMgfCBSVENfQUxSTUFSX01TSzIgfCBSVENfQUxSTUFSX01TSzEpIC8qITwgTWFza3MgYWxsICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19BTE1BX1RJTUVfRk9STUFUICBBTEFSTUEgVElNRSBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEFNIG9yIDI0LWhvdXIgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX1BNICAgICAgICAgUlRDX0FMUk1BUl9QTSAgICAgICAgIC8qITwgUE0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMTUJfTUFTSyAgQUxBUk1CIE1BU0sKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTm8gbWFza3MgYXBwbGllZCBvbiBBbGFybSBCKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfTUFTS19EQVRFV0VFS0RBWSAgICAgICBSVENfQUxSTUJSX01TSzQgICAgICAgICAvKiE8IERhdGUvZGF5IGRvIG5vdCBjYXJlIGluIEFsYXJtIEIgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX0hPVVJTICAgICAgICAgICAgIFJUQ19BTFJNQlJfTVNLMyAgICAgICAgIC8qITwgSG91cnMgZG8gbm90IGNhcmUgaW4gQWxhcm0gQiBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1CX01BU0tfTUlOVVRFUyAgICAgICAgICAgUlRDX0FMUk1CUl9NU0syICAgICAgICAgLyohPCBNaW51dGVzIGRvIG5vdCBjYXJlIGluIEFsYXJtIEIgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX1NFQ09ORFMgICAgICAgICAgIFJUQ19BTFJNQlJfTVNLMSAgICAgICAgIC8qITwgU2Vjb25kcyBkbyBub3QgY2FyZSBpbiBBbGFybSBCIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfTUFTS19BTEwgICAgICAgICAgICAgICAoUlRDX0FMUk1CUl9NU0s0IHwgUlRDX0FMUk1CUl9NU0szIHwgUlRDX0FMUk1CUl9NU0syIHwgUlRDX0FMUk1CUl9NU0sxKSAvKiE8IE1hc2tzIGFsbCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQl9USU1FX0ZPUk1BVCAgQUxBUk1CIFRJTUUgRk9STUFUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfQU0gICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBBTSBvciAyNC1ob3VyIGZvcm1hdCAqLworI2RlZmluZSBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9QTSAgICAgICAgIFJUQ19BTFJNQlJfUE0gICAgICAgICAvKiE8IFBNICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19USU1FU1RBTVBfRURHRSAgVElNRVNUQU1QIEVER0UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVElNRVNUQU1QX0VER0VfUklTSU5HICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFJUQ19UUyBpbnB1dCByaXNpbmcgZWRnZSBnZW5lcmF0ZXMgYSB0aW1lLXN0YW1wIGV2ZW50ICovCisjZGVmaW5lIExMX1JUQ19USU1FU1RBTVBfRURHRV9GQUxMSU5HICAgICAgUlRDX0NSX1RTRURHRSAgICAgICAgIC8qITwgUlRDX1RTIGlucHV0IGZhbGxpbmcgZWRnZSBnZW5lcmF0ZXMgYSB0aW1lLXN0YW1wIGV2ZW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RTX1RJTUVfRk9STUFUICBUSU1FU1RBTVAgVElNRSBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVFNfVElNRV9GT1JNQVRfQU0gICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEFNIG9yIDI0LWhvdXIgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19UU19USU1FX0ZPUk1BVF9QTSAgICAgICAgICAgUlRDX1RTVFJfUE0gICAgICAgICAgIC8qITwgUE0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUiAgVEFNUEVSCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfMSAgICAgICAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QMUUgLyohPCBSVENfVEFNUDEgaW5wdXQgZGV0ZWN0aW9uICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjJfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl8yICAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAyRSAvKiE8IFJUQ19UQU1QMiBpbnB1dCBkZXRlY3Rpb24gKi8KKyNlbmRpZiAvKiBSVENfVEFNUEVSMl9TVVBQT1JUICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSXzMgICAgICAgICAgICAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUDNFIC8qITwgUlRDX1RBTVAzIGlucHV0IGRldGVjdGlvbiAqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUl9NQVNLICBUQU1QRVIgTUFTSworICAqIEB7CisgICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX01BU0tfVEFNUEVSMSAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUDFNRiAvKiE8IFRhbXBlciAxIGV2ZW50IGdlbmVyYXRlcyBhIHRyaWdnZXIgZXZlbnQuIFRBTVAxRiBpcyBtYXNrZWQgYW5kIGludGVybmFsbHkgY2xlYXJlZCBieSBoYXJkd2FyZS5UaGUgYmFja3VwIHJlZ2lzdGVycyBhcmUgbm90IGVyYXNlZCAqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIyX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfTUFTS19UQU1QRVIyICAgICAgICAgUlRDX1RBTVBDUl9UQU1QMk1GIC8qITwgVGFtcGVyIDIgZXZlbnQgZ2VuZXJhdGVzIGEgdHJpZ2dlciBldmVudC4gVEFNUDJGIGlzIG1hc2tlZCBhbmQgaW50ZXJuYWxseSBjbGVhcmVkIGJ5IGhhcmR3YXJlLiBUaGUgYmFja3VwIHJlZ2lzdGVycyBhcmUgbm90IGVyYXNlZC4gKi8KKyNlbmRpZiAvKiBSVENfVEFNUEVSMl9TVVBQT1JUICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX01BU0tfVEFNUEVSMyAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUDNNRiAvKiE8IFRhbXBlciAzIGV2ZW50IGdlbmVyYXRlcyBhIHRyaWdnZXIgZXZlbnQuIFRBTVAzRiBpcyBtYXNrZWQgYW5kIGludGVybmFsbHkgY2xlYXJlZCBieSBoYXJkd2FyZS4gVGhlIGJhY2t1cCByZWdpc3RlcnMgYXJlIG5vdCBlcmFzZWQgKi8KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVJfTk9FUkFTRSAgVEFNUEVSIE5PIEVSQVNFCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIxICAgICAgUlRDX1RBTVBDUl9UQU1QMU5PRVJBU0UgLyohPCBUYW1wZXIgMSBldmVudCBkb2VzIG5vdCBlcmFzZSB0aGUgYmFja3VwIHJlZ2lzdGVycy4gKi8KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX05PRVJBU0VfVEFNUEVSMiAgICAgIFJUQ19UQU1QQ1JfVEFNUDJOT0VSQVNFIC8qITwgVGFtcGVyIDIgZXZlbnQgZG9lcyBub3QgZXJhc2UgdGhlIGJhY2t1cCByZWdpc3RlcnMuICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjJfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjMgICAgICBSVENfVEFNUENSX1RBTVAzTk9FUkFTRSAvKiE8IFRhbXBlciAzIGV2ZW50IGRvZXMgbm90IGVyYXNlIHRoZSBiYWNrdXAgcmVnaXN0ZXJzLiAqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QQ1JfVEFNUFBSQ0gpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVJfRFVSQVRJT04gIFRBTVBFUiBEVVJBVElPTgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMVJUQ0NMSyAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZSBzYW1wbGluZyBkdXJpbmcgMSBSVENDTEsgY3ljbGUgICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMlJUQ0NMSyAgICAgUlRDX1RBTVBDUl9UQU1QUFJDSF8wICAvKiE8IFRhbXBlciBwaW5zIGFyZSBwcmUtY2hhcmdlZCBiZWZvcmUgc2FtcGxpbmcgZHVyaW5nIDIgUlRDQ0xLIGN5Y2xlcyAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX0RVUkFUSU9OXzRSVENDTEsgICAgIFJUQ19UQU1QQ1JfVEFNUFBSQ0hfMSAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nIGR1cmluZyA0IFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9EVVJBVElPTl84UlRDQ0xLICAgICBSVENfVEFNUENSX1RBTVBQUkNIICAgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZSBzYW1wbGluZyBkdXJpbmcgOCBSVENDTEsgY3ljbGVzICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJUQ19UQU1QQ1JfVEFNUFBSQ0ggKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBDUl9UQU1QRkxUKQorLyoqIEBkZWZncm91cCBSVENfTExfRUNfVEFNUEVSX0ZJTFRFUiAgVEFNUEVSIEZJTFRFUgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRklMVEVSX0RJU0FCTEUgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRhbXBlciBmaWx0ZXIgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9GSUxURVJfMlNBTVBMRSAgICAgICBSVENfVEFNUENSX1RBTVBGTFRfMCAgICAvKiE8IFRhbXBlciBpcyBhY3RpdmF0ZWQgYWZ0ZXIgMiBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9GSUxURVJfNFNBTVBMRSAgICAgICBSVENfVEFNUENSX1RBTVBGTFRfMSAgICAvKiE8IFRhbXBlciBpcyBhY3RpdmF0ZWQgYWZ0ZXIgNCBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9GSUxURVJfOFNBTVBMRSAgICAgICBSVENfVEFNUENSX1RBTVBGTFQgICAgICAvKiE8IFRhbXBlciBpcyBhY3RpdmF0ZWQgYWZ0ZXIgOCBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwuICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJUQ19UQU1QQ1JfVEFNUEZMVCAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUENSX1RBTVBGUkVRKQorLyoqIEBkZWZncm91cCBSVENfTExfRUNfVEFNUEVSX1NBTVBMRlJFUURJViAgVEFNUEVSIFNBTVBMSU5HIEZSRVFVRU5DWSBESVZJREVSCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMzI3NjggICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDMyNzY4ICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzE2Mzg0ICAgUlRDX1RBTVBDUl9UQU1QRlJFUV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMTYzODQgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfODE5MiAgICBSVENfVEFNUENSX1RBTVBGUkVRXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyA4MTkyICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzQwOTYgICAgKFJUQ19UQU1QQ1JfVEFNUEZSRVFfMSB8IFJUQ19UQU1QQ1JfVEFNUEZSRVFfMCkgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gNDA5NiAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yMDQ4ICAgIFJUQ19UQU1QQ1JfVEFNUEZSRVFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDIwNDggKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMTAyNCAgICAoUlRDX1RBTVBDUl9UQU1QRlJFUV8yIHwgUlRDX1RBTVBDUl9UQU1QRlJFUV8wKSAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAxMDI0ICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzUxMiAgICAgKFJUQ19UQU1QQ1JfVEFNUEZSRVFfMiB8IFJUQ19UQU1QQ1JfVEFNUEZSRVFfMSkgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gNTEyICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzI1NiAgICAgUlRDX1RBTVBDUl9UQU1QRlJFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMjU2ICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJUQ19UQU1QQ1JfVEFNUEZSRVEgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfVEFNUEVSX0FDVElWRUxFVkVMICBUQU1QRVIgQUNUSVZFIExFVkVMCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDEgICAgUlRDX1RBTVBDUl9UQU1QMVRSRyAvKiE8IFJUQ19UQU1QMSBpbnB1dCBmYWxsaW5nIGVkZ2UgKGlmIFRBTVBGTFQgPSAwMCkgb3Igc3RheWluZyBoaWdoIChpZiBUQU1QRkxUICE9IDAwKSB0cmlnZ2VycyBhIHRhbXBlciBkZXRlY3Rpb24gZXZlbnQqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIyX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDIgICAgUlRDX1RBTVBDUl9UQU1QMlRSRyAvKiE8IFJUQ19UQU1QMiBpbnB1dCBmYWxsaW5nIGVkZ2UgKGlmIFRBTVBGTFQgPSAwMCkgb3Igc3RheWluZyBoaWdoIChpZiBUQU1QRkxUICE9IDAwKSB0cmlnZ2VycyBhIHRhbXBlciBkZXRlY3Rpb24gZXZlbnQqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIyX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDMgICAgUlRDX1RBTVBDUl9UQU1QM1RSRyAvKiE8IFJUQ19UQU1QMyBpbnB1dCBmYWxsaW5nIGVkZ2UgKGlmIFRBTVBGTFQgPSAwMCkgb3Igc3RheWluZyBoaWdoIChpZiBUQU1QRkxUICE9IDAwKSB0cmlnZ2VycyBhIHRhbXBlciBkZXRlY3Rpb24gZXZlbnQqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1dBS0VVUENMT0NLX0RJViAgV0FLRVVQIENMT0NLIERJVgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfMTYgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJUQy8xNiBjbG9jayBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzggICAgICAgICAgIChSVENfQ1JfV1VDS1NFTF8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBSVEMvOCBjbG9jayBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzQgICAgICAgICAgIChSVENfQ1JfV1VDS1NFTF8xKSAgICAgICAgICAgICAgICAgICAgLyohPCBSVEMvNCBjbG9jayBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzIgICAgICAgICAgIChSVENfQ1JfV1VDS1NFTF8xIHwgUlRDX0NSX1dVQ0tTRUxfMCkgLyohPCBSVEMvMiBjbG9jayBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9SVENfV0FLRVVQQ0xPQ0tfQ0tTUFJFICAgICAgICAgIChSVENfQ1JfV1VDS1NFTF8yKSAgICAgICAgICAgICAgICAgICAgLyohPCBja19zcHJlICh1c3VhbGx5IDEgSHopIGNsb2NrIGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1JUQ19XQUtFVVBDTE9DS19DS1NQUkVfV1VUICAgICAgKFJUQ19DUl9XVUNLU0VMXzIgfCBSVENfQ1JfV1VDS1NFTF8xKSAvKiE8IGNrX3NwcmUgKHVzdWFsbHkgMSBIeikgY2xvY2sgaXMgc2VsZWN0ZWQgYW5kIDJleHAxNiBpcyBhZGRlZCB0byB0aGUgV1VUIGNvdW50ZXIgdmFsdWUqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoUlRDX0JBQ0tVUF9TVVBQT1JUKQorLyoqIEBkZWZncm91cCBSVENfTExfRUNfQktQICBCQUNLVVAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQktQX0RSMCAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIExMX1JUQ19CS1BfRFIxICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjIgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKQorI2RlZmluZSBMTF9SVENfQktQX0RSMyAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwM1UpCisjZGVmaW5lIExMX1JUQ19CS1BfRFI0ICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUlRDX0JBQ0tVUF9TVVBQT1JUICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0NBTElCX09VVFBVVCAgQ2FsaWJyYXRpb24gb3V0cHV0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX09VVFBVVF9OT05FICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBDYWxpYnJhdGlvbiBvdXRwdXQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX09VVFBVVF8xSFogICAgICAgICAgICAoUlRDX0NSX0NPRSB8IFJUQ19DUl9DT1NFTCkgLyohPCBDYWxpYnJhdGlvbiBvdXRwdXQgaXMgNTEyIEh6ICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9PVVRQVVRfNTEySFogICAgICAgICAgKFJUQ19DUl9DT0UpICAgICAgICAgICAgICAgIC8qITwgQ2FsaWJyYXRpb24gb3V0cHV0IGlzIDEgSHogKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0NBTElCX0lOU0VSVFBVTFNFICBDYWxpYnJhdGlvbiBwdWxzZSBpbnNlcnRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQ0FMSUJfSU5TRVJUUFVMU0VfTk9ORSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IE5vIFJUQ0NMSyBwdWxzZXMgYXJlIGFkZGVkICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9JTlNFUlRQVUxTRV9TRVQgICAgICAgUlRDX0NBTFJfQ0FMUCAgICAgICAgIC8qITwgT25lIFJUQ0NMSyBwdWxzZSBpcyBlZmZlY3RpdmVseSBpbnNlcnRlZCBldmVyeSAyZXhwMTEgcHVsc2VzIChmcmVxdWVuY3kgaW5jcmVhc2VkIGJ5IDQ4OC41IHBwbSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0NBTElCX1BFUklPRCAgQ2FsaWJyYXRpb24gcGVyaW9kCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX1BFUklPRF8zMlNFQyAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBVc2UgYSAzMi1zZWNvbmQgY2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9QRVJJT0RfMTZTRUMgICAgICAgICAgUlRDX0NBTFJfQ0FMVzE2ICAgICAgIC8qITwgVXNlIGEgMTYtc2Vjb25kIGNhbGlicmF0aW9uIGN5Y2xlIHBlcmlvZCAqLworI2RlZmluZSBMTF9SVENfQ0FMSUJfUEVSSU9EXzhTRUMgICAgICAgICAgIFJUQ19DQUxSX0NBTFc4ICAgICAgICAvKiE8IFVzZSBhIDgtc2Vjb25kIGNhbGlicmF0aW9uIGN5Y2xlIHBlcmlvZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0V4cG9ydGVkX01hY3JvcyBSVEMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBSVEMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX1JUQ19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFJUQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9SVENfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VNX0NvbnZlcnQgQ29udmVydCBoZWxwZXIgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCBhIHZhbHVlIGZyb20gMiBkaWdpdCBkZWNpbWFsIGZvcm1hdCB0byBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1ZBTFVFX18gQnl0ZSB0byBiZSBjb252ZXJ0ZWQKKyAgKiBAcmV0dmFsIENvbnZlcnRlZCBieXRlCisgICovCisjZGVmaW5lIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChfX1ZBTFVFX18pICh1aW50OF90KSgoKChfX1ZBTFVFX18pIC8gMTBVKSA8PCA0VSkgfCAoKF9fVkFMVUVfXykgJSAxMFUpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjb252ZXJ0IGEgdmFsdWUgZnJvbSBCQ0QgZm9ybWF0IHRvIDIgZGlnaXQgZGVjaW1hbCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBCQ0QgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICogQHJldHZhbCBDb252ZXJ0ZWQgYnl0ZQorICAqLworI2RlZmluZSBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oX19WQUxVRV9fKSAodWludDhfdCkoKCgodWludDhfdCkoKF9fVkFMVUVfXykgJiAodWludDhfdCkweEYwVSkgPj4gKHVpbnQ4X3QpMHg0VSkgKiAxMFUgKSArICgoX19WQUxVRV9fKSAmICh1aW50OF90KTB4MEZVKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRU1fRGF0ZSBEYXRlIGhlbHBlciBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSB3ZWVrZGF5LgorICAqIEBwYXJhbSAgX19SVENfREFURV9fIERhdGUgcmV0dXJuZWQgYnkgQHJlZiAgTExfUlRDX0RBVEVfR2V0IGZ1bmN0aW9uLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfV0VFS0RBWShfX1JUQ19EQVRFX18pICgoKF9fUlRDX0RBVEVfXykgPj4gUlRDX09GRlNFVF9XRUVLREFZKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSBZZWFyIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX0RBVEVfXyBWYWx1ZSByZXR1cm5lZCBieSBAcmVmICBMTF9SVENfREFURV9HZXQKKyAgKiBAcmV0dmFsIFllYXIgaW4gQkNEIGZvcm1hdCAoMHgwMCAuIC4gLiAweDk5KQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfWUVBUihfX1JUQ19EQVRFX18pICgoX19SVENfREFURV9fKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSBNb250aCBpbiBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1JUQ19EQVRFX18gVmFsdWUgcmV0dXJuZWQgYnkgQHJlZiAgTExfUlRDX0RBVEVfR2V0CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KQU5VQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0ZFQlJVQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BUkNICisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FQUklMCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVVHVVNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX1NFUFRFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9PQ1RPQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX05PVkVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0RFQ0VNQkVSCisgICovCisjZGVmaW5lIF9fTExfUlRDX0dFVF9NT05USChfX1JUQ19EQVRFX18pICgoKF9fUlRDX0RBVEVfXykgPj5SVENfT0ZGU0VUX01PTlRIKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBwYXJhbSAgX19SVENfREFURV9fIFZhbHVlIHJldHVybmVkIGJ5IEByZWYgIExMX1JUQ19EQVRFX0dldAorICAqIEByZXR2YWwgRGF5IGluIEJDRCBmb3JtYXQgKDB4MDEgLiAuIC4gMHgzMSkKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX0RBWShfX1JUQ19EQVRFX18pICgoKF9fUlRDX0RBVEVfXykgPj5SVENfT0ZGU0VUX0RBWSkgJiAweDAwMDAwMEZGVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRU1fVGltZSBUaW1lIGhlbHBlciBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSBob3VyIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX1RJTUVfXyBSVEMgdGltZSByZXR1cm5lZCBieSBAcmVmIExMX1JUQ19USU1FX0dldCBmdW5jdGlvbgorICAqIEByZXR2YWwgSG91cnMgaW4gQkNEIGZvcm1hdCAoMHgwMS4gLiAuMHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMpCisgICovCisjZGVmaW5lIF9fTExfUlRDX0dFVF9IT1VSKF9fUlRDX1RJTUVfXykgKCgoX19SVENfVElNRV9fKSA+PiBSVENfT0ZGU0VUX0hPVVIpICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIG1pbnV0ZSBpbiBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1JUQ19USU1FX18gUlRDIHRpbWUgcmV0dXJuZWQgYnkgQHJlZiBMTF9SVENfVElNRV9HZXQgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdCAoMHgwMC4gLiAuMHg1OSkKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX01JTlVURShfX1JUQ19USU1FX18pICgoKF9fUlRDX1RJTUVfXykgPj4gUlRDX09GRlNFVF9NSU5VVEUpICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIHNlY29uZCBpbiBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1JUQ19USU1FX18gUlRDIHRpbWUgcmV0dXJuZWQgYnkgQHJlZiBMTF9SVENfVElNRV9HZXQgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIFNlY29uZHMgaW4gIGZvcm1hdCAoMHgwMC4gLiAuMHg1OSkKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX1NFQ09ORChfX1JUQ19USU1FX18pICgoX19SVENfVElNRV9fKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFJUQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBIb3VycyBmb3JtYXQgKDI0IGhvdXIvZGF5IG9yIEFNL1BNIGhvdXIgZm9ybWF0KQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRk1UICAgICAgICAgICBMTF9SVENfU2V0SG91ckZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhvdXJGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfSE9VUkZPUk1BVF9BTVBNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfU2V0SG91ckZvcm1hdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgSG91ckZvcm1hdCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX0ZNVCwgSG91ckZvcm1hdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhvdXJzIGZvcm1hdCAoMjQgaG91ci9kYXkgb3IgQU0vUE0gaG91ciBmb3JtYXQpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRk1UICAgICAgICAgICBMTF9SVENfR2V0SG91ckZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0hPVVJGT1JNQVRfQU1QTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX0ZNVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgZmxhZyB0byBiZSByb3V0ZWQgdG8gUlRDX0FMQVJNIG91dHB1dAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBPU0VMICAgICAgICAgIExMX1JUQ19TZXRBbGFybU91dEV2ZW50CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQWxhcm1PdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9BTE1BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX0FMTUIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfV0FLRVVQCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfU2V0QWxhcm1PdXRFdmVudChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgQWxhcm1PdXRwdXQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q1IsIFJUQ19DUl9PU0VMLCBBbGFybU91dHB1dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBmbGFnIHRvIGJlIHJvdXRlZCB0byBSVENfQUxBUk0gb3V0cHV0CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgT1NFTCAgICAgICAgICBMTF9SVENfR2V0QWxhcm1PdXRFdmVudAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfQUxNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9BTE1CCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX1dBS0VVUAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19HZXRBbGFybU91dEV2ZW50KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX09TRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUlRDX0FMQVJNIG91dHB1dCB0eXBlIChBTEFSTSBpbiBwdXNoLXB1bGwgb3Igb3Blbi1kcmFpbiBvdXRwdXQpCisgICogQG5vdGUgICBVc2VkIG9ubHkgd2hlbiBSVENfQUxBUk0gaXMgbWFwcGVkIG9uIFBDMTMKKyAgKiBAcm10b2xsIE9SICAgICAgICBBTEFSTU9VVFRZUEUgIExMX1JUQ19TZXRBbGFybU91dHB1dFR5cGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1fT1VUUFVUVFlQRV9PUEVORFJBSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1fT1VUUFVUVFlQRV9QVVNIUFVMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldEFsYXJtT3V0cHV0VHlwZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgT3V0cHV0KQoreworICBNT0RJRllfUkVHKFJUQ3gtPk9SLCBSVENfT1JfQUxBUk1PVVRUWVBFLCBPdXRwdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfQUxBUk0gb3V0cHV0IHR5cGUgKEFMQVJNIGluIHB1c2gtcHVsbCBvciBvcGVuLWRyYWluIG91dHB1dCkKKyAgKiBAbm90ZSAgIHVzZWQgb25seSB3aGVuIFJUQ19BTEFSTSBpcyBtYXBwZWQgb24gUEMxMworICAqIEBybXRvbGwgT1IgICAgICAgIEFMQVJNT1VUVFlQRSAgTExfUlRDX0dldEFsYXJtT3V0cHV0VHlwZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNX09VVFBVVFRZUEVfT1BFTkRSQUlOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNX09VVFBVVFRZUEVfUFVTSFBVTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfR2V0QWxhcm1PdXRwdXRUeXBlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5PUiwgUlRDX09SX0FMQVJNT1VUVFlQRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbml0aWFsaXphdGlvbiBtb2RlCisgICogQG5vdGUgICBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHVzZWQgdG8gcHJvZ3JhbSB0aW1lIGFuZCBkYXRlIHJlZ2lzdGVyIChSVENfVFIgYW5kIFJUQ19EUikKKyAgKiAgICAgICAgIGFuZCBwcmVzY2FsZXIgcmVnaXN0ZXIgKFJUQ19QUkVSKS4KKyAgKiAgICAgICAgIENvdW50ZXJzIGFyZSBzdG9wcGVkIGFuZCBzdGFydCBjb3VudGluZyBmcm9tIHRoZSBuZXcgdmFsdWUgd2hlbiBJTklUIGlzIHJlc2V0LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIElOSVQgICAgICAgICAgTExfUlRDX0VuYWJsZUluaXRNb2RlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUluaXRNb2RlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgUlRDX0xMX0lOSVRfTUFTSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbml0aWFsaXphdGlvbiBtb2RlIChGcmVlIHJ1bm5pbmcgbW9kZSkKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBJTklUICAgICAgICAgIExMX1JUQ19EaXNhYmxlSW5pdE1vZGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUluaXRNb2RlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKHVpbnQzMl90KX5SVENfSVNSX0lOSVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBPdXRwdXQgcG9sYXJpdHkgKHBpbiBpcyBsb3cgd2hlbiBBTFJBRi9BTFJCRi9XVVRGIGlzIGFzc2VydGVkKQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQT0wgICAgICAgICAgIExMX1JUQ19TZXRPdXRwdXRQb2xhcml0eQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX09VVFBVVFBPTEFSSVRZX1BJTl9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX09VVFBVVFBPTEFSSVRZX1BJTl9MT1cKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19TZXRPdXRwdXRQb2xhcml0eShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q1IsIFJUQ19DUl9QT0wsIFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgT3V0cHV0IHBvbGFyaXR5CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUE9MICAgICAgICAgICBMTF9SVENfR2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fTE9XCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0dldE91dHB1dFBvbGFyaXR5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX1BPTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBCeXBhc3MgdGhlIHNoYWRvdyByZWdpc3RlcnMKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQllQU0hBRCAgICAgICBMTF9SVENfRW5hYmxlU2hhZG93UmVnQnlwYXNzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZVNoYWRvd1JlZ0J5cGFzcyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0JZUFNIQUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQnlwYXNzIHRoZSBzaGFkb3cgcmVnaXN0ZXJzCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQllQU0hBRCAgICAgICBMTF9SVENfRGlzYWJsZVNoYWRvd1JlZ0J5cGFzcworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlU2hhZG93UmVnQnlwYXNzKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CWVBTSEFEKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTaGFkb3cgcmVnaXN0ZXJzIGJ5cGFzcyBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBCWVBTSEFEICAgICAgIExMX1JUQ19Jc1NoYWRvd1JlZ0J5cGFzc0VuYWJsZWQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzU2hhZG93UmVnQnlwYXNzRW5hYmxlZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CWVBTSEFEKSA9PSAoUlRDX0NSX0JZUFNIQUQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJUQ19SRUZJTiByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uICg1MCBvciA2MCBIeikKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJFRkNLT04gICAgICAgTExfUlRDX0VuYWJsZVJlZkNsb2NrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZVJlZkNsb2NrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfUkVGQ0tPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVENfUkVGSU4gcmVmZXJlbmNlIGNsb2NrIGRldGVjdGlvbiAoNTAgb3IgNjAgSHopCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRUZDS09OICAgICAgIExMX1JUQ19EaXNhYmxlUmVmQ2xvY2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZVJlZkNsb2NrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9SRUZDS09OKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQXN5bmNocm9ub3VzIHByZXNjYWxlciBmYWN0b3IKKyAgKiBAcm10b2xsIFBSRVIgICAgICAgICBQUkVESVZfQSAgICAgIExMX1JUQ19TZXRBc3luY2hQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBBc3luY2hQcmVzY2FsZXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHg3RgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldEFzeW5jaFByZXNjYWxlcihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgQXN5bmNoUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9BLCBBc3luY2hQcmVzY2FsZXIgPDwgUlRDX1BSRVJfUFJFRElWX0FfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgU3luY2hyb25vdXMgcHJlc2NhbGVyIGZhY3RvcgorICAqIEBybXRvbGwgUFJFUiAgICAgICAgIFBSRURJVl9TICAgICAgTExfUlRDX1NldFN5bmNoUHJlc2NhbGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3luY2hQcmVzY2FsZXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHg3RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfU2V0U3luY2hQcmVzY2FsZXIoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFN5bmNoUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9TLCBTeW5jaFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFzeW5jaHJvbm91cyBwcmVzY2FsZXIgZmFjdG9yCisgICogQHJtdG9sbCBQUkVSICAgICAgICAgUFJFRElWX0EgICAgICBMTF9SVENfR2V0QXN5bmNoUHJlc2NhbGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHg3RgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19HZXRBc3luY2hQcmVzY2FsZXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9BKSA+PiBSVENfUFJFUl9QUkVESVZfQV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTeW5jaHJvbm91cyBwcmVzY2FsZXIgZmFjdG9yCisgICogQHJtdG9sbCBQUkVSICAgICAgICAgUFJFRElWX1MgICAgICBMTF9SVENfR2V0U3luY2hQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDdGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfR2V0U3luY2hQcmVzY2FsZXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9TKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzLgorICAqIEBybXRvbGwgV1BSICAgICAgICAgIEtFWSAgICAgICAgICAgTExfUlRDX0VuYWJsZVdyaXRlUHJvdGVjdGlvbgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFdSSVRFX1JFRyhSVEN4LT5XUFIsIFJUQ19XUklURV9QUk9URUNUSU9OX0RJU0FCTEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMuCisgICogQHJtdG9sbCBXUFIgICAgICAgICAgS0VZICAgICAgICAgICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+V1BSLCBSVENfV1JJVEVfUFJPVEVDVElPTl9FTkFCTEVfMSk7CisgIFdSSVRFX1JFRyhSVEN4LT5XUFIsIFJUQ19XUklURV9QUk9URUNUSU9OX0VOQUJMRV8yKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUlRDX09VVCByZW1hcAorICAqIEBybXRvbGwgT1IgICAgICAgICAgIE9VVF9STVAgICAgICAgTExfUlRDX0VuYWJsZU91dFJlbWFwCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZU91dFJlbWFwKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPk9SLCBSVENfT1JfT1VUX1JNUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVENfT1VUIHJlbWFwCisgICogQHJtdG9sbCBPUiAgICAgICAgICAgT1VUX1JNUCAgICAgICBMTF9SVENfRGlzYWJsZU91dFJlbWFwCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVPdXRSZW1hcChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPk9SLCBSVENfT1JfT1VUX1JNUCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX1RpbWUgVGltZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRpbWUgZm9ybWF0IChBTS8yNC1ob3VyIG9yIFBNIG5vdGF0aW9uKQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQHJtdG9sbCBUUiAgICAgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfVElNRV9TZXRGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUaW1lRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX0FNX09SXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX1BNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9TZXRGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRpbWVGb3JtYXQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+VFIsIFJUQ19UUl9QTSwgVGltZUZvcm1hdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRpbWUgZm9ybWF0IChBTSBvciBQTSBub3RhdGlvbikKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBub3RlIFJlYWQgZWl0aGVyIFJUQ19TU1Igb3IgUlRDX1RSIGxvY2tzIHRoZSB2YWx1ZXMgaW4gdGhlIGhpZ2hlci1vcmRlciBjYWxlbmRhcgorICAqICAgICAgIHNoYWRvdyByZWdpc3RlcnMgdW50aWwgUlRDX0RSIGlzIHJlYWQgKExMX1JUQ19SZWFkUmVnKFJUQywgRFIpKS4KKyAgKiBAcm10b2xsIFRSICAgICAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19USU1FX0dldEZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX0FNX09SXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX1BNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RJTUVfR2V0Rm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UUiwgUlRDX1RSX1BNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEhvdXJzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgaG91ciBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBUUiAgICAgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfVElNRV9TZXRIb3VyXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19USU1FX1NldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9TZXRIb3VyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBIb3VycykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5UUiwgKFJUQ19UUl9IVCB8IFJUQ19UUl9IVSksCisgICAgICAgICAgICAgKCgoSG91cnMgJiAweEYwVSkgPDwgKFJUQ19UUl9IVF9Qb3MgLSA0VSkpIHwgKChIb3VycyAmIDB4MEZVKSA8PCBSVENfVFJfSFVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBIb3VycyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBSZWFkIGVpdGhlciBSVENfU1NSIG9yIFJUQ19UUiBsb2NrcyB0aGUgdmFsdWVzIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIKKyAgKiAgICAgICBzaGFkb3cgcmVnaXN0ZXJzIHVudGlsIFJUQ19EUiBpcyByZWFkIChMTF9SVENfUmVhZFJlZyhSVEMsIERSKSkuCisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBob3VyIGZyb20gQkNEIHRvCisgICogICAgICAgQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgVFIgICAgICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0SG91clxuCisgICogICAgICAgICBUUiAgICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldEhvdXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPlRSLCAoUlRDX1RSX0hUIHwgUlRDX1RSX0hVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKHRlbXAgJiBSVENfVFJfSFQpID4+IFJUQ19UUl9IVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19UUl9IVSkgPj4gUlRDX1RSX0hVX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBNaW51dGVzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBUUiAgICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVElNRV9TZXRNaW51dGVcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0TWludXRlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWludXRlcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX1NldE1pbnV0ZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWludXRlcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5UUiwgKFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VKSwKKyAgICAgICAgICAgICAoKChNaW51dGVzICYgMHhGMFUpIDw8IChSVENfVFJfTU5UX1BvcyAtIDRVKSkgfCAoKE1pbnV0ZXMgJiAweDBGVSkgPDwgUlRDX1RSX01OVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgUmVhZCBlaXRoZXIgUlRDX1NTUiBvciBSVENfVFIgbG9ja3MgdGhlIHZhbHVlcyBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyCisgICogICAgICAgc2hhZG93IHJlZ2lzdGVycyB1bnRpbCBSVENfRFIgaXMgcmVhZCAoTExfUlRDX1JlYWRSZWcoUlRDLCBEUikpLgorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgbWludXRlIGZyb20gQkNECisgICogICAgICAgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgVFIgICAgICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0TWludXRlXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19USU1FX0dldE1pbnV0ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldE1pbnV0ZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+VFIsIChSVENfVFJfTU5UIHwgUlRDX1RSX01OVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX1RSX01OVCkgPj4gUlRDX1RSX01OVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19UUl9NTlUpID4+IFJUQ19UUl9NTlVfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBTZWNvbmRzIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIFRSICAgICAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19USU1FX1NldFNlY29uZFxuCisgICogICAgICAgICBUUiAgICAgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfVElNRV9TZXRTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBTZWNvbmRzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfU2V0U2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTZWNvbmRzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRSLCAoUlRDX1RSX1NUIHwgUlRDX1RSX1NVKSwKKyAgICAgICAgICAgICAoKChTZWNvbmRzICYgMHhGMFUpIDw8IChSVENfVFJfU1RfUG9zIC0gNFUpKSB8ICgoU2Vjb25kcyAmIDB4MEZVKSA8PCBSVENfVFJfU1VfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBub3RlIFJlYWQgZWl0aGVyIFJUQ19TU1Igb3IgUlRDX1RSIGxvY2tzIHRoZSB2YWx1ZXMgaW4gdGhlIGhpZ2hlci1vcmRlciBjYWxlbmRhcgorICAqICAgICAgIHNoYWRvdyByZWdpc3RlcnMgdW50aWwgUlRDX0RSIGlzIHJlYWQgKExMX1JUQ19SZWFkUmVnKFJUQywgRFIpKS4KKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFNlY29uZHMgZnJvbSBCQ0QKKyAgKiAgICAgICB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBUUiAgICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRTZWNvbmRcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RJTUVfR2V0U2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5UUiwgKFJUQ19UUl9TVCB8IFJUQ19UUl9TVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX1RSX1NUKSA+PiBSVENfVFJfU1RfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfVFJfU1UpID4+IFJUQ19UUl9TVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGltZSAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBub3RlIFRpbWVGb3JtYXQgYW5kIEhvdXJzIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgZm9ybWF0CisgICogQHJtdG9sbCBUUiAgICAgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWdcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX1RJTUVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19USU1FX0NvbmZpZ1xuCisgICogICAgICAgICBUUiAgICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWdcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX1RJTUVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19USU1FX0NvbmZpZ1xuCisgICogICAgICAgICBUUiAgICAgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBGb3JtYXQxMl8yNCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9BTV9PUl8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9QTQorICAqIEBwYXJhbSAgSG91cnMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqIEBwYXJhbSAgTWludXRlcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcGFyYW0gIFNlY29uZHMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9Db25maWcoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZvcm1hdDEyXzI0LCB1aW50MzJfdCBIb3VycywgdWludDMyX3QgTWludXRlcywgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gRm9ybWF0MTJfMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfVFJfSFRfUG9zIC0gNFUpKSB8ICgoSG91cnMgJiAweDBGVSkgPDwgUlRDX1RSX0hVX1BvcykpICAgICB8IFwKKyAgICAgICAgICgoKE1pbnV0ZXMgJiAweEYwVSkgPDwgKFJUQ19UUl9NTlRfUG9zIC0gNFUpKSB8ICgoTWludXRlcyAmIDB4MEZVKSA8PCBSVENfVFJfTU5VX1BvcykpIHwgXAorICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX1RSX1NUX1BvcyAtIDRVKSkgfCAoKFNlY29uZHMgJiAweDBGVSkgPDwgUlRDX1RSX1NVX1BvcykpOworICBNT0RJRllfUkVHKFJUQ3gtPlRSLCAoUlRDX1RSX1BNIHwgUlRDX1RSX0hUIHwgUlRDX1RSX0hVIHwgUlRDX1RSX01OVCB8IFJUQ19UUl9NTlUgfCBSVENfVFJfU1QgfCBSVENfVFJfU1UpLCB0ZW1wKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGltZSAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBub3RlIFJlYWQgZWl0aGVyIFJUQ19TU1Igb3IgUlRDX1RSIGxvY2tzIHRoZSB2YWx1ZXMgaW4gdGhlIGhpZ2hlci1vcmRlciBjYWxlbmRhcgorICAqICAgICAgIHNoYWRvdyByZWdpc3RlcnMgdW50aWwgUlRDX0RSIGlzIHJlYWQgKExMX1JUQ19SZWFkUmVnKFJUQywgRFIpKS4KKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm9zIF9fTExfUlRDX0dFVF9IT1VSLCBfX0xMX1JUQ19HRVRfTUlOVVRFIGFuZCBfX0xMX1JUQ19HRVRfU0VDT05ECisgICogICAgICAgYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFRSICAgICAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19USU1FX0dldFxuCisgICogICAgICAgICBUUiAgICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0XG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19USU1FX0dldFxuCisgICogICAgICAgICBUUiAgICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgaG91cnMsIG1pbnV0ZXMgYW5kIHNlY29uZHMgKEZvcm1hdDogMHgwMEhITU1TUykuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RJTUVfR2V0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5UUiwgKFJUQ19UUl9IVCB8IFJUQ19UUl9IVSB8IFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VIHwgUlRDX1RSX1NUIHwgUlRDX1RSX1NVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKCgodGVtcCAmIFJUQ19UUl9IVCkgPj4gUlRDX1RSX0hUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX1RSX0hVKSA+PiBSVENfVFJfSFVfUG9zKSkgPDwgUlRDX09GRlNFVF9IT1VSKSB8ICBcCisgICAgICAgICAgICAgICAgICAgICgoKCgodGVtcCAmIFJUQ19UUl9NTlQpID4+IFJUQ19UUl9NTlRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfVFJfTU5VKSA+PiBSVENfVFJfTU5VX1BvcykpIDw8IFJUQ19PRkZTRVRfTUlOVVRFKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCgoKHRlbXAgJiBSVENfVFJfU1QpID4+IFJUQ19UUl9TVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19UUl9TVSkgPj4gUlRDX1RSX1NVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBNZW1vcml6ZSB3aGV0aGVyIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjaGFuZ2UgaGFzIGJlZW4gcGVyZm9ybWVkCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEJLUCAgICAgICAgICAgTExfUlRDX1RJTUVfRW5hYmxlRGF5TGlnaHRTdG9yZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX0VuYWJsZURheUxpZ2h0U3RvcmUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CS1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgbWVtb3JpemF0aW9uIHdoZXRoZXIgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNoYW5nZSBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEJLUCAgICAgICAgICAgTExfUlRDX1RJTUVfRGlzYWJsZURheUxpZ2h0U3RvcmUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9EaXNhYmxlRGF5TGlnaHRTdG9yZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQktQKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSVEMgRGF5IExpZ2h0IFNhdmluZyBzdG9yZWQgb3BlcmF0aW9uIGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQktQICAgICAgICAgICBMTF9SVENfVElNRV9Jc0RheUxpZ2h0U3RvcmVFbmFibGVkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0lzRGF5TGlnaHRTdG9yZUVuYWJsZWQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQktQKSA9PSAoUlRDX0NSX0JLUCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdWJ0cmFjdCAxIGhvdXIgKHdpbnRlciB0aW1lIGNoYW5nZSkKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgU1VCMUggICAgICAgICBMTF9SVENfVElNRV9EZWNIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfRGVjSG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1NVQjFIKTsKK30KKworLyoqCisgICogQGJyaWVmICBBZGQgMSBob3VyIChzdW1tZXIgdGltZSBjaGFuZ2UpCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFERDFIICAgICAgICAgTExfUlRDX1RJTUVfSW5jSG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX0luY0hvdXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BREQxSCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN1YiBzZWNvbmQgdmFsdWUgaW4gdGhlIHN5bmNocm9ub3VzIHByZXNjYWxlciBjb3VudGVyLgorICAqIEBub3RlICBZb3UgY2FuIHVzZSBib3RoIFN1YlNlY29uZHMgdmFsdWUgYW5kIFNlY29uZEZyYWN0aW9uIChQUkVESVZfUyB0aHJvdWdoCisgICogICAgICAgIExMX1JUQ19HZXRTeW5jaFByZXNjYWxlciBmdW5jdGlvbikgdGVybXMgcmV0dXJuZWQgdG8gY29udmVydCBDYWxlbmRhcgorICAqICAgICAgICBTdWJTZWNvbmRzIHZhbHVlIGluIHNlY29uZCBmcmFjdGlvbiByYXRpbyB3aXRoIHRpbWUgdW5pdCBmb2xsb3dpbmcKKyAgKiAgICAgICAgZ2VuZXJpYyBmb3JtdWxhOgorICAqICAgICAgICAgID09PiBTZWNvbmRzIGZyYWN0aW9uIHJhdGlvICogdGltZV91bml0PSBbKFNlY29uZEZyYWN0aW9uLVN1YlNlY29uZHMpLyhTZWNvbmRGcmFjdGlvbisxKV0gKiB0aW1lX3VuaXQKKyAgKiAgICAgICAgVGhpcyBjb252ZXJzaW9uIGNhbiBiZSBwZXJmb3JtZWQgb25seSBpZiBubyBzaGlmdCBvcGVyYXRpb24gaXMgcGVuZGluZworICAqICAgICAgICAoaWUuIFNIRlA9MCkgd2hlbiBQUkVESVZfUyA+PSBTUy4KKyAgKiBAcm10b2xsIFNTUiAgICAgICAgICBTUyAgICAgICAgICAgIExMX1JUQ19USU1FX0dldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN1YiBzZWNvbmQgdmFsdWUgKG51bWJlciBiZXR3ZWVuIDAgYW5kIDY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldFN1YlNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+U1NSLCBSVENfU1NSX1NTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3luY2hyb25pemUgdG8gYSByZW1vdGUgY2xvY2sgd2l0aCBhIGhpZ2ggZGVncmVlIG9mIHByZWNpc2lvbi4KKyAgKiBAbm90ZSAgIFRoaXMgb3BlcmF0aW9uIGVmZmVjdGl2ZWx5IHN1YnRyYWN0cyBmcm9tIChkZWxheXMpIG9yIGFkdmFuY2UgdGhlIGNsb2NrIG9mIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQuCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgV2hlbiBSRUZDS09OIGlzIHNldCwgZmlybXdhcmUgbXVzdCBub3Qgd3JpdGUgdG8gU2hpZnQgY29udHJvbCByZWdpc3Rlci4KKyAgKiBAcm10b2xsIFNISUZUUiAgICAgICBBREQxUyAgICAgICAgIExMX1JUQ19USU1FX1N5bmNocm9uaXplXG4KKyAgKiAgICAgICAgIFNISUZUUiAgICAgICBTVUJGUyAgICAgICAgIExMX1JUQ19USU1FX1N5bmNocm9uaXplCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2hpZnRTZWNvbmQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfU0hJRlRfU0VDT05EX0RFTEFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1NISUZUX1NFQ09ORF9BRFZBTkNFCisgICogQHBhcmFtICBGcmFjdGlvbiBOdW1iZXIgb2YgU2Vjb25kcyBGcmFjdGlvbnMgKGFueSB2YWx1ZSBmcm9tIDAgdG8gMHg3RkZGKQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfU3luY2hyb25pemUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFNoaWZ0U2Vjb25kLCB1aW50MzJfdCBGcmFjdGlvbikKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPlNISUZUUiwgU2hpZnRTZWNvbmQgfCBGcmFjdGlvbik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0RhdGUgRGF0ZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IFllYXIgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgWWVhciBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgWVQgICAgICAgICAgICBMTF9SVENfREFURV9TZXRZZWFyXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX1NldFllYXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBZZWFyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg5OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0RBVEVfU2V0WWVhcihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgWWVhcikKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5EUiwgKFJUQ19EUl9ZVCB8IFJUQ19EUl9ZVSksCisgICAgICAgICAgICAgKCgoWWVhciAmIDB4RjBVKSA8PCAoUlRDX0RSX1lUX1BvcyAtIDRVKSkgfCAoKFllYXIgJiAweDBGVSkgPDwgUlRDX0RSX1lVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgWWVhciBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFllYXIgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgRFIgICAgICAgICAgIFlUICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0WWVhclxuCisgICogICAgICAgICBEUiAgICAgICAgICAgWVUgICAgICAgICAgICBMTF9SVENfREFURV9HZXRZZWFyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDk5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0RBVEVfR2V0WWVhcihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+RFIsIChSVENfRFJfWVQgfCBSVENfRFJfWVUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19EUl9ZVCkgPj4gUlRDX0RSX1lUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0RSX1lVKSA+PiBSVENfRFJfWVVfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFdlZWsgZGF5CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgV0RVICAgICAgICAgICBMTF9SVENfREFURV9TZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgV2Vla0RheSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfREFURV9TZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBXZWVrRGF5KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkRSLCBSVENfRFJfV0RVLCBXZWVrRGF5IDw8IFJUQ19EUl9XRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgV2VlayBkYXkKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBybXRvbGwgRFIgICAgICAgICAgIFdEVSAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0V2Vla0RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfTU9OREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVFVFU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RIVVJTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfRlJJREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TVU5EQVkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfREFURV9HZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5EUiwgUlRDX0RSX1dEVSkgPj4gUlRDX0RSX1dEVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBNb250aCBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNb250aCBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgTVQgICAgICAgICAgICBMTF9SVENfREFURV9TZXRNb250aFxuCisgICogICAgICAgICBEUiAgICAgICAgICAgTVUgICAgICAgICAgICBMTF9SVENfREFURV9TZXRNb250aAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1vbnRoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pBTlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfRkVCUlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFSQ0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVBSSUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVMWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BVUdVU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfU0VQVEVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX09DVE9CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTk9WRU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfREVDRU1CRVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EQVRFX1NldE1vbnRoKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNb250aCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5EUiwgKFJUQ19EUl9NVCB8IFJUQ19EUl9NVSksCisgICAgICAgICAgICAgKCgoTW9udGggJiAweEYwVSkgPDwgKFJUQ19EUl9NVF9Qb3MgLSA0VSkpIHwgKChNb250aCAmIDB4MEZVKSA8PCBSVENfRFJfTVVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNb250aCBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IE1vbnRoIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBNVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldE1vbnRoXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBNVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldE1vbnRoCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSkFOVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9GRUJSVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVJDSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BUFJJTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVUxZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FVR1VTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9TRVBURU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfT0NUT0JFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9OT1ZFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9ERUNFTUJFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19EQVRFX0dldE1vbnRoKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5EUiwgKFJUQ19EUl9NVCB8IFJUQ19EUl9NVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX0RSX01UKSA+PiBSVENfRFJfTVRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfRFJfTVUpID4+IFJUQ19EUl9NVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfREFURV9TZXREYXlcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0RBVEVfU2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0RBVEVfU2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+RFIsIChSVENfRFJfRFQgfCBSVENfRFJfRFUpLAorICAgICAgICAgICAgICgoKERheSAmIDB4RjBVKSA8PCAoUlRDX0RSX0RUX1BvcyAtIDRVKSkgfCAoKERheSAmIDB4MEZVKSA8PCBSVENfRFJfRFVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBEYXkgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERUICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0RGF5XG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldERheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19EQVRFX0dldERheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+RFIsIChSVENfRFJfRFQgfCBSVENfRFJfRFUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19EUl9EVCkgPj4gUlRDX0RSX0RUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0RSX0RVKSA+PiBSVENfRFJfRFVfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGRhdGUgKFdlZWtEYXksIERheSwgTW9udGggYW5kIFllYXIpIGluIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZ1xuCisgICogICAgICAgICBEUiAgICAgICAgICAgTVQgICAgICAgICAgICBMTF9SVENfREFURV9Db25maWdcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX0RBVEVfQ29uZmlnXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZ1xuCisgICogICAgICAgICBEUiAgICAgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfREFURV9Db25maWdcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIFlUICAgICAgICAgICAgTExfUlRDX0RBVEVfQ29uZmlnXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdlZWtEYXkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEBwYXJhbSAgTW9udGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSkFOVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9GRUJSVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVJDSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BUFJJTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVUxZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FVR1VTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9TRVBURU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfT0NUT0JFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9OT1ZFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9ERUNFTUJFUgorICAqIEBwYXJhbSAgWWVhciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4OTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EQVRFX0NvbmZpZyhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2Vla0RheSwgdWludDMyX3QgRGF5LCB1aW50MzJfdCBNb250aCwgdWludDMyX3QgWWVhcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gKFdlZWtEYXkgPDwgUlRDX0RSX1dEVV9Qb3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICgoKFllYXIgJiAweEYwVSkgPDwgKFJUQ19EUl9ZVF9Qb3MgLSA0VSkpIHwgKChZZWFyICYgMHgwRlUpIDw8IFJUQ19EUl9ZVV9Qb3MpKSAgIHwgXAorICAgICAgICAgKCgoTW9udGggJiAweEYwVSkgPDwgKFJUQ19EUl9NVF9Qb3MgLSA0VSkpIHwgKChNb250aCAmIDB4MEZVKSA8PCBSVENfRFJfTVVfUG9zKSkgfCBcCisgICAgICAgICAoKChEYXkgJiAweEYwVSkgPDwgKFJUQ19EUl9EVF9Qb3MgLSA0VSkpIHwgKChEYXkgJiAweDBGVSkgPDwgUlRDX0RSX0RVX1BvcykpOworCisgIE1PRElGWV9SRUcoUlRDeC0+RFIsIChSVENfRFJfV0RVIHwgUlRDX0RSX01UIHwgUlRDX0RSX01VIHwgUlRDX0RSX0RUIHwgUlRDX0RSX0RVIHwgUlRDX0RSX1lUIHwgUlRDX0RSX1lVKSwgdGVtcCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGRhdGUgKFdlZWtEYXksIERheSwgTW9udGggYW5kIFllYXIpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX1dFRUtEQVksIF9fTExfUlRDX0dFVF9ZRUFSLCBfX0xMX1JUQ19HRVRfTU9OVEgsCisgICogYW5kIF9fTExfUlRDX0dFVF9EQVkgYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIERSICAgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFxuCisgICogICAgICAgICBEUiAgICAgICAgICAgTVQgICAgICAgICAgICBMTF9SVENfREFURV9HZXRcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0XG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFxuCisgICogICAgICAgICBEUiAgICAgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfREFURV9HZXRcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIFlUICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0XG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbWJpbmF0aW9uIG9mIFdlZWtEYXksIERheSwgTW9udGggYW5kIFllYXIgKEZvcm1hdDogMHhXV0RETU1ZWSkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0RBVEVfR2V0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5EUiwgKFJUQ19EUl9XRFUgfCBSVENfRFJfTVQgfCBSVENfRFJfTVUgfCBSVENfRFJfRFQgfCBSVENfRFJfRFUgfCBSVENfRFJfWVQgfCBSVENfRFJfWVUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19EUl9XRFUpID4+IFJUQ19EUl9XRFVfUG9zKSA8PCBSVENfT0ZGU0VUX1dFRUtEQVkpIHwgXAorICAgICAgICAgICAgICAgICAgICAoKCgoKHRlbXAgJiBSVENfRFJfRFQpID4+IFJUQ19EUl9EVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19EUl9EVSkgPj4gUlRDX0RSX0RVX1BvcykpIDw8IFJUQ19PRkZTRVRfREFZKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCgoKCh0ZW1wICYgUlRDX0RSX01UKSA+PiBSVENfRFJfTVRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfRFJfTVUpID4+IFJUQ19EUl9NVV9Qb3MpKSA8PCBSVENfT0ZGU0VUX01PTlRIKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCgoKHRlbXAgJiBSVENfRFJfWVQpID4+IFJUQ19EUl9ZVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19EUl9ZVSkgPj4gUlRDX0RSX1lVX1BvcykpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfQUxBUk1BIEFMQVJNQQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFsYXJtIEEKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQUUgICAgICAgICBMTF9SVENfQUxNQV9FbmFibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9FbmFibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BTFJBRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybSBBCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkFFICAgICAgICAgTExfUlRDX0FMTUFfRGlzYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX0Rpc2FibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkFFKTsKK30KKworLyoqCisgICogQGJyaWVmICBTcGVjaWZ5IHRoZSBBbGFybSBBIG1hc2tzLgorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIE1TSzQgICAgICAgICAgTExfUlRDX0FMTUFfU2V0TWFza1xuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTVNLMyAgICAgICAgICBMTF9SVENfQUxNQV9TZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNU0syICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1hc2tcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1TSzEgICAgICAgICAgTExfUlRDX0FMTUFfU2V0TWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19EQVRFV0VFS0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfSE9VUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX01JTlVURVMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX1NFQ09ORFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0TWFzayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWFzaykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfTVNLNCB8IFJUQ19BTFJNQVJfTVNLMyB8IFJUQ19BTFJNQVJfTVNLMiB8IFJUQ19BTFJNQVJfTVNLMSwgTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBBbGFybSBBIG1hc2tzLgorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIE1TSzQgICAgICAgICAgTExfUlRDX0FMTUFfR2V0TWFza1xuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTVNLMyAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNU0syICAgICAgICAgIExMX1JUQ19BTE1BX0dldE1hc2tcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1TSzEgICAgICAgICAgTExfUlRDX0FMTUFfR2V0TWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX0RBVEVXRUVLREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19IT1VSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfTUlOVVRFUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfU0VDT05EUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfQUxMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0TWFzayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX01TSzQgfCBSVENfQUxSTUFSX01TSzMgfCBSVENfQUxSTUFSX01TSzIgfCBSVENfQUxSTUFSX01TSzEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWxhcm1BIFdlZWsgZGF5IHNlbGVjdGlvbiAoRFVbMzowXSByZXByZXNlbnRzIHRoZSB3ZWVrIGRheS4gRFRbMTowXSBpcyBkbyBub3QgY2FyZSkKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBXRFNFTCAgICAgICAgIExMX1JUQ19BTE1BX0VuYWJsZVdlZWtkYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9FbmFibGVXZWVrZGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9XRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybUEgV2VlayBkYXkgc2VsZWN0aW9uIChEVVszOjBdIHJlcHJlc2VudHMgdGhlIGRhdGUgKQorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIFdEU0VMICAgICAgICAgTExfUlRDX0FMTUFfRGlzYWJsZVdlZWtkYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9EaXNhYmxlV2Vla2RheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9XRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEEgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfQUxNQV9TZXREYXlcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9EVCB8IFJUQ19BTFJNQVJfRFUpLAorICAgICAgICAgICAgICgoKERheSAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9EVF9Qb3MgLSA0VSkpIHwgKChEYXkgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9EVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEEgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXREYXlcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDMxCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5BTFJNQVIsIChSVENfQUxSTUFSX0RUIHwgUlRDX0FMUk1BUl9EVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX0FMUk1BUl9EVCkgPj4gUlRDX0FMUk1BUl9EVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19BTFJNQVJfRFUpID4+IFJUQ19BTFJNQVJfRFVfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEEgV2Vla2RheQorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0V2Vla0RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdlZWtEYXkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0V2Vla0RheShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2Vla0RheSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfRFUsIFdlZWtEYXkgPDwgUlRDX0FMUk1BUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBBIFdlZWtkYXkKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFdlZWtEYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0V2Vla0RheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX0RVKSA+PiBSVENfQUxSTUFSX0RVX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFsYXJtIEEgdGltZSBmb3JtYXQgKEFNLzI0LWhvdXIgb3IgUE0gbm90YXRpb24pCisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRUaW1lRm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZUZvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX0FNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfVElNRV9GT1JNQVRfUE0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX1NldFRpbWVGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRpbWVGb3JtYXQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX1BNLCBUaW1lRm9ybWF0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQSB0aW1lIGZvcm1hdCAoQU0gb3IgUE0gbm90YXRpb24pCisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lRm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX1BNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0VGltZUZvcm1hdChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX1BNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEEgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgSG91cnMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0SG91clxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSG91cnMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0SG91cihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgSG91cnMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9IVCB8IFJUQ19BTFJNQVJfSFUpLAorICAgICAgICAgICAgICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfQUxSTUFSX0hUX1BvcyAtIDRVKSkgfCAoKEhvdXJzICYgMHgwRlUpIDw8IFJUQ19BTFJNQVJfSFVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBBIEhvdXJzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IEhvdXJzIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldEhvdXJcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0SG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRIb3VyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5BTFJNQVIsIChSVENfQUxSTUFSX0hUIHwgUlRDX0FMUk1BUl9IVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX0FMUk1BUl9IVCkgPj4gUlRDX0FMUk1BUl9IVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19BTFJNQVJfSFUpID4+IFJUQ19BTFJNQVJfSFVfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEEgTWludXRlcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNaW51dGVzIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1pbnV0ZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNaW51dGVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0TWludXRlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNaW51dGVzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfTU5UIHwgUlRDX0FMUk1BUl9NTlUpLAorICAgICAgICAgICAgICgoKE1pbnV0ZXMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQVJfTU5UX1BvcyAtIDRVKSkgfCAoKE1pbnV0ZXMgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9NTlVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBBIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNaW51dGVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0TWludXRlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0TWludXRlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5BTFJNQVIsIChSVENfQUxSTUFSX01OVCB8IFJUQ19BTFJNQVJfTU5VKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKHRlbXAgJiBSVENfQUxSTUFSX01OVCkgPj4gUlRDX0FMUk1BUl9NTlRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfQUxSTUFSX01OVSkgPj4gUlRDX0FMUk1BUl9NTlVfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEEgU2Vjb25kcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBTZWNvbmRzIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldFNlY29uZFxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBTZWNvbmRzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0U2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTZWNvbmRzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfU1QgfCBSVENfQUxSTUFSX1NVKSwKKyAgICAgICAgICAgICAoKChTZWNvbmRzICYgMHhGMFUpIDw8IChSVENfQUxSTUFSX1NUX1BvcyAtIDRVKSkgfCAoKFNlY29uZHMgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9TVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEEgU2Vjb25kcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBTZWNvbmRzIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFNlY29uZFxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfU1QgfCBSVENfQUxSTUFSX1NVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKHRlbXAgJiBSVENfQUxSTUFSX1NUKSA+PiBSVENfQUxSTUFSX1NUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0FMUk1BUl9TVSkgPj4gUlRDX0FMUk1BUl9TVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQSBUaW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX0FMTUFfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUFfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUFfQ29uZmlnVGltZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEZvcm1hdDEyXzI0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfVElNRV9GT1JNQVRfQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9QTQorICAqIEBwYXJhbSAgSG91cnMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqIEBwYXJhbSAgTWludXRlcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcGFyYW0gIFNlY29uZHMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9Db25maWdUaW1lKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBGb3JtYXQxMl8yNCwgdWludDMyX3QgSG91cnMsIHVpbnQzMl90IE1pbnV0ZXMsIHVpbnQzMl90IFNlY29uZHMpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IEZvcm1hdDEyXzI0IHwgKCgoSG91cnMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQVJfSFRfUG9zIC0gNFUpKSB8ICgoSG91cnMgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9IVV9Qb3MpKSAgICB8IFwKKyAgICAgICAgICgoKE1pbnV0ZXMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQVJfTU5UX1BvcyAtIDRVKSkgfCAoKE1pbnV0ZXMgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9NTlVfUG9zKSkgfCBcCisgICAgICAgICAoKChTZWNvbmRzICYgMHhGMFUpIDw8IChSVENfQUxSTUFSX1NUX1BvcyAtIDRVKSkgfCAoKFNlY29uZHMgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9TVV9Qb3MpKTsKKworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9QTSB8IFJUQ19BTFJNQVJfSFQgfCBSVENfQUxSTUFSX0hVIHwgUlRDX0FMUk1BUl9NTlQgfCBSVENfQUxSTUFSX01OVSB8IFJUQ19BTFJNQVJfU1QgfCBSVENfQUxSTUFSX1NVLCB0ZW1wKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBUaW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX0hPVVIsIF9fTExfUlRDX0dFVF9NSU5VVEUgYW5kIF9fTExfUlRDX0dFVF9TRUNPTkQKKyAgKiBhcmUgYXZhaWxhYmxlIHRvIGdldCBpbmRlcGVuZGVudGx5IGVhY2ggcGFyYW1ldGVyLgorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFRpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFRpbWUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRUaW1lKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoTExfUlRDX0FMTUFfR2V0SG91cihSVEN4KSA8PCBSVENfT0ZGU0VUX0hPVVIpIHwgKExMX1JUQ19BTE1BX0dldE1pbnV0ZShSVEN4KSA8PCBSVENfT0ZGU0VUX01JTlVURSkgfCBMTF9SVENfQUxNQV9HZXRTZWNvbmQoUlRDeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBBIE1hc2sgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0cyBzdGFydGluZyBhdCB0aGlzIGJpdAorICAqIEBub3RlIFRoaXMgcmVnaXN0ZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIEFMUkFFIGlzIHJlc2V0IGluIFJUQ19DUiByZWdpc3RlciwKKyAgKiAgICAgICBvciBpbiBpbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBybXRvbGwgQUxSTUFTU1IgICAgIE1BU0tTUyAgICAgICAgTExfUlRDX0FMTUFfU2V0U3ViU2Vjb25kTWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1hc2sgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX1NldFN1YlNlY29uZE1hc2soUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1hc2spCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFTU1IsIFJUQ19BTFJNQVNTUl9NQVNLU1MsIE1hc2sgPDwgUlRDX0FMUk1BU1NSX01BU0tTU19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBBIE1hc2sgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0cyBzdGFydGluZyBhdCB0aGlzIGJpdAorICAqIEBybXRvbGwgQUxSTUFTU1IgICAgIE1BU0tTUyAgICAgICAgTExfUlRDX0FMTUFfR2V0U3ViU2Vjb25kTWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0U3ViU2Vjb25kTWFzayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUFTU1IsIFJUQ19BTFJNQVNTUl9NQVNLU1MpID4+IFJUQ19BTFJNQVNTUl9NQVNLU1NfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQSBTdWIgc2Vjb25kcyB2YWx1ZQorICAqIEBybXRvbGwgQUxSTUFTU1IgICAgIFNTICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0U3ViU2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3Vic2Vjb25kIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXRTdWJTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFN1YnNlY29uZCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVNTUiwgUlRDX0FMUk1BU1NSX1NTLCBTdWJzZWNvbmQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBBIFN1YiBzZWNvbmRzIHZhbHVlCisgICogQHJtdG9sbCBBTFJNQVNTUiAgICAgU1MgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRTdWJTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0ZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1BX0dldFN1YlNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUFTU1IsIFJUQ19BTFJNQVNTUl9TUykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9BTEFSTUIgQUxBUk1CCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWxhcm0gQgorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBTFJCRSAgICAgICAgIExMX1JUQ19BTE1CX0VuYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX0VuYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFsYXJtIEIKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQkUgICAgICAgICBMTF9SVENfQUxNQl9EaXNhYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfRGlzYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNwZWNpZnkgdGhlIEFsYXJtIEIgbWFza3MuCisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgTVNLNCAgICAgICAgICBMTF9SVENfQUxNQl9TZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNU0szICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1hc2tcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1TSzIgICAgICAgICAgTExfUlRDX0FMTUJfU2V0TWFza1xuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTVNLMSAgICAgICAgICBMTF9SVENfQUxNQl9TZXRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX0RBVEVXRUVLREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19IT1VSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfTUlOVVRFUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfU0VDT05EUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRNYXNrKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNYXNrKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9NU0s0IHwgUlRDX0FMUk1CUl9NU0szIHwgUlRDX0FMUk1CUl9NU0syIHwgUlRDX0FMUk1CUl9NU0sxLCBNYXNrKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIEFsYXJtIEIgbWFza3MuCisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgTVNLNCAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNU0szICAgICAgICAgIExMX1JUQ19BTE1CX0dldE1hc2tcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1TSzIgICAgICAgICAgTExfUlRDX0FMTUJfR2V0TWFza1xuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTVNLMSAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfREFURVdFRUtEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX0hPVVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19NSU5VVEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19TRUNPTkRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19BTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRNYXNrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfTVNLNCB8IFJUQ19BTFJNQlJfTVNLMyB8IFJUQ19BTFJNQlJfTVNLMiB8IFJUQ19BTFJNQlJfTVNLMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBbGFybUIgV2VlayBkYXkgc2VsZWN0aW9uIChEVVszOjBdIHJlcHJlc2VudHMgdGhlIHdlZWsgZGF5LiBEVFsxOjBdIGlzIGRvIG5vdCBjYXJlKQorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIFdEU0VMICAgICAgICAgTExfUlRDX0FMTUJfRW5hYmxlV2Vla2RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX0VuYWJsZVdlZWtkYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+QUxSTUJSLCBSVENfQUxSTUJSX1dEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFsYXJtQiBXZWVrIGRheSBzZWxlY3Rpb24gKERVWzM6MF0gcmVwcmVzZW50cyB0aGUgZGF0ZSApCisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgV0RTRUwgICAgICAgICBMTF9SVENfQUxNQl9EaXNhYmxlV2Vla2RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX0Rpc2FibGVXZWVrZGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+QUxSTUJSLCBSVENfQUxSTUJSX1dEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQiBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgRGF5IGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldERheVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQl9TZXREYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBEYXkgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IERheSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIChSVENfQUxSTUJSX0RUIHwgUlRDX0FMUk1CUl9EVSksCisgICAgICAgICAgICAgKCgoRGF5ICYgMHhGMFUpIDw8IChSVENfQUxSTUJSX0RUX1BvcyAtIDRVKSkgfCAoKERheSAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX0RVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQiBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgRGF5IGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldERheVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXREYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MzEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfRFQgfCBSVENfQUxSTUJSX0RVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKHRlbXAgJiBSVENfQUxSTUJSX0RUKSA+PiBSVENfQUxSTUJSX0RUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0FMUk1CUl9EVSkgPj4gUlRDX0FMUk1CUl9EVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQiBXZWVrZGF5CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQl9TZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgV2Vla0RheSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBXZWVrRGF5KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9EVSwgV2Vla0RheSA8PCBSVENfQUxSTUJSX0RVX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEIgV2Vla2RheQorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0V2Vla0RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfTU9OREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVFVFU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RIVVJTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfRlJJREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TVU5EQVkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfRFUpID4+IFJUQ19BTFJNQlJfRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQiB0aW1lIGZvcm1hdCAoQU0vMjQtaG91ciBvciBQTSBub3RhdGlvbikKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldFRpbWVGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUaW1lRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9QTQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0VGltZUZvcm1hdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVGltZUZvcm1hdCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfUE0sIFRpbWVGb3JtYXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBCIHRpbWUgZm9ybWF0IChBTSBvciBQTSBub3RhdGlvbikKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX0FNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfUE0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRUaW1lRm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfUE0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQiBIb3VycyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBIb3VycyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfQUxNQl9TZXRIb3VyXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRIb3VyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBIb3VycykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIChSVENfQUxSTUJSX0hUIHwgUlRDX0FMUk1CUl9IVSksCisgICAgICAgICAgICAgKCgoSG91cnMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQlJfSFRfUG9zIC0gNFUpKSB8ICgoSG91cnMgJiAweDBGVSkgPDwgUlRDX0FMUk1CUl9IVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEIgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgSG91cnMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0SG91clxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldEhvdXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfSFQgfCBSVENfQUxSTUJSX0hVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKHRlbXAgJiBSVENfQUxSTUJSX0hUKSA+PiBSVENfQUxSTUJSX0hUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0FMUk1CUl9IVSkgPj4gUlRDX0FMUk1CUl9IVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQiBNaW51dGVzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IE1pbnV0ZXMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0TWludXRlXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1pbnV0ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1pbnV0ZXMgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1pbnV0ZXMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9NTlQgfCBSVENfQUxSTUJSX01OVSksCisgICAgICAgICAgICAgKCgoTWludXRlcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9NTlRfUG9zIC0gNFUpKSB8ICgoTWludXRlcyAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX01OVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEIgTWludXRlcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNaW51dGVzIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1CX0dldE1pbnV0ZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfTU5UIHwgUlRDX0FMUk1CUl9NTlUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19BTFJNQlJfTU5UKSA+PiBSVENfQUxSTUJSX01OVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19BTFJNQlJfTU5VKSA+PiBSVENfQUxSTUJSX01OVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQiBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFNlY29uZHMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0U2Vjb25kXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNlY29uZHMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFNlY29uZHMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9TVCB8IFJUQ19BTFJNQlJfU1UpLAorICAgICAgICAgICAgICgoKFNlY29uZHMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQlJfU1RfUG9zIC0gNFUpKSB8ICgoU2Vjb25kcyAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX1NVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQiBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFNlY29uZHMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0U2Vjb25kXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9TVCB8IFJUQ19BTFJNQlJfU1UpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19BTFJNQlJfU1QpID4+IFJUQ19BTFJNQlJfU1RfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfQUxSTUJSX1NVKSA+PiBSVENfQUxSTUJSX1NVX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBCIFRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX0FMTUJfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUJfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRm9ybWF0MTJfMjQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX1BNCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHBhcmFtICBNaW51dGVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZvcm1hdDEyXzI0LCB1aW50MzJfdCBIb3VycywgdWludDMyX3QgTWludXRlcywgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gRm9ybWF0MTJfMjQgfCAoKChIb3VycyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9IVF9Qb3MgLSA0VSkpIHwgKChIb3VycyAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX0hVX1BvcykpICAgIHwgXAorICAgICAgICAgKCgoTWludXRlcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9NTlRfUG9zIC0gNFUpKSB8ICgoTWludXRlcyAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX01OVV9Qb3MpKSB8IFwKKyAgICAgICAgICgoKFNlY29uZHMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQlJfU1RfUG9zIC0gNFUpKSB8ICgoU2Vjb25kcyAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX1NVX1BvcykpOworCisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJSLCBSVENfQUxSTUJSX1BNIHwgUlRDX0FMUk1CUl9IVCB8IFJUQ19BTFJNQlJfSFUgfCBSVENfQUxSTUJSX01OVCB8IFJUQ19BTFJNQlJfTU5VIHwgUlRDX0FMUk1CUl9TVCB8IFJUQ19BTFJNQlJfU1UsIHRlbXApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBCIFRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvcyBfX0xMX1JUQ19HRVRfSE9VUiwgX19MTF9SVENfR0VUX01JTlVURSBhbmQgX19MTF9SVENfR0VUX1NFQ09ORAorICAqIGFyZSBhdmFpbGFibGUgdG8gZ2V0IGluZGVwZW5kZW50bHkgZWFjaCBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0VGltZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbWJpbmF0aW9uIG9mIGhvdXJzLCBtaW51dGVzIGFuZCBzZWNvbmRzLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldFRpbWUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKChMTF9SVENfQUxNQl9HZXRIb3VyKFJUQ3gpIDw8IFJUQ19PRkZTRVRfSE9VUikgfCAoTExfUlRDX0FMTUJfR2V0TWludXRlKFJUQ3gpIDw8IFJUQ19PRkZTRVRfTUlOVVRFKSB8IExMX1JUQ19BTE1CX0dldFNlY29uZChSVEN4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFsYXJtIEIgTWFzayB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXRzIHN0YXJ0aW5nIGF0IHRoaXMgYml0CisgICogQG5vdGUgVGhpcyByZWdpc3RlciBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gQUxSQkUgaXMgcmVzZXQgaW4gUlRDX0NSIHJlZ2lzdGVyLAorICAqICAgICAgIG9yIGluIGluaXRpYWxpemF0aW9uIG1vZGUuCisgICogQHJtdG9sbCBBTFJNQlNTUiAgICAgTUFTS1NTICAgICAgICBMTF9SVENfQUxNQl9TZXRTdWJTZWNvbmRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWFzayBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0U3ViU2Vjb25kTWFzayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWFzaykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlNTUiwgUlRDX0FMUk1CU1NSX01BU0tTUywgTWFzayA8PCBSVENfQUxSTUJTU1JfTUFTS1NTX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEIgTWFzayB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXRzIHN0YXJ0aW5nIGF0IHRoaXMgYml0CisgICogQHJtdG9sbCBBTFJNQlNTUiAgICAgTUFTS1NTICAgICAgICBMTF9SVENfQUxNQl9HZXRTdWJTZWNvbmRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRTdWJTZWNvbmRNYXNrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQlNTUiwgUlRDX0FMUk1CU1NSX01BU0tTUykgID4+IFJUQ19BTFJNQlNTUl9NQVNLU1NfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQiBTdWIgc2Vjb25kcyB2YWx1ZQorICAqIEBybXRvbGwgQUxSTUJTU1IgICAgIFNTICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0U3ViU2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3Vic2Vjb25kIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRTdWJTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFN1YnNlY29uZCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlNTUiwgUlRDX0FMUk1CU1NSX1NTLCBTdWJzZWNvbmQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBCIFN1YiBzZWNvbmRzIHZhbHVlCisgICogQHJtdG9sbCBBTFJNQlNTUiAgICAgU1MgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRTdWJTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0ZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldFN1YlNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUJTU1IsIFJUQ19BTFJNQlNTUl9TUykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9UaW1lc3RhbXAgVGltZXN0YW1wCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVGltZXN0YW1wCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRTRSAgICAgICAgICAgTExfUlRDX1RTX0VuYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UU19FbmFibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9UU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVGltZXN0YW1wCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRTRSAgICAgICAgICAgTExfUlRDX1RTX0Rpc2FibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVFNfRGlzYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgVGltZS1zdGFtcCBldmVudCBhY3RpdmUgZWRnZQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSBUU0UgbXVzdCBiZSByZXNldCB3aGVuIFRTRURHRSBpcyBjaGFuZ2VkIHRvIGF2b2lkIHVud2FudGVkIFRTRiBzZXR0aW5nCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVFNFREdFICAgICAgICBMTF9SVENfVFNfU2V0QWN0aXZlRWRnZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEVkZ2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRVNUQU1QX0VER0VfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVTVEFNUF9FREdFX0ZBTExJTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UU19TZXRBY3RpdmVFZGdlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBFZGdlKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkNSLCBSVENfQ1JfVFNFREdFLCBFZGdlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZS1zdGFtcCBldmVudCBhY3RpdmUgZWRnZQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUU0VER0UgICAgICAgIExMX1JUQ19UU19HZXRBY3RpdmVFZGdlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRVNUQU1QX0VER0VfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVTVEFNUF9FREdFX0ZBTExJTkcKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0QWN0aXZlRWRnZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9UU0VER0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIEFNL1BNIG5vdGF0aW9uIChBTSBvciAyNC1ob3VyIGZvcm1hdCkKKyAgKiBAcm10b2xsIFRTVFIgICAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19UU19HZXRUaW1lRm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVFNfVElNRV9GT1JNQVRfQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVFNfVElNRV9GT1JNQVRfUE0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0VGltZUZvcm1hdChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFNUUiwgUlRDX1RTVFJfUE0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIEhvdXJzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IEhvdXJzIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFRTVFIgICAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19UU19HZXRIb3VyXG4KKyAgKiAgICAgICAgIFRTVFIgICAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19UU19HZXRIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRIb3VyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU1RSLCBSVENfVFNUUl9IVCB8IFJUQ19UU1RSX0hVKSA+PiBSVENfVFNUUl9IVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgTWludXRlcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNaW51dGVzIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFRTVFIgICAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19UU19HZXRNaW51dGVcbgorICAqICAgICAgICAgVFNUUiAgICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX1RTX0dldE1pbnV0ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTVFIsIFJUQ19UU1RSX01OVCB8IFJUQ19UU1RSX01OVSkgPj4gUlRDX1RTVFJfTU5VX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFNlY29uZHMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgVFNUUiAgICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX1RTX0dldFNlY29uZFxuCisgICogICAgICAgICBUU1RSICAgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfVFNfR2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFNUUiwgUlRDX1RTVFJfU1QgfCBSVENfVFNUUl9TVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgdGltZSAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm9zIF9fTExfUlRDX0dFVF9IT1VSLCBfX0xMX1JUQ19HRVRfTUlOVVRFIGFuZCBfX0xMX1JUQ19HRVRfU0VDT05ECisgICogYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFRTVFIgICAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19UU19HZXRUaW1lXG4KKyAgKiAgICAgICAgIFRTVFIgICAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19UU19HZXRUaW1lXG4KKyAgKiAgICAgICAgIFRTVFIgICAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19UU19HZXRUaW1lXG4KKyAgKiAgICAgICAgIFRTVFIgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19UU19HZXRUaW1lXG4KKyAgKiAgICAgICAgIFRTVFIgICAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19UU19HZXRUaW1lXG4KKyAgKiAgICAgICAgIFRTVFIgICAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19UU19HZXRUaW1lCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgaG91cnMsIG1pbnV0ZXMgYW5kIHNlY29uZHMuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldFRpbWUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19UU1RSX0hUIHwgUlRDX1RTVFJfSFUgfCBSVENfVFNUUl9NTlQgfCBSVENfVFNUUl9NTlUgfCBSVENfVFNUUl9TVCB8IFJUQ19UU1RSX1NVKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBXZWVrIGRheQorICAqIEBybXRvbGwgVFNEUiAgICAgICAgIFdEVSAgICAgICAgICAgTExfUlRDX1RTX0dldFdlZWtEYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTRFIsIFJUQ19UU0RSX1dEVSkgPj4gUlRDX1RTRFJfV0RVX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBNb250aCBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNb250aCBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBUU0RSICAgICAgICAgTVQgICAgICAgICAgICBMTF9SVENfVFNfR2V0TW9udGhcbgorICAqICAgICAgICAgVFNEUiAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX1RTX0dldE1vbnRoCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSkFOVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9GRUJSVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVJDSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BUFJJTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVUxZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FVR1VTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9TRVBURU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfT0NUT0JFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9OT1ZFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9ERUNFTUJFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRNb250aChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFNEUiwgUlRDX1RTRFJfTVQgfCBSVENfVFNEUl9NVSkgPj4gUlRDX1RTRFJfTVVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIERheSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBEYXkgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgVFNEUiAgICAgICAgIERUICAgICAgICAgICAgTExfUlRDX1RTX0dldERheVxuCisgICogICAgICAgICBUU0RSICAgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfVFNfR2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDMxCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldERheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFNEUiwgUlRDX1RTRFJfRFQgfCBSVENfVFNEUl9EVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgZGF0ZSAoV2Vla0RheSwgRGF5IGFuZCBNb250aCkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX1dFRUtEQVksIF9fTExfUlRDX0dFVF9NT05USCwKKyAgKiBhbmQgX19MTF9SVENfR0VUX0RBWSBhcmUgYXZhaWxhYmxlIHRvIGdldCBpbmRlcGVuZGVudGx5IGVhY2ggcGFyYW1ldGVyLgorICAqIEBybXRvbGwgVFNEUiAgICAgICAgIFdEVSAgICAgICAgICAgTExfUlRDX1RTX0dldERhdGVcbgorICAqICAgICAgICAgVFNEUiAgICAgICAgIE1UICAgICAgICAgICAgTExfUlRDX1RTX0dldERhdGVcbgorICAqICAgICAgICAgVFNEUiAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX1RTX0dldERhdGVcbgorICAqICAgICAgICAgVFNEUiAgICAgICAgIERUICAgICAgICAgICAgTExfUlRDX1RTX0dldERhdGVcbgorICAqICAgICAgICAgVFNEUiAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX1RTX0dldERhdGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBXZWVrZGF5LCBEYXkgYW5kIE1vbnRoCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldERhdGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTRFIsIFJUQ19UU0RSX1dEVSB8IFJUQ19UU0RSX01UIHwgUlRDX1RTRFJfTVUgfCBSVENfVFNEUl9EVCB8IFJUQ19UU0RSX0RVKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRpbWUtc3RhbXAgc3ViIHNlY29uZCB2YWx1ZQorICAqIEBybXRvbGwgVFNTU1IgICAgICAgIFNTICAgICAgICAgICAgTExfUlRDX1RTX0dldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldFN1YlNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFNTU1IsIFJUQ19UU1NTUl9TUykpOworfQorCisjaWYgZGVmaW5lZChSVENfVEFNUENSX1RBTVBUUykKKy8qKgorICAqIEBicmllZiAgQWN0aXZhdGUgdGltZXN0YW1wIG9uIHRhbXBlciBkZXRlY3Rpb24gZXZlbnQKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QVFMgICAgICAgIExMX1JUQ19UU19FbmFibGVPblRhbXBlcgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UU19FbmFibGVPblRhbXBlcihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUFRTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRpbWVzdGFtcCBvbiB0YW1wZXIgZGV0ZWN0aW9uIGV2ZW50CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUFRTICAgICAgICBMTF9SVENfVFNfRGlzYWJsZU9uVGFtcGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RTX0Rpc2FibGVPblRhbXBlcihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QVFMpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QQ1JfVEFNUFRTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX1RhbXBlciBUYW1wZXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVENfVEFNUHggaW5wdXQgZGV0ZWN0aW9uCisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDFFICAgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZVxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDJFICAgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZVxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDNFICAgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRhbXBlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSXzMKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9FbmFibGUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRhbXBlcikKK3sKKyAgU0VUX0JJVChSVEN4LT5UQU1QQ1IsIFRhbXBlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUlRDX1RBTVB4IGlucHV0IGRldGVjdGlvbgorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxRSAgICAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlXG4KKyAgKiAgICAgICAgIFRBTVBDUiAgICAgICBUQU1QMkUgICAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZVxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDNFICAgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUYW1wZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl8zCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRGlzYWJsZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVGFtcGVyKQoreworICBDTEVBUl9CSVQoUlRDeC0+VEFNUENSLCBUYW1wZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUYW1wZXIgbWFzayBmbGFnCisgICogQG5vdGUgQXNzb2NpYXRlZCBUYW1wZXIgSVQgbXVzdCBub3QgZW5hYmxlZCB3aGVuIHRhbXBlciBtYXNrIGlzIHNldC4KKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMU1GICAgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlTWFza1xuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDJNRiAgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZU1hc2tcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAzTUYgICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX01BU0tfVEFNUEVSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTUFTS19UQU1QRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjMKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9FbmFibGVNYXNrKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNYXNrKQoreworICBTRVRfQklUKFJUQ3gtPlRBTVBDUiwgTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUYW1wZXIgbWFzayBmbGFnCisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDFNRiAgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVNYXNrXG4KKyAgKiAgICAgICAgIFRBTVBDUiAgICAgICBUQU1QMk1GICAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZU1hc2tcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAzTUYgICAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlTWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX01BU0tfVEFNUEVSMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTUFTS19UQU1QRVIzCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRGlzYWJsZU1hc2soUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1hc2spCit7CisgIENMRUFSX0JJVChSVEN4LT5UQU1QQ1IsIE1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBiYWNrdXAgcmVnaXN0ZXIgZXJhc2UgYWZ0ZXIgVGFtcGVyIGV2ZW50IGRldGVjdGlvbgorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxTk9FUkFTRSAgTExfUlRDX1RBTVBFUl9FbmFibGVFcmFzZUJLUFxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDJOT0VSQVNFICBMTF9SVENfVEFNUEVSX0VuYWJsZUVyYXNlQktQXG4KKyAgKiAgICAgICAgIFRBTVBDUiAgICAgICBUQU1QM05PRVJBU0UgIExMX1JUQ19UQU1QRVJfRW5hYmxlRXJhc2VCS1AKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUYW1wZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX05PRVJBU0VfVEFNUEVSMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIzCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRW5hYmxlRXJhc2VCS1AoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRhbXBlcikKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBTVBDUiwgVGFtcGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGJhY2t1cCByZWdpc3RlciBlcmFzZSBhZnRlciBUYW1wZXIgZXZlbnQgZGV0ZWN0aW9uCisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDFOT0VSQVNFICBMTF9SVENfVEFNUEVSX0Rpc2FibGVFcmFzZUJLUFxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDJOT0VSQVNFICBMTF9SVENfVEFNUEVSX0Rpc2FibGVFcmFzZUJLUFxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDNOT0VSQVNFICBMTF9SVENfVEFNUEVSX0Rpc2FibGVFcmFzZUJLUAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRhbXBlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX05PRVJBU0VfVEFNUEVSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjMKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9EaXNhYmxlRXJhc2VCS1AoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRhbXBlcikKK3sKKyAgU0VUX0JJVChSVEN4LT5UQU1QQ1IsIFRhbXBlcik7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QQ1JfVEFNUFBVRElTKQorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJUQ19UQU1QeCBwdWxsLXVwIGRpc2FibGUgKERpc2FibGUgcHJlY2hhcmdlIG9mIFJUQ19UQU1QeCBwaW5zKQorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBQVURJUyAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlUHVsbFVwCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9EaXNhYmxlUHVsbFVwKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QUFVESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVENfVEFNUHggcHVsbC11cCBkaXNhYmxlICggUHJlY2hhcmdlIFJUQ19UQU1QeCBwaW5zIGJlZm9yZSBzYW1wbGluZykKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QUFVESVMgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlUHVsbFVwCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9FbmFibGVQdWxsVXAoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUFBVRElTKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUENSX1RBTVBQVURJUyAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUENSX1RBTVBQUkNIKQorLyoqCisgICogQGJyaWVmICBTZXQgUlRDX1RBTVB4IHByZWNoYXJnZSBkdXJhdGlvbgorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBQUkNIICAgICAgTExfUlRDX1RBTVBFUl9TZXRQcmVjaGFyZ2UKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBEdXJhdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMVJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMlJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fNFJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fOFJUQ0NMSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9TZXRQcmVjaGFyZ2UoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IER1cmF0aW9uKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QUFJDSCwgRHVyYXRpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfVEFNUHggcHJlY2hhcmdlIGR1cmF0aW9uCisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUFBSQ0ggICAgICBMTF9SVENfVEFNUEVSX0dldFByZWNoYXJnZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl8xUlRDQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl8yUlRDQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl80UlRDQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl84UlRDQ0xLCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RBTVBFUl9HZXRQcmVjaGFyZ2UoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QUFJDSCkpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QQ1JfVEFNUFBSQ0ggKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBDUl9UQU1QRkxUKQorLyoqCisgICogQGJyaWVmICBTZXQgUlRDX1RBTVB4IGZpbHRlciBjb3VudAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBGTFQgICAgICAgTExfUlRDX1RBTVBFUl9TZXRGaWx0ZXJDb3VudAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEZpbHRlckNvdW50IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSXzJTQU1QTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0ZJTFRFUl80U0FNUExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfOFNBTVBMRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9TZXRGaWx0ZXJDb3VudChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgRmlsdGVyQ291bnQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+VEFNUENSLCBSVENfVEFNUENSX1RBTVBGTFQsIEZpbHRlckNvdW50KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUlRDX1RBTVB4IGZpbHRlciBjb3VudAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBGTFQgICAgICAgTExfUlRDX1RBTVBFUl9HZXRGaWx0ZXJDb3VudAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSXzJTQU1QTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0ZJTFRFUl80U0FNUExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfOFNBTVBMRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UQU1QRVJfR2V0RmlsdGVyQ291bnQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QRkxUKSk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBDUl9UQU1QRkxUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QQ1JfVEFNUEZSRVEpCisvKioKKyAgKiBAYnJpZWYgIFNldCBUYW1wZXIgc2FtcGxpbmcgZnJlcXVlbmN5CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUEZSRVEgICAgICBMTF9SVENfVEFNUEVSX1NldFNhbXBsaW5nRnJlcQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNhbXBsaW5nRnJlcSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzMyNzY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMTYzODQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl84MTkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfNDA5NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzIwNDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8xMDI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfNTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMjU2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX1NldFNhbXBsaW5nRnJlcShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgU2FtcGxpbmdGcmVxKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QRlJFUSwgU2FtcGxpbmdGcmVxKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGFtcGVyIHNhbXBsaW5nIGZyZXF1ZW5jeQorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBGUkVRICAgICAgTExfUlRDX1RBTVBFUl9HZXRTYW1wbGluZ0ZyZXEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzMyNzY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMTYzODQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl84MTkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfNDA5NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzIwNDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8xMDI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfNTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMjU2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RBTVBFUl9HZXRTYW1wbGluZ0ZyZXEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QRlJFUSkpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QQ1JfVEFNUEZSRVEgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWN0aXZlIGxldmVsIGZvciBUYW1wZXIgaW5wdXQKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMVRSRyAgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlQWN0aXZlTGV2ZWxcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAyVFJHICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVBY3RpdmVMZXZlbFxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDNUUkcgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZUFjdGl2ZUxldmVsCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9BQ1RJVkVMRVZFTF9UQU1QMworICAqCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0VuYWJsZUFjdGl2ZUxldmVsKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBUYW1wZXIpCit7CisgIFNFVF9CSVQoUlRDeC0+VEFNUENSLCBUYW1wZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQWN0aXZlIGxldmVsIGZvciBUYW1wZXIgaW5wdXQKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMVRSRyAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZUFjdGl2ZUxldmVsXG4KKyAgKiAgICAgICAgIFRBTVBDUiAgICAgICBUQU1QMlRSRyAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZUFjdGl2ZUxldmVsXG4KKyAgKiAgICAgICAgIFRBTVBDUiAgICAgICBUQU1QM1RSRyAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZUFjdGl2ZUxldmVsCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9BQ1RJVkVMRVZFTF9UQU1QMworICAqCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0Rpc2FibGVBY3RpdmVMZXZlbChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVGFtcGVyKQoreworICBDTEVBUl9CSVQoUlRDeC0+VEFNUENSLCBUYW1wZXIpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9XYWtldXAgV2FrZXVwCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgV2FrZXVwIHRpbWVyCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVVEUgICAgICAgICAgTExfUlRDX1dBS0VVUF9FbmFibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfV0FLRVVQX0VuYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1dVVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgV2FrZXVwIHRpbWVyCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVVEUgICAgICAgICAgTExfUlRDX1dBS0VVUF9EaXNhYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1dBS0VVUF9EaXNhYmxlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBXYWtldXAgdGltZXIgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBXVVRFICAgICAgICAgIExMX1JUQ19XQUtFVVBfSXNFbmFibGVkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19XQUtFVVBfSXNFbmFibGVkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX1dVVEUpID09IChSVENfQ1JfV1VURSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgV2FrZXVwIGNsb2NrCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlIEJpdCBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUlRDX0NSIFdVVEUgYml0ID0gMCBhbmQgUlRDX0lTUiBXVVRXRiBiaXQgPSAxCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV1VDS1NFTCAgICAgICBMTF9SVENfV0FLRVVQX1NldENsb2NrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgV2FrZXVwQ2xvY2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0NLU1BSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19DS1NQUkVfV1VUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfV0FLRVVQX1NldENsb2NrKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBXYWtldXBDbG9jaykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX1dVQ0tTRUwsIFdha2V1cENsb2NrKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgV2FrZXVwIGNsb2NrCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV1VDS1NFTCAgICAgICBMTF9SVENfV0FLRVVQX0dldENsb2NrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0NLU1BSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19DS1NQUkVfV1VUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1dBS0VVUF9HZXRDbG9jayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVUNLU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFdha2V1cCBhdXRvLXJlbG9hZCB2YWx1ZQorICAqIEBub3RlIEJpdCBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gV1VUV0YgaXMgc2V0IHRvIDEgaW4gUlRDX0lTUgorICAqIEBybXRvbGwgV1VUUiAgICAgICAgIFdVVCAgICAgICAgICAgTExfUlRDX1dBS0VVUF9TZXRBdXRvUmVsb2FkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19XQUtFVVBfU2V0QXV0b1JlbG9hZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVmFsdWUpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+V1VUUiwgUlRDX1dVVFJfV1VULCBWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2V1cCBhdXRvLXJlbG9hZCB2YWx1ZQorICAqIEBybXRvbGwgV1VUUiAgICAgICAgIFdVVCAgICAgICAgICAgTExfUlRDX1dBS0VVUF9HZXRBdXRvUmVsb2FkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfV0FLRVVQX0dldEF1dG9SZWxvYWQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPldVVFIsIFJUQ19XVVRSX1dVVCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSVENfQkFDS1VQX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9CYWNrdXBfUmVnaXN0ZXJzIEJhY2t1cF9SZWdpc3RlcnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlcyBhIGRhdGEgaW4gYSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQktQeFIgICAgICAgIEJLUCAgICAgICAgICAgTExfUlRDX0JBS19TZXRSZWdpc3RlcgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJhY2t1cFJlZ2lzdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSNAorICAqIEBwYXJhbSAgRGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19CQUtfU2V0UmVnaXN0ZXIoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEJhY2t1cFJlZ2lzdGVyLCB1aW50MzJfdCBEYXRhKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICp0bXA7CisKKyAgdG1wID0gJihSVEN4LT5CS1AwUikgKyBCYWNrdXBSZWdpc3RlcjsKKworICAqdG1wID0gRGF0YTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkcyBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgUmVnaXN0ZXIuCisgICogQHJtdG9sbCBCS1B4UiAgICAgICAgQktQICAgICAgICAgICBMTF9SVENfQkFLX0dldFJlZ2lzdGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQmFja3VwUmVnaXN0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFI0CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQkFLX0dldFJlZ2lzdGVyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBCYWNrdXBSZWdpc3RlcikKK3sKKyAgY29uc3QgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqdG1wOworCisgIHRtcCA9ICYoUlRDeC0+QktQMFIpICsgQmFja3VwUmVnaXN0ZXI7CisKKyAgLyogUmVhZCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyICovCisgIHJldHVybiAqdG1wOworfQorCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJUQ19CQUNLVVBfU1VQUE9SVCAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9DYWxpYnJhdGlvbiBDYWxpYnJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IENhbGlicmF0aW9uIG91dHB1dCBmcmVxdWVuY3kgKDEgSHogb3IgNTEyIEh6KQorICAqIEBub3RlIEJpdHMgYXJlIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBDT0UgICAgICAgICAgIExMX1JUQ19DQUxfU2V0T3V0cHV0RnJlcVxuCisgICogICAgICAgICBDUiAgICAgICAgICAgQ09TRUwgICAgICAgICBMTF9SVENfQ0FMX1NldE91dHB1dEZyZXEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBGcmVxdWVuY3kgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfT1VUUFVUX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfT1VUUFVUXzFIWgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9PVVRQVVRfNTEySFoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DQUxfU2V0T3V0cHV0RnJlcShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgRnJlcXVlbmN5KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkNSLCBSVENfQ1JfQ09FIHwgUlRDX0NSX0NPU0VMLCBGcmVxdWVuY3kpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDYWxpYnJhdGlvbiBvdXRwdXQgZnJlcXVlbmN5ICgxIEh6IG9yIDUxMiBIeikKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBDT0UgICAgICAgICAgIExMX1JUQ19DQUxfR2V0T3V0cHV0RnJlcVxuCisgICogICAgICAgICBDUiAgICAgICAgICAgQ09TRUwgICAgICAgICBMTF9SVENfQ0FMX0dldE91dHB1dEZyZXEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9PVVRQVVRfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9PVVRQVVRfMUhaCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX09VVFBVVF81MTJIWgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19DQUxfR2V0T3V0cHV0RnJlcShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9DT0UgfCBSVENfQ1JfQ09TRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbnNlcnQgb3Igbm90IE9uZSBSVENDTEsgcHVsc2UgZXZlcnkgMmV4cDExIHB1bHNlcyAoZnJlcXVlbmN5IGluY3JlYXNlZCBieSA0ODguNSBwcG0pCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlIEJpdCBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUkVDQUxQRiBpcyBzZXQgdG8gMCBpbiBSVENfSVNSCisgICogQHJtdG9sbCBDQUxSICAgICAgICAgQ0FMUCAgICAgICAgICBMTF9SVENfQ0FMX1NldFB1bHNlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUHVsc2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfSU5TRVJUUFVMU0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9JTlNFUlRQVUxTRV9TRVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DQUxfU2V0UHVsc2UoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFB1bHNlKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkNBTFIsIFJUQ19DQUxSX0NBTFAsIFB1bHNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBvbmUgUlRDQ0xLIGhhcyBiZWVuIGluc2VydGVkIG9yIG5vdCBldmVyeSAyZXhwMTEgcHVsc2VzIChmcmVxdWVuY3kgaW5jcmVhc2VkIGJ5IDQ4OC41IHBwbSkKKyAgKiBAcm10b2xsIENBTFIgICAgICAgICBDQUxQICAgICAgICAgIExMX1JUQ19DQUxfSXNQdWxzZUluc2VydGVkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19DQUxfSXNQdWxzZUluc2VydGVkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxQKSA9PSAoUlRDX0NBTFJfQ0FMUCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNhbGlicmF0aW9uIGN5Y2xlIHBlcmlvZAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEJpdCBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUkVDQUxQRiBpcyBzZXQgdG8gMCBpbiBSVENfSVNSCisgICogQHJtdG9sbCBDQUxSICAgICAgICAgQ0FMVzggICAgICAgICBMTF9SVENfQ0FMX1NldFBlcmlvZFxuCisgICogICAgICAgICBDQUxSICAgICAgICAgQ0FMVzE2ICAgICAgICBMTF9SVENfQ0FMX1NldFBlcmlvZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBlcmlvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9QRVJJT0RfMzJTRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfUEVSSU9EXzE2U0VDCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX1BFUklPRF84U0VDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ0FMX1NldFBlcmlvZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUGVyaW9kKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkNBTFIsIFJUQ19DQUxSX0NBTFc4IHwgUlRDX0NBTFJfQ0FMVzE2LCBQZXJpb2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kCisgICogQHJtdG9sbCBDQUxSICAgICAgICAgQ0FMVzggICAgICAgICBMTF9SVENfQ0FMX0dldFBlcmlvZFxuCisgICogICAgICAgICBDQUxSICAgICAgICAgQ0FMVzE2ICAgICAgICBMTF9SVENfQ0FMX0dldFBlcmlvZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX1BFUklPRF8zMlNFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9QRVJJT0RfMTZTRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfUEVSSU9EXzhTRUMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQ0FMX0dldFBlcmlvZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+Q0FMUiwgUlRDX0NBTFJfQ0FMVzggfCBSVENfQ0FMUl9DQUxXMTYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQ2FsaWJyYXRpb24gbWludXMKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBCaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFJFQ0FMUEYgaXMgc2V0IHRvIDAgaW4gUlRDX0lTUgorICAqIEBybXRvbGwgQ0FMUiAgICAgICAgIENBTE0gICAgICAgICAgTExfUlRDX0NBTF9TZXRNaW51cworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENhbGliTWludXMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDFGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NBTF9TZXRNaW51cyhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgQ2FsaWJNaW51cykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxNLCBDYWxpYk1pbnVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2FsaWJyYXRpb24gbWludXMKKyAgKiBAcm10b2xsIENBTFIgICAgICAgICBDQUxNICAgICAgICAgIExMX1JUQ19DQUxfR2V0TWludXMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPSAweDFGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19DQUxfR2V0TWludXMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNBTFIsIFJUQ19DQUxSX0NBTE0pKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IFJlY2FsaWJyYXRpb24gcGVuZGluZyBGbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUkVDQUxQRiAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1JFQ0FMUAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1JFQ0FMUChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1JFQ0FMUEYpID09IChSVENfSVNSX1JFQ0FMUEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfVEFNUDMgZGV0ZWN0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQU1QM0YgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19UQU1QMyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1RBTVAzRikgPT0gKFJUQ19JU1JfVEFNUDNGKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjJfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgR2V0IFJUQ19UQU1QMiBkZXRlY3Rpb24gZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRBTVAyRiAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19UQU1QMgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1RBTVAyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfVEFNUDJGKSA9PSAoUlRDX0lTUl9UQU1QMkYpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjJfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBHZXQgUlRDX1RBTVAxIGRldGVjdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEFNUDFGICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1RBTVAxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9UQU1QMUYpID09IChSVENfSVNSX1RBTVAxRikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWUtc3RhbXAgb3ZlcmZsb3cgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRTT1ZGICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19UU09WCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfVFNPVihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1RTT1ZGKSA9PSAoUlRDX0lTUl9UU09WRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZS1zdGFtcCBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFNGICAgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1RTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfVFMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9UU0YpID09IChSVENfSVNSX1RTRikpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1dBS0VVUF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBHZXQgV2FrZXVwIHRpbWVyIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBXVVRGICAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfV1VUCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfV1VUKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfV1VURikgPT0gKFJUQ19JU1JfV1VURikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBSVENfV0FLRVVQX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUxSQkYgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0FMUkIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJCKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfQUxSQkYpID09IChSVENfSVNSX0FMUkJGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBBIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBTFJBRiAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX0FMUkEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9BTFJBRikgPT0gKFJUQ19JU1JfQUxSQUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUlRDX1RBTVAzIGRldGVjdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEFNUDNGICAgICAgICBMTF9SVENfQ2xlYXJGbGFnX1RBTVAzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19UQU1QMyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfVEFNUDNGIHwgUlRDX0lTUl9JTklUKSAmIDB4MDAwMEZGRkZVKSB8IChSVEN4LT5JU1IgJiBSVENfSVNSX0lOSVQpKSk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDbGVhciBSVENfVEFNUDIgZGV0ZWN0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQU1QMkYgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVEFNUDIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX1RBTVAyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9UQU1QMkYgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSMl9TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJUQ19UQU1QMSBkZXRlY3Rpb24gZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRBTVAxRiAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19UQU1QMQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfVEFNUDEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFdSSVRFX1JFRyhSVEN4LT5JU1IsICh+KChSVENfSVNSX1RBTVAxRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUaW1lLXN0YW1wIG92ZXJmbG93IGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUU09WRiAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVFNPVgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfVFNPVihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfVFNPVkYgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUaW1lLXN0YW1wIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUU0YgICAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVFMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX1RTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9UU0YgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1dBS0VVUF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtldXAgdGltZXIgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVVEYgICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19XVVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX1dVVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfV1VURiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEFsYXJtIEIgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMUkJGICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19BTFJCCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19BTFJCKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9BTFJCRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEFsYXJtIEEgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMUkFGICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19BTFJBCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9BTFJBRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbml0aWFsaXphdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSU5JVEYgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfSU5JVEYpID09IChSVENfSVNSX0lOSVRGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZWdpc3RlcnMgc3luY2hyb25pemF0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSU0YgICAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfUlMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19SUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1JTRikgPT0gKFJUQ19JU1JfUlNGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlZ2lzdGVycyBzeW5jaHJvbml6YXRpb24gZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJTRiAgICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19SUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfUlMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFdSSVRFX1JFRyhSVEN4LT5JU1IsICh+KChSVENfSVNSX1JTRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbml0aWFsaXphdGlvbiBzdGF0dXMgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIElOSVRTICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVRTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfSU5JVFMpID09IChSVENfSVNSX0lOSVRTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTaGlmdCBvcGVyYXRpb24gcGVuZGluZyBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgU0hQRiAgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1NIUAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1NIUChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1NIUEYpID09IChSVENfSVNSX1NIUEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19XQUtFVVBfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2V1cCB0aW1lciB3cml0ZSBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgV1VUV0YgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1dVVFcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19XVVRXKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfV1VUV0YpID09IChSVENfSVNSX1dVVFdGKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBCIHdyaXRlIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBTFJCV0YgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQlcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJCVyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX0FMUkJXRikgPT0gKFJUQ19JU1JfQUxSQldGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBBIHdyaXRlIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBTFJBV0YgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQVcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJBVyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX0FMUkFXRikgPT0gKFJUQ19JU1JfQUxSQVdGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUaW1lLXN0YW1wIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUU0lFICAgICAgICAgIExMX1JUQ19FbmFibGVJVF9UUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9UUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVGltZS1zdGFtcCBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVFNJRSAgICAgICAgICBMTF9SVENfRGlzYWJsZUlUX1RTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVJVF9UUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNJRSk7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19XQUtFVVBfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFdha2V1cCB0aW1lciBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV1VUSUUgICAgICAgICBMTF9SVENfRW5hYmxlSVRfV1VUCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUlUX1dVVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1dVVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFdha2V1cCB0aW1lciBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV1VUSUUgICAgICAgICBMTF9SVENfRGlzYWJsZUlUX1dVVAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfV1VUKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRJRSk7Cit9CisjZW5kaWYgLyogUlRDX1dBS0VVUF9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFsYXJtIEIgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkJJRSAgICAgICAgTExfUlRDX0VuYWJsZUlUX0FMUkIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfQUxSQihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybSBCIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBTFJCSUUgICAgICAgIExMX1JUQ19EaXNhYmxlSVRfQUxSQgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfQUxSQihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWxhcm0gQSBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQUlFICAgICAgICBMTF9SVENfRW5hYmxlSVRfQUxSQQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFsYXJtIEEgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkFJRSAgICAgICAgTExfUlRDX0Rpc2FibGVJVF9BTFJBCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVJVF9BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BTFJBSUUpOworfQorCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgVGFtcGVyIDMgaW50ZXJydXB0CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDNJRSAgICAgICBMTF9SVENfRW5hYmxlSVRfVEFNUDMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfVEFNUDMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+VEFNUENSLCBSVENfVEFNUENSX1RBTVAzSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVGFtcGVyIDMgaW50ZXJydXB0CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDNJRSAgICAgICBMTF9SVENfRGlzYWJsZUlUX1RBTVAzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVJVF9UQU1QMyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QM0lFKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIyX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUYW1wZXIgMiBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMklFICAgICAgIExMX1JUQ19FbmFibGVJVF9UQU1QMgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9UQU1QMihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUDJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUYW1wZXIgMiBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMklFICAgICAgIExMX1JUQ19EaXNhYmxlSVRfVEFNUDIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX1RBTVAyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+VEFNUENSLCBSVENfVEFNUENSX1RBTVAySUUpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIyX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRhbXBlciAxIGludGVycnVwdAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxSUUgICAgICAgTExfUlRDX0VuYWJsZUlUX1RBTVAxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUlUX1RBTVAxKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QMUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRhbXBlciAxIGludGVycnVwdAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxSUUgICAgICAgTExfUlRDX0Rpc2FibGVJVF9UQU1QMQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfVEFNUDEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUDFJRSk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhbGwgVGFtcGVyIEludGVycnVwdAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBJRSAgICAgICAgTExfUlRDX0VuYWJsZUlUX1RBTVAKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfVEFNUChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGFsbCBUYW1wZXIgSW50ZXJydXB0CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUElFICAgICAgICBMTF9SVENfRGlzYWJsZUlUX1RBTVAKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX1RBTVAoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiAgVGltZS1zdGFtcCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUU0lFICAgICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9UUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfVFMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNJRSkgPT0gKFJUQ19DUl9UU0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmICBXYWtldXAgdGltZXIgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV1VUSUUgICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfV1VUCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9XVVQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfV1VUSUUpID09IChSVENfQ1JfV1VUSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogUlRDX1dBS0VVUF9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgIEFsYXJtIEIgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQklFICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfQUxSQgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfQUxSQihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BTFJCSUUpID09IChSVENfQ1JfQUxSQklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmICBBbGFybSBBIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkFJRSAgICAgICAgTExfUlRDX0lzRW5hYmxlZElUX0FMUkEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX0FMUkEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQUlFKSA9PSAoUlRDX0NSX0FMUkFJRSkpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgIFRhbXBlciAzIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAzSUUgICAgICAgTExfUlRDX0lzRW5hYmxlZElUX1RBTVAzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9UQU1QMyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+VEFNUENSLAorICAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAzSUUpID09IChSVENfVEFNUENSX1RBTVAzSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiAgVGFtcGVyIDIgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDJJRSAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfVEFNUDIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX1RBTVAyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5UQU1QQ1IsCisgICAgICAgICAgICAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUDJJRSkgPT0gKFJUQ19UQU1QQ1JfVEFNUDJJRSkpID8gMVVMIDogMFVMKTsKKworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIyX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgIFRhbXBlciAxIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxSUUgICAgICAgTExfUlRDX0lzRW5hYmxlZElUX1RBTVAxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9UQU1QMShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+VEFNUENSLAorICAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAxSUUpID09IChSVENfVEFNUENSX1RBTVAxSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGFsbCB0aGUgVEFNUEVSIGludGVycnVwdHMgYXJlIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUElFICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfVEFNUAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfVEFNUChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+VEFNUENSLAorICAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVBJRSkgPT0gKFJUQ19UQU1QQ1JfVEFNUElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9SVENfRGVJbml0KFJUQ19UeXBlRGVmICpSVEN4KTsKK0Vycm9yU3RhdHVzIExMX1JUQ19Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCBMTF9SVENfSW5pdFR5cGVEZWYgKlJUQ19Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19TdHJ1Y3RJbml0KExMX1JUQ19Jbml0VHlwZURlZiAqUlRDX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfUlRDX1RJTUVfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX1RpbWVUeXBlRGVmICpSVENfVGltZVN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9SVENfVElNRV9TdHJ1Y3RJbml0KExMX1JUQ19UaW1lVHlwZURlZiAqUlRDX1RpbWVTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfUlRDX0RBVEVfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX0RhdGVUeXBlRGVmICpSVENfRGF0ZVN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9SVENfREFURV9TdHJ1Y3RJbml0KExMX1JUQ19EYXRlVHlwZURlZiAqUlRDX0RhdGVTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfUlRDX0FMTUFfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1JUQ19BTE1CX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFJUQ19Gb3JtYXQsIExMX1JUQ19BbGFybVR5cGVEZWYgKlJUQ19BbGFybVN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9SVENfQUxNQV9TdHJ1Y3RJbml0KExMX1JUQ19BbGFybVR5cGVEZWYgKlJUQ19BbGFybVN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9SVENfQUxNQl9TdHJ1Y3RJbml0KExMX1JUQ19BbGFybVR5cGVEZWYgKlJUQ19BbGFybVN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfRW50ZXJJbml0TW9kZShSVENfVHlwZURlZiAqUlRDeCk7CitFcnJvclN0YXR1cyBMTF9SVENfRXhpdEluaXRNb2RlKFJUQ19UeXBlRGVmICpSVEN4KTsKK0Vycm9yU3RhdHVzIExMX1JUQ19XYWl0Rm9yU3luY2hybyhSVENfVHlwZURlZiAqUlRDeCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFJUQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyTDB4eF9MTF9SVENfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9sbF9zcGkuaCBiL0luYy9zdG0zMmwweHhfbGxfc3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3ZGI3OQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfbGxfc3BpLmgKQEAgLTAsMCArMSwyMDI4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3NwaS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTUEkgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0xMX1NQSV9ICisjZGVmaW5lIFNUTTMyTDB4eF9MTF9TUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFNQSTEpIHx8IGRlZmluZWQgKFNQSTIpCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMIFNQSQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VTX0lOSVQgU1BJIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTUEkgSW5pdCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRyYW5zZmVyRGlyZWN0aW9uOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIHVuaWRpcmVjdGlvbmFsIG9yIGJpZGlyZWN0aW9uYWwgZGF0YSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19UUkFOU0ZFUl9NT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uKCkuKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBtb2RlIChNYXN0ZXIvU2xhdmUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19NT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldE1vZGUoKS4qLworCisgIHVpbnQzMl90IERhdGFXaWR0aDsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGRhdGEgd2lkdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX0RBVEFXSURUSC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXREYXRhV2lkdGgoKS4qLworCisgIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q2xvY2tQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgQ2xvY2tQaGFzZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBhY3RpdmUgZWRnZSBmb3IgdGhlIGJpdCBjYXB0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19QSEFTRS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXRDbG9ja1BoYXNlKCkuKi8KKworICB1aW50MzJfdCBOU1M7ICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgTlNTIHNpZ25hbCBpcyBtYW5hZ2VkIGJ5IGhhcmR3YXJlIChOU1MgcGluKSBvciBieSBzb2Z0d2FyZSB1c2luZyB0aGUgU1NJIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfTlNTX01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0TlNTTW9kZSgpLiovCisKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBCYXVkUmF0ZSBwcmVzY2FsZXIgdmFsdWUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgU0NLIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19CQVVEUkFURVBSRVNDQUxFUi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhlIGNvbW11bmljYXRpb24gY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXN0ZXIgY2xvY2suIFRoZSBzbGF2ZSBjbG9jayBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgQml0T3JkZXI7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSB0cmFuc2ZlcnMgc3RhcnQgZnJvbSBNU0Igb3IgTFNCIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfQklUX09SREVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldFRyYW5zZmVyQml0T3JkZXIoKS4qLworCisgIHVpbnQzMl90IENSQ0NhbGN1bGF0aW9uOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgQ1JDIGNhbGN1bGF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19DUkNfQ0FMQ1VMQVRJT04uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfU1BJX0VuYWJsZUNSQygpIGFuZCBAcmVmIExMX1NQSV9EaXNhYmxlQ1JDKCkuKi8KKworICB1aW50MzJfdCBDUkNQb2x5OyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBvbHlub21pYWwgdXNlZCBmb3IgdGhlIENSQyBjYWxjdWxhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q1JDUG9seW5vbWlhbCgpLiovCisKK30gTExfU1BJX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFNQSSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfU1BJX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfU1JfUlhORSAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9SWE5FICAgICAgICAgICAgICAgLyohPCBSeCBidWZmZXIgbm90IGVtcHR5IGZsYWcgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfVFhFICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9UWEUgICAgICAgICAgICAgICAgLyohPCBUeCBidWZmZXIgZW1wdHkgZmxhZyAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfQlNZICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9CU1kgICAgICAgICAgICAgICAgLyohPCBCdXN5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfQ1JDRVJSICAgICAgICAgICAgICAgICAgIFNQSV9TUl9DUkNFUlIgICAgICAgICAgICAgLyohPCBDUkMgZXJyb3IgZmxhZyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfTU9ERiAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9NT0RGICAgICAgICAgICAgICAgLyohPCBNb2RlIGZhdWx0IGZsYWcgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfT1ZSICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9PVlIgICAgICAgICAgICAgICAgLyohPCBPdmVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfRlJFICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9GUkUgICAgICAgICAgICAgICAgLyohPCBUSSBtb2RlIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfU1BJX1JlYWRSZWcgYW5kICBMTF9TUElfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0NSMl9SWE5FSUUgICAgICAgICAgICAgICAgICBTUElfQ1IyX1JYTkVJRSAgICAgICAgICAgIC8qITwgUnggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1NQSV9DUjJfVFhFSUUgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9UWEVJRSAgICAgICAgICAgICAvKiE8IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICAgICAqLworI2RlZmluZSBMTF9TUElfQ1IyX0VSUklFICAgICAgICAgICAgICAgICAgIFNQSV9DUjJfRVJSSUUgICAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX01PREUgT3BlcmF0aW9uIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfTU9ERV9NQVNURVIgICAgICAgICAgICAgICAgIChTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSkgICAgLyohPCBNYXN0ZXIgY29uZmlndXJhdGlvbiAgKi8KKyNkZWZpbmUgTExfU1BJX01PREVfU0xBVkUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgU2xhdmUgY29uZmlndXJhdGlvbiAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19QUk9UT0NPTCBTZXJpYWwgUHJvdG9jb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfUFJPVE9DT0xfTU9UT1JPTEEgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBNb3Rvcm9sYSBtb2RlLiBVc2VkIGFzIGRlZmF1bHQgdmFsdWUgKi8KKyNkZWZpbmUgTExfU1BJX1BST1RPQ09MX1RJICAgICAgICAgICAgICAgICAoU1BJX0NSMl9GUkYpICAgICAgICAgICAgIC8qITwgVEkgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19QSEFTRSBDbG9jayBQaGFzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9QSEFTRV8xRURHRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IEZpcnN0IGNsb2NrIHRyYW5zaXRpb24gaXMgdGhlIGZpcnN0IGRhdGEgY2FwdHVyZSBlZGdlICAqLworI2RlZmluZSBMTF9TUElfUEhBU0VfMkVER0UgICAgICAgICAgICAgICAgIChTUElfQ1IxX0NQSEEpICAgICAgICAgICAgLyohPCBTZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1BPTEFSSVRZIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgQ2xvY2sgdG8gMCB3aGVuIGlkbGUgKi8KKyNkZWZpbmUgTExfU1BJX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAoU1BJX0NSMV9DUE9MKSAgICAgICAgICAgIC8qITwgQ2xvY2sgdG8gMSB3aGVuIGlkbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0JBVURSQVRFUFJFU0NBTEVSIEJhdWQgUmF0ZSBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMiAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzIgICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNCAgICAgIChTUElfQ1IxX0JSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzQgICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWOCAgICAgIChTUElfQ1IxX0JSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzggICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTYgICAgIChTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzE2ICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMzIgICAgIChTUElfQ1IxX0JSXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzMyICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNjQgICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzApICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzY0ICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTI4ICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEpICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzEyOCAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMjU2ICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfQklUX09SREVSIFRyYW5zbWlzc2lvbiBCaXQgT3JkZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfTFNCX0ZJUlNUICAgICAgICAgICAgICAgICAgIChTUElfQ1IxX0xTQkZJUlNUKSAgICAgICAgLyohPCBEYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIExTQiBmaXJzdCAqLworI2RlZmluZSBMTF9TUElfTVNCX0ZJUlNUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBEYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfVFJBTlNGRVJfTU9ERSBUcmFuc2ZlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0ZVTExfRFVQTEVYICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGdWxsLUR1cGxleCBtb2RlLiBSeCBhbmQgVHggdHJhbnNmZXIgb24gMiBsaW5lcyAqLworI2RlZmluZSBMTF9TUElfU0lNUExFWF9SWCAgICAgICAgICAgICAgICAgIChTUElfQ1IxX1JYT05MWSkgICAgICAgICAgICAgICAgICAgICAvKiE8IFNpbXBsZXggUnggbW9kZS4gIFJ4IHRyYW5zZmVyIG9ubHkgb24gMSBsaW5lICAgICovCisjZGVmaW5lIExMX1NQSV9IQUxGX0RVUExFWF9SWCAgICAgICAgICAgICAgKFNQSV9DUjFfQklESU1PREUpICAgICAgICAgICAgICAgICAgIC8qITwgSGFsZi1EdXBsZXggUnggbW9kZS4gUnggdHJhbnNmZXIgb24gMSBsaW5lICAgICAgKi8KKyNkZWZpbmUgTExfU1BJX0hBTEZfRFVQTEVYX1RYICAgICAgICAgICAgICAoU1BJX0NSMV9CSURJTU9ERSB8IFNQSV9DUjFfQklESU9FKSAgLyohPCBIYWxmLUR1cGxleCBUeCBtb2RlLiBUeCB0cmFuc2ZlciBvbiAxIGxpbmUgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfTlNTX01PREUgU2xhdmUgU2VsZWN0IFBpbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX05TU19TT0ZUICAgICAgICAgICAgICAgICAgICAoU1BJX0NSMV9TU00pICAgICAgICAgICAgICAgICAgICAgLyohPCBOU1MgbWFuYWdlZCBpbnRlcm5hbGx5LiBOU1MgcGluIG5vdCB1c2VkIGFuZCBmcmVlICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfTlNTX0hBUkRfSU5QVVQgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5TUyBwaW4gdXNlZCBpbiBJbnB1dC4gT25seSB1c2VkIGluIE1hc3RlciBtb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9OU1NfSEFSRF9PVVRQVVQgICAgICAgICAgICAgKCgodWludDMyX3QpU1BJX0NSMl9TU09FIDw8IDE2VSkpIC8qITwgTlNTIHBpbiB1c2VkIGluIE91dHB1dC4gT25seSB1c2VkIGluIFNsYXZlIG1vZGUgYXMgY2hpcCBzZWxlY3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0RBVEFXSURUSCBEYXRhd2lkdGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzhCSVQgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERhdGEgbGVuZ3RoIGZvciBTUEkgdHJhbnNmZXI6ICA4IGJpdHMgKi8KKyNkZWZpbmUgTExfU1BJX0RBVEFXSURUSF8xNkJJVCAgICAgICAgICAgICAoU1BJX0NSMV9ERkYpICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCBmb3IgU1BJIHRyYW5zZmVyOiAgMTYgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfQ1JDX0NBTENVTEFUSU9OIENSQyBDYWxjdWxhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IENSQyBjYWxjdWxhdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9TUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFICAgICAgIChTUElfQ1IxX0NSQ0VOKSAgICAgICAgICAgLyohPCBDUkMgY2FsY3VsYXRpb24gZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FeHBvcnRlZF9NYWNyb3MgU1BJIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gU1BJIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9TUElfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBTUEkgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFNQSSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTUEkgcGVyaXBoZXJhbAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNQRSAgICAgICAgICAgTExfU1BJX0VuYWJsZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTUEkgcGVyaXBoZXJhbAorICAqIEBub3RlICAgV2hlbiBkaXNhYmxpbmcgdGhlIFNQSSwgZm9sbG93IHRoZSBwcm9jZWR1cmUgZGVzY3JpYmVkIGluIHRoZSBSZWZlcmVuY2UgTWFudWFsLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNQRSAgICAgICAgICAgTExfU1BJX0Rpc2FibGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9TUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNQSSBwZXJpcGhlcmFsIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTUEUgICAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSkgPT0gKFNQSV9DUjFfU1BFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTUEkgb3BlcmF0aW9uIG1vZGUgdG8gTWFzdGVyIG9yIFNsYXZlCisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTVNUUiAgICAgICAgICBMTF9TUElfU2V0TW9kZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgU1NJICAgICAgICAgICBMTF9TUElfU2V0TW9kZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTU9ERV9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTU9ERV9TTEFWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldE1vZGUoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IE1vZGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSwgTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNQSSBvcGVyYXRpb24gbW9kZSAoTWFzdGVyIG9yIFNsYXZlKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1TVFIgICAgICAgICAgTExfU1BJX0dldE1vZGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFNTSSAgICAgICAgICAgTExfU1BJX0dldE1vZGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX1NMQVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldE1vZGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9NU1RSIHwgU1BJX0NSMV9TU0kpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBGUkYgICAgICAgICAgIExMX1NQSV9TZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN0YW5kYXJkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX1RJCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0U3RhbmRhcmQoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFN0YW5kYXJkKQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9GUkYsIFN0YW5kYXJkKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBGUkYgICAgICAgICAgIExMX1NQSV9HZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX1RJCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFN0YW5kYXJkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfRlJGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNsb2NrIHBoYXNlCisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuCisgICogICAgICAgICBUaGlzIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUEhBICAgICAgICAgIExMX1NQSV9TZXRDbG9ja1BoYXNlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tQaGFzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8yRURHRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENsb2NrUGhhc2UoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IENsb2NrUGhhc2UpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQSEEsIENsb2NrUGhhc2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjbG9jayBwaGFzZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENQSEEgICAgICAgICAgTExfU1BJX0dldENsb2NrUGhhc2UKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8yRURHRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRDbG9ja1BoYXNlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1BIQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjbG9jayBwb2xhcml0eQorICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLgorICAqICAgICAgICAgVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1BPTCAgICAgICAgICBMTF9TUElfU2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENsb2NrUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRDbG9ja1BvbGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBDbG9ja1BvbGFyaXR5KQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9DUE9MLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2xvY2sgcG9sYXJpdHkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUE9MICAgICAgICAgIExMX1NQSV9HZXRDbG9ja1BvbGFyaXR5CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgYmF1ZCByYXRlIHByZXNjYWxlcgorICAqIEBub3RlICAgVGhlc2UgYml0cyBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuIFNQSSBCYXVkUmF0ZSA9IGZQQ0xLL1ByZXNjYWxlci4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJhdWRSYXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQmF1ZFJhdGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0JSLCBCYXVkUmF0ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGJhdWQgcmF0ZSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9HZXRCYXVkUmF0ZVByZXNjYWxlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0QmF1ZFJhdGVQcmVzY2FsZXIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9CUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0cmFuc2ZlciBiaXQgb3JkZXIKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfU2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJpdE9yZGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckJpdE9yZGVyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBCaXRPcmRlcikKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfTFNCRklSU1QsIEJpdE9yZGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdHJhbnNmZXIgYml0IG9yZGVyCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfR2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0VHJhbnNmZXJCaXRPcmRlcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0xTQkZJUlNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRyYW5zZmVyIGRpcmVjdGlvbiBtb2RlCisgICogQG5vdGUgICBGb3IgSGFsZi1EdXBsZXggbW9kZSwgUnggRGlyZWN0aW9uIGlzIHNldCBieSBkZWZhdWx0LgorICAqICAgICAgICAgSW4gbWFzdGVyIG1vZGUsIHRoZSBNT1NJIHBpbiBpcyB1c2VkIGFuZCBpbiBzbGF2ZSBtb2RlLCB0aGUgTUlTTyBwaW4gaXMgdXNlZCBmb3IgSGFsZi1EdXBsZXguCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhPTkxZICAgICAgICBMTF9TUElfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIEJJRElNT0RFICAgICAgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJT0UgICAgICAgIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0ZVTExfRFVQTEVYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1NJTVBMRVhfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfVFgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb24pCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX1JYT05MWSB8IFNQSV9DUjFfQklESU1PREUgfCBTUElfQ1IxX0JJRElPRSwgVHJhbnNmZXJEaXJlY3Rpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0cmFuc2ZlciBkaXJlY3Rpb24gbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYT05MWSAgICAgICAgTExfU1BJX0dldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJTU9ERSAgICAgIExMX1NQSV9HZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgICogICAgICAgICBDUjEgICAgICAgICAgQklESU9FICAgICAgICBMTF9TUElfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9GVUxMX0RVUExFWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9TSU1QTEVYX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0hBTEZfRFVQTEVYX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0hBTEZfRFVQTEVYX1RYCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFRyYW5zZmVyRGlyZWN0aW9uKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfUlhPTkxZIHwgU1BJX0NSMV9CSURJTU9ERSB8IFNQSV9DUjFfQklESU9FKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGZyYW1lIGRhdGEgd2lkdGgKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERkYgICAgICAgICAgIExMX1NQSV9TZXREYXRhV2lkdGgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzhCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE2QklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RGF0YVdpZHRoKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBEYXRhV2lkdGgpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0RGRiwgRGF0YVdpZHRoKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZnJhbWUgZGF0YSB3aWR0aAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERGRiAgICAgICAgICAgTExfU1BJX0dldERhdGFXaWR0aAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF84QklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNkJJVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXREYXRhV2lkdGgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9ERkYpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUZfQ1JDX01hbmFnZW1lbnQgQ1JDIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDUkMKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNFTiAgICAgICAgIExMX1NQSV9FbmFibGVDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlQ1JDKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUkNFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDUkMKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNFTiAgICAgICAgIExMX1NQSV9EaXNhYmxlQ1JDCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVDUkMoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1JDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIENSQyBpcyBlbmFibGVkCisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgYmUgd3JpdHRlbiBvbmx5IHdoZW4gU1BJIGlzIGRpc2FibGVkIChTUEUgPSAwKSBmb3IgY29ycmVjdCBvcGVyYXRpb24uCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1JDRU4gICAgICAgICBMTF9TUElfSXNFbmFibGVkQ1JDCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRDUkMoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUkNFTikgPT0gKFNQSV9DUjFfQ1JDRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IENSQ05leHQgdG8gdHJhbnNmZXIgQ1JDIG9uIHRoZSBsaW5lCisgICogQG5vdGUgICBUaGlzIGJpdCBoYXMgdG8gYmUgd3JpdHRlbiBhcyBzb29uIGFzIHRoZSBsYXN0IGRhdGEgaXMgd3JpdHRlbiBpbiB0aGUgU1BJeF9EUiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNORVhUICAgICAgIExMX1NQSV9TZXRDUkNOZXh0CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ05leHQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBwb2x5bm9taWFsIGZvciBDUkMgY2FsY3VsYXRpb24KKyAgKiBAcm10b2xsIENSQ1BSICAgICAgICBDUkNQT0xZICAgICAgIExMX1NQSV9TZXRDUkNQb2x5bm9taWFsCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ1JDUG9seSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ1BvbHlub21pYWwoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IENSQ1BvbHkpCit7CisgIFdSSVRFX1JFRyhTUEl4LT5DUkNQUiwgKHVpbnQxNl90KUNSQ1BvbHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwb2x5bm9taWFsIGZvciBDUkMgY2FsY3VsYXRpb24KKyAgKiBAcm10b2xsIENSQ1BSICAgICAgICBDUkNQT0xZICAgICAgIExMX1NQSV9HZXRDUkNQb2x5bm9taWFsCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgaXMgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldENSQ1BvbHlub21pYWwoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFNQSXgtPkNSQ1BSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJ4IENSQworICAqIEBybXRvbGwgUlhDUkNSICAgICAgIFJYQ1JDICAgICAgICAgTExfU1BJX0dldFJ4Q1JDCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgaXMgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFJ4Q1JDKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhTUEl4LT5SWENSQ1IpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVHggQ1JDCisgICogQHJtdG9sbCBUWENSQ1IgICAgICAgVFhDUkMgICAgICAgICBMTF9TUElfR2V0VHhDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0VHhDUkMoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFNQSXgtPlRYQ1JDUikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9OU1NfTWFuYWdlbWVudCBTbGF2ZSBTZWxlY3QgUGluIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBOU1MgbW9kZQorICAqIEBub3RlICAgTExfU1BJX05TU19TT0ZUIE1vZGUgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1NNICAgICAgICAgICBMTF9TUElfU2V0TlNTTW9kZVxuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1NPRSAgICAgICAgICBMTF9TUElfU2V0TlNTTW9kZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE5TUyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfU09GVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfSEFSRF9JTlBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9OU1NfSEFSRF9PVVRQVVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXROU1NNb2RlKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBOU1MpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX1NTTSwgIE5TUyk7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IyLCBTUElfQ1IyX1NTT0UsICgodWludDMyX3QpKE5TUyA+PiAxNlUpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE5TUyBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1NNICAgICAgICAgICBMTF9TUElfR2V0TlNTTW9kZVxuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1NPRSAgICAgICAgICBMTF9TUElfR2V0TlNTTW9kZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19TT0ZUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX0lOUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX09VVFBVVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXROU1NNb2RlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZWdpc3RlciB1aW50MzJfdCBTc20gID0gKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9TU00pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgU3NvZSA9IChSRUFEX0JJVChTUEl4LT5DUjIsICBTUElfQ1IyX1NTT0UpIDw8IDE2VSk7CisgIHJldHVybiAoU3NtIHwgU3NvZSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJ4IGJ1ZmZlciBpcyBub3QgZW1wdHkKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBSWE5FICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfUlhORSkgPT0gKFNQSV9TUl9SWE5FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFR4IGJ1ZmZlciBpcyBlbXB0eQorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFRYRSAgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19UWEUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19UWEUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfVFhFKSA9PSAoU1BJX1NSX1RYRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ1JDIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDUkNFUlIgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfQ1JDRVJSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfQ1JDRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0NSQ0VSUikgPT0gKFNQSV9TUl9DUkNFUlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IG1vZGUgZmF1bHQgZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIE1PREYgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19NT0RGCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfTU9ERihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9NT0RGKSA9PSAoU1BJX1NSX01PREYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IG92ZXJydW4gZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIE9WUiAgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19PVlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19PVlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfT1ZSKSA9PSAoU1BJX1NSX09WUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYnVzeSBmbGFnCisgICogQG5vdGUgICBUaGUgQlNZIGZsYWcgaXMgY2xlYXJlZCB1bmRlciBhbnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAgKiAtV2hlbiB0aGUgU1BJIGlzIGNvcnJlY3RseSBkaXNhYmxlZAorICAqIC1XaGVuIGEgZmF1bHQgaXMgZGV0ZWN0ZWQgaW4gTWFzdGVyIG1vZGUgKE1PREYgYml0IHNldCB0byAxKQorICAqIC1JbiBNYXN0ZXIgbW9kZSwgd2hlbiBpdCBmaW5pc2hlcyBhIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCBubyBuZXcgZGF0YSBpcyByZWFkeSB0byBiZQorICAqIHNlbnQKKyAgKiAtSW4gU2xhdmUgbW9kZSwgd2hlbiB0aGUgQlNZIGZsYWcgaXMgc2V0IHRvICcwJyBmb3IgYXQgbGVhc3Qgb25lIFNQSSBjbG9jayBjeWNsZSBiZXR3ZWVuCisgICogZWFjaCBkYXRhIHRyYW5zZmVyLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEJTWSAgICAgICAgICAgTExfU1BJX0lzQWN0aXZlRmxhZ19CU1kKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19CU1koU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfQlNZKSA9PSAoU1BJX1NSX0JTWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfRlJFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfRlJFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0ZSRSkgPT0gKFNQSV9TUl9GUkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ1JDIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDUkNFUlIgICAgICAgIExMX1NQSV9DbGVhckZsYWdfQ1JDRVJSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19DUkNFUlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5TUiwgU1BJX1NSX0NSQ0VSUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgbW9kZSBmYXVsdCBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSCisgICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHdyaXRlIGFjY2VzcyB0byB0aGUgU1BJeF9DUjEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBNT0RGICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfTU9ERgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfTU9ERihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWdfc3I7CisgIHRtcHJlZ19zciA9IFNQSXgtPlNSOworICAodm9pZCkgdG1wcmVnX3NyOworICBDTEVBUl9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgb3ZlcnJ1biBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X0RSCisgICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSIHJlZ2lzdGVyCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9TUElfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgdG1wcmVnID0gU1BJeC0+RFI7CisgICh2b2lkKSB0bXByZWc7CisgIHRtcHJlZyA9IFNQSXgtPlNSOworICAodm9pZCkgdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSByZWFkaW5nIFNQSXhfU1IgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfRlJFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19GUkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICB0bXByZWcgPSBTUEl4LT5TUjsKKyAgKHZvaWQpIHRtcHJlZzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUZfSVRfTWFuYWdlbWVudCBJbnRlcnJ1cHQgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGVycm9yIGludGVycnVwdAorICAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IgY29uZGl0aW9uIG9jY3VycyAoQ1JDRVJSLCBPVlIsIE1PREYgaW4gU1BJIG1vZGUsIEZSRSBhdCBUSSBtb2RlKS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX1NQSV9FbmFibGVJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9TUElfRW5hYmxlSVRfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWE5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRW5hYmxlSVRfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZUlUX1RYRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXJyb3IgaW50ZXJydXB0CisgICogQG5vdGUgICBUaGlzIGJpdCBjb250cm9scyB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBpbnRlcnJ1cHQgd2hlbiBhbiBlcnJvciBjb25kaXRpb24gb2NjdXJzIChDUkNFUlIsIE9WUiwgTU9ERiBpbiBTUEkgbW9kZSwgRlJFIGF0IFRJIG1vZGUpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSeCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYTkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRGlzYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1RYRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBlcnJvciBpbnRlcnJ1cHQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfRVJSSUUpID09IChTUElfQ1IyX0VSUklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfUlhORUlFKSA9PSAoU1BJX0NSMl9SWE5FSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHggYnVmZmVyIGVtcHR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRUlFICAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhFSUUpID09IChTUElfQ1IyX1RYRUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUEgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBSeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfU1BJX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIFJ4CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9TUElfRGlzYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlRE1BUmVxX1JYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBSeCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSA9PSAoU1BJX0NSMl9SWERNQUVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgVHgKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1NQSV9FbmFibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBUeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfU1BJX0Rpc2FibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZURNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgVHggaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfU1BJX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhETUFFTikgPT0gKFNQSV9DUjJfVFhETUFFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGRhdGEgcmVnaXN0ZXIgYWRkcmVzcyB1c2VkIGZvciBETUEgdHJhbnNmZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9ETUFfR2V0UmVnQWRkcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkgJiAoU1BJeC0+RFIpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9EQVRBX01hbmFnZW1lbnQgREFUQSBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWFkIDgtQml0cyBpbiB0aGUgZGF0YSByZWdpc3RlcgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfU1BJX1JlY2VpdmVEYXRhOAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJ4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX1NQSV9SZWNlaXZlRGF0YTgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9SRUcoU1BJeC0+RFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIDE2LUJpdHMgaW4gdGhlIGRhdGEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9SZWNlaXZlRGF0YTE2CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUnhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfU1BJX1JlY2VpdmVEYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDE2X3QpKFJFQURfUkVHKFNQSXgtPkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgOC1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9TUElfVHJhbnNtaXREYXRhOAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9UcmFuc21pdERhdGE4KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50OF90IFR4RGF0YSkKK3sKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyAgX19JTyB1aW50OF90ICpzcGlkciA9ICgoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKTsKKyAgKnNwaWRyID0gVHhEYXRhOworI2Vsc2UKKyAgKigoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKSA9IFR4RGF0YTsKKyNlbmRpZgorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIDE2LUJpdHMgaW4gdGhlIGRhdGEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9UcmFuc21pdERhdGExNgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1RyYW5zbWl0RGF0YTE2KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MTZfdCBUeERhdGEpCit7CisjaWYgZGVmaW5lZCAoX19HTlVDX18pCisgIF9fSU8gdWludDE2X3QgKnNwaWRyID0gKChfX0lPIHVpbnQxNl90ICopJlNQSXgtPkRSKTsKKyAgKnNwaWRyID0gVHhEYXRhOworI2Vsc2UKKyAgU1BJeC0+RFIgPSBUeERhdGE7CisjZW5kaWYKK30KKworLyoqCisgICogQH0KKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX1NQSV9EZUluaXQoU1BJX1R5cGVEZWYgKlNQSXgpOworRXJyb3JTdGF0dXMgTExfU1BJX0luaXQoU1BJX1R5cGVEZWYgKlNQSXgsIExMX1NQSV9Jbml0VHlwZURlZiAqU1BJX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfU1BJX1N0cnVjdEluaXQoTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTUElfSTJTX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIEkyU19MTCBJMlMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEkyU19MTF9FU19JTklUIEkyUyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSTJTIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBJMlMgb3BlcmF0aW5nIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0xMX0VDX01PREUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXRUcmFuc2Zlck1vZGUoKS4qLworCisgIHVpbnQzMl90IFN0YW5kYXJkOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc3RhbmRhcmQgdXNlZCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19MTF9FQ19TVEFOREFSRAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJTX1NldFN0YW5kYXJkKCkuKi8KKworCisgIHVpbnQzMl90IERhdGFGb3JtYXQ7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZGF0YSBmb3JtYXQgZm9yIHRoZSBJMlMgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfTExfRUNfREFUQV9GT1JNQVQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXREYXRhRm9ybWF0KCkuKi8KKworCisgIHVpbnQzMl90IE1DTEtPdXRwdXQ7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBJMlMgTUNMSyBvdXRwdXQgaXMgZW5hYmxlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0xMX0VDX01DTEtfT1VUUFVUCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfSTJTX0VuYWJsZU1hc3RlckNsb2NrKCkgb3IgQHJlZiBMTF9JMlNfRGlzYWJsZU1hc3RlckNsb2NrLiovCisKKworICB1aW50MzJfdCBBdWRpb0ZyZXE7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZyZXF1ZW5jeSBzZWxlY3RlZCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19MTF9FQ19BVURJT19GUkVRCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW8gRnJlcXVlbmN5IGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIFJlZmVyZW5jZSBtYW51YWwgZm9ybXVsYXMgdG8gY2FsY3VsYXRlIFByZXNjYWxlciBMaW5lYXIsIFBhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9JMlNfU2V0UHJlc2NhbGVyTGluZWFyKCkgYW5kIEByZWYgTExfSTJTX1NldFByZXNjYWxlclBhcml0eSgpIHRvIHNldCBpdC4qLworCisKKyAgdWludDMyX3QgQ2xvY2tQb2xhcml0eTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpZGxlIHN0YXRlIG9mIHRoZSBJMlMgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0xMX0VDX1BPTEFSSVRZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMlNfU2V0Q2xvY2tQb2xhcml0eSgpLiovCisKK30gTExfSTJTX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBJMlMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0kyU19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX1JYTkUgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfUlhORSAgICAgICAgICAgIC8qITwgUnggYnVmZmVyIG5vdCBlbXB0eSBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX1RYRSAgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfVFhFICAgICAgICAgICAgIC8qITwgVHggYnVmZmVyIGVtcHR5IGZsYWcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX0JTWSAgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfQlNZICAgICAgICAgICAgIC8qITwgQnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX1VEUiAgICAgICAgICAgICAgICAgICAgICBTUElfU1JfVURSICAgICAgICAgICAgICAgIC8qITwgVW5kZXJydW4gZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX09WUiAgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfT1ZSICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBmbGFnICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX0ZSRSAgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfRlJFICAgICAgICAgICAgIC8qITwgVEkgbW9kZSBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1NQSV9SZWFkUmVnIGFuZCAgTExfU1BJX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyU19DUjJfUlhORUlFICAgICAgICAgICAgICAgICAgTExfU1BJX0NSMl9SWE5FSUUgICAgICAgICAvKiE8IFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9JMlNfQ1IyX1RYRUlFICAgICAgICAgICAgICAgICAgIExMX1NQSV9DUjJfVFhFSUUgICAgICAgICAgLyohPCBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0NSMl9FUlJJRSAgICAgICAgICAgICAgICAgICBMTF9TUElfQ1IyX0VSUklFICAgICAgICAgIC8qITwgRXJyb3IgaW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19EQVRBX0ZPUk1BVCBEYXRhIGZvcm1hdAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyU19EQVRBRk9STUFUXzE2QiAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggMTYgYml0cywgQ2hhbm5lbCBsZW5naHQgMTZiaXQgKi8KKyNkZWZpbmUgTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVEICAgICAoU1BJX0kyU0NGR1JfQ0hMRU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCAxNiBiaXRzLCBDaGFubmVsIGxlbmdodCAzMmJpdCAqLworI2RlZmluZSBMTF9JMlNfREFUQUZPUk1BVF8yNEIgICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9DSExFTiB8IFNQSV9JMlNDRkdSX0RBVExFTl8wKSAgICAvKiE8IERhdGEgbGVuZ3RoIDI0IGJpdHMsIENoYW5uZWwgbGVuZ2h0IDMyYml0ICovCisjZGVmaW5lIExMX0kyU19EQVRBRk9STUFUXzMyQiAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0NITEVOIHwgU1BJX0kyU0NGR1JfREFUTEVOXzEpICAgIC8qITwgRGF0YSBsZW5ndGggMTYgYml0cywgQ2hhbm5lbCBsZW5naHQgMzJiaXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX1BPTEFSSVRZIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgQ2xvY2sgc3RlYWR5IHN0YXRlIGlzIGxvdyBsZXZlbCAgKi8KKyNkZWZpbmUgTExfSTJTX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfQ0tQT0wpICAgICAgIC8qITwgQ2xvY2sgc3RlYWR5IHN0YXRlIGlzIGhpZ2ggbGV2ZWwgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX1NUQU5EQVJEIEkycyBTdGFuZGFyZAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9QSElMSVBTICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEkyUyBzdGFuZGFyZCBwaGlsaXBzICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9NU0IgICAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU1NURF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1TQiBqdXN0aWZpZWQgc3RhbmRhcmQgKGxlZnQganVzdGlmaWVkKSAgICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9MU0IgICAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU1NURF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IExTQiBqdXN0aWZpZWQgc3RhbmRhcmQgKHJpZ2h0IGp1c3RpZmllZCkgICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9QQ01fU0hPUlQgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU1NURF8wIHwgU1BJX0kyU0NGR1JfSTJTU1REXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBDTSBzdGFuZGFyZCwgc2hvcnQgZnJhbWUgc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9QQ01fTE9ORyAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU1NURF8wIHwgU1BJX0kyU0NGR1JfSTJTU1REXzEgfCBTUElfSTJTQ0ZHUl9QQ01TWU5DKSAvKiE8IFBDTSBzdGFuZGFyZCwgbG9uZyBmcmFtZSBzeW5jaHJvbml6YXRpb24gICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19NT0RFIE9wZXJhdGlvbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX01PREVfU0xBVkVfVFggICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSBUeCBjb25maWd1cmF0aW9uICAqLworI2RlZmluZSBMTF9JMlNfTU9ERV9TTEFWRV9SWCAgICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9JMlNDRkdfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNsYXZlIFJ4IGNvbmZpZ3VyYXRpb24gICovCisjZGVmaW5lIExMX0kyU19NT0RFX01BU1RFUl9UWCAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU0NGR18xKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFzdGVyIFR4IGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTExfSTJTX01PREVfTUFTVEVSX1JYICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfSTJTQ0ZHXzAgfCBTUElfSTJTQ0ZHUl9JMlNDRkdfMSkgLyohPCBNYXN0ZXIgUnggY29uZmlndXJhdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfUFJFU0NBTEVSX0ZBQ1RPUiBQcmVzY2FsZXIgRmFjdG9yCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfRVZFTiAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgT2RkIGZhY3RvcjogUmVhbCBkaXZpZGVyIHZhbHVlIGlzID0gIEkyU0RJViAqIDIgICAgKi8KKyNkZWZpbmUgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfT0REICAgICAgICAoU1BJX0kyU1BSX09ERCA+PiA4VSkgICAgIC8qITwgT2RkIGZhY3RvcjogUmVhbCBkaXZpZGVyIHZhbHVlIGlzID0gKEkyU0RJViAqIDIpKzEgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfTUNMS19PVVRQVVQgTUNMSyBPdXRwdXQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMlNfTUNMS19PVVRQVVRfRElTQUJMRSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgY2xvY2sgb3V0cHV0IGlzIGRpc2FibGVkICovCisjZGVmaW5lIExMX0kyU19NQ0xLX09VVFBVVF9FTkFCTEUgICAgICAgICAgKFNQSV9JMlNQUl9NQ0tPRSkgICAgICAgICAvKiE8IE1hc3RlciBjbG9jayBvdXRwdXQgaXMgZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX0FVRElPX0ZSRVEgQXVkaW8gRnJlcXVlbmN5CisgICogQHsKKyAgKi8KKworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzE5MksgICAgICAgICAgICAgIDE5MjAwMFUgICAgICAgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAxOTIwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV85NksgICAgICAgICAgICAgICA5NjAwMFUgICAgICAgIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDk2MDAwIEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfNDhLICAgICAgICAgICAgICAgNDgwMDBVICAgICAgICAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICA0ODAwMCBIeiAgICAgICAqLworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzQ0SyAgICAgICAgICAgICAgIDQ0MTAwVSAgICAgICAgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgNDQxMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8zMksgICAgICAgICAgICAgICAzMjAwMFUgICAgICAgIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDMyMDAwIEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfMjJLICAgICAgICAgICAgICAgMjIwNTBVICAgICAgICAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICAyMjA1MCBIeiAgICAgICAqLworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzE2SyAgICAgICAgICAgICAgIDE2MDAwVSAgICAgICAgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMTYwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8xMUsgICAgICAgICAgICAgICAxMTAyNVUgICAgICAgIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDExMDI1IEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfOEsgICAgICAgICAgICAgICAgODAwMFUgICAgICAgICAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICAgODAwMCBIeiAgICAgICAqLworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRX0RFRkFVTFQgICAgICAgICAgIDJVICAgICAgICAgICAgLyohPCBBdWRpbyBGcmVxIG5vdCBzcGVjaWZpZWQuIFJlZ2lzdGVyIEkyU0RJViA9IDIgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyU19MTF9FeHBvcnRlZF9NYWNyb3MgSTJTIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gSTJTIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gSTJTIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9JMlNfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBJMlMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJMlMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfSTJTX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBJMlMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgSTJTIG1vZGUgYW5kIEVuYWJsZSBJMlMgcGVyaXBoZXJhbAorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU01PRCAgICAgICAgTExfSTJTX0VuYWJsZVxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgSTJTRSAgICAgICAgICBMTF9JMlNfRW5hYmxlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNNT0QgfCBTUElfSTJTQ0ZHUl9JMlNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEkyUyBwZXJpcGhlcmFsCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTRSAgICAgICAgICBMTF9JMlNfRGlzYWJsZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTTU9EIHwgU1BJX0kyU0NGR1JfSTJTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSTJTIHBlcmlwaGVyYWwgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU0UgICAgICAgICAgTExfSTJTX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNFKSA9PSAoU1BJX0kyU0NGR1JfSTJTRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSTJTIGRhdGEgZnJhbWUgbGVuZ3RoCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgREFUTEVOICAgICAgICBMTF9JMlNfU2V0RGF0YUZvcm1hdFxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgQ0hMRU4gICAgICAgICBMTF9JMlNfU2V0RGF0YUZvcm1hdAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8xNkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8xNkJfRVhURU5ERUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8yNEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8zMkIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19TZXREYXRhRm9ybWF0KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBEYXRhRm9ybWF0KQoreworICBNT0RJRllfUkVHKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOLCBEYXRhRm9ybWF0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIGRhdGEgZnJhbWUgbGVuZ3RoCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgREFUTEVOICAgICAgICBMTF9JMlNfR2V0RGF0YUZvcm1hdFxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgQ0hMRU4gICAgICAgICBMTF9JMlNfR2V0RGF0YUZvcm1hdAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMTZCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMjRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMzJCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldERhdGFGb3JtYXQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEkyUyBjbG9jayBwb2xhcml0eQorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIENLUE9MICAgICAgICAgTExfSTJTX1NldENsb2NrUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQ2xvY2tQb2xhcml0eSkKK3sKKyAgU0VUX0JJVChTUEl4LT5JMlNDRkdSLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIGNsb2NrIHBvbGFyaXR5CisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgQ0tQT0wgICAgICAgICBMTF9JMlNfR2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9ISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldENsb2NrUG9sYXJpdHkoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0NLUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEkyUyBzdGFuZGFyZCBwcm90b2NvbAorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU1NURCAgICAgICAgTExfSTJTX1NldFN0YW5kYXJkXG4KKyAgKiAgICAgICAgIEkyU0NGR1IgICAgICBQQ01TWU5DICAgICAgIExMX0kyU19TZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN0YW5kYXJkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX1BISUxJUFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfTVNCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX0xTQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QQ01fU0hPUlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX0xPTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19TZXRTdGFuZGFyZChTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgU3RhbmRhcmQpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTU1REIHwgU1BJX0kyU0NGR1JfUENNU1lOQywgU3RhbmRhcmQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJMlMgc3RhbmRhcmQgcHJvdG9jb2wKKyAgKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNTVEQgICAgICAgIExMX0kyU19HZXRTdGFuZGFyZFxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgUENNU1lOQyAgICAgICBMTF9JMlNfR2V0U3RhbmRhcmQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QSElMSVBTCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX01TQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9MU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX1BDTV9MT05HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFN0YW5kYXJkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNTVEQgfCBTUElfSTJTQ0ZHUl9QQ01TWU5DKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEkyUyB0cmFuc2ZlciBtb2RlCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTQ0ZHICAgICAgICBMTF9JMlNfU2V0VHJhbnNmZXJNb2RlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX1NMQVZFX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfU0xBVkVfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfUlgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19TZXRUcmFuc2Zlck1vZGUoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IE1vZGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTQ0ZHLCBNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIHRyYW5zZmVyIG1vZGUKKyAgKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNDRkcgICAgICAgIExMX0kyU19HZXRUcmFuc2Zlck1vZGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX1NMQVZFX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfU0xBVkVfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfUlgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfR2V0VHJhbnNmZXJNb2RlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNDRkcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSTJTIGxpbmVhciBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBJMlNESVYgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJMaW5lYXIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJMaW5lYXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAyIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0UHJlc2NhbGVyTGluZWFyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50OF90IFByZXNjYWxlckxpbmVhcikKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX0kyU0RJViwgUHJlc2NhbGVyTGluZWFyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIGxpbmVhciBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBJMlNESVYgICAgICAgIExMX0kyU19HZXRQcmVzY2FsZXJMaW5lYXIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBQcmVzY2FsZXJMaW5lYXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAyIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFByZXNjYWxlckxpbmVhcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9JMlNESVYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSTJTIHBhcml0eSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBPREQgICAgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJQYXJpdHkKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfT0RECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0UHJlc2NhbGVyUGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBQcmVzY2FsZXJQYXJpdHkpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9PREQsIFByZXNjYWxlclBhcml0eSA8PCA4VSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEkyUyBwYXJpdHkgcHJlc2NhbGVyCisgICogQHJtdG9sbCBJMlNQUiAgICAgICAgT0REICAgICAgICAgICBMTF9JMlNfR2V0UHJlc2NhbGVyUGFyaXR5CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfT0RECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFByZXNjYWxlclBhcml0eShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9PREQpID4+IDhVKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIG1hc3RlciBjbG9jayBvdXB1dCAoUGluIE1DSykKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBNQ0tPRSAgICAgICAgIExMX0kyU19FbmFibGVNYXN0ZXJDbG9jaworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVNYXN0ZXJDbG9jayhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX01DS09FKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBtYXN0ZXIgY2xvY2sgb3VwdXQgKFBpbiBNQ0spCisgICogQHJtdG9sbCBJMlNQUiAgICAgICAgTUNLT0UgICAgICAgICBMTF9JMlNfRGlzYWJsZU1hc3RlckNsb2NrCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0Rpc2FibGVNYXN0ZXJDbG9jayhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfTUNLT0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBtYXN0ZXIgY2xvY2sgb3VwdXQgKFBpbiBNQ0spIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBNQ0tPRSAgICAgICAgIExMX0kyU19Jc0VuYWJsZWRNYXN0ZXJDbG9jaworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkTWFzdGVyQ2xvY2soU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfTUNLT0UpID09IChTUElfSTJTUFJfTUNLT0UpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKFNQSV9JMlNDRkdSX0FTVFJURU4pCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhc3luY2hyb25vdXMgc3RhcnQKKyAgKiBAcm10b2xsIEkyU0NGR1IgICAgICBBU1RSVEVOICAgICAgIExMX0kyU19FbmFibGVBc3luY1N0YXJ0CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZUFzeW5jU3RhcnQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfQVNUUlRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSAgYXN5bmNocm9ub3VzIHN0YXJ0CisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgQVNUUlRFTiAgICAgICBMTF9JMlNfRGlzYWJsZUFzeW5jU3RhcnQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZUFzeW5jU3RhcnQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9BU1RSVEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBhc3luY2hyb25vdXMgc3RhcnQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEFTVFJURU4gICAgICAgTExfSTJTX0lzRW5hYmxlZEFzeW5jU3RhcnQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZEFzeW5jU3RhcnQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0FTVFJURU4pID09IChTUElfSTJTQ0ZHUl9BU1RSVEVOKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNQSV9JMlNDRkdSX0FTVFJURU4gKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUZfRkxBRyBGTEFHIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJ4IGJ1ZmZlciBpcyBub3QgZW1wdHkKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBSWE5FICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNBY3RpdmVGbGFnX1JYTkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHggYnVmZmVyIGlzIGVtcHR5CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgVFhFICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNBY3RpdmVGbGFnX1RYRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBidXN5IGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBCU1kgICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfQlNZCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfQlNZKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzQWN0aXZlRmxhZ19CU1koU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IG92ZXJydW4gZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIE9WUiAgICAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19PVlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19PVlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX09WUihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdW5kZXJydW4gZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIFVEUiAgICAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19VRFIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19VRFIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfVURSKSA9PSAoU1BJX1NSX1VEUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfRlJFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfRlJFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzQWN0aXZlRmxhZ19GUkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNoYW5uZWwgc2lkZSBmbGFnLgorICAqIEBub3RlICAgMDogQ2hhbm5lbCBMZWZ0IGhhcyB0byBiZSB0cmFuc21pdHRlZCBvciBoYXMgYmVlbiByZWNlaXZlZFxuCisgICogICAgICAgICAxOiBDaGFubmVsIFJpZ2h0IGhhcyB0byBiZSB0cmFuc21pdHRlZCBvciBoYXMgYmVlbiByZWNlaXZlZFxuCisgICogICAgICAgICBJdCBoYXMgbm8gc2lnbmlmaWNhbmNlIGluIFBDTSBtb2RlLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENIU0lERSAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19DSFNJREUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19DSFNJREUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfQ0hTSURFKSA9PSAoU1BJX1NSX0NIU0lERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBvdmVycnVuIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBPVlIgICAgICAgICAgIExMX0kyU19DbGVhckZsYWdfT1ZSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0NsZWFyRmxhZ19PVlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9DbGVhckZsYWdfT1ZSKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHVuZGVycnVuIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBVRFIgICAgICAgICAgIExMX0kyU19DbGVhckZsYWdfVURSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0NsZWFyRmxhZ19VRFIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICB0bXByZWcgPSBTUEl4LT5TUjsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgRlJFICAgICAgICAgICBMTF9JMlNfQ2xlYXJGbGFnX0ZSRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19DbGVhckZsYWdfRlJFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfQ2xlYXJGbGFnX0ZSRShTUEl4KTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUZfSVQgSW50ZXJydXB0IE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBlcnJvciBJVAorICAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IgY29uZGl0aW9uIG9jY3VycyAoT1ZSLCBVRFIgYW5kIEZSRSBpbiBJMlMgbW9kZSkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9JMlNfRW5hYmxlSVRfRVJSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0VuYWJsZUlUX0VSUihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUnggYnVmZmVyIG5vdCBlbXB0eSBJVAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfSTJTX0VuYWJsZUlUX1JYTkUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0VuYWJsZUlUX1JYTkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFR4IGJ1ZmZlciBlbXB0eSBJVAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRUlFICAgICAgICAgTExfSTJTX0VuYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVJVF9UWEUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9FbmFibGVJVF9UWEUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBlcnJvciBJVAorICAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IgY29uZGl0aW9uIG9jY3VycyAoT1ZSLCBVRFIgYW5kIEZSRSBpbiBJMlMgbW9kZSkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9JMlNfRGlzYWJsZUlUX0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRGlzYWJsZUlUX0VSUihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgSVQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX0kyU19EaXNhYmxlSVRfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0Rpc2FibGVJVF9SWE5FKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVHggYnVmZmVyIGVtcHR5IElUCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9JMlNfRGlzYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRGlzYWJsZUlUX1RYRShTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFUlIgSVQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJTX0lzRW5hYmxlZElUX0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZElUX0VSUihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSWE5FIElUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX0kyU19Jc0VuYWJsZWRJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZElUX1JYTkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVFhFIElUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWEVJRSAgICAgICAgIExMX0kyU19Jc0VuYWJsZWRJVF9UWEUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZElUX1RYRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIExMX1NQSV9Jc0VuYWJsZWRJVF9UWEUoU1BJeCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0RNQSBETUEgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBSeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfSTJTX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9FbmFibGVETUFSZXFfUlgoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgUngKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWERNQUVOICAgICAgIExMX0kyU19EaXNhYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0Rpc2FibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9EaXNhYmxlRE1BUmVxX1JYKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBSeCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9JMlNfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1JYKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgVHgKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX0kyU19FbmFibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRW5hYmxlRE1BUmVxX1RYKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIFR4CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9JMlNfRGlzYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRGlzYWJsZURNQVJlcV9UWChTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgVHggaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfSTJTX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZERNQVJlcV9UWChTUEl4KTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUZfREFUQSBEQVRBIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgMTYtQml0cyBpbiBkYXRhIHJlZ2lzdGVyCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9JMlNfUmVjZWl2ZURhdGExNgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJ4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfSTJTX1JlY2VpdmVEYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfUmVjZWl2ZURhdGExNihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSAxNi1CaXRzIGluIGRhdGEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0kyU19UcmFuc21pdERhdGExNgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfVHJhbnNtaXREYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQxNl90IFR4RGF0YSkKK3sKKyAgTExfU1BJX1RyYW5zbWl0RGF0YTE2KFNQSXgsIFR4RGF0YSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0kyU19EZUluaXQoU1BJX1R5cGVEZWYgKlNQSXgpOworRXJyb3JTdGF0dXMgTExfSTJTX0luaXQoU1BJX1R5cGVEZWYgKlNQSXgsIExMX0kyU19Jbml0VHlwZURlZiAqSTJTX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfSTJTX1N0cnVjdEluaXQoTExfSTJTX0luaXRUeXBlRGVmICpJMlNfSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9JMlNfQ29uZmlnUHJlc2NhbGVyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBQcmVzY2FsZXJMaW5lYXIsIHVpbnQzMl90IFByZXNjYWxlclBhcml0eSk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1BJX0kyU19TVVBQT1JUICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChTUEkxKSB8fCBkZWZpbmVkIChTUEkyKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0xMX1NQSV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2xsX3N5c3RlbS5oIGIvSW5jL3N0bTMybDB4eF9sbF9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGQyY2EyCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9sbF9zeXN0ZW0uaApAQCAtMCwwICsxLDEwODkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfc3lzdGVtLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNZU1RFTSBMTCBtb2R1bGUuCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBMTCBTWVNURU0gZHJpdmVyIGNvbnRhaW5zIGEgc2V0IG9mIGdlbmVyaWMgQVBJcyB0aGF0IGNhbiBiZQorICAgIHVzZWQgYnkgdXNlcjoKKyAgICAgICgrKSBTb21lIG9mIHRoZSBGTEFTSCBmZWF0dXJlcyBuZWVkIHRvIGJlIGhhbmRsZWQgaW4gdGhlIFNZU1RFTSBmaWxlLgorICAgICAgKCspIEFjY2VzcyB0byBEQkdDTVUgcmVnaXN0ZXJzCisgICAgICAoKykgQWNjZXNzIHRvIFNZU0NGRyByZWdpc3RlcnMKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyTDB4eF9MTF9TWVNURU1fSAorI2RlZmluZSBfX1NUTTMyTDB4eF9MTF9TWVNURU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKEZMQVNIKSB8fCBkZWZpbmVkIChTWVNDRkcpIHx8IGRlZmluZWQgKERCR01DVSkKKworLyoqIEBkZWZncm91cCBTWVNURU1fTEwgU1lTVEVNCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9Qcml2YXRlX0NvbnN0YW50cyBTWVNURU0gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiBQb3dlci1kb3duIGluIFJ1biBtb2RlIEZsYXNoIGtleQorICovCisjZGVmaW5lIEZMQVNIX1BES0VZMSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwNDE1MjYzN1UpIC8qITwgRmxhc2ggcG93ZXIgZG93biBrZXkxICovCisjZGVmaW5lIEZMQVNIX1BES0VZMiAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHhGQUZCRkNGRFUpIC8qITwgRmxhc2ggcG93ZXIgZG93biBrZXkyOiB1c2VkIHdpdGggRkxBU0hfUERLRVkxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdW5sb2NrIHRoZSBSVU5fUEQgYml0IGluIEZMQVNIX0FDUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBTWVNURU0gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfUkVNQVAgU1lTQ0ZHIE1lbW9yeSBSZW1hcAorKiBAeworKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX0ZMQVNIICAgICAgICAgICAgICAodWludDMyX3QpMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gRmxhc2ggbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfUkVNQVBfU1lTVEVNRkxBU0ggICAgICAgIFNZU0NGR19DRkdSMV9NRU1fTU9ERV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3lzdGVtIEZsYXNoIG1lbW9yeSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NZU0NGR19SRU1BUF9TUkFNICAgICAgICAgICAgICAgKFNZU0NGR19DRkdSMV9NRU1fTU9ERV8xIHwgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzApICAgLyohPCBTUkFNIG1hcHBlZCBhdCAweDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX1VGQikKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0JBTktNT0RFIFNZU0NGRyBCYW5rIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfQkFOS01PREVfQkFOSzEgICAgICAgICAgICh1aW50MzJfdCkweDAwMDAwMDAwVSAgICAgLyohPCBGbGFzaCBCYW5rMSBtYXBwZWQgYXQgMHgwODAwMDAwMCAoYW5kIGFsaWFzZWQgYXQgMHgwMDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYXNoIEJhbmsyIG1hcHBlZCBhdCAweDA4MDE4MDAwIChhbmQgYWxpYXNlZCBhdCAweDAwMDE4MDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSBFRVBST00gQmFuazEgbWFwcGVkIGF0IDB4MDgwODAwMDAgKGFuZCBhbGlhc2VkIGF0IDB4MDAwODAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhIEVFUFJPTSBCYW5rMiBtYXBwZWQgYXQgMHgwODA4MEMwMCAoYW5kIGFsaWFzZWQgYXQgMHgwMDA4MEMwMCkgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0JBTktNT0RFX0JBTksyICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfVUZCICAgICAgICAgIC8qITwgRmxhc2ggQmFuazIgbWFwcGVkIGF0IDB4MDgwMDAwMDAgKGFuZCBhbGlhc2VkIGF0IDB4MDAwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFzaCBCYW5rMSBtYXBwZWQgYXQgMHgwODAxODAwMCAoYW5kIGFsaWFzZWQgYXQgMHgwMDAxODAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgRUVQUk9NIEJhbmsyIG1hcHBlZCBhdCAweDA4MDgwMDAwIChhbmQgYWxpYXNlZCBhdCAweDAwMDgwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSBFRVBST00gQmFuazEgbWFwcGVkIGF0IDB4MDgwODBDMDAgKGFuZCBhbGlhc2VkIGF0IDB4MDAwODBDMDApICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX1VGQiAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19CT09UTU9ERSBTWVNDRkcgQm9vdCBNb2RlCisqIEB7CisqLworI2RlZmluZSBMTF9TWVNDRkdfQk9PVE1PREVfRkxBU0ggICAgICAgICAgICh1aW50MzJfdCkweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBGbGFzaCBtZW1vcnkgYm9vdCBtb2RlICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfQk9PVE1PREVfU1lTVEVNRkxBU0ggICAgIFNZU0NGR19DRkdSMV9CT09UX01PREVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3lzdGVtIEZsYXNoIG1lbW9yeSBib290IG1vZGUgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfQk9PVE1PREVfU1JBTSAgICAgICAgICAgIChTWVNDRkdfQ0ZHUjFfQk9PVF9NT0RFXzEgfCBTWVNDRkdfQ0ZHUjFfQk9PVF9NT0RFXzApIC8qITwgU1JBTSBib290IG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjJfQ0FQQSkKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0NGR1IyIFNZU0NGRyBWTENEIFJhaWwgQ29ubmVjdGlvbgorICAqIEB7CisgICovCisKKyNkZWZpbmUgTExfU1lTQ0ZHX0NBUEFfVkxDRDJfUEIyICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfQ0FQQV8wICAgICAgIC8qITwgQ29ubmVjdCBQQjIgIHBpbiB0byBMQ0RfVkxDRDIgcmFpbHMgc3VwcGx5IHZvbHRhZ2UgICovCisjZGVmaW5lIExMX1NZU0NGR19DQVBBX1ZMQ0QxX1BCMTIgICAgICAgICAgU1lTQ0ZHX0NGR1IyX0NBUEFfMSAgICAgICAvKiE8IENvbm5lY3QgUEIxMiBwaW4gdG8gTENEX1ZMQ0QxIHJhaWxzIHN1cHBseSB2b2x0YWdlICAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0FQQV9WTENEM19QQjAgICAgICAgICAgIFNZU0NGR19DRkdSMl9DQVBBXzIgICAgICAgLyohPCBDb25uZWN0IFBCMCAgcGluIHRvIExDRF9WTENEMyByYWlscyBzdXBwbHkgdm9sdGFnZSAgKi8KKyNpZiBkZWZpbmVkIChTWVNDRkdfQ0ZHUjJfQ0FQQV8zKQorI2RlZmluZSBMTF9TWVNDRkdfQ0FQQV9WTENEMV9QRTExICAgICAgICAgIFNZU0NGR19DRkdSMl9DQVBBXzMgICAgICAgLyohPCBDb25uZWN0IFBFMTEgcGluIHRvIExDRF9WTENEMSByYWlscyBzdXBwbHkgdm9sdGFnZSAgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjJfQ0FQQV8zICovCisjaWYgZGVmaW5lZCAoU1lTQ0ZHX0NGR1IyX0NBUEFfNCkKKyNkZWZpbmUgTExfU1lTQ0ZHX0NBUEFfVkxDRDNfUEUxMiAgICAgICAgICBTWVNDRkdfQ0ZHUjJfQ0FQQV80ICAgICAgIC8qITwgQ29ubmVjdCBQRTEyIHBpbiB0byBMQ0RfVkxDRDMgcmFpbHMgc3VwcGx5IHZvbHRhZ2UgICovCisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IyX0NBUEFfNCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjJfQ0FQQSAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19JMkNfRkFTVE1PREVQTFVTIFNZU0NGRyBJMkMgRkFTVE1PREVQTFVTCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI2ICAgICBTWVNDRkdfQ0ZHUjJfSTJDX1BCNl9GTVAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCNiAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjcgICAgIFNZU0NGR19DRkdSMl9JMkNfUEI3X0ZNUCAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEI3ICAgICAgICovCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOCAgICAgU1lTQ0ZHX0NGR1IyX0kyQ19QQjhfRk1QICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjggICAgICAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI5ICAgICBTWVNDRkdfQ0ZHUjJfSTJDX1BCOV9GTVAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCOSAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxICAgIFNZU0NGR19DRkdSMl9JMkMxX0ZNUCAgICAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gSTJDMSBwaW5zICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjJfSTJDMl9GTVApCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzIgICAgU1lTQ0ZHX0NGR1IyX0kyQzJfRk1QICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBJMkMyIHBpbnMgKi8KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjJfSTJDMl9GTVAgKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkMzX0ZNUCkKKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMyAgICBTWVNDRkdfQ0ZHUjJfSTJDM19GTVAgICAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIEkyQzMgcGlucyAqLworI2VuZGlmIC8qIFNZU0NGR19DRkdSMl9JMkMzX0ZNUCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfVlJFRklOVF9DT05UUk9MIFNZU0NGRyBWUkVGSU5UIENvbnRyb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfVlJFRklOVF9DT05ORUNUX05PTkUgICAgICAgICh1aW50MzJfdCkweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE5vIHBhZCBjb25uZWN0ZWQgdG8gVlJFRklOVF9BREMgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1ZSRUZJTlRfQ09OTkVDVF9JTzEgICAgICAgICBTWVNDRkdfQ0ZHUjNfVlJFRl9PVVRfMCAgICAgICAgICAgLyohPCBQQjAgY29ubmVjdGVkIHRvIFZSRUZJTlRfQURDICovCisjZGVmaW5lIExMX1NZU0NGR19WUkVGSU5UX0NPTk5FQ1RfSU8yICAgICAgICAgU1lTQ0ZHX0NGR1IzX1ZSRUZfT1VUXzEgICAgICAgICAgIC8qITwgUEIxIGNvbm5lY3RlZCB0byBWUkVGSU5UX0FEQyAqLworI2RlZmluZSBMTF9TWVNDRkdfVlJFRklOVF9DT05ORUNUX0lPMV9JTzIgICAgIChTWVNDRkdfQ0ZHUjNfVlJFRl9PVVRfMCB8IFNZU0NGR19DRkdSM19WUkVGX09VVF8xKSAgIC8qITwgUEIwIGFuZCBQQjEgY29ubmVjdGVkIHRvIFZSRUZJTlRfQURDICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19FWFRJX1BPUlQgU1lTQ0ZHIEVYVEkgUG9ydAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX1BPUlRBICAgICAgICAgICAgICAgKHVpbnQzMl90KTBVICAgICAgICAgICAgICAvKiE8IEVYVEkgUE9SVCBBICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX1BPUlRCICAgICAgICAgICAgICAgKHVpbnQzMl90KTFVICAgICAgICAgICAgICAvKiE8IEVYVEkgUE9SVCBCICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX1BPUlRDICAgICAgICAgICAgICAgKHVpbnQzMl90KTJVICAgICAgICAgICAgICAvKiE8IEVYVEkgUE9SVCBDICovCisjaWYgZGVmaW5lZChHUElPRF9CQVNFKQorI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JURCAgICAgICAgICAgICAgICh1aW50MzJfdCkzVSAgICAgICAgICAgICAgLyohPCBFWFRJIFBPUlQgRCAqLworI2VuZGlmIC8qR1BJT0RfQkFTRSovCisjaWYgZGVmaW5lZChHUElPRV9CQVNFKQorI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JURSAgICAgICAgICAgICAgICh1aW50MzJfdCk0VSAgICAgICAgICAgICAgLyohPCBFWFRJIFBPUlQgRSAqLworI2VuZGlmIC8qR1BJT0VfQkFTRSovCisjaWYgZGVmaW5lZChHUElPSF9CQVNFKQorI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUSCAgICAgICAgICAgICAgICh1aW50MzJfdCk1VSAgICAgICAgICAgICAgLyohPCBFWFRJIFBPUlQgSCAqLworI2VuZGlmIC8qR1BJT0hfQkFTRSovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19FWFRJX0xJTkUgU1lTQ0ZHIEVYVEkgTGluZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUwICAgICAgICAgICAgICAgKHVpbnQzMl90KSgwVSAgPDwgMTZVIHwgMFUpICAvKiE8IEVYVElfUE9TSVRJT05fMCAgfCBFWFRJQ1JbMF0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEgICAgICAgICAgICAgICAodWludDMyX3QpKDRVICA8PCAxNlUgfCAwVSkgIC8qITwgRVhUSV9QT1NJVElPTl80ICB8IEVYVElDUlswXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMiAgICAgICAgICAgICAgICh1aW50MzJfdCkoOFUgIDw8IDE2VSB8IDBVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzggIHwgRVhUSUNSWzBdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUzICAgICAgICAgICAgICAgKHVpbnQzMl90KSgxMlUgPDwgMTZVIHwgMFUpICAvKiE8IEVYVElfUE9TSVRJT05fMTIgfCBFWFRJQ1JbMF0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTQgICAgICAgICAgICAgICAodWludDMyX3QpKDBVICA8PCAxNlUgfCAxVSkgIC8qITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FNSAgICAgICAgICAgICAgICh1aW50MzJfdCkoNFUgIDw8IDE2VSB8IDFVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzQgIHwgRVhUSUNSWzFdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkU2ICAgICAgICAgICAgICAgKHVpbnQzMl90KSg4VSAgPDwgMTZVIHwgMVUpICAvKiE8IEVYVElfUE9TSVRJT05fOCAgfCBFWFRJQ1JbMV0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTcgICAgICAgICAgICAgICAodWludDMyX3QpKDEyVSA8PCAxNlUgfCAxVSkgIC8qITwgRVhUSV9QT1NJVElPTl8xMiB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FOCAgICAgICAgICAgICAgICh1aW50MzJfdCkoMFUgIDw8IDE2VSB8IDJVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzAgIHwgRVhUSUNSWzJdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkU5ICAgICAgICAgICAgICAgKHVpbnQzMl90KSg0VSAgPDwgMTZVIHwgMlUpICAvKiE8IEVYVElfUE9TSVRJT05fNCAgfCBFWFRJQ1JbMl0gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEwICAgICAgICAgICAgICAodWludDMyX3QpKDhVICA8PCAxNlUgfCAyVSkgIC8qITwgRVhUSV9QT1NJVElPTl84ICB8IEVYVElDUlsyXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTEgICAgICAgICAgICAgICh1aW50MzJfdCkoMTJVIDw8IDE2VSB8IDJVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzEyIHwgRVhUSUNSWzJdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUxMiAgICAgICAgICAgICAgKHVpbnQzMl90KSgwVSAgPDwgMTZVIHwgM1UpICAvKiE8IEVYVElfUE9TSVRJT05fMCAgfCBFWFRJQ1JbM10gKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0VYVElfTElORTEzICAgICAgICAgICAgICAodWludDMyX3QpKDRVICA8PCAxNlUgfCAzVSkgIC8qITwgRVhUSV9QT1NJVElPTl80ICB8IEVYVElDUlszXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTQgICAgICAgICAgICAgICh1aW50MzJfdCkoOFUgIDw8IDE2VSB8IDNVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzggIHwgRVhUSUNSWzNdICovCisjZGVmaW5lIExMX1NZU0NGR19FWFRJX0xJTkUxNSAgICAgICAgICAgICAgKHVpbnQzMl90KSgxMlUgPDwgMTZVIHwgM1UpICAvKiE8IEVYVElfUE9TSVRJT05fMTIgfCBFWFRJQ1JbM10gKi8KKy8qKgorICAqIEB9CisgICovCisKKworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19BUEIxX0dSUDFfU1RPUF9JUCBEQkdNQ1UgQVBCMSBHUlAxIFNUT1AgSVAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTJfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19USU0yX1NUT1AgICAgLyohPCBUSU0yIGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjaWYgZGVmaW5lZChUSU0zKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19USU0zX1NUT1AgICAgLyohPCBUSU0zIGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjZW5kaWYgLypUSU0zKi8KKyNpZiBkZWZpbmVkKFRJTTYpCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNl9TVE9QICAgICAgREJHTUNVX0FQQjFfRlpfREJHX1RJTTZfU1RPUCAgICAvKiE8IFRJTTYgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKlRJTTYqLworI2lmIGRlZmluZWQoVElNNykKKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9USU03X1NUT1AgICAgICBEQkdNQ1VfQVBCMV9GWl9EQkdfVElNN19TVE9QICAgIC8qITwgVElNNyBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2VuZGlmIC8qVElNNyovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1AgICAgICAgREJHTUNVX0FQQjFfRlpfREJHX1JUQ19TVE9QICAgICAvKiE8IFJUQyBDYWxlbmRhciBmcm96ZW4gd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19XV0RHX1NUT1AgICAgLyohPCBEZWJ1ZyBXaW5kb3cgV2F0Y2hkb2cgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QICAgICAgREJHTUNVX0FQQjFfRlpfREJHX0lXREdfU1RPUCAgICAvKiE8IERlYnVnIEluZGVwZW5kZW50IFdhdGNoZG9nIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzFfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19JMkMxX1NUT1AgICAgLyohPCBJMkMxIFNNQlVTIHRpbWVvdXQgbW9kZSBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQgKi8KKyNpZiBkZWZpbmVkKEkyQzIpCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMl9TVE9QICAgICAgREJHTUNVX0FQQjFfRlpfREJHX0kyQzJfU1RPUCAgICAvKiE8IEkyQzIgU01CVVMgdGltZW91dCBtb2RlIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAqLworI2VuZGlmIC8qSTJDMiovCisjaWYgZGVmaW5lZChJMkMzKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzNfU1RPUCAgICAgIERCR01DVV9BUEIxX0ZaX0RCR19JMkMzX1NUT1AgICAgLyohPCBJMkMzIFNNQlVTIHRpbWVvdXQgbW9kZSBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKkkyQzMqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QICAgIERCR01DVV9BUEIxX0ZaX0RCR19MUFRJTUVSX1NUT1AgLyohPCBMUFRJTTEgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0FQQjJfR1JQMV9TVE9QX0lQIERCR01DVSBBUEIyIEdSUDEgU1RPUCBJUAorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChUSU0yMikKKyNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU0yMl9TVE9QICAgICBEQkdNQ1VfQVBCMl9GWl9EQkdfVElNMjJfU1RPUCAvKiE8IFRJTTIyIGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjZW5kaWYgLypUSU0yMiovCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMjFfU1RPUCAgICAgREJHTUNVX0FQQjJfRlpfREJHX1RJTTIxX1NUT1AgLyohPCBUSU0yMSBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfTEFURU5DWSBGTEFTSCBMQVRFTkNZCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV8wICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IEZMQVNIIFplcm8gTGF0ZW5jeSBjeWNsZSAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzEgICAgICAgICAgICAgICAgIEZMQVNIX0FDUl9MQVRFTkNZICAgICAgIC8qITwgRkxBU0ggT25lIExhdGVuY3kgY3ljbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgU1lTVEVNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VGX1NZU0NGRyBTWVNDRkcKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBtZW1vcnkgbWFwcGluZyBhdCBhZGRyZXNzIDB4MDAwMDAwMDAKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBNRU1fTU9ERSAgICAgIExMX1NZU0NGR19TZXRSZW1hcE1lbW9yeQorICAqIEBwYXJhbSAgTWVtb3J5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX0ZMQVNICisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX1NZU1RFTUZMQVNICisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX1NSQU0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRSZW1hcE1lbW9yeSh1aW50MzJfdCBNZW1vcnkpCit7CisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFLCBNZW1vcnkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBtZW1vcnkgbWFwcGluZyBhdCBhZGRyZXNzIDB4MDAwMDAwMDAKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBNRU1fTU9ERSAgICAgIExMX1NZU0NGR19HZXRSZW1hcE1lbW9yeQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfRkxBU0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfU1lTVEVNRkxBU0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfU1JBTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HZXRSZW1hcE1lbW9yeSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfTUVNX01PREUpKTsKK30KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX1VGQikKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IEZsYXNoIGJhbmsgbW9kZSAoQmFuayBmbGFzaGVkIGF0IDB4MDgwMDAwMDApCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgVUZCICAgICAgICAgICBMTF9TWVNDRkdfU2V0Rmxhc2hCYW5rTW9kZQorICAqIEBwYXJhbSAgQmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19CQU5LTU9ERV9CQU5LMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19CQU5LTU9ERV9CQU5LMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldEZsYXNoQmFua01vZGUodWludDMyX3QgQmFuaykKK3sKKyAgTU9ESUZZX1JFRyhTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfVUZCLCBCYW5rKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRmxhc2ggYmFuayBtb2RlIChCYW5rIGZsYXNoZWQgYXQgMHgwODAwMDAwMCkKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBVRkIgICAgICAgICAgIExMX1NZU0NGR19HZXRGbGFzaEJhbmtNb2RlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19CQU5LTU9ERV9CQU5LMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19CQU5LTU9ERV9CQU5LMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HZXRGbGFzaEJhbmtNb2RlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9VRkIpKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfQ0ZHUjFfVUZCICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IEJvb3QgbW9kZSBzZWxlY3RlZCBieSB0aGUgYm9vdCBwaW5zIHN0YXR1cyBiaXRzCisgICogQG5vdGUgICBJdCBpbmRpY2F0ZXMgdGhlIGJvb3QgbW9kZSBzZWxlY3RlZCBieSB0aGUgYm9vdCBwaW5zLiBCaXQgOQorICAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGNvbXBsZW1lbnQgb2YgbkJPT1QxIGJpdCBpbiB0aGUgRkxBU0hfT1BUUiByZWdpc3Rlci4KKyAgKiAgICAgICAgIEl0cyB2YWx1ZSBpcyBkZWZpbmVkIGluIHRoZSBvcHRpb24gYnl0ZXMuIEJpdCA4IGNvcnJlc3BvbmRzIHRvIHRoZQorICAqICAgICAgICAgdmFsdWUgc2FtcGxlZCBvbiB0aGUgQk9PVDAgcGluLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEJPT1RfTU9ERSAgICAgIExMX1NZU0NGR19HZXRCb290TW9kZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQk9PVE1PREVfRkxBU0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQk9PVE1PREVfU1lTVEVNRkxBU0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQk9PVE1PREVfU1JBTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HZXRCb290TW9kZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfQk9PVF9NT0RFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRmlyZXdhbGwgcHJvdGVjdGlvbiBlbmFibGVkCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgRldESVMgICAgICAgICBMTF9TWVNDRkdfRW5hYmxlRmlyZXdhbGwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVGaXJld2FsbCh2b2lkKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX0ZXRElTRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEZpcmV3YWxsIHByb3RlY3Rpb24gaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMiBGV0RJUyAgICAgICAgIExMX1NZU0NGR19Jc0VuYWJsZWRGaXJld2FsbAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRGaXJld2FsbCh2b2lkKQoreworICByZXR1cm4gIShSRUFEX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfRldESVNFTikgPT0gU1lTQ0ZHX0NGR1IyX0ZXRElTRU4pOworfQorCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjJfQ0FQQSkKKy8qKgorICAqIEBicmllZiAgU2V0IFZMQ0QgcmFpbCBjb25uZWN0aW9uIHRvIG9wdGlvbmFsIGV4dGVybmFsIGNhcGFjaXRvcgorICAqIEBub3RlICAgT25lIHRvIHRocmVlIGV4dGVybmFsIGNhcGFjaXRvcnMgY2FuIGJlIGNvbm5lY3RlZCB0byBwYWRzIHRvIGRvCisgICogICAgICAgICBWTENEIGJpYXNpbmcuCisgICogICAgICAgICAtIExDRF9WTENEMSByYWlsIGNhbiBiZSBjb25uZWN0ZWQgdG8gUEIxMiBvciBQRTExKCopLAorICAqICAgICAgICAgLSBMQ0RfVkxDRDIgcmFpbCBjYW4gYmUgY29ubmVjdGVkIHRvIFBCMiwKKyAgKiAgICAgICAgIC0gTENEX1ZMQ0QzIHJhaWwgY2FuIGJlIGNvbm5lY3RlZCB0byBQQjAgb3IgUEUxMigqKQorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIENBUEEgICAgICBMTF9TWVNDRkdfU2V0VkxDRFJhaWxDb25uZWN0aW9uCisgICogQHBhcmFtICBJb1BpbkNvbm5lY3QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NBUEFfVkxDRDFfUEIxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQVBBX1ZMQ0QxX1BFMTEoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0FQQV9WTENEMl9QQjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0FQQV9WTENEM19QQjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0FQQV9WTENEM19QRTEyKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldFZMQ0RSYWlsQ29ubmVjdGlvbih1aW50MzJfdCBJb1BpbkNvbm5lY3QpCit7CisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX0NBUEEsIElvUGluQ29ubmVjdCk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBHZXQgVkxDRCByYWlsIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbgorICAqIEBub3RlICAgT25lIHRvIHRocmVlIGV4dGVybmFsIGNhcGFjaXRvcnMgY2FuIGJlIGNvbm5lY3RlZCB0byBwYWRzIHRvIGRvCisgICogICAgICAgICBWTENEIGJpYXNpbmcuCisgICogICAgICAgICAtIExDRF9WTENEMSByYWlsIGNhbiBiZSBjb25uZWN0ZWQgdG8gUEIxMiBvciBQRTExKCopLAorICAqICAgICAgICAgLSBMQ0RfVkxDRDIgcmFpbCBjYW4gYmUgY29ubmVjdGVkIHRvIFBCMiwKKyAgKiAgICAgICAgIC0gTENEX1ZMQ0QzIHJhaWwgY2FuIGJlIGNvbm5lY3RlZCB0byBQQjAgb3IgUEUxMigqKQorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIENBUEEgICAgICBMTF9TWVNDRkdfR2V0VkxDRFJhaWxDb25uZWN0aW9uCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0FQQV9WTENEMV9QQjEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NBUEFfVkxDRDFfUEUxMSgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQVBBX1ZMQ0QyX1BCMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQVBBX1ZMQ0QzX1BCMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DQVBBX1ZMQ0QzX1BFMTIoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0dldFZMQ0RSYWlsQ29ubmVjdGlvbih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfQ0FQQSkpOworfQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBJMkMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5LgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIEkyQ19QQnhfRk1QICAgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjIgSTJDeF9GTVAgICAgICBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzCisgICogQHBhcmFtICBDb25maWdGYXN0TW9kZVBsdXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMyAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzKHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cykKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IyLCBDb25maWdGYXN0TW9kZVBsdXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEkyQyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgSTJDX1BCeF9GTVAgICBMTF9TWVNDRkdfRGlzYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjIgSTJDeF9GTVAgICAgICBMTF9TWVNDRkdfRGlzYWJsZUZhc3RNb2RlUGx1cworICAqIEBwYXJhbSAgQ29uZmlnRmFzdE1vZGVQbHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMyICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzMgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXModWludDMyX3QgQ29uZmlnRmFzdE1vZGVQbHVzKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMiwgQ29uZmlnRmFzdE1vZGVQbHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3Qgd2hpY2ggcGFkIGlzIGNvbm5lY3RlZCB0byBWUkVGSU5UX0FEQworICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IzIFNFTF9WUkVGX09VVCAgTExfU1lTQ0ZHX1ZSRUZJTlRfU2V0Q29ubmVjdGlvbgorICAqIEBwYXJhbSAgSW9QaW5Db25uZWN0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1ZSRUZJTlRfQ09OTkVDVF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1ZSRUZJTlRfQ09OTkVDVF9JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVlJFRklOVF9DT05ORUNUX0lPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19WUkVGSU5UX0NPTk5FQ1RfSU8xX0lPMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1ZSRUZJTlRfU2V0Q29ubmVjdGlvbih1aW50MzJfdCBJb1BpbkNvbm5lY3QpCit7CisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMywgU1lTQ0ZHX0NGR1IzX1ZSRUZfT1VULCBJb1BpbkNvbm5lY3QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwYWQgY29ubmVjdGlvbiB0byBWUkVGSU5UX0FEQworICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IzIFNFTF9WUkVGX09VVCAgTExfU1lTQ0ZHX1ZSRUZJTlRfR2V0Q29ubmVjdGlvbgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVlJFRklOVF9DT05ORUNUX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVlJFRklOVF9DT05ORUNUX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19WUkVGSU5UX0NPTk5FQ1RfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1ZSRUZJTlRfQ09OTkVDVF9JTzFfSU8yCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX1ZSRUZJTlRfR2V0Q29ubmVjdGlvbih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPkNGR1IzLCBTWVNDRkdfQ0ZHUjNfVlJFRl9PVVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBCdWZmZXIgdXNlZCB0byBnZW5lcmF0ZSBWUkVGSU5UIHJlZmVyZW5jZSBmb3IgQURDIGVuYWJsZQorICAqIEBub3RlICAgVGhlIFZyZWZJbml0IGJ1ZmZlciB0byBBREMgdGhyb3VnaCBpbnRlcm5hbCBwYXRoIGlzIGFsc28KKyAgKiAgICAgICAgIGVuYWJsZWQgdXNpbmcgZnVuY3Rpb24gTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKCkKKyAgKiAgICAgICAgIHdpdGggcGFyYW1ldGVyIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMyBFTkJVRl9WUkVGSU5UX0FEQyAgIExMX1NZU0NGR19WUkVGSU5UX0VuYWJsZUFEQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1ZSRUZJTlRfRW5hYmxlQURDKHZvaWQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMywgU1lTQ0ZHX0NGR1IzX0VOQlVGX1ZSRUZJTlRfQURDKTsKK30KKworLyoqCisgICogQGJyaWVmICBCdWZmZXIgdXNlZCB0byBnZW5lcmF0ZSBWUkVGSU5UIHJlZmVyZW5jZSBmb3IgQURDIGRpc2FibGUKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMyBFTkJVRl9WUkVGSU5UX0FEQyAgIExMX1NZU0NGR19WUkVGSU5UX0Rpc2FibGVBREMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19WUkVGSU5UX0Rpc2FibGVBREModm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTkJVRl9WUkVGSU5UX0FEQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQnVmZmVyIHVzZWQgdG8gZ2VuZXJhdGUgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZmVyZW5jZSBmb3IgQURDIGVuYWJsZQorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IzIEVOQlVGX1NFTlNPUl9BREMgICAgTExfU1lTQ0ZHX1RFTVBTRU5TT1JfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfVEVNUFNFTlNPUl9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IzLCBTWVNDRkdfQ0ZHUjNfRU5CVUZfU0VOU09SX0FEQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQnVmZmVyIHVzZWQgdG8gZ2VuZXJhdGUgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZmVyZW5jZSBmb3IgQURDIGRpc2FibGUKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMyBFTkJVRl9TRU5TT1JfQURDICAgIExMX1NZU0NGR19URU1QU0VOU09SX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19URU1QU0VOU09SX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTkJVRl9TRU5TT1JfQURDKTsKK30KKworLyoqCisgICogQGJyaWVmICBCdWZmZXIgdXNlZCB0byBnZW5lcmF0ZSBWUkVGSU5UIHJlZmVyZW5jZSBmb3IgY29tcGFyYXRvciBlbmFibGUKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMyBFTkJVRl9WUkVGSU5UX0NPTVAgIExMX1NZU0NGR19WUkVGSU5UX0VuYWJsZUNPTVAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19WUkVGSU5UX0VuYWJsZUNPTVAodm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IzLCBTWVNDRkdfQ0ZHUjNfRU5CVUZMUF9WUkVGSU5UX0NPTVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEJ1ZmZlciB1c2VkIHRvIGdlbmVyYXRlIFZSRUZJTlQgcmVmZXJlbmNlIGZvciBjb21wYXJhdG9yIGRpc2FibGUKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMyBFTkJVRl9WUkVGSU5UX0NPTVAgIExMX1NZU0NGR19WUkVGSU5UX0Rpc2FibGVDT01QCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfVlJFRklOVF9EaXNhYmxlQ09NUCh2b2lkKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMywgU1lTQ0ZHX0NGR1IzX0VOQlVGTFBfVlJFRklOVF9DT01QKTsKK30KKworI2lmIGRlZmluZWQgKFJDQ19IU0k0OF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBCdWZmZXIgdXNlZCB0byBnZW5lcmF0ZSBWUkVGSU5UIHJlZmVyZW5jZSBmb3IgSFNJNDggb3NjaWxsYXRvciBlbmFibGUKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMyBFTlJFRl9IU0k0OCAgICAgICAgIExMX1NZU0NGR19WUkVGSU5UX0VuYWJsZUhTSTQ4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfVlJFRklOVF9FbmFibGVIU0k0OCh2b2lkKQoreworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTlJFRl9IU0k0OCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQnVmZmVyIHVzZWQgdG8gZ2VuZXJhdGUgVlJFRklOVCByZWZlcmVuY2UgZm9yIEhTSTQ4IG9zY2lsbGF0b3IgZGlzYWJsZQorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IzIEVOUkVGX0hTSTQ4ICAgICAgICAgTExfU1lTQ0ZHX1ZSRUZJTlRfRGlzYWJsZUhTSTQ4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfVlJFRklOVF9EaXNhYmxlSFNJNDgodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTlJFRl9IU0k0OCk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBWUkVGSU5UIGlzIHJlYWR5IG9yIG5vdAorICAqIEBub3RlICAgV2hlbiBzZXQsIGl0IGluZGljYXRlcyB0aGF0IFZSRUZJTlQgaXMgYXZhaWxhYmxlIGZvciBCT1IsIFBWRCBhbmQgTENECisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjMgVlJFRklOVF9SRFlGICAgICAgICBMTF9TWVNDRkdfVlJFRklOVF9Jc1JlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX1ZSRUZJTlRfSXNSZWFkeSh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19WUkVGSU5UX1JEWUYpID09IFNZU0NGR19DRkdSM19WUkVGSU5UX1JEWUYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgdGhlIHdob2xlIGNvbnRlbnQgb2YgU1lTQ0ZHX0NGR1IzIHJlZ2lzdGVyCisgICogQG5vdGUgICBBZnRlciBTWVNDRkdfQ0ZHUjMgcmVnaXN0ZXIgbG9jaywgb25seSByZWFkIGFjY2VzcyBhdmFpbGFibGUuCisgICogICAgICAgICBPbmx5IHN5c3RlbSBoYXJkd2FyZSByZXNldCB1bmxvY2tzIFNZU0NGR19DRkdSMyByZWdpc3Rlci4KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMyBSRUZfTE9DSyAgICAgICAgICAgIExMX1NZU0NGR19WUkVGSU5UX0xvY2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19WUkVGSU5UX0xvY2sodm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IzLCBTWVNDRkdfQ0ZHUjNfUkVGX0xPQ0spOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNZU0NGR19DRkdSMyByZWdpc3RlciBpcyBsb2NrZWQgKG9ubHkgcmVhZCBhY2Nlc3MpIG9yIG5vdAorICAqIEBub3RlICAgV2hlbiBzZXQsIGl0IGluZGljYXRlcyB0aGF0IFNZU0NGR19DRkdSMyByZWdpc3RlciBpcyBsb2NrZWQsIG9ubHkgcmVhZCBhY2Nlc3MgYXZhaWxhYmxlCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjMgUkVGX0xPQ0sgICAgICAgICAgICAgIExMX1NZU0NGR19WUkVGSU5UX0lzTG9ja2VkCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX1ZSRUZJTlRfSXNMb2NrZWQodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChTWVNDRkctPkNGR1IzLCBTWVNDRkdfQ0ZHUjNfUkVGX0xPQ0spID09IFNZU0NGR19DRkdSM19SRUZfTE9DSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHNvdXJjZSBpbnB1dCBmb3IgdGhlIEVYVEkgZXh0ZXJuYWwgaW50ZXJydXB0LgorICAqIEBybXRvbGwgU1lTQ0ZHX0VYVElDUjEgRVhUSTAgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJMSAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEkyICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTMgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJNCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEk1ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTYgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJNyAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEk4ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTkgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJMTAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEkxMSAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTEyICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJMTMgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkxNCAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTE1ICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZQorICAqIEBwYXJhbSAgUG9ydCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlREICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRFICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRIICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKiBAcGFyYW0gIExpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2UodWludDMyX3QgUG9ydCwgdWludDMyX3QgTGluZSkKK3sKKyAgTU9ESUZZX1JFRyhTWVNDRkctPkVYVElDUltMaW5lICYgMHhGRlVdLCBTWVNDRkdfRVhUSUNSMV9FWFRJMCA8PCAoTGluZSA+PiAxNlUpLCBQb3J0IDw8IChMaW5lID4+IDE2VSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY29uZmlndXJlZCBkZWZpbmVkIGZvciBzcGVjaWZpYyBFWFRJIExpbmUKKyAgKiBAcm10b2xsIFNZU0NGR19FWFRJQ1IxIEVYVEkwICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjEgRVhUSTEgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMSBFWFRJMiAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IxIEVYVEkzICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTQgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJNSAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEk2ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjIgRVhUSTcgICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJOCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEk5ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSTEwICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMyBFWFRJMTEgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkxMiAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSTEzICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJMTQgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1I0IEVYVEkxNSAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2UKKyAgKiBAcGFyYW0gIExpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUSCAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2UodWludDMyX3QgTGluZSkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1lTQ0ZHLT5FWFRJQ1JbTGluZSAmIDB4RkZVXSwgKFNZU0NGR19FWFRJQ1IxX0VYVEkwIDw8IChMaW5lID4+IDE2VSkpKSA+PiAoTGluZSA+PiAxNlUpKTsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VGX0RCR01DVSBEQkdNQ1UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgZGV2aWNlIGlkZW50aWZpZXIKKyAgKiBAcm10b2xsIERCR01DVV9JRENPREUgREVWX0lEICAgICAgICBMTF9EQkdNQ1VfR2V0RGV2aWNlSUQKKyAgKiBAcmV0dmFsIFZhbHVlcyBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0ZGIChleDogTDA1MyAtPiAweDQxNywgTDA3MyAtPiAweDQ0NykKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQkdNQ1VfR2V0RGV2aWNlSUQodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREJHTUNVLT5JRENPREUsIERCR01DVV9JRENPREVfREVWX0lEKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBkZXZpY2UgcmV2aXNpb24gaWRlbnRpZmllcgorICAqIEBub3RlIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSByZXZpc2lvbiBvZiB0aGUgZGV2aWNlLgorICAqIEBybXRvbGwgREJHTUNVX0lEQ09ERSBSRVZfSUQgICAgICAgIExMX0RCR01DVV9HZXRSZXZpc2lvbklECisgICogQHJldHZhbCBWYWx1ZXMgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQkdNQ1VfR2V0UmV2aXNpb25JRCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQkdNQ1UtPklEQ09ERSwgREJHTUNVX0lEQ09ERV9SRVZfSUQpID4+IERCR01DVV9JRENPREVfUkVWX0lEX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNMRUVQIG1vZGUKKyAgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU0xFRVAgICAgIExMX0RCR01DVV9FbmFibGVEQkdTbGVlcE1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVEQkdTbGVlcE1vZGUodm9pZCkKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NMRUVQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNMRUVQIG1vZGUKKyAgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU0xFRVAgICAgIExMX0RCR01DVV9EaXNhYmxlREJHU2xlZXBNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRGlzYWJsZURCR1NsZWVwTW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TTEVFUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUT1AgbW9kZQorICAqIEBybXRvbGwgREJHTUNVX0NSICAgIERCR19TVE9QICAgICAgTExfREJHTUNVX0VuYWJsZURCR1N0b3BNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUodm9pZCkKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUT1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RPUCBtb2RlCisgICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgREJHX1NUT1AgICAgICBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlKHZvaWQpCit7CisgIENMRUFSX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUT1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUKKyAgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RBTkRCWSAgIExMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEBybXRvbGwgREJHTUNVX0NSICAgIERCR19TVEFOREJZICAgTExfREJHTUNVX0Rpc2FibGVEQkdTdGFuZGJ5TW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0Rpc2FibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgICogQGJyaWVmICBGcmVlemUgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAxIHBlcmlwaGVyYWxzKQorICAqIEBybXRvbGwgQVBCMUZaICAgICAgREJHX1RJTTJfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX1RJTTNfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX1RJTTZfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX1RJTTdfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX1JUQ19TVE9QICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX1dXREdfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX0lXREdfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX0kyQzFfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX0kyQzJfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX0kyQzNfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX0xQVElNRVJfU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU0yX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTZfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTdfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9XV0RHX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0lXREdfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMyX1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9MUFRJTTFfU1RPUAorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9BUEIxX0dSUDFfRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlosIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuZnJlZXplIEFQQjEgcGVyaXBoZXJhbHMgKGdyb3VwMSBwZXJpcGhlcmFscykKKyAgKiBAcm10b2xsIEFQQjFGWiAgICAgIERCR19USU0yX1NUT1AgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX1RJTTNfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIxRlogICAgICBEQkdfVElNNl9TVE9QICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjFGWiAgICAgIERCR19USU03X1NUT1AgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX1JUQ19TVE9QICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIxRlogICAgICBEQkdfV1dER19TVE9QICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjFGWiAgICAgIERCR19JV0RHX1NUT1AgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX0kyQzFfU1RPUCAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIxRlogICAgICBEQkdfSTJDMl9TVE9QICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIEFQQjFGWiAgICAgIERCR19JMkMzX1NUT1AgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMUZaICAgICAgREJHX0xQVElNRVJfU1RPUCAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTJfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNM19TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNl9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNN19TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMxX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzJfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzNfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5BUEIxRlosIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZyZWV6ZSBBUEIyIHBlcmlwaGVyYWxzCisgICogQHJtdG9sbCBBUEIyRlogICAgICBEQkdfVElNMjJfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgQVBCMkZaICAgICAgREJHX1RJTTIxX1NUT1AgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMjJfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTIxX1NUT1AKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMl9HUlAxX0ZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKERCR01DVS0+QVBCMkZaLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBVbmZyZWV6ZSBBUEIyIHBlcmlwaGVyYWxzCisgICogQHJtdG9sbCBBUEIyRlogICAgICBEQkdfVElNMjJfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBBUEIyRlogICAgICBEQkdfVElNMjFfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTIyX1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0yMV9TVE9QCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5BUEIyRlosIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FRl9GTEFTSCBGTEFTSAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEZMQVNIIExhdGVuY3kKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBMQVRFTkNZICAgICAgIExMX0ZMQVNIX1NldExhdGVuY3kKKyAgKiBAcGFyYW0gIExhdGVuY3kgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX1NldExhdGVuY3kodWludDMyX3QgTGF0ZW5jeSkKK3sKKyAgTU9ESUZZX1JFRyhGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfTEFURU5DWSwgTGF0ZW5jeSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEZMQVNIIExhdGVuY3kKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBMQVRFTkNZICAgICAgIExMX0ZMQVNIX0dldExhdGVuY3kKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRkxBU0hfR2V0TGF0ZW5jeSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfTEFURU5DWSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBQcmVmZXRjaAorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFBSRlRFTiAgICAgICAgTExfRkxBU0hfRW5hYmxlUHJlZmV0Y2gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0VuYWJsZVByZWZldGNoKHZvaWQpCit7CisgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BSRlRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQcmVmZXRjaAorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFBSRlRFTiAgICAgICAgTExfRkxBU0hfRGlzYWJsZVByZWZldGNoCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlUHJlZmV0Y2godm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkZURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFByZWZldGNoIGJ1ZmZlciBpcyBlbmFibGVkCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgUFJGVEVOICAgICAgICBMTF9GTEFTSF9Jc1ByZWZldGNoRW5hYmxlZAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0lzUHJlZmV0Y2hFbmFibGVkKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BSRlRFTikgPT0gKEZMQVNIX0FDUl9QUkZURU4pKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBGbGFzaCBQb3dlci1kb3duIG1vZGUgZHVyaW5nIHJ1biBtb2RlIG9yIExvdy1wb3dlciBydW4gbW9kZQorICAqIEBub3RlIEZsYXNoIG1lbW9yeSBjYW4gYmUgcHV0IGluIHBvd2VyLWRvd24gbW9kZSBvbmx5IHdoZW4gdGhlIGNvZGUgaXMgZXhlY3V0ZWQKKyAgKiAgICAgICBmcm9tIFJBTQorICAqIEBub3RlIEZsYXNoIG11c3Qgbm90IGJlIGFjY2Vzc2VkIHdoZW4gcG93ZXIgZG93biBpcyBlbmFibGVkCisgICogQG5vdGUgRmxhc2ggbXVzdCBub3QgYmUgcHV0IGluIHBvd2VyLWRvd24gd2hpbGUgYSBwcm9ncmFtIG9yIGFuIGVyYXNlIG9wZXJhdGlvbgorICAqICAgICAgIGlzIG9uLWdvaW5nCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgUlVOX1BEICAgICAgICBMTF9GTEFTSF9FbmFibGVSdW5Qb3dlckRvd25cbgorICAqICAgICAgICAgRkxBU0hfUERLRVlSIFBES0VZMSAgICAgICAgTExfRkxBU0hfRW5hYmxlUnVuUG93ZXJEb3duXG4KKyAgKiAgICAgICAgIEZMQVNIX1BES0VZUiBQREtFWTIgICAgICAgIExMX0ZMQVNIX0VuYWJsZVJ1blBvd2VyRG93bgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRW5hYmxlUnVuUG93ZXJEb3duKHZvaWQpCit7CisgIC8qIEZvbGxvd2luZyB2YWx1ZXMgbXVzdCBiZSB3cml0dGVuIGNvbnNlY3V0aXZlbHkgdG8gdW5sb2NrIHRoZSBSVU5fUEQgYml0IGluCisgICAgIEZMQVNIX0FDUiAqLworICBXUklURV9SRUcoRkxBU0gtPlBES0VZUiwgRkxBU0hfUERLRVkxKTsKKyAgV1JJVEVfUkVHKEZMQVNILT5QREtFWVIsIEZMQVNIX1BES0VZMik7CisgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1JVTl9QRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBGbGFzaCBQb3dlci1kb3duIG1vZGUgZHVyaW5nIHJ1biBtb2RlIG9yIExvdy1wb3dlciBydW4gbW9kZQorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFJVTl9QRCAgICAgICAgTExfRkxBU0hfRGlzYWJsZVJ1blBvd2VyRG93blxuCisgICogICAgICAgICBGTEFTSF9QREtFWVIgUERLRVkxICAgICAgICBMTF9GTEFTSF9EaXNhYmxlUnVuUG93ZXJEb3duXG4KKyAgKiAgICAgICAgIEZMQVNIX1BES0VZUiBQREtFWTIgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVSdW5Qb3dlckRvd24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0Rpc2FibGVSdW5Qb3dlckRvd24odm9pZCkKK3sKKyAgLyogRm9sbG93aW5nIHZhbHVlcyBtdXN0IGJlIHdyaXR0ZW4gY29uc2VjdXRpdmVseSB0byB1bmxvY2sgdGhlIFJVTl9QRCBiaXQgaW4KKyAgICAgRkxBU0hfQUNSICovCisgIFdSSVRFX1JFRyhGTEFTSC0+UERLRVlSLCBGTEFTSF9QREtFWTEpOworICBXUklURV9SRUcoRkxBU0gtPlBES0VZUiwgRkxBU0hfUERLRVkyKTsKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9SVU5fUEQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBGbGFzaCBQb3dlci1kb3duIG1vZGUgZHVyaW5nIFNsZWVwIG9yIExvdy1wb3dlciBzbGVlcCBtb2RlCisgICogQG5vdGUgRmxhc2ggbXVzdCBub3QgYmUgcHV0IGluIHBvd2VyLWRvd24gd2hpbGUgYSBwcm9ncmFtIG9yIGFuIGVyYXNlIG9wZXJhdGlvbgorICAqICAgICAgIGlzIG9uLWdvaW5nCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgU0xFRVBfUEQgICAgICBMTF9GTEFTSF9FbmFibGVTbGVlcFBvd2VyRG93bgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRW5hYmxlU2xlZXBQb3dlckRvd24odm9pZCkKK3sKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfU0xFRVBfUEQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRmxhc2ggUG93ZXItZG93biBtb2RlIGR1cmluZyBTbGVlcCBvciBMb3ctcG93ZXIgc2xlZXAgbW9kZQorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFNMRUVQX1BEICAgICAgTExfRkxBU0hfRGlzYWJsZVNsZWVwUG93ZXJEb3duCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlU2xlZXBQb3dlckRvd24odm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9TTEVFUF9QRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGJ1ZmZlcnMgdXNlZCBhcyBhIGNhY2hlIGR1cmluZyByZWFkIGFjY2VzcworICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIERJU0FCX0JVRiAgICAgTExfRkxBU0hfRW5hYmxlQnVmZmVycworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRW5hYmxlQnVmZmVycyh2b2lkKQoreworICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0RJU0FCX0JVRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBidWZmZXJzIHVzZWQgYXMgYSBjYWNoZSBkdXJpbmcgcmVhZCBhY2Nlc3MKKyAgKiBAbm90ZSAgIFdoZW4gZGlzYWJsZWQsIGV2ZXJ5IHJlYWQgd2lsbCBhY2Nlc3MgdGhlIE5WTSBldmVuIGZvcgorICAqICAgICAgICAgYW4gYWRkcmVzcyBhbHJlYWR5IHJlYWQgKGZvciBleGFtcGxlLCB0aGUgcHJldmlvdXMgYWRkcmVzcykuCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRElTQUJfQlVGICAgICBMTF9GTEFTSF9EaXNhYmxlQnVmZmVycworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRGlzYWJsZUJ1ZmZlcnModm9pZCkKK3sKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRElTQUJfQlVGKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgcHJlLXJlYWQKKyAgKiBAbm90ZSAgIFdoZW4gZW5hYmxlZCwgdGhlIG1lbW9yeSBpbnRlcmZhY2Ugc3RvcmVzIHRoZSBsYXN0IGFkZHJlc3MKKyAgKiAgICAgICAgIHJlYWQgYXMgZGF0YSBhbmQgdHJpZXMgdG8gcmVhZCB0aGUgbmV4dCBvbmUgd2hlbiBubyBvdGhlcgorICAqICAgICAgICAgcmVhZCBvciB3cml0ZSBvciBwcmVmZXRjaCBvcGVyYXRpb24gaXMgb25nb2luZy4KKyAgKiAgICAgICAgIEl0IGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgZXZlcnkgdGltZSB0aGUgYnVmZmVycyBhcmUgZGlzYWJsZWQuCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgUFJFX1JFQUQgICAgICBMTF9GTEFTSF9FbmFibGVQcmVSZWFkCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVQcmVSZWFkKHZvaWQpCit7CisgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BSRV9SRUFEKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHByZS1yZWFkCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgUFJFX1JFQUQgICAgICBMTF9GTEFTSF9EaXNhYmxlUHJlUmVhZAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRGlzYWJsZVByZVJlYWQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkVfUkVBRCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChGTEFTSCkgfHwgZGVmaW5lZCAoU1lTQ0ZHKSB8fCBkZWZpbmVkIChEQkdNQ1UpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9MTF9TWVNURU1fSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9sbF90aW0uaCBiL0luYy9zdG0zMmwweHhfbGxfdGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4M2Y1YwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfbGxfdGltLmgKQEAgLTAsMCArMSwzMjkzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3RpbS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUSU0gTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX19TVE0zMkwweHhfTExfVElNX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfTExfVElNX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChUSU0yKSB8fCBkZWZpbmVkIChUSU0zKSB8fCBkZWZpbmVkIChUSU0yMSkgfHwgZGVmaW5lZCAoVElNMjIpIHx8IGRlZmluZWQgKFRJTTYpIHx8IGRlZmluZWQgKFRJTTcpCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMIFRJTQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9WYXJpYWJsZXMgVElNIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IE9GRlNFVF9UQUJfQ0NNUnhbXSA9Cit7CisgIDB4MDBVLCAgIC8qIDA6IFRJTXhfQ0gxICAqLworICAweDAwVSwgICAvKiAxOiBOQSAqLworICAweDAwVSwgICAvKiAyOiBUSU14X0NIMiAgKi8KKyAgMHgwMFUsICAgLyogMzogTkEgKi8KKyAgMHgwNFUsICAgLyogNDogVElNeF9DSDMgICovCisgIDB4MDBVLCAgIC8qIDU6IE5BICovCisgIDB4MDRVICAgIC8qIDY6IFRJTXhfQ0g0ICAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX09DeHhbXSA9Cit7CisgIDBVLCAgICAgICAgICAgIC8qIDA6IE9DMU0sIE9DMUZFLCBPQzFQRSAqLworICAwVSwgICAgICAgICAgICAvKiAxOiAtIE5BICovCisgIDhVLCAgICAgICAgICAgIC8qIDI6IE9DMk0sIE9DMkZFLCBPQzJQRSAqLworICAwVSwgICAgICAgICAgICAvKiAzOiAtIE5BICovCisgIDBVLCAgICAgICAgICAgIC8qIDQ6IE9DM00sIE9DM0ZFLCBPQzNQRSAqLworICAwVSwgICAgICAgICAgICAvKiA1OiAtIE5BICovCisgIDhVICAgICAgICAgICAgIC8qIDY6IE9DNE0sIE9DNEZFLCBPQzRQRSAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX0lDeHhbXSA9Cit7CisgIDBVLCAgICAgICAgICAgIC8qIDA6IENDMVMsIElDMVBTQywgSUMxRiAqLworICAwVSwgICAgICAgICAgICAvKiAxOiAtIE5BICovCisgIDhVLCAgICAgICAgICAgIC8qIDI6IENDMlMsIElDMlBTQywgSUMyRiAqLworICAwVSwgICAgICAgICAgICAvKiAzOiAtIE5BICovCisgIDBVLCAgICAgICAgICAgIC8qIDQ6IENDM1MsIElDM1BTQywgSUMzRiAqLworICAwVSwgICAgICAgICAgICAvKiA1OiAtIE5BICovCisgIDhVICAgICAgICAgICAgIC8qIDY6IENDNFMsIElDNFBTQywgSUM0RiAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX0NDeFBbXSA9Cit7CisgIDBVLCAgICAgICAgICAgIC8qIDA6IENDMVAgKi8KKyAgMFUsICAgICAgICAgICAgLyogMTogTkEgKi8KKyAgNFUsICAgICAgICAgICAgLyogMjogQ0MyUCAqLworICAwVSwgICAgICAgICAgICAvKiAzOiBOQSAqLworICA4VSwgICAgICAgICAgICAvKiA0OiBDQzNQICovCisgIDBVLCAgICAgICAgICAgIC8qIDU6IE5BICovCisgIDEyVSAgICAgICAgICAgIC8qIDY6IENDNFAgKi8KK307CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9Qcml2YXRlX0NvbnN0YW50cyBUSU0gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisKKy8qIFJlbWFwIG1hc2sgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVElNeF9PUl9STVBfU0hJRlQgIDE2VQorI2RlZmluZSBUSU14X09SX1JNUF9NQVNLICAgMHgwMDAwRkZGRlUKKyNkZWZpbmUgVElNMl9PUl9STVBfTUFTSyAgICgoVElNMl9PUl9FVFJfUk1QIHwgVElNMl9PUl9USTRfUk1QICkgPDwgVElNeF9PUl9STVBfU0hJRlQpCisjZGVmaW5lIFRJTTIxX09SX1JNUF9NQVNLICAoKFRJTTIxX09SX0VUUl9STVAgfCBUSU0yMV9PUl9USTFfUk1QIHwgVElNMjFfT1JfVEkyX1JNUCkgPDwgVElNeF9PUl9STVBfU0hJRlQpCisjZGVmaW5lIFRJTTIyX09SX1JNUF9NQVNLICAoKFRJTTIyX09SX0VUUl9STVAgfCBUSU0yMl9PUl9USTFfUk1QKSA8PCBUSU14X09SX1JNUF9TSElGVCkKKyNpZiBkZWZpbmVkKFRJTTMpCisjZGVmaW5lIFRJTTNfT1JfUk1QX01BU0sgICAoKFRJTTNfT1JfRVRSX1JNUCB8IFRJTTNfT1JfVEkxX1JNUCB8IFRJTTNfT1JfVEkyX1JNUCB8IFRJTTNfT1JfVEk0X1JNUCkgPDwgVElNeF9PUl9STVBfU0hJRlQpCisjZW5kaWYgLyogVElNMyAqLworCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX1ByaXZhdGVfTWFjcm9zIFRJTSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKiogQGJyaWVmICBDb252ZXJ0IGNoYW5uZWwgaWQgaW50byBjaGFubmVsIGluZGV4LgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgVElNX0dFVF9DSEFOTkVMX0lOREVYKCBfX0NIQU5ORUxfXykgXAorKCgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMSkgPyAwVSA6XAorKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gyKSA/IDJVIDpcCisoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDMpID8gNFUgOiA2VSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRVNfSU5JVCBUSU0gRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBUaW1lIEJhc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQxNl90IFByZXNjYWxlcjsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlIHVzZWQgdG8gZGl2aWRlIHRoZSBUSU0gY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgQ291bnRlck1vZGU7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb3VudGVyIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0NPVU5URVJNT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldENvdW50ZXJNb2RlKCkuKi8KKworICB1aW50MzJfdCBBdXRvcmVsb2FkOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGF1dG8gcmVsb2FkIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0by1SZWxvYWQgUmVnaXN0ZXIgYXQgdGhlIG5leHQgdXBkYXRlIGV2ZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgdGltZXIgaW5zdGFuY2VzIG1heSBzdXBwb3J0IDMyIGJpdHMgY291bnRlcnMuIEluIHRoYXQgY2FzZSB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkZGRkZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldEF1dG9SZWxvYWQoKS4qLworCisgIHVpbnQzMl90IENsb2NrRGl2aXNpb247ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0NMT0NLRElWSVNJT04uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbigpLiovCit9IExMX1RJTV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gT3V0cHV0IENvbXBhcmUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE9DTW9kZTsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PQ01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9PQ19TZXRNb2RlKCkuKi8KKworICB1aW50MzJfdCBPQ1N0YXRlOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09DU1RBVEUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbCgpIG9yIEByZWYgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsKCkuKi8KKworICB1aW50MzJfdCBDb21wYXJlVmFsdWU7ICAvKiE8IFNwZWNpZmllcyB0aGUgQ29tcGFyZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gTExfVElNX09DX1NldENvbXBhcmVDSHggKHg9MS4uNikuKi8KKworICB1aW50MzJfdCBPQ1BvbGFyaXR5OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09DUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9PQ19TZXRQb2xhcml0eSgpLiovCisKKworfSBMTF9USU1fT0NfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIElucHV0IENhcHR1cmUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICB1aW50MzJfdCBJQ1BvbGFyaXR5OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19QT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFBvbGFyaXR5KCkuKi8KKworICB1aW50MzJfdCBJQ0FjdGl2ZUlucHV0OyAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQUNUSVZFSU5QVVQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dCgpLiovCisKKyAgdWludDMyX3QgSUNQcmVzY2FsZXI7ICAgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDUFNDLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdCBJQ0ZpbHRlcjsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfRklMVEVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0RmlsdGVyKCkuKi8KK30gTExfVElNX0lDX0luaXRUeXBlRGVmOworCisKKy8qKgorICAqIEBicmllZiAgVElNIEVuY29kZXIgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBFbmNvZGVyTW9kZTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBlbmNvZGVyIHJlc29sdXRpb24gKHgyIG9yIHg0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0VOQ09ERVJNT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9TZXRFbmNvZGVyTW9kZSgpLiovCisKKyAgdWludDMyX3QgSUMxUG9sYXJpdHk7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgVEkxIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFBvbGFyaXR5KCkuKi8KKworICB1aW50MzJfdCBJQzFBY3RpdmVJbnB1dDsgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTEgaW5wdXQgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19BQ1RJVkVJTlBVVC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQoKS4qLworCisgIHVpbnQzMl90IElDMVByZXNjYWxlcjsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJMSBpbnB1dCBwcmVzY2FsZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdCBJQzFGaWx0ZXI7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTEgaW5wdXQgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfRklMVEVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRGaWx0ZXIoKS4qLworCisgIHVpbnQzMl90IElDMlBvbGFyaXR5OyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiBUSTIgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19QT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0UG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90IElDMkFjdGl2ZUlucHV0OyAgLyohPCBTcGVjaWZpZXMgdGhlIFRJMiBpbnB1dCBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0FDVElWRUlOUFVULgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dCgpLiovCisKKyAgdWludDMyX3QgSUMyUHJlc2NhbGVyOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgVEkyIGlucHV0IHByZXNjYWxlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDUFNDLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IElDMkZpbHRlcjsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJMiBpbnB1dCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19GSUxURVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovCisKK30gTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWY7CisKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBUSU0gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1RJTV9SZWFkUmVnIGZ1bmN0aW9uLgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9TUl9VSUYgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9VSUYgICAgICAgICAgIC8qITwgVXBkYXRlIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzFJRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzFJRiAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDEgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDMklGICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDMklGICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgMiBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MzSUYgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MzSUYgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzRJRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzRJRiAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDQgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX1RJRiAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX1RJRiAgICAgICAgICAgLyohPCBUcmlnZ2VyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzFPRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzFPRiAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MyT0YgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MyT0YgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAyIG92ZXJjYXB0dXJlIGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDM09GICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDM09GICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMyBvdmVyY2FwdHVyZSBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzRPRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzRPRiAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfVElNX1JlYWRSZWcgYW5kICBMTF9USU1fV3JpdGVSZWcgZnVuY3Rpb25zLgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9ESUVSX1VJRSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX1VJRSAgICAgICAgIC8qITwgVXBkYXRlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfQ0MxSUUgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MxSUUgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgMSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0NDMklFICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDMklFICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDIgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DQzNJRSAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzNJRSAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfQ0M0SUUgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0M0SUUgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgNCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX1RJRSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX1RJRSAgICAgICAgIC8qITwgVHJpZ2dlciBpbnRlcnJ1cHQgZW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19VUERBVEVTT1VSQ0UgVXBkYXRlIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUiAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgQ291bnRlciBvdmVyZmxvdy91bmRlcmZsb3csIFNldHRpbmcgdGhlIFVHIGJpdCBvciBVcGRhdGUgZ2VuZXJhdGlvbiB0aHJvdWdoIHRoZSBzbGF2ZSBtb2RlIGNvbnRyb2xsZXIgZ2VuZXJhdGVzIGFuIHVwZGF0ZSByZXF1ZXN0ICovCisjZGVmaW5lIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUiAgICAgICAgICAgIFRJTV9DUjFfVVJTICAgICAgICAgIC8qITwgT25seSBjb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdyBnZW5lcmF0ZXMgYW4gdXBkYXRlIHJlcXVlc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09ORVBVTFNFTU9ERSBPbmUgUHVsc2UgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9PTkVQVUxTRU1PREVfU0lOR0xFICAgICAgICAgICAgIFRJTV9DUjFfT1BNICAgICAgICAgIC8qITwgQ291bnRlciBpcyBub3Qgc3RvcHBlZCBhdCB1cGRhdGUgZXZlbnQgKi8KKyNkZWZpbmUgTExfVElNX09ORVBVTFNFTU9ERV9SRVBFVElUSVZFICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBDb3VudGVyIHN0b3BzIGNvdW50aW5nIGF0IHRoZSBuZXh0IHVwZGF0ZSBldmVudCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ09VTlRFUk1PREUgQ291bnRlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX1VQICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPENvdW50ZXIgdXNlZCBhcyB1cGNvdW50ZXIgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0RPV04gICAgICAgICAgICAgICAgVElNX0NSMV9ESVIgICAgICAgICAgLyohPCBDb3VudGVyIHVzZWQgYXMgZG93bmNvdW50ZXIgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUCAgICAgICAgICAgVElNX0NSMV9DTVNfMCAgICAgICAgLyohPCBUaGUgY291bnRlciBjb3VudHMgdXAgYW5kIGRvd24gYWx0ZXJuYXRpdmVseS4gT3V0cHV0IGNvbXBhcmUgaW50ZXJydXB0IGZsYWdzIG9mIG91dHB1dCBjaGFubmVscyAgYXJlIHNldCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgaXMgY291bnRpbmcgZG93bi4gKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9ET1dOICAgICAgICAgVElNX0NSMV9DTVNfMSAgICAgICAgLyohPFRoZSBjb3VudGVyIGNvdW50cyB1cCBhbmQgZG93biBhbHRlcm5hdGl2ZWx5LiBPdXRwdXQgY29tcGFyZSBpbnRlcnJ1cHQgZmxhZ3Mgb2Ygb3V0cHV0IGNoYW5uZWxzICBhcmUgc2V0IG9ubHkgd2hlbiB0aGUgY291bnRlciBpcyBjb3VudGluZyB1cCAqLworI2RlZmluZSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04gICAgICBUSU1fQ1IxX0NNUyAgICAgICAgICAvKiE8IFRoZSBjb3VudGVyIGNvdW50cyB1cCBhbmQgZG93biBhbHRlcm5hdGl2ZWx5LiBPdXRwdXQgY29tcGFyZSBpbnRlcnJ1cHQgZmxhZ3Mgb2Ygb3V0cHV0IGNoYW5uZWxzICBhcmUgc2V0IG9ubHkgd2hlbiB0aGUgY291bnRlciBpcyBjb3VudGluZyB1cCBvciBkb3duLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0xPQ0tESVZJU0lPTiBDbG9jayBEaXZpc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgdERUUz10Q0tfSU5UICovCisjZGVmaW5lIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIgICAgICAgICAgICAgIFRJTV9DUjFfQ0tEXzAgICAgICAgIC8qITwgdERUUz0yKnRDS19JTlQgKi8KKyNkZWZpbmUgTExfVElNX0NMT0NLRElWSVNJT05fRElWNCAgICAgICAgICAgICAgVElNX0NSMV9DS0RfMSAgICAgICAgLyohPCB0RFRTPTQqdENLX0lOVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ09VTlRFUkRJUkVDVElPTiBDb3VudGVyIERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSRElSRUNUSU9OX1VQICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgVGltZXIgY291bnRlciBjb3VudHMgdXAgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJESVJFQ1RJT05fRE9XTiAgICAgICAgICAgVElNX0NSMV9ESVIgICAgICAgICAgLyohPCBUaW1lciBjb3VudGVyIGNvdW50cyBkb3duICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NDRE1BUkVRVUVTVCBDYXB0dXJlIENvbXBhcmUgRE1BIFJlcXVlc3QKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ0NETUFSRVFVRVNUX0NDICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IENDeCBETUEgcmVxdWVzdCBzZW50IHdoZW4gQ0N4IGV2ZW50IG9jY3VycyAqLworI2RlZmluZSBMTF9USU1fQ0NETUFSRVFVRVNUX1VQREFURSAgICAgICAgICAgICBUSU1fQ1IyX0NDRFMgICAgICAgICAvKiE8IENDeCBETUEgcmVxdWVzdHMgc2VudCB3aGVuIHVwZGF0ZSBldmVudCBvY2N1cnMgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0hBTk5FTCBDaGFubmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gxICAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MxRSAgICAgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCAxICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMiAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMkUgICAgIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgMiAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDMgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzNFICAgICAvKiE8IFRpbWVyIGlucHV0L291dHB1dCBjaGFubmVsIDMgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0g0ICAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0M0RSAgICAgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCA0ICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ1NUQVRFIE91dHB1dCBDb25maWd1cmF0aW9uIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBPQ3ggaXMgbm90IGFjdGl2ZSAqLworI2RlZmluZSBMTF9USU1fT0NTVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFFICAgICAgICAgICAvKiE8IE9DeCBzaWduYWwgaXMgb3V0cHV0IG9uIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBwaW4gKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DTU9ERSBPdXRwdXQgQ29uZmlndXJhdGlvbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9GUk9aRU4gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPFRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIG91dHB1dCBjb21wYXJlIHJlZ2lzdGVyIFRJTXhfQ0NSeSBhbmQgdGhlIGNvdW50ZXIgVElNeF9DTlQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb3V0cHV0IGNoYW5uZWwgbGV2ZWwgKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgVElNX0NDTVIxX09DMU1fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPE9DeVJFRiBpcyBmb3JjZWQgaGlnaCBvbiBjb21wYXJlIG1hdGNoKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9JTkFDVElWRSAgICAgICAgICAgICAgICAgVElNX0NDTVIxX09DMU1fMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPE9DeVJFRiBpcyBmb3JjZWQgbG93IG9uIGNvbXBhcmUgbWF0Y2gqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX1RPR0dMRSAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzApICAgICAgICAgICAgICAgICAgICAvKiE8T0N5UkVGIHRvZ2dsZXMgb24gY29tcGFyZSBtYXRjaCovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFICAgICAgICAgIFRJTV9DQ01SMV9PQzFNXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGxvdyovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfRk9SQ0VEX0FDVElWRSAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMCkgICAgICAgICAgICAgICAgICAgIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGhpZ2gqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX1BXTTEgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzEpICAgICAgICAgICAgICAgICAgICAvKiE8SW4gdXBjb3VudGluZywgY2hhbm5lbCB5IGlzIGFjdGl2ZSBhcyBsb25nIGFzIFRJTXhfQ05UPFRJTXhfQ0NSeSBlbHNlIGluYWN0aXZlLiAgSW4gZG93bmNvdW50aW5nLCBjaGFubmVsIHkgaXMgaW5hY3RpdmUgYXMgbG9uZyBhcyBUSU14X0NOVD5USU14X0NDUnkgZWxzZSBhY3RpdmUuKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9QV00yICAgICAgICAgICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzIgfCBUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMCkgLyohPEluIHVwY291bnRpbmcsIGNoYW5uZWwgeSBpcyBpbmFjdGl2ZSBhcyBsb25nIGFzIFRJTXhfQ05UPFRJTXhfQ0NSeSBlbHNlIGFjdGl2ZS4gIEluIGRvd25jb3VudGluZywgY2hhbm5lbCB5IGlzIGFjdGl2ZSBhcyBsb25nIGFzIFRJTXhfQ05UPlRJTXhfQ0NSeSBlbHNlIGluYWN0aXZlKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DUE9MQVJJVFkgT3V0cHV0IENvbmZpZ3VyYXRpb24gUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fT0NQT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBPQ3hhY3RpdmUgaGlnaCovCisjZGVmaW5lIExMX1RJTV9PQ1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMVAgICAgICAgICAgICAgICAvKiE8IE9DeGFjdGl2ZSBsb3cqLworLyoqCisgICogQH0KKyAgKi8KKworCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0FDVElWRUlOUFVUIEFjdGl2ZSBJbnB1dCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkgICAgICAgICAgICAoVElNX0NDTVIxX0NDMVNfMCA8PCAxNlUpIC8qITwgSUN4IGlzIG1hcHBlZCBvbiBUSXggKi8KKyNkZWZpbmUgTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkgICAgICAgICAgKFRJTV9DQ01SMV9DQzFTXzEgPDwgMTZVKSAvKiE8IElDeCBpcyBtYXBwZWQgb24gVEl5ICovCisjZGVmaW5lIExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfQ0MxUyA8PCAxNlUpICAgLyohPCBJQ3ggaXMgbWFwcGVkIG9uIFRSQyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSUNQU0MgSW5wdXQgQ29uZmlndXJhdGlvbiBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgLyohPCBObyBwcmVzY2FsZXIsIGNhcHR1cmUgaXMgZG9uZSBlYWNoIHRpbWUgYW4gZWRnZSBpcyBkZXRlY3RlZCBvbiB0aGUgY2FwdHVyZSBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWMiAgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMVBTQ18wIDw8IDE2VSkgICAgLyohPCBDYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cyAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWNCAgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMVBTQ18xIDw8IDE2VSkgICAgLyohPCBDYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cyAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWOCAgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMVBTQyA8PCAxNlUpICAgICAgLyohPCBDYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSUNfRklMVEVSIElucHV0IENvbmZpZ3VyYXRpb24gRmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gZmlsdGVyLCBzYW1wbGluZyBpcyBkb25lIGF0IGZEVFMgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OMiAgICAgICAgICAgICAgKFRJTV9DQ01SMV9JQzFGXzAgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX040ICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMUZfMSA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj00ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjggICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMSB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONiAgICAgICAgICAgICAgKFRJTV9DQ01SMV9JQzFGXzIgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjggICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X042ICAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzIgfCBUSU1fQ0NNUjFfSUMxRl8xKSA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOCAgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMSB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjYgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxRl8zIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49NiAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044ICAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8wKSA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjUgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMSkgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONiAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8xIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X044ICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzIpIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjUgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NSAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONiAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMSkgPDwgMTZVKSAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044ICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxRiA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0lDX1BPTEFSSVRZIElucHV0IENvbmZpZ3VyYXRpb24gUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjaXJjdWl0IGlzIHNlbnNpdGl2ZSB0byBUSXhGUDEgcmlzaW5nIGVkZ2UsIFRJeEZQMSBpcyBub3QgaW52ZXJ0ZWQgKi8KKyNkZWZpbmUgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcgICAgICAgICAgICAgVElNX0NDRVJfQ0MxUCAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgY2lyY3VpdCBpcyBzZW5zaXRpdmUgdG8gVEl4RlAxIGZhbGxpbmcgZWRnZSwgVEl4RlAxIGlzIGludmVydGVkICovCisjZGVmaW5lIExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRSAgICAgICAgICAgIChUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApIC8qITwgVGhlIGNpcmN1aXQgaXMgc2Vuc2l0aXZlIHRvIGJvdGggVEl4RlAxIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcywgVEl4RlAxIGlzIG5vdCBpbnZlcnRlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0xPQ0tTT1VSQ0UgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0aW1lciBpcyBjbG9ja2VkIGJ5IHRoZSBpbnRlcm5hbCBjbG9jayBwcm92aWRlZCBmcm9tIHRoZSBSQ0MgKi8KKyNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMSAgICAgICAgICAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEgfCBUSU1fU01DUl9TTVNfMCkgICAvKiE8IENvdW50ZXIgY291bnRzIGF0IGVhY2ggcmlzaW5nIG9yIGZhbGxpbmcgZWRnZSBvbiBhIHNlbGVjdGVkIGlucHV0Ki8KKyNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMiAgICAgICAgICAgVElNX1NNQ1JfRUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgY291bnRzIGF0IGVhY2ggcmlzaW5nIG9yIGZhbGxpbmcgZWRnZSBvbiB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCBFVFIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VOQ09ERVJNT0RFIEVuY29kZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTEgICAgICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAxLCB4MiBtb2RlIC0gQ291bnRlciBjb3VudHMgdXAvZG93biBvbiBUSTFGUDEgZWRnZSBkZXBlbmRpbmcgb24gVEkyRlAyIGxldmVsICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTIgICAgICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAyLCB4MiBtb2RlIC0gQ291bnRlciBjb3VudHMgdXAvZG93biBvbiBUSTJGUDIgZWRnZSBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YNF9USTEyICAgICAgICAgICAgICAgICAgIChUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAzLCB4NCBtb2RlIC0gQ291bnRlciBjb3VudHMgdXAvZG93biBvbiBib3RoIFRJMUZQMSBhbmQgVEkyRlAyIGVkZ2VzIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgdGhlIG90aGVyIGlucHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19UUkdPIFRyaWdnZXIgT3V0cHV0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RSR09fUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVRyBiaXQgZnJvbSB0aGUgVElNeF9FR1IgcmVnaXN0ZXIgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19FTkFCTEUgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgRW5hYmxlIHNpZ25hbCAoQ05UX0VOKSBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX1VQREFURSAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBkYXRlIGV2ZW50IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKi8KKyNkZWZpbmUgTExfVElNX1RSR09fQ0MxSUYgICAgICAgICAgICAgICAgICAgICAgKFRJTV9DUjJfTU1TXzEgfCBUSU1fQ1IyX01NU18wKSAgICAgICAgICAgICAgICAgLyohPCBDQzEgY2FwdHVyZSBvciBhIGNvbXBhcmUgbWF0Y2ggaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19PQzFSRUYgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DMVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19PQzJSRUYgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzApICAgICAgICAgICAgICAgICAvKiE8IE9DMlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19PQzNSRUYgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzEpICAgICAgICAgICAgICAgICAvKiE8IE9DM1JFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19PQzRSRUYgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzEgfCBUSU1fQ1IyX01NU18wKSAvKiE8IE9DNFJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19TTEFWRU1PREUgU2xhdmUgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfRElTQUJMRUQgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2xhdmUgbW9kZSBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX1JFU0VUICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMiAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlc2V0IE1vZGUgLSBSaXNpbmcgZWRnZSBvZiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBpbnB1dCAoVFJHSSkgcmVpbml0aWFsaXplcyB0aGUgY291bnRlciAqLworI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX0dBVEVEICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMCkgICAvKiE8IEdhdGVkIE1vZGUgLSBUaGUgY291bnRlciBjbG9jayBpcyBlbmFibGVkIHdoZW4gdGhlIHRyaWdnZXIgaW5wdXQgKFRSR0kpIGlzIGhpZ2ggKi8KKyNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9UUklHR0VSICAgICAgICAgICAgICAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEpICAgLyohPCBUcmlnZ2VyIE1vZGUgLSBUaGUgY291bnRlciBzdGFydHMgYXQgYSByaXNpbmcgZWRnZSBvZiB0aGUgdHJpZ2dlciBUUkdJICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19UUyBUcmlnZ2VyIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMCAoSVRSMCkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIxICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1RTXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMSAoSVRSMSkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIyICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1RTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMiAoSVRSMikgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIzICAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fU01DUl9UU18wIHwgVElNX1NNQ1JfVFNfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMyAoSVRSMykgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19USTFGX0VEICAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1RTXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJMSBFZGdlIERldGVjdG9yIChUSTFGX0VEKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX1RJMUZQMSAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyZWQgVGltZXIgSW5wdXQgMSAoVEkxRlAxKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX1RJMkZQMiAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyZWQgVGltZXIgSW5wdXQgMiAoVEkxMlAyKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX0VUUkYgICAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18xIHwgVElNX1NNQ1JfVFNfMCkgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyZWQgZXh0ZXJuYWwgVHJpZ2dlciAoRVRSRikgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19FVFJfUE9MQVJJVFkgRXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9FVFJfUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRVRSIGlzIG5vbi1pbnZlcnRlZCwgYWN0aXZlIGF0IGhpZ2ggbGV2ZWwgb3IgcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgVElNX1NNQ1JfRVRQICAgICAgICAgICAgLyohPCBFVFIgaXMgaW52ZXJ0ZWQsIGFjdGl2ZSBhdCBsb3cgbGV2ZWwgb3IgZmFsbGluZyBlZGdlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19FVFJfUFJFU0NBTEVSIEV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBFVFIgcHJlc2NhbGVyIE9GRiAqLworI2RlZmluZSBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVYyICAgICAgICAgICAgICBUSU1fU01DUl9FVFBTXzAgICAgICAgICAvKiE8IEVUUiBmcmVxdWVuY3kgaXMgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgIFRJTV9TTUNSX0VUUFNfMSAgICAgICAgIC8qITwgRVRSIGZyZXF1ZW5jeSBpcyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgVElNX1NNQ1JfRVRQUyAgICAgICAgICAgLyohPCBFVFIgZnJlcXVlbmN5IGlzIGRpdmlkZWQgYnkgOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRVRSX0ZJTFRFUiBFeHRlcm5hbCBUcmlnZ2VyIEZpbHRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBmaWx0ZXIsIHNhbXBsaW5nIGlzIGRvbmUgYXQgZkRUUyAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OMiAgICAgICAgICAgICBUSU1fU01DUl9FVEZfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9ONCAgICAgICAgICAgICBUSU1fU01DUl9FVEZfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49NCAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OOCAgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzEgfCBUSU1fU01DUl9FVEZfMCkgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49OCAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMl9ONiAgICAgICAgICAgICBUSU1fU01DUl9FVEZfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYyX044ICAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMiB8IFRJTV9TTUNSX0VURl8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjRfTjYgICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8yIHwgVElNX1NNQ1JfRVRGXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49NiAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWNF9OOCAgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMSB8IFRJTV9TTUNSX0VURl8wKSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVY4X042ICAgICAgICAgICAgIFRJTV9TTUNSX0VURl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjggICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzApICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X041ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X042ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzEgfCBUSU1fU01DUl9FVEZfMCkgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X044ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzIpICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX041ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMCkgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX042ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMSkgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX044ICAgICAgICAgICAgVElNX1NNQ1JfRVRGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTggKi8KKy8qKgorICAqIEB9CisgICovCisKKworCisKKworCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0RNQUJVUlNUX0JBU0VBRERSIERNQSBCdXJzdCBCYXNlIEFkZHJlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ1IxICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DUjEgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ1IyICAgICAgICAgICBUSU1fRENSX0RCQV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DUjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfU01DUiAgICAgICAgICBUSU1fRENSX0RCQV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9TTUNSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0RJRVIgICAgICAgICAgKFRJTV9EQ1JfREJBXzEgfCAgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfRElFUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9TUiAgICAgICAgICAgIFRJTV9EQ1JfREJBXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X1NSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0VHUiAgICAgICAgICAgKFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfRUdSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIxICAgICAgICAgKFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NNUjEgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjIgICAgICAgICAoVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEgfCBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DQ01SMiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ0VSICAgICAgICAgIFRJTV9EQ1JfREJBXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDRVIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ05UICAgICAgICAgICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DTlQgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfUFNDICAgICAgICAgICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9QU0MgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQVJSICAgICAgICAgICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzEgfCBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9BUlIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfUkNSICAgICAgICAgICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9SQ1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMSAgICAgICAgICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DQ1IxIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjIgICAgICAgICAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSkgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NSMiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IzICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEgfCBUSU1fRENSX0RCQV8wKSAgLyohPCBUSU14X0NDUjMgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNCAgICAgICAgICBUSU1fRENSX0RCQV80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DQ1I0IHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0JEVFIgICAgICAgICAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQkRUUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMyAgICAgICAgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDTVIzIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjUgICAgICAgICAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8xIHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NSNSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I2ICAgICAgICAgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDUjYgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfT1IxICAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9PUjEgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfT1IyICAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8xKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9PUjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfT1IzICAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8xIHwgVElNX0RDUl9EQkFfMCkgIC8qITwgVElNeF9PUjMgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRE1BQlVSU1RfTEVOR1RIIERNQSBCdXJzdCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzFUUkFOU0ZFUiAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEgcmVnaXN0ZXIgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzJUUkFOU0ZFUlMgICAgICBUSU1fRENSX0RCTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDIgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8zVFJBTlNGRVJTICAgICAgVElNX0RDUl9EQkxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAzIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNFRSQU5TRkVSUyAgICAgIChUSU1fRENSX0RCTF8xIHwgIFRJTV9EQ1JfREJMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gNCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzVUUkFOU0ZFUlMgICAgICBUSU1fRENSX0RCTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDUgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF82VFJBTlNGRVJTICAgICAgKFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byA2IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfN1RSQU5TRkVSUyAgICAgIChUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gNyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzhUUkFOU0ZFUlMgICAgICAoVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzEgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF85VFJBTlNGRVJTICAgICAgVElNX0RDUl9EQkxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byA5IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTBUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTAgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMVRSQU5TRkVSUyAgICAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxMSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEyVFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzEgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEyIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTNUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTMgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNFRSQU5TRkVSUyAgICAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMCkgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxNCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE1VFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8xKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE1IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTZUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzEgfCBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xN1RSQU5TRkVSUyAgICAgVElNX0RDUl9EQkxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxNyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE4VFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfNCB8ICBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE4IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTJfRVRSX1JNUCAgVElNMiBFeHRlcm5hbCBUcmlnZ2VyIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfRVRSX1JNUF9HUElPICAgICBUSU0yX09SX1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yX0VUUiBpcyBjb25uZWN0ZWQgdG8gT3JlZCBHUElPICovCisjaWYgZGVmaW5lZChUSU1fVElNMl9SRU1BUF9IU0lfU1VQUE9SVCkKKyNkZWZpbmUgTExfVElNX1RJTTJfRVRSX1JNUF9IU0kgICAgICAoVElNMl9PUl9FVFJfUk1QXzEgfCBUSU0yX09SX0VUUl9STVBfMCB8IFRJTTJfT1JfUk1QX01BU0spICAgLyohPCBUSU0yX0VUUiBpcyBjb25uZWN0ZWQgdG8gSFNJICovCisjZW5kaWYgLyogZGVmaW5lZChUSU1fVElNMl9SRU1BUF9IU0lfU1VQUE9SVCkgKi8KKyNpZiBkZWZpbmVkKFRJTV9USU0yX1JFTUFQX0hTSTQ4X1NVUFBPUlQpCisjZGVmaW5lIExMX1RJTV9USU0yX0VUUl9STVBfSFNJNDggICAgKFRJTTJfT1JfRVRSX1JNUF8yIHwgVElNMl9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMl9FVFIgaXMgY29ubmVjdGVkIHRvIEhTSTQ4ICovCisjZW5kaWYgLyogZGVmaW5lZChUSU1fVElNMl9SRU1BUF9IU0k0OF9TVVBQT1JUKSAqLworI2RlZmluZSBMTF9USU1fVElNMl9FVFJfUk1QX0xTRSAgICAgIChUSU0yX09SX0VUUl9STVBfMiB8IFRJTTJfT1JfRVRSX1JNUF8wIHwgVElNMl9PUl9STVBfTUFTSykgICAvKiE8IFRJTTJfRVRSIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfRVRSX1JNUF9DT01QMiAgICAoVElNMl9PUl9FVFJfUk1QXzIgfCBUSU0yX09SX0VUUl9STVBfMSB8IFRJTTJfT1JfUk1QX01BU0spICAgLyohPCBUSU0yX0VUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yX0VUUl9STVBfQ09NUDEgICAgKFRJTTJfT1JfRVRSX1JNUCB8IFRJTTJfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMl9FVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yX1RJNF9STVAgIFRJTTIgVGltZXIgSW5wdXQgQ2g0IFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfVEk0X1JNUF9HUElPICAgICAgVElNMl9PUl9STVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMiBpbnB1dCBjYXB0dXJlIDQgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfVEk0X1JNUF9DT01QMiAgICAgKFRJTTJfT1JfVEk0X1JNUF8wIHwgVElNMl9PUl9STVBfTUFTSykgICAgIC8qITwgVElNMiBpbnB1dCBjYXB0dXJlIDQgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTRfUk1QX0NPTVAxICAgICAoVElNMl9PUl9USTRfUk1QXzEgfCBUSU0yX09SX1JNUF9NQVNLKSAgICAgLyohPCBUSU0yIGlucHV0IGNhcHR1cmUgNCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChUSU0zX09SX0VUUl9STVApCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0zX0VUUl9STVAgIFRJTTMgRXh0ZXJuYWwgVHJpZ2dlciBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9USU0zX0VUUl9STVBfR1BJTyAgICAgICAgIFRJTTNfT1JfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0zX0VUUiBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNM19FVFJfUk1QX0hTSTQ4RElWNiAgICAoVElNM19PUl9FVFJfUk1QXzEgfCBUSU0zX09SX1JNUF9NQVNLKSAgICAgICAgIC8qITwgVElNM19FVFIgaXMgY29ubmVjdGVkIHRvIEhTSTQ4IGRpdmlkZWQgYnkgNiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKFRJTTNfT1JfRVRSX1JNUCkgKi8KKworI2lmIGRlZmluZWQoVElNM19PUl9USTFfUk1QKSB8fCBkZWZpbmVkKFRJTTNfT1JfVEkyX1JNUCkgfHwgZGVmaW5lZChUSU0zX09SX1RJNF9STVApCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0zX1RJX1JNUCAgVElNMyBFeHRlcm5hbCBJbnB1dHMgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNM19USV9STVBfVEkxX1VTQl9TT0YgICAgICBUSU0zX09SX1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0zX1RJMSBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gVVNCX1NPRiAqLworI2RlZmluZSBMTF9USU1fVElNM19USV9STVBfVEkxX0dQSU8gICAgICAgICAoVElNM19PUl9USTFfUk1QIHwgVElNM19PUl9STVBfTUFTSykgICAgICAgLyohPCBUSU0zX1RJMSBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gUEUzLCBQQTYsIFBDNiBvciBQQjQgKi8KKworI2RlZmluZSBMTF9USU1fVElNM19USV9STVBfVEkyX0dQSU9fREVGICAgICBUSU0zX09SX1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXBwaW5nIFBCNSB0byBUSU0yMl9DSDIgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfVElfUk1QX1RJMl9HUElPQjVfQUY0ICAgKFRJTTNfT1JfVEkyX1JNUCB8IFRJTTNfT1JfUk1QX01BU0spICAgICAgIC8qITwgTWFwcGluZyBQQjUgdG8gVElNM19DSDIgKi8KKworI2RlZmluZSBMTF9USU1fVElNM19USV9STVBfVEk0X0dQSU9fREVGICAgICAoMHgwMDAwMDAwMFUgfCBUSU0zX09SX1JNUF9NQVNLKSAgICAgICAgICAgLyohPCBNYXBwaW5nIFBDOSB0byBVU0JfT0UgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfVElfUk1QX1RJNF9HUElPQzlfQUYyICAgKFRJTTNfT1JfVEk0X1JNUCB8IFRJTTNfT1JfUk1QX01BU0spICAgICAgIC8qITwgTWFwcGluZyBQQzkgdG8gVElNM19DSDQgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypkZWZpbmVkKFRJTTNfT1JfVEkxX1JNUCkgb3IgZGVmaW5lZChUSU0zX09SX1RJMl9STVApIG9yIGRlZmluZWQoVElNM19PUl9USTRfUk1QKSovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTIxX0VUUl9STVAgIFRJTTIxIEV4dGVybmFsIFRyaWdnZXIgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMjFfRVRSX1JNUF9HUElPICBUSU0yMV9PUl9STVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjFfRVRSIGlzIGNvbm5lY3RlZCB0byBPcmVkIEdQSU8xICovCisjZGVmaW5lIExMX1RJTV9USU0yMV9FVFJfUk1QX0NPTVAyIChUSU0yMV9PUl9FVFJfUk1QXzAgfCBUSU0yMV9PUl9STVBfTUFTSykgICAgLyohPCBUSU0yMV9FVFIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMjFfRVRSX1JNUF9DT01QMSAoVElNMjFfT1JfRVRSX1JNUF8xIHwgVElNMjFfT1JfUk1QX01BU0spICAgIC8qITwgVElNMjFfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIxX0VUUl9STVBfTFNFICAgKFRJTTIxX09SX0VUUl9STVAgfCBUSU0yMV9PUl9STVBfTUFTSykgICAgICAvKiE8IFRJTTIxX0VUUiBpcyBjb25uZWN0ZWQgdG8gTFNFICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yMV9USTFfUk1QICBUSU0yMSBFeHRlcm5hbCBJbnB1dCBDaDEgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMjFfVEkxX1JNUF9HUElPICAgIFRJTTIxX09SX1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjFfVEkxIGlzIGNvbm5lY3RlZCB0byBPcmVkIEdQSU8xICovCisjZGVmaW5lIExMX1RJTV9USU0yMV9USTFfUk1QX1JUQ19XSyAgKFRJTTIxX09SX1RJMV9STVBfMCB8IFRJTTIxX09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMV9USTEgaXMgY29ubmVjdGVkIHRvIFJUQ19XQUtFVVAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIxX1RJMV9STVBfSFNFX1JUQyAoVElNMjFfT1JfVEkxX1JNUF8xIHwgVElNMjFfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIxX1RJMSBpcyBjb25uZWN0ZWQgdG8gSFNFX1JUQyAqLworI2RlZmluZSBMTF9USU1fVElNMjFfVEkxX1JNUF9NU0kgICAgIChUSU0yMV9PUl9USTFfUk1QXzEgfCBUSU0yMV9PUl9USTFfUk1QXzAgfCBUSU0yMV9PUl9STVBfTUFTSykgIC8qITwgVElNMjFfVEkxIGlzIGNvbm5lY3RlZCB0byBNU0kgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIxX1RJMV9STVBfTFNFICAgICAoVElNMjFfT1JfVEkxX1JNUF8yIHwgVElNMjFfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIxX1RJMSBpcyBjb25uZWN0ZWQgdG8gTFNFICovCisjZGVmaW5lIExMX1RJTV9USU0yMV9USTFfUk1QX0xTSSAgICAgKFRJTTIxX09SX1RJMV9STVBfMiB8IFRJTTIxX09SX1RJMV9STVBfMCB8IFRJTTIxX09SX1JNUF9NQVNLKSAgLyohPCBUSU0yMV9USTEgaXMgY29ubmVjdGVkIHRvIExTSSAqLworI2RlZmluZSBMTF9USU1fVElNMjFfVEkxX1JNUF9DT01QMSAgIChUSU0yMV9PUl9USTFfUk1QXzIgfCBUSU0yMV9PUl9USTFfUk1QXzEgfCBUSU0yMV9PUl9STVBfTUFTSykgIC8qITwgVElNMjFfVEkxIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIxX1RJMV9STVBfTUNPICAgICAoVElNMjFfT1JfVEkxX1JNUCB8IFRJTTIxX09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIxX1RJMSBpcyBjb25uZWN0ZWQgdG8gTUNPICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yMV9USTJfUk1QICBUSU0yMSBFeHRlcm5hbCBJbnB1dCBDaDIgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMjFfVEkyX1JNUF9HUElPICAgIFRJTTIxX09SX1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMjFfVEkyIGlzIGNvbm5lY3RlZCB0byBPcmVkIEdQSU8xICovCisjZGVmaW5lIExMX1RJTV9USU0yMV9USTJfUk1QX0NPTVAyICAgKFRJTTIxX09SX1RJMl9STVAgfCBUSU0yMV9PUl9STVBfTUFTSykgICAgICAgLyohPCBUSU0yMV9USTIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVElNMjJfT1JfRVRSX1JNUCkKKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMjJfRVRSX1JNUCAgVElNMjIgRXh0ZXJuYWwgVHJpZ2dlciBSZW1hcAorKiBAeworKi8KKyNkZWZpbmUgTExfVElNX1RJTTIyX0VUUl9STVBfR1BJTyAgVElNMjJfT1JfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIyX0VUUiBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMjJfRVRSX1JNUF9DT01QMiAoVElNMjJfT1JfRVRSX1JNUF8wIHwgVElNMjJfT1JfUk1QX01BU0spICAgIC8qITwgVElNMjJfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTIyX0VUUl9STVBfQ09NUDEgKFRJTTIyX09SX0VUUl9STVBfMSB8IFRJTTIyX09SX1JNUF9NQVNLKSAgICAvKiE8IFRJTTIyX0VUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yMl9FVFJfUk1QX0xTRSAgIChUSU0yMl9PUl9FVFJfUk1QIHwgVElNMjJfT1JfUk1QX01BU0spICAgICAgLyohPCBUSU0yMl9FVFIgaXMgY29ubmVjdGVkIHRvIExTRSAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKFRJTTIyX09SX0VUUl9STVApICovCisKKyNpZiBkZWZpbmVkKFRJTTIyX09SX1RJMV9STVApCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yMl9USTFfUk1QICBUSU0yMiBFeHRlcm5hbCBJbnB1dCBDaDEgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMjJfVEkxX1JNUF9HUElPMSAgVElNMjJfT1JfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yMl9USTEgaXMgY29ubmVjdGVkIHRvIEdQSU8xICovCisjZGVmaW5lIExMX1RJTV9USU0yMl9USTFfUk1QX0NPTVAyICAoVElNMjJfT1JfVEkxX1JNUF8wIHwgVElNMjJfT1JfUk1QX01BU0spICAgICAvKiE8IFRJTTIyX1RJMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yMl9USTFfUk1QX0NPTVAxICAoVElNMjJfT1JfVEkxX1JNUF8xIHwgVElNMjJfT1JfUk1QX01BU0spICAgICAvKiE8IFRJTTIyX1RJMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIExMX1RJTV9USU0yMl9USTFfUk1QX0dQSU8yICAoVElNMjJfT1JfVEkxX1JNUCB8IFRJTTIyX09SX1JNUF9NQVNLKSAgICAgICAvKiE8IFRJTTIyX1RJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTzIgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogZGVmaW5lZChUSU0yMl9PUl9USTFfUk1QKSAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FeHBvcnRlZF9NYWNyb3MgVElNIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFRJTSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBUSU0gSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX1RJTV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKChfX0lOU1RBTkNFX18pLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gVElNIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFRJTSBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9USU1fUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKChfX0lOU1RBTkNFX18pLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRU1fRXhwb3J0ZWRfTWFjcm9zIEV4cG9ydGVkX01hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBwcmVzY2FsZXIgdmFsdWUgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgY291bnRlciBjbG9jayBmcmVxdWVuY3kuCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19QU0MgKDgwMDAwMDAwLCAxMDAwMDAwKTsKKyAgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcGFyYW0gIF9fQ05UQ0xLX18gY291bnRlciBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqIEByZXR2YWwgUHJlc2NhbGVyIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KKyNkZWZpbmUgX19MTF9USU1fQ0FMQ19QU0MoX19USU1DTEtfXywgX19DTlRDTEtfXykgICBcCisgICAoKChfX1RJTUNMS19fKSA+PSAoX19DTlRDTEtfXykpID8gKHVpbnQzMl90KSgoKF9fVElNQ0xLX18pLyhfX0NOVENMS19fKSkgLSAxVSkgOiAwVSkKKworLyoqCisgICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGF1dG8tcmVsb2FkIHZhbHVlIHRvIGFjaGlldmUgdGhlIHJlcXVpcmVkIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5LgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfQVJSICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXIgKCksIDEwMDAwKTsKKyAgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyCisgICogQHBhcmFtICBfX0ZSRVFfXyBvdXRwdXQgc2lnbmFsIGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHJldHZhbCAgQXV0by1yZWxvYWQgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworI2RlZmluZSBfX0xMX1RJTV9DQUxDX0FSUihfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0ZSRVFfXykgXAorICAgICAoKCgoX19USU1DTEtfXykvKChfX1BTQ19fKSArIDFVKSkgPj0gKF9fRlJFUV9fKSkgPyAoKChfX1RJTUNMS19fKS8oKF9fRlJFUV9fKSAqICgoX19QU0NfXykgKyAxVSkpKSAtIDFVKSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgY29tcGFyZSB2YWx1ZSByZXF1aXJlZCB0byBhY2hpZXZlIHRoZSByZXF1aXJlZCB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkuCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19ERUxBWSAoMTAwMDAwMCwgQHJlZiBMTF9USU1fR2V0UHJlc2NhbGVyICgpLCAxMCk7CisgICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcgorICAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpCisgICogQHJldHZhbCBDb21wYXJlIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KKyNkZWZpbmUgX19MTF9USU1fQ0FMQ19ERUxBWShfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0RFTEFZX18pICBcCisoKHVpbnQzMl90KSgoKHVpbnQ2NF90KShfX1RJTUNMS19fKSAqICh1aW50NjRfdCkoX19ERUxBWV9fKSkgXAorICAgICAgICAgIC8gKCh1aW50NjRfdCkxMDAwMDAwVSAqICh1aW50NjRfdCkoKF9fUFNDX18pICsgMVUpKSkpCisKKy8qKgorICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSB0byBhY2hpZXZlIHRoZSByZXF1aXJlZCBwdWxzZSBkdXJhdGlvbiAod2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gb25lIHB1bHNlIG1vZGUpLgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfUFVMU0UgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlciAoKSwgMTAsIDIwKTsKKyAgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyCisgICogQHBhcmFtICBfX0RFTEFZX18gdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5IChpbiB1cykKKyAgKiBAcGFyYW0gIF9fUFVMU0VfXyBwdWxzZSBkdXJhdGlvbiAoaW4gdXMpCisgICogQHJldHZhbCBBdXRvLXJlbG9hZCB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfUFVMU0UoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fLCBfX1BVTFNFX18pICBcCisgKCh1aW50MzJfdCkoX19MTF9USU1fQ0FMQ19ERUxBWSgoX19USU1DTEtfXyksIChfX1BTQ19fKSwgKF9fUFVMU0VfXykpIFwKKyAgICAgICAgICAgKyBfX0xMX1RJTV9DQUxDX0RFTEFZKChfX1RJTUNMS19fKSwgKF9fUFNDX18pLCAoX19ERUxBWV9fKSkpKQorCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyByZXRyaWV2aW5nIHRoZSByYXRpbyBvZiB0aGUgaW5wdXQgY2FwdHVyZSBwcmVzY2FsZXIKKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9HRVRfSUNQU0NfUkFUSU8gKEByZWYgTExfVElNX0lDX0dldFByZXNjYWxlciAoKSk7CisgICogQHBhcmFtICBfX0lDUFNDX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWOAorICAqIEByZXR2YWwgSW5wdXQgY2FwdHVyZSBwcmVzY2FsZXIgcmF0aW8gKDEsIDIsIDQgb3IgOCkKKyAgKi8KKyNkZWZpbmUgX19MTF9USU1fR0VUX0lDUFNDX1JBVElPKF9fSUNQU0NfXykgIFwKKyAgICgodWludDMyX3QpKDB4MDFVIDw8ICgoKF9fSUNQU0NfXykgPj4gMTZVKSA+PiBUSU1fQ0NNUjFfSUMxUFNDX1BvcykpKQorCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfVGltZV9CYXNlIFRpbWUgQmFzZSBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRpbWVyIGNvdW50ZXIuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9USU1fRW5hYmxlQ291bnRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUNvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aW1lciBjb3VudGVyLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENFTiAgICAgICAgICAgTExfVElNX0Rpc2FibGVDb3VudGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUNvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGltZXIgY291bnRlciBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENFTiAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZENvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NFTikgPT0gKFRJTV9DUjFfQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB1cGRhdGUgZXZlbnQgZ2VuZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRElTICAgICAgICAgIExMX1RJTV9FbmFibGVVcGRhdGVFdmVudAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZVVwZGF0ZUV2ZW50KFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdXBkYXRlIGV2ZW50IGdlbmVyYXRpb24uCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVURJUyAgICAgICAgICBMTF9USU1fRGlzYWJsZVVwZGF0ZUV2ZW50CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZVVwZGF0ZUV2ZW50KFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB1cGRhdGUgZXZlbnQgZ2VuZXJhdGlvbiBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVESVMgICAgICAgICAgTExfVElNX0lzRW5hYmxlZFVwZGF0ZUV2ZW50CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBJbnZlcnRlZCBzdGF0ZSBvZiBiaXQgKDAgb3IgMSkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZFVwZGF0ZUV2ZW50KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfVURJUykgPT0gKHVpbnQzMl90KVJFU0VUKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHVwZGF0ZSBldmVudCBzb3VyY2UKKyAgKiBAbm90ZSBVcGRhdGUgZXZlbnQgc291cmNlIHNldCB0byBMTF9USU1fVVBEQVRFU09VUkNFX1JFR1VMQVI6IGFueSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cworICAqICAgICAgIGdlbmVyYXRlIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgaWYgZW5hYmxlZDoKKyAgKiAgICAgICAgLSBDb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdworICAqICAgICAgICAtIFNldHRpbmcgdGhlIFVHIGJpdAorICAqICAgICAgICAtIFVwZGF0ZSBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlcgorICAqIEBub3RlIFVwZGF0ZSBldmVudCBzb3VyY2Ugc2V0IHRvIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUjogb25seSBjb3VudGVyCisgICogICAgICAgb3ZlcmZsb3cvdW5kZXJmbG93IGdlbmVyYXRlcyBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVVJTICAgICAgICAgICBMTF9USU1fU2V0VXBkYXRlU291cmNlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBVcGRhdGVTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX1JFR1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX0NPVU5URVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRVcGRhdGVTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFVwZGF0ZVNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIFRJTV9DUjFfVVJTLCBVcGRhdGVTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZXZlbnQgdXBkYXRlIHNvdXJjZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVSUyAgICAgICAgICAgTExfVElNX0dldFVwZGF0ZVNvdXJjZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX1JFR1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX0NPVU5URVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0VXBkYXRlU291cmNlKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfVVJTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IG9uZSBwdWxzZSBtb2RlIChvbmUgc2hvdCB2LnMuIHJlcGV0aXRpdmUpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE9QTSAgICAgICAgICAgTExfVElNX1NldE9uZVB1bHNlTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT25lUHVsc2VNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09ORVBVTFNFTU9ERV9TSU5HTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT05FUFVMU0VNT0RFX1JFUEVUSVRJVkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRPbmVQdWxzZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IE9uZVB1bHNlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIFRJTV9DUjFfT1BNLCBPbmVQdWxzZU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgb25lIHB1bHNlIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgT1BNICAgICAgICAgICBMTF9USU1fR2V0T25lUHVsc2VNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PTkVQVUxTRU1PREVfU0lOR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09ORVBVTFNFTU9ERV9SRVBFVElUSVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldE9uZVB1bHNlTW9kZShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX09QTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdGltZXIgY291bnRlciBjb3VudGluZyBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8KKyAgKiAgICAgICBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgY291bnRlciBtb2RlIHNlbGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZAorICAqICAgICAgIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQG5vdGUgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24KKyAgKiAgICAgICBkdWUgdG8gRElSIGJpdCByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJUiAgICAgICAgICAgTExfVElNX1NldENvdW50ZXJNb2RlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBDTVMgICAgICAgICAgIExMX1RJTV9TZXRDb3VudGVyTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ291bnRlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfRE9XTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX0RPV04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDb3VudGVyTW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ291bnRlck1vZGUpCit7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IxLCAoVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUyksIENvdW50ZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGNvdW50ZXIgbW9kZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DT1VOVEVSX01PREVfU0VMRUNUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvCisgICogICAgICAgY2hlY2sgd2hldGhlciBvciBub3QgdGhlIGNvdW50ZXIgbW9kZSBzZWxlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQKKyAgKiAgICAgICBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJUiAgICAgICAgICAgTExfVElNX0dldENvdW50ZXJNb2RlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBDTVMgICAgICAgICAgIExMX1RJTV9HZXRDb3VudGVyTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfRE9XTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX0RPV04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0Q291bnRlck1vZGUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhdXRvLXJlbG9hZCAoQVJSKSBwcmVsb2FkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFSUEUgICAgICAgICAgTExfVElNX0VuYWJsZUFSUlByZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVBUlJQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9BUlBFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG8tcmVsb2FkIChBUlIpIHByZWxvYWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQVJQRSAgICAgICAgICBMTF9USU1fRGlzYWJsZUFSUlByZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQVJSUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkNSMSxUSU1fQ1IxX0FSUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIGF1dG8tcmVsb2FkIChBUlIpIHByZWxvYWQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBUlBFICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRBUlJQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEFSUlByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9BUlBFKSA9PSAoVElNX0NSMV9BUlBFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGl2aXNpb24gcmF0aW8gYmV0d2VlbiB0aGUgdGltZXIgY2xvY2sgIGFuZCB0aGUgc2FtcGxpbmcgY2xvY2sgdXNlZCBieSB0aGUgZGVhZC10aW1lIGdlbmVyYXRvcnMgKHdoZW4gc3VwcG9ydGVkKSBhbmQgdGhlIGRpZ2l0YWwgZmlsdGVycy4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS19ESVZJU0lPTl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IHRoZSBjbG9jayBkaXZpc2lvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXIKKyAgKiAgICAgICBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDS0QgICAgICAgICAgIExMX1RJTV9TZXRDbG9ja0RpdmlzaW9uCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja0RpdmlzaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2xvY2tEaXZpc2lvbikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIFRJTV9DUjFfQ0tELCBDbG9ja0RpdmlzaW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGFjdHVhbCBkaXZpc2lvbiByYXRpbyBiZXR3ZWVuIHRoZSB0aW1lciBjbG9jayAgYW5kIHRoZSBzYW1wbGluZyBjbG9jayB1c2VkIGJ5IHRoZSBkZWFkLXRpbWUgZ2VuZXJhdG9ycyAod2hlbiBzdXBwb3J0ZWQpIGFuZCB0aGUgZGlnaXRhbCBmaWx0ZXJzLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgdGhlIGNsb2NrIGRpdmlzaW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0aW1lcgorICAqICAgICAgIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENLRCAgICAgICAgICAgTExfVElNX0dldENsb2NrRGl2aXNpb24KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldENsb2NrRGl2aXNpb24oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9DS0QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNvdW50ZXIgdmFsdWUuCisgICogQHJtdG9sbCBDTlQgICAgICAgICAgQ05UICAgICAgICAgICBMTF9USU1fU2V0Q291bnRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ291bnRlciBDb3VudGVyIHZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb3VudGVyKQoreworICBXUklURV9SRUcoVElNeC0+Q05ULCBDb3VudGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGNvdW50ZXIgdmFsdWUuCisgICogQHJtdG9sbCBDTlQgICAgICAgICAgQ05UICAgICAgICAgICBMTF9USU1fR2V0Q291bnRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ291bnRlciB2YWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkYpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldENvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNOVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBkaXJlY3Rpb24gb2YgdGhlIGNvdW50ZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBESVIgICAgICAgICAgIExMX1RJTV9HZXREaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJESVJFQ1RJT05fVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUkRJUkVDVElPTl9ET1dOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldERpcmVjdGlvbihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0RJUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgcHJlc2NhbGVyIHZhbHVlLgorICAqIEBub3RlIFRoZSBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeSBDS19DTlQgaXMgZXF1YWwgdG8gZkNLX1BTQyAvIChQU0NbMTU6MF0gKyAxKS4KKyAgKiBAbm90ZSBUaGUgcHJlc2NhbGVyIGNhbiBiZSBjaGFuZ2VkIG9uIHRoZSBmbHkgYXMgdGhpcyBjb250cm9sIHJlZ2lzdGVyIGlzIGJ1ZmZlcmVkLiBUaGUgbmV3CisgICogICAgICAgcHJlc2NhbGVyIHJhdGlvIGlzIHRha2VuIGludG8gYWNjb3VudCBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQuCisgICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19QU0MgY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBQcmVzY2FsZXIgcGFyYW1ldGVyCisgICogQHJtdG9sbCBQU0MgICAgICAgICAgUFNDICAgICAgICAgICBMTF9USU1fU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXIgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgUHJlc2NhbGVyKQoreworICBXUklURV9SRUcoVElNeC0+UFNDLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgcHJlc2NhbGVyIHZhbHVlLgorICAqIEBybXRvbGwgUFNDICAgICAgICAgIFBTQyAgICAgICAgICAgTExfVElNX0dldFByZXNjYWxlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgIFByZXNjYWxlciB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+UFNDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4KKyAgKiBAbm90ZSBUaGUgY291bnRlciBpcyBibG9ja2VkIHdoaWxlIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSBpcyBudWxsLgorICAqIEBub3RlIEhlbHBlciBtYWNybyBAcmVmIF9fTExfVElNX0NBTENfQVJSIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgQXV0b1JlbG9hZCBwYXJhbWV0ZXIKKyAgKiBAcm10b2xsIEFSUiAgICAgICAgICBBUlIgICAgICAgICAgIExMX1RJTV9TZXRBdXRvUmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBBdXRvUmVsb2FkIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRBdXRvUmVsb2FkKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBBdXRvUmVsb2FkKQoreworICBXUklURV9SRUcoVElNeC0+QVJSLCBBdXRvUmVsb2FkKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGF1dG8tcmVsb2FkIHZhbHVlLgorICAqIEBybXRvbGwgQVJSICAgICAgICAgIEFSUiAgICAgICAgICAgTExfVElNX0dldEF1dG9SZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEF1dG8tcmVsb2FkIHZhbHVlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldEF1dG9SZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkFSUikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9DYXB0dXJlX0NvbXBhcmUgQ2FwdHVyZSBDb21wYXJlIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRyaWdnZXIgb2YgdGhlIGNhcHR1cmUvY29tcGFyZSBETUEgcmVxdWVzdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ0RTICAgICAgICAgIExMX1RJTV9DQ19TZXRETUFSZXFUcmlnZ2VyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBETUFSZXFUcmlnZ2VyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDRE1BUkVRVUVTVF9DQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfU2V0RE1BUmVxVHJpZ2dlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRE1BUmVxVHJpZ2dlcikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfQ0NEUywgRE1BUmVxVHJpZ2dlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCB0cmlnZ2VyIG9mIHRoZSBjYXB0dXJlL2NvbXBhcmUgRE1BIHJlcXVlc3QuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NEUyAgICAgICAgICBMTF9USU1fQ0NfR2V0RE1BUmVxVHJpZ2dlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NETUFSRVFVRVNUX0NDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDRE1BUkVRVUVTVF9VUERBVEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fQ0NfR2V0RE1BUmVxVHJpZ2dlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDRFMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIGNoYW5uZWxzLgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMUUgICAgICAgICAgTExfVElNX0NDX0VuYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMkUgICAgICAgICAgTExfVElNX0NDX0VuYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM0UgICAgICAgICAgTExfVElNX0NDX0VuYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNEUgICAgICAgICAgTExfVElNX0NDX0VuYWJsZUNoYW5uZWwKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWxzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX0VuYWJsZUNoYW5uZWwoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWxzKQoreworICBTRVRfQklUKFRJTXgtPkNDRVIsIENoYW5uZWxzKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSBjaGFubmVscy4KKyAgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFFICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM0UgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRFICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWxzKQoreworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgQ2hhbm5lbHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgY2hhbm5lbChzKSBpcyhhcmUpIGVuYWJsZWQuCisgICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxRSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzRSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0RSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWwoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWxzKQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DQ0VSLCBDaGFubmVscykgPT0gKENoYW5uZWxzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9PdXRwdXRfQ2hhbm5lbCBPdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGFuIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIENDMVMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgQ0MyUyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDNFMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9ISUdIIG9yIEByZWYgTExfVElNX09DUE9MQVJJVFlfTE9XCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfQ29uZmlnT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBDb25maWd1cmF0aW9uKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfQ0MxUyA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLCAoVElNX0NDRVJfQ0MxUCA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pLAorICAgICAgICAgICAgIChDb25maWd1cmF0aW9uICYgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBEZWZpbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBvdXRwdXQgcmVmZXJlbmNlIHNpZ25hbCBPQ3hSRUYgZnJvbSB3aGljaAorICAqICAgICAgICAgT0N4IGFuZCBPQ3hOICh3aGVuIHJlbGV2YW50KSBhcmUgZGVyaXZlZC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GUk9aRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfSU5BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1RPR0dMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GT1JDRURfQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QV00xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QV00yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0TW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTW9kZSkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfT0MxTSAgfCBUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSwgIE1vZGUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIG91dHB1dCBjb21wYXJlIG1vZGUgb2YgYW4gb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxTSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyTSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzTSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0TSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZST1pFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9JTkFDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfVE9HR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1BXTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1BXTTIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0TW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgKChUSU1fQ0NNUjFfT0MxTSAgfCBUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSkgPj4gU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIGFuIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9MT1cKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRQb2xhcml0eShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwgKFRJTV9DQ0VSX0NDMVAgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwgIFBvbGFyaXR5IDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBwb2xhcml0eSBvZiBhbiBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUE9MQVJJVFlfTE9XCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldFBvbGFyaXR5KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPkNDRVIsIChUSU1fQ0NFUl9DQzFQIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGZhc3QgbW9kZSBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBub3RlIEFjdHMgb25seSBpZiB0aGUgY2hhbm5lbCBpcyBjb25maWd1cmVkIGluIFBXTTEgb3IgUFdNMiBtb2RlLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzRkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNEZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRW5hYmxlRmFzdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgU0VUX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZmFzdCBtb2RlIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxRkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0ZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0RkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRGlzYWJsZUZhc3QoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIGZhc3QgbW9kZSBpcyBlbmFibGVkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxRkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3RcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0RkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3RcbgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICByZWdpc3RlciB1aW50MzJfdCBiaXRmaWVsZCA9IFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF07CisgIHJldHVybiAoKFJFQURfQklUKCpwUmVnLCBiaXRmaWVsZCkgPT0gYml0ZmllbGQpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxUEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMlBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0UEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBTRVRfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMVBFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxUEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM1BFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0UEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFQRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBjb21wYXJlIHJlZ2lzdGVyIChUSU14X0NDUngpIHByZWxvYWQgaXMgZW5hYmxlZCBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMVBFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzUEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNFBFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkXG4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxUEUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgYml0ZmllbGQpID09IGJpdGZpZWxkKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNsZWFyaW5nIHRoZSBvdXRwdXQgY2hhbm5lbCBvbiBhbiBleHRlcm5hbCBldmVudC4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaW4gT3V0cHV0IGNvbXBhcmUgYW5kIFBXTSBtb2Rlcy4gSXQgZG9lcyBub3Qgd29yayBpbiBGb3JjZWQgbW9kZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9PQ1hSRUZfQ0xFQVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBjbGVhciB0aGUgT0N4UkVGIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkNFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzQ0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19FbmFibGVDbGVhcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgU0VUX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFDRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNsZWFyaW5nIHRoZSBvdXRwdXQgY2hhbm5lbCBvbiBhbiBleHRlcm5hbCBldmVudC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9PQ1hSRUZfQ0xFQVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBjbGVhciB0aGUgT0N4UkVGIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRGlzYWJsZUNsZWFyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfT0MxQ0UgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIGNsZWFyaW5nIHRoZSBvdXRwdXQgY2hhbm5lbCBvbiBhbiBleHRlcm5hbCBldmVudCBpcyBlbmFibGVkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBlbmFibGVzIGNsZWFyaW5nIHRoZSBvdXRwdXQgY2hhbm5lbCBvbiBhbiBleHRlcm5hbCBldmVudC4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaW4gT3V0cHV0IGNvbXBhcmUgYW5kIFBXTSBtb2Rlcy4gSXQgZG9lcyBub3Qgd29yayBpbiBGb3JjZWQgbW9kZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9PQ1hSRUZfQ0xFQVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBjbGVhciB0aGUgT0N4UkVGIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkNFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzQ0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxQ0UgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgYml0ZmllbGQpID09IGJpdGZpZWxkKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDEgKFRJTXhfQ0NSMSkuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDEoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjEsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDIgKFRJTXhfQ0NSMikuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMiBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjIgICAgICAgICBDQ1IyICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjIsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDMgKFRJTXhfQ0NSMykuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MzX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IzICAgICAgICAgQ0NSMyAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gzKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIFdSSVRFX1JFRyhUSU14LT5DQ1IzLCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCA0IChUSU14X0NDUjQpLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1I0ICAgICAgICAgQ0NSNCAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIFdSSVRFX1JFRyhUSU14LT5DQ1I0LCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjEpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDEuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0gxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1IyKSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCAyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDIgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IyICAgICAgICAgQ0NSMiAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNIMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRDb21wYXJlQ0gyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSMykgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgMy4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCAzIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMyAgICAgICAgIENDUjMgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0Q29tcGFyZUNIMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjQpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M0X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjQgICAgICAgICBDQ1I0ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjQpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfSW5wdXRfQ2hhbm5lbCBJbnB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgaW5wdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBDQzFTICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMVBTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMxRiAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBDQzJTICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMlBTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMyRiAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM1BTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUMzRiAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBDQzRTICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNFBTQyAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUM0RiAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5QICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5QICAgICAgICAgTExfVElNX0lDX0NvbmZpZworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEBwYXJhbSAgQ29uZmlndXJhdGlvbiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgYWxsIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSSBvciBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJIG9yIEByZWYgTExfVElNX0FDVElWRUlOUFVUX1RSQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYxIG9yIC4uLiBvciBAcmVmIExMX1RJTV9JQ1BTQ19ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMSBvciAuLi4gb3IgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcgb3IgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORyBvciBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ29uZmlndXJhdGlvbikKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfSUMxRiB8IFRJTV9DQ01SMV9JQzFQU0MgfCBUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoKENvbmZpZ3VyYXRpb24gPj4gMTZVKSAmIChUSU1fQ0NNUjFfSUMxRiB8IFRJTV9DQ01SMV9JQzFQU0MgfCBUSU1fQ0NNUjFfQ0MxUykpICA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsICgoVElNX0NDRVJfQ0MxTlAgfCBUSU1fQ0NFUl9DQzFQKSA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pLAorICAgICAgICAgICAgIChDb25maWd1cmF0aW9uICYgKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkpIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBhY3RpdmUgaW5wdXQuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgQ0MxUyAgICAgICAgICBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXRcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIENDMlMgICAgICAgICAgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0M0UyAgICAgICAgICBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcGFyYW0gIElDQWN0aXZlSW5wdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfSU5ESVJFQ1RUSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgSUNBY3RpdmVJbnB1dCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSwgKElDQWN0aXZlSW5wdXQgPj4gMTZVKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBhY3RpdmUgaW5wdXQuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgQ0MxUyAgICAgICAgICBMTF9USU1fSUNfR2V0QWN0aXZlSW5wdXRcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIENDMlMgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9JQ19HZXRBY3RpdmVJbnB1dFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0M0UyAgICAgICAgICBMTF9USU1fSUNfR2V0QWN0aXZlSW5wdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfVFJDCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgKChUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSkgPj4gU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSA8PCAxNlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgcHJlc2NhbGVyIG9mIGlucHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgSUMxUFNDICAgICAgICBMTF9USU1fSUNfU2V0UHJlc2NhbGVyXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJQU0MgICAgICAgIExMX1RJTV9JQ19TZXRQcmVzY2FsZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM1BTQyAgICAgICAgTExfVElNX0lDX1NldFByZXNjYWxlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUM0UFNDICAgICAgICBMTF9USU1fSUNfU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBJQ1ByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBJQ1ByZXNjYWxlcikKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfSUMxUFNDKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pLCAoSUNQcmVzY2FsZXIgPj4gMTZVKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBwcmVzY2FsZXIgdmFsdWUgYWN0aW5nIG9uIGFuICBpbnB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMVBTQyAgICAgICAgTExfVElNX0lDX0dldFByZXNjYWxlclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMyUFNDICAgICAgICBMTF9USU1fSUNfR2V0UHJlc2NhbGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNQU0MgICAgICAgIExMX1RJTV9JQ19HZXRQcmVzY2FsZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNFBTQyAgICAgICAgTExfVElNX0lDX0dldFByZXNjYWxlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRQcmVzY2FsZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHJldHVybiAoKFJFQURfQklUKCpwUmVnLCAoKFRJTV9DQ01SMV9JQzFQU0MpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkgPDwgMTZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGlucHV0IGZpbHRlciBkdXJhdGlvbi4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBJQzFGICAgICAgICAgIExMX1RJTV9JQ19TZXRGaWx0ZXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMkYgICAgICAgICAgTExfVElNX0lDX1NldEZpbHRlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUMzRiAgICAgICAgICBMTF9USU1fSUNfU2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRGICAgICAgICAgIExMX1RJTV9JQ19TZXRGaWx0ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcGFyYW0gIElDRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX040CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYyX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY4X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X041CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX041CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9OOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX1NldEZpbHRlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgSUNGaWx0ZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX0lDMUYpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSksIChJQ0ZpbHRlciA+PiAxNlUpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBpbnB1dCBmaWx0ZXIgZHVyYXRpb24uCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgSUMxRiAgICAgICAgICBMTF9USU1fSUNfR2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJGICAgICAgICAgIExMX1RJTV9JQ19HZXRGaWx0ZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM0YgICAgICAgICAgTExfVElNX0lDX0dldEZpbHRlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUM0RiAgICAgICAgICBMTF9USU1fSUNfR2V0RmlsdGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX04yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9ONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY0X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0RmlsdGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgKChUSU1fQ0NNUjFfSUMxRikgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSkgPj4gU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSA8PCAxNlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgaW5wdXQgY2hhbm5lbCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0TlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcGFyYW0gIElDUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19TZXRQb2xhcml0eShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgSUNQb2xhcml0eSkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLCAoKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICBJQ1BvbGFyaXR5IDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjdXJyZW50IGlucHV0IGNoYW5uZWwgcG9sYXJpdHkuCisgICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTlAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNOUCAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRQb2xhcml0eShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5DQ0VSLCAoKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSkgPj4KKyAgICAgICAgICBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbm5lY3QgdGhlIFRJTXhfQ0gxLCBDSDIgYW5kIENIMyBwaW5zICB0byB0aGUgVEkxIGlucHV0IChYT1IgY29tYmluYXRpb24pLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1hPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gWE9SIGlucHV0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRJMVMgICAgICAgICAgTExfVElNX0lDX0VuYWJsZVhPUkNvbWJpbmF0aW9uCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfRW5hYmxlWE9SQ29tYmluYXRpb24oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX1RJMVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2Nvbm5lY3QgdGhlIFRJTXhfQ0gxLCBDSDIgYW5kIENIMyBwaW5zICBmcm9tIHRoZSBUSTEgaW5wdXQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fWE9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBYT1IgaW5wdXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVEkxUyAgICAgICAgICBMTF9USU1fSUNfRGlzYWJsZVhPUkNvbWJpbmF0aW9uCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfRGlzYWJsZVhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX1RJMVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyBhcmUgY29ubmVjdGVjdGVkIHRvIHRoZSBUSTEgaW5wdXQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fWE9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBYT1IgaW5wdXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVEkxUyAgICAgICAgICBMTF9USU1fSUNfSXNFbmFibGVkWE9SQ29tYmluYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfSXNFbmFibGVkWE9SQ29tYmluYXRpb24oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9USTFTKSA9PSAoVElNX0NSMl9USTFTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjYXB0dXJlZCB2YWx1ZSBmb3IgaW5wdXQgY2hhbm5lbCAxLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGlucHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDYXB0dXJlZFZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gxKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IxKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgaW5wdXQgY2hhbm5lbCAyIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMiAgICAgICAgIENDUjIgICAgICAgICAgTExfVElNX0lDX0dldENhcHR1cmVDSDIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENhcHR1cmVkVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldENhcHR1cmVDSDIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgMy4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBpbnB1dCBjaGFubmVsIDMgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IzICAgICAgICAgQ0NSMyAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ2FwdHVyZWRWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjYXB0dXJlZCB2YWx1ZSBmb3IgaW5wdXQgY2hhbm5lbCA0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGlucHV0IGNoYW5uZWwgNCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjQgICAgICAgICBDQ1I0ICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0g0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDYXB0dXJlZFZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRDYXB0dXJlQ0g0KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1I0KSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0Nsb2NrX1NlbGVjdGlvbiBDb3VudGVyIGNsb2NrIHNlbGVjdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBleHRlcm5hbCBjbG9jayBtb2RlIDIuCisgICogQG5vdGUgV2hlbiBleHRlcm5hbCBjbG9jayBtb2RlIDIgaXMgZW5hYmxlZCB0aGUgY291bnRlciBpcyBjbG9ja2VkIGJ5IGFueSBhY3RpdmUgZWRnZSBvbiB0aGUgRVRSRiBzaWduYWwuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX0VuYWJsZUV4dGVybmFsQ2xvY2sKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVFeHRlcm5hbENsb2NrKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX0VDRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBleHRlcm5hbCBjbG9jayBtb2RlIDIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVFeHRlcm5hbENsb2NrCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUV4dGVybmFsQ2xvY2soVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9FQ0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgZXh0ZXJuYWwgY2xvY2sgbW9kZSAyIGlzIGVuYWJsZWQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEV4dGVybmFsQ2xvY2sKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRXh0ZXJuYWxDbG9jayhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfRUNFKSA9PSAoVElNX1NNQ1JfRUNFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY2xvY2sgc291cmNlIG9mIHRoZSBjb3VudGVyIGNsb2NrLgorICAqIEBub3RlIHdoZW4gc2VsZWN0ZWQgY2xvY2sgc291cmNlIGlzIGV4dGVybmFsIGNsb2NrIG1vZGUgMSwgdGhlIHRpbWVyIGlucHV0CisgICogICAgICAgdGhlIGV4dGVybmFsIGNsb2NrIGlzIGFwcGxpZWQgaXMgc2VsZWN0ZWQgYnkgY2FsbGluZyB0aGUgQHJlZiBMTF9USU1fU2V0VHJpZ2dlcklucHV0KCkKKyAgKiAgICAgICBmdW5jdGlvbi4gVGhpcyB0aW1lciBpbnB1dCBtdXN0IGJlIGNvbmZpZ3VyZWQgYnkgY2FsbGluZworICAqICAgICAgIHRoZSBAcmVmIExMX1RJTV9JQ19Db25maWcoKSBmdW5jdGlvbi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTEuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIFNNUyAgICAgICAgICAgTExfVElNX1NldENsb2NrU291cmNlXG4KKyAgKiAgICAgICAgIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9TZXRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tTT1VSQ0VfRVhUX01PREUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldENsb2NrU291cmNlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDbG9ja1NvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMgfCBUSU1fU01DUl9FQ0UsIENsb2NrU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGVuY29kZXIgaW50ZXJmYWNlIG1vZGUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBlbmNvZGVyIG1vZGUuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0RW5jb2Rlck1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEVuY29kZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfWDRfVEkxMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEVuY29kZXJNb2RlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBFbmNvZGVyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMsIEVuY29kZXJNb2RlKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfVGltZXJfU3luY2hyb25pemF0aW9uIFRpbWVyIHN5bmNocm9uaXNhdGlvbiBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0cmlnZ2VyIG91dHB1dCAoVFJHTykgdXNlZCBmb3IgdGltZXIgc3luY2hyb25pemF0aW9uIC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9NQVNURVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgbWFzdGVyIHRpbWVyLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1NUyAgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyU3luY2hyb25pemF0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19VUERBVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19DQzFJRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX09DMVJFRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX09DMlJFRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX09DM1JFRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX09DNFJFRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFRyaWdnZXJPdXRwdXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRpbWVyU3luY2hyb25pemF0aW9uKQoreworICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgVElNX0NSMl9NTVMsIFRpbWVyU3luY2hyb25pemF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHN5bmNocm9uaXphdGlvbiBtb2RlIG9mIGEgc2xhdmUgdGltZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0U2xhdmVNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBTbGF2ZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX0RJU0FCTEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NMQVZFTU9ERV9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfR0FURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX1RSSUdHRVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRTbGF2ZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFNsYXZlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMsIFNsYXZlTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzZWxlY3RzIHRoZSB0cmlnZ2VyIGlucHV0IHRvIGJlIHVzZWQgdG8gc3luY2hyb25pemUgdGhlIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgVFMgICAgICAgICAgICBMTF9USU1fU2V0VHJpZ2dlcklucHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUcmlnZ2VySW5wdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19USTFGX0VECisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX1RJMUZQMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19USTJGUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfRVRSRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFRyaWdnZXJJbnB1dChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVHJpZ2dlcklucHV0KQoreworICBNT0RJRllfUkVHKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX1RTLCBUcmlnZ2VySW5wdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTWFzdGVyL1NsYXZlIG1vZGUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgTVNNICAgICAgICAgICBMTF9USU1fRW5hYmxlTWFzdGVyU2xhdmVNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlTWFzdGVyU2xhdmVNb2RlKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX01TTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgTWFzdGVyL1NsYXZlIG1vZGUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgTVNNICAgICAgICAgICBMTF9USU1fRGlzYWJsZU1hc3RlclNsYXZlTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVNYXN0ZXJTbGF2ZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9NU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE1hc3Rlci9TbGF2ZSBtb2RlIGlzIGVuYWJsZWQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgTVNNICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkTWFzdGVyU2xhdmVNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZE1hc3RlclNsYXZlTW9kZShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfTVNNKSA9PSAoVElNX1NNQ1JfTVNNKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgZXh0ZXJuYWwgdHJpZ2dlciAoRVRSKSBpbnB1dC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9FVFJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgRVRQICAgICAgICAgICBMTF9USU1fQ29uZmlnRVRSXG4KKyAgKiAgICAgICAgIFNNQ1IgICAgICAgICBFVFBTICAgICAgICAgIExMX1RJTV9Db25maWdFVFJcbgorICAqICAgICAgICAgU01DUiAgICAgICAgIEVURiAgICAgICAgICAgTExfVElNX0NvbmZpZ0VUUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRVRSUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BPTEFSSVRZX05PTklOVkVSVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QT0xBUklUWV9JTlZFUlRFRAorICAqIEBwYXJhbSAgRVRSUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWOAorICAqIEBwYXJhbSAgRVRSRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX040CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYyX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjRfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWNF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVY4X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9Db25maWdFVFIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEVUUlBvbGFyaXR5LCB1aW50MzJfdCBFVFJQcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVUUkZpbHRlcikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9FVFAgfCBUSU1fU01DUl9FVFBTIHwgVElNX1NNQ1JfRVRGLCBFVFJQb2xhcml0eSB8IEVUUlByZXNjYWxlciB8IEVUUkZpbHRlcik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0RNQV9CdXJzdF9Nb2RlIERNQSBidXJzdCBtb2RlIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSB0aW1lciBETUEgYnVyc3QgZmVhdHVyZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9ETUFCVVJTVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgICogICAgICAgbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIERNQSBidXJzdCBtb2RlLgorICAqIEBybXRvbGwgRENSICAgICAgICAgIERCTCAgICAgICAgICAgTExfVElNX0NvbmZpZ0RNQUJ1cnN0XG4KKyAgKiAgICAgICAgIERDUiAgICAgICAgICBEQkEgICAgICAgICAgIExMX1RJTV9Db25maWdETUFCdXJzdAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRE1BQnVyc3RCYXNlQWRkcmVzcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ1IyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NNQ1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRElFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9TUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9FR1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfUFNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FSUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9SQ1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9CRFRSCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9PUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfT1IyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX09SMworICAqIEBwYXJhbSAgRE1BQnVyc3RMZW5ndGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzFUUkFOU0ZFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMlRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfM1RSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNFRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNVRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNlRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfN1RSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfOFRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfOVRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTBUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzExVFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMlRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTNUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE0VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNVRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTZUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE3VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xOFRSQU5TRkVSUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0RNQUJ1cnN0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBETUFCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBETUFCdXJzdExlbmd0aCkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5EQ1IsIChUSU1fRENSX0RCTCB8IFRJTV9EQ1JfREJBKSwgKERNQUJ1cnN0QmFzZUFkZHJlc3MgfCBETUFCdXJzdExlbmd0aCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9UaW1lcl9JbnB1dHNfUmVtYXBwaW5nIFRpbWVyIGlucHV0IHJlbWFwcGluZworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFJlbWFwIFRJTSBpbnB1dHMgKGlucHV0IGNoYW5uZWwsIGludGVybmFsL2V4dGVybmFsIHRyaWdnZXJzKS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9SRU1BUF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgc29tZSB0aW1lciBpbnB1dHMgY2FuIGJlIHJlbWFwcGVkLgorICAqIEBybXRvbGwgVElNMl9PUiAgICAgRVRSX1JNUCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0yX09SICAgICBUSTRfUk1QICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAgKiAgICAgICAgIFRJTTIxX09SICAgIEVUUl9STVAgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICAqICAgICAgICAgVElNMjFfT1IgICAgVEkxX1JNUCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0yMV9PUiAgICBUSTJfUk1QICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAgKiAgICAgICAgIFRJTTIyX09SICAgIEVUUl9STVAgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICAqICAgICAgICAgVElNMjJfT1IgICAgVEkxX1JNUCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0zX09SICAgICBFVFJfUk1QICAgICAgTExfVElNX1NldFJlbWFwXG4KKyAgKiAgICAgICAgIFRJTTNfT1IgICAgIFRJMV9STVAgICAgICBMTF9USU1fU2V0UmVtYXBcbgorICAqICAgICAgICAgVElNM19PUiAgICAgVEkyX1JNUCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0zX09SICAgICBUSTRfUk1QICAgICAgTExfVElNX1NldFJlbWFwCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBSZW1hcCBSZW1hcCBwYXJhbXMgZGVwZW5kcyBvbiB0aGUgVElNeC4gRGVzY3JpcHRpb24gYXZhaWxhYmxlIG9ubHkKKyAgKiAgICAgICAgIGluIENITSB2ZXJzaW9uIG9mIHRoZSBVc2VyIE1hbnVhbCAobm90IGluIC5wZGYpLgorICAqICAgICAgICAgT3RoZXJ3aXNlIHNlZSBSZWZlcmVuY2UgTWFudWFsIGRlc2NyaXB0aW9uIG9mIE9SIHJlZ2lzdGVycy4KKyAgKgorICAqICAgICAgICAgQmVsb3cgZGVzY3JpcHRpb24gc3VtbWFyaXplcyAiVGltZXIgSW5zdGFuY2UiIGFuZCAiUmVtYXAiIHBhcmFtIGNvbWJpbmF0aW9uczoKKyAgKgorICAqICAgICAgICAgVElNMjogYW55IGNvbWJpbmF0aW9uIG9mIEVUUl9STVAsIFRJNF9STVAgd2hlcmUKKyAgKgorICAqICAgICAgICAgICAgLiAuIEVUUl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUl9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUl9STVBfSFNJICAgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSX1JNUF9IU0k0OCAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9FVFJfUk1QX0xTRQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0VUUl9STVBfQ09NUDIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9FVFJfUk1QX0NPTVAxCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBUSTRfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTRfUk1QX0dQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTRfUk1QX0NPTVAxCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEk0X1JNUF9DT01QMgorICAqCisgICogICAgICAgICBUSU0zOiBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgICAgICAgICgqKikKKyAgKgorICAqICAgICAgICAgICAgLiAuIEVUUl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyAgICAoKiopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSX1JNUF9HUElPCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfRVRSX1JNUF9IU0k0OERJVjYKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJX1JNUF9USTEgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyAoKiopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVElfUk1QX1RJMV9VU0JfU09GCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVElfUk1QX1RJMV9HUElPCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBUSV9STVBfVEkyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgKCoqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJX1JNUF9USTJfR1BJT19ERUYKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNM19USV9STVBfVEkyX0dQSU9CNV9BRjQKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJX1JNUF9USTQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyAoKiopCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTNfVElfUk1QX1RJNF9HUElPX0RFRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJX1JNUF9USTRfR1BJT0M5X0FGMgorICAqCisgICogICAgICAgICBUSU0yMTogYW55IGNvbWJpbmF0aW9uIG9mIEVUUl9STVAsIFRJMV9STVAsIFRJMl9STVAgd2hlcmUKKyAgKgorICAqICAgICAgICAgICAgLiAuIEVUUl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMV9FVFJfUk1QX0dQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjFfRVRSX1JNUF9DT01QMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMV9FVFJfUk1QX0NPTVAxCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIxX0VUUl9STVBfTFNFCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBUSTFfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjFfVEkxX1JNUF9HUElPCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIxX1RJMV9STVBfUlRDX1dLCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIxX1RJMV9STVBfSFNFX1JUQworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMV9USTFfUk1QX01TSQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMV9USTFfUk1QX0xTRQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMV9USTFfUk1QX0xTSQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMV9USTFfUk1QX0NPTVAxCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIxX1RJMV9STVBfTUNPCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBUSTJfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjFfVEkyX1JNUF9HUElPCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIxX1RJMl9STVBfQ09NUDIKKyAgKgorICAqICAgICAgICAgVElNMjI6IGFueSBjb21iaW5hdGlvbiBvZiBFVFJfUk1QLCBUSTFfUk1QIHdoZXJlICAoKiopCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBFVFJfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgKCoqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMl9FVFJfUk1QX0dQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjJfRVRSX1JNUF9DT01QMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMl9FVFJfUk1QX0NPTVAxCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIyX0VUUl9STVBfTFNFCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBUSTFfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgKCoqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMl9USTFfUk1QX0dQSU8xCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTIyX1RJMV9STVBfQ09NUDIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMjJfVEkxX1JNUF9DT01QMQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yMl9USTFfUk1QX0dQSU8yCisgICoKKyAgKiAgICAgICAgICgqKSBWYWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcy4gXG4KKyAgKiAgICAgICAgICgqKSBSZWdpc3RlciBub3QgYXZhaWxhYmxlIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFJlbWFwKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBSZW1hcCkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5PUiwgKFJlbWFwID4+IFRJTXhfT1JfUk1QX1NISUZUKSwgKFJlbWFwICYgVElNeF9PUl9STVBfTUFTSykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBRy1NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBVSUYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9VSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSBpcyBzZXQgKHVwZGF0ZSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgVUlGICAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX1VJRikgPT0gKFRJTV9TUl9VSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnIChDQzFGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzFJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGZsYWcgKENDMUYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMUlGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzFJRikgPT0gKFRJTV9TUl9DQzFJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcgKENDMkYpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMklGICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDMklGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgZmxhZyAoQ0MyRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MySUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDMklGKSA9PSAoVElNX1NSX0NDMklGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAoQ0MzRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MzSUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MzSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBmbGFnIChDQzNGKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzNJRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MzSUYpID09IChUSU1fU1JfQ0MzSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnIChDQzRGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzRJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzRJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGZsYWcgKENDNEYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNElGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzRJRikgPT0gKFRJTV9TUl9DQzRJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgdHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAoVElGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBUSUYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX1RJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAoVElGKSBpcyBzZXQgKHRyaWdnZXIgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFRJRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX1RJRikgPT0gKFRJTV9TUl9USUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAxIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MxT0YpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMU9GICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzFPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0MxT1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDMU9GKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMSBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDMU9GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFPRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MxT1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzFPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MxT0YpID09IChUSU1fU1JfQ0MxT0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAyIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MyT0YpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMk9GICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzJPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0MyT1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDMk9GKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMiBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDMk9GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAyIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MyT0YgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMk9WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MyT1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDMk9GKSA9PSAoVElNX1NSX0NDMk9GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgMyBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDM09GKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzNPRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MzT1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDM09WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzNPRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDMgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzNPRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgMyBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDM09GICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzNPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDM09WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzNPRikgPT0gKFRJTV9TUl9DQzNPRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDQgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzRPRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M0T0YgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDNE9WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzRPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0M0T0YpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSA0IG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0M0T0YpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDQgb3Zlci1jYXB0dXJlIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzRPRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M0T1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzRPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M0T0YpID09IChUSU1fU1JfQ0M0T0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0lUX01hbmFnZW1lbnQgSVQtTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB1cGRhdGUgaW50ZXJydXB0IChVSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFVJRSAgICAgICAgICAgTExfVElNX0VuYWJsZUlUX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdXBkYXRlIGludGVycnVwdCAoVUlFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBVSUUgICAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVwZGF0ZSBpbnRlcnJ1cHQgKFVJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBVSUUgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VSUUpID09IChUSU1fRElFUl9VSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAxIGludGVycnVwdCAoQ0MxSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMUlFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMSAgaW50ZXJydXB0IChDQzFJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxSUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAxIGludGVycnVwdCAoQ0MxSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxSUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxSUUpID09IChUSU1fRElFUl9DQzFJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDIgaW50ZXJydXB0IChDQzJJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MySUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSAyICBpbnRlcnJ1cHQgKENDMklFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJJRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDIgaW50ZXJydXB0IChDQzJJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJJRSkgPT0gKFRJTV9ESUVSX0NDMklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgMyBpbnRlcnJ1cHQgKENDM0lFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNJRSAgICAgICAgIExMX1RJTV9FbmFibGVJVF9DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDMgIGludGVycnVwdCAoQ0MzSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0lFICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgMyBpbnRlcnJ1cHQgKENDM0lFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0lFICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDM0lFKSA9PSAoVElNX0RJRVJfQ0MzSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSA0IGludGVycnVwdCAoQ0M0SUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNElFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgNCAgaW50ZXJydXB0IChDQzRJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0SUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSA0IGludGVycnVwdCAoQ0M0SUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0SUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0SUUpID09IChUSU1fRElFUl9DQzRJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVElFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9USUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmlnZ2VyIGludGVycnVwdCAoVElFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX1RSSUcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVElFKSA9PSAoVElNX0RJRVJfVElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUEtTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB1cGRhdGUgRE1BIHJlcXVlc3QgKFVERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVURFICAgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHVwZGF0ZSBETUEgcmVxdWVzdCAoVURFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBVREUgICAgICAgICAgIExMX1RJTV9EaXNhYmxlRE1BUmVxX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXBkYXRlIERNQSByZXF1ZXN0ICAoVURFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFVERSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVURFKSA9PSAoVElNX0RJRVJfVURFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgMSBETUEgcmVxdWVzdCAoQ0MxREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMURFICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfQ0MxKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSAxICBETUEgcmVxdWVzdCAoQ0MxREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMURFICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAxIERNQSByZXF1ZXN0IChDQzFERSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFERSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMURFKSA9PSAoVElNX0RJRVJfQ0MxREUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAyIERNQSByZXF1ZXN0IChDQzJERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MyREUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MyREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDIgIERNQSByZXF1ZXN0IChDQzJERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MyREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDIgRE1BIHJlcXVlc3QgKENDMkRFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMkRFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MyREUpID09IChUSU1fRElFUl9DQzJERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDMgRE1BIHJlcXVlc3QgKENDM0RFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMyAgRE1BIHJlcXVlc3QgKENDM0RFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNERSAgICAgICAgIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgMyBETUEgcmVxdWVzdCAoQ0MzREUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzREUgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNERSkgPT0gKFRJTV9ESUVSX0NDM0RFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgNCBETUEgcmVxdWVzdCAoQ0M0REUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNERFICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfQ0M0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSA0ICBETUEgcmVxdWVzdCAoQ0M0REUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNERFICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSA0IERNQSByZXF1ZXN0IChDQzRERSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRERSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNERFKSA9PSAoVElNX0RJRVJfQ0M0REUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRERSAgICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRERSAgICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyaWdnZXIgaW50ZXJydXB0IChUREUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVERFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX1RSSUcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RERSkgPT0gKFRJTV9ESUVSX1RERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRVZFTlRfTWFuYWdlbWVudCBFVkVOVC1NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYW4gdXBkYXRlIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIFVHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX1VHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMSBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzFHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MxKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzFHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMiBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzJHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzJHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMyBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzNHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzNHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgNCBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzRHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0M0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzRHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSB0cmlnZ2VyIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIFRHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfVEcpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9Jbml0IEluaXRpYWxpc2F0aW9uIGFuZCBkZWluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX1RJTV9EZUluaXQoVElNX1R5cGVEZWYgKlRJTXgpOwordm9pZCBMTF9USU1fU3RydWN0SW5pdChMTF9USU1fSW5pdFR5cGVEZWYgKlRJTV9Jbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1RJTV9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSW5pdFR5cGVEZWYgKlRJTV9Jbml0U3RydWN0KTsKK3ZvaWQgTExfVElNX09DX1N0cnVjdEluaXQoTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fT0NfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NfSW5pdFN0cnVjdCk7Cit2b2lkIExMX1RJTV9JQ19TdHJ1Y3RJbml0KExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fSUNfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNfSW5pdFN0cnVjdCk7Cit2b2lkIExMX1RJTV9FTkNPREVSX1N0cnVjdEluaXQoTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgKlRJTV9FbmNvZGVySW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fRU5DT0RFUl9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiAqVElNX0VuY29kZXJJbml0U3RydWN0KTsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBUSU0xIHx8IFRJTTMgfHwgVElNMjEgfHwgVElNMjIgfHwgVElNNiB8fCBUSU03ICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyTDB4eF9MTF9USU1fSCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfdXNhcnQuaCBiL0luYy9zdG0zMmwweHhfbGxfdXNhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjExNDEwCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9sbF91c2FydC5oCkBAIC0wLDAgKzEsMzc0MCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF91c2FydC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVU0FSVCBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0xMX1VTQVJUX0gKKyNkZWZpbmUgU1RNMzJMMHh4X0xMX1VTQVJUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChVU0FSVDEpIHx8IGRlZmluZWQgKFVTQVJUMikgfHwgZGVmaW5lZCAoVVNBUlQ0KSB8fCBkZWZpbmVkIChVU0FSVDUpCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTEwgVVNBUlQKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfUHJpdmF0ZV9Db25zdGFudHMgVVNBUlQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfUHJpdmF0ZV9NYWNyb3MgVVNBUlQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VTX0lOSVQgVVNBUlQgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIExMIFVTQVJUIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBUaGlzIGZpZWxkIGRlZmluZXMgZXhwZWN0ZWQgVXNhcnQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldEJhdWRSYXRlKCkuKi8KKworICB1aW50MzJfdCBEYXRhV2lkdGg7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfREFUQVdJRFRILgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXREYXRhV2lkdGgoKS4qLworCisgIHVpbnQzMl90IFN0b3BCaXRzOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfU1RPUEJJVFMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkuKi8KKworICB1aW50MzJfdCBQYXJpdHk7ICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFBhcml0eSgpLiovCisKKyAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb247ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBhbmQvb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfRElSRUNUSU9OLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbigpLiovCisKKyAgdWludDMyX3QgSGFyZHdhcmVGbG93Q29udHJvbDsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX0hXQ09OVFJPTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0SFdGbG93Q3RybCgpLiovCisKKyAgdWludDMyX3QgT3ZlclNhbXBsaW5nOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBVU0FSVCBvdmVyc2FtcGxpbmcgbW9kZSBpcyAxNiBvciA4LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfT1ZFUlNBTVBMSU5HLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRPdmVyU2FtcGxpbmcoKS4qLworCit9IExMX1VTQVJUX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgTEwgVVNBUlQgQ2xvY2sgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tPdXRwdXQ7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVVNBUlQgY2xvY2sgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX0NMT0NLLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dCgpIG9yIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLworCisgIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLworCisgIHVpbnQzMl90IENsb2NrUGhhc2U7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfUEhBU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVCBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24uICovCisKKyAgdWludDMyX3QgTGFzdEJpdENsb2NrUHVsc2U7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19MQVNUQ0xLUFVMU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVCBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVVNBUlRfU2V0TGFzdENsa1B1bHNlT3V0cHV0KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4gKi8KKworfSBMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9Db25zdGFudHMgVVNBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1dyaXRlUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX1BFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0ZFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgICAgIC8qITwgRnJhbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkNGICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGVycm9yIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX09SRUNGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAgICAgICAgICAgICAvKiE8IElkbGUgbGluZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9UQ0NGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBmbGFnICovCisjaWYgZGVmaW5lZChVU0FSVF9UQ0JHVF9TVVBQT1JUKQorI2RlZmluZSBMTF9VU0FSVF9JQ1JfVENCR1RDRiAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQkdUQ0YgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGVkIGJlZm9yZSBndWFyZCB0aW1lIGZsYWcgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9VU0FSVF9JQ1JfTEJEQ0YgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0xCRENGICAgICAgICAgICAgICAgLyohPCBMSU4gYnJlYWsgZGV0ZWN0aW9uIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0NUU0NGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9DVFNDRiAgICAgICAgICAgICAgIC8qITwgQ1RTIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX1JUT0NGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9SVE9DRiAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZXIgdGltZW91dCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9FT0JDRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRU9CQ0YgICAgICAgICAgICAgICAvKiE8IEVuZCBvZiBibG9jayBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9DTUNGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ01DRiAgICAgICAgICAgICAgICAvKiE8IENoYXJhY3RlciBtYXRjaCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9XVUNGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfV1VDRiAgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9VU0FSVF9SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1BFICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9QRSAgICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0ZFICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgICAgICAgICAgIC8qITwgRnJhbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9ORSAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTkUgICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX09SRSAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9PUkUgICAgICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9JRExFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfSURMRSAgICAgICAgICAgICAgICAvKiE8IElkbGUgbGluZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SWE5FICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhORSAgICAgICAgICAgICAgICAvKiE8IFJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVEMgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RDICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVFhFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0xCREYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9MQkRGICAgICAgICAgICAgICAgIC8qITwgTElOIGJyZWFrIGRldGVjdGlvbiBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9DVFNJRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQ1RTSUYgICAgICAgICAgICAgICAvKiE8IENUUyBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQ1RTICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NUUyAgICAgICAgICAgICAgICAgLyohPCBDVFMgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUlRPRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JUT0YgICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlciB0aW1lb3V0IGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0VPQkYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9FT0JGICAgICAgICAgICAgICAgIC8qITwgRW5kIG9mIGJsb2NrIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0FCUkUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9BQlJFICAgICAgICAgICAgICAgIC8qITwgQXV0byBiYXVkIHJhdGUgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQUJSRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0FCUkYgICAgICAgICAgICAgICAgLyohPCBBdXRvIGJhdWQgcmF0ZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9CVVNZICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQlVTWSAgICAgICAgICAgICAgICAvKiE8IEJ1c3kgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQ01GICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NNRiAgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfU0JLRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1NCS0YgICAgICAgICAgICAgICAgLyohPCBTZW5kIGJyZWFrIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1JXVSAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SV1UgICAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZXIgd2FrZXVwIGZyb20gTXV0ZSBtb2RlIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1dVRiAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9XVUYgICAgICAgICAgICAgICAgIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1RFQUNLICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9URUFDSyAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1JFQUNLICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SRUFDSyAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAqLworI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKKyNkZWZpbmUgTExfVVNBUlRfSVNSX1RDQkdUICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9UQ0JHVCAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGNvbXBsZXRpb24gZmxhZyAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1JlYWRSZWcgYW5kICBMTF9VU0FSVF9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfSURMRUlFICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0lETEVJRSAgICAgICAgICAgICAgLyohPCBJRExFIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1JYTkVJRSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9SWE5FSUUgICAgICAgICAgICAgIC8qITwgUmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9UQ0lFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVENJRSAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9UWEVJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVFhFSUUgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfUEVJRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BFSUUgICAgICAgICAgICAgICAgLyohPCBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX0NNSUUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9DTUlFICAgICAgICAgICAgICAgIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1JUT0lFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9SVE9JRSAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9FT0JJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfRU9CSUUgICAgICAgICAgICAgICAvKiE8IEVuZCBvZiBCbG9jayBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMl9MQkRJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfTEJESUUgICAgICAgICAgICAgICAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjNfRUlFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0VJRSAgICAgICAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19DVFNJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfQ1RTSUUgICAgICAgICAgICAgICAvKiE8IENUUyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19XVUZJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfV1VGSUUgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjaWYgZGVmaW5lZChVU0FSVF9UQ0JHVF9TVVBQT1JUKQorI2RlZmluZSBMTF9VU0FSVF9DUjNfVENCR1RJRSAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX1RDQkdUSUUgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgaW50ZXJydXB0IGVuYWJsZSAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0RJUkVDVElPTiBDb21tdW5pY2F0aW9uIERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9OT05FICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyIGFyZSBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9VU0FSVF9ESVJFQ1RJT05fUlggICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGlzIGRpc2FibGVkIGFuZCBSZWNlaXZlciBpcyBlbmFibGVkICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9UWCAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXR0ZXIgaXMgZW5hYmxlZCBhbmQgUmVjZWl2ZXIgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfVEUgfFVTQVJUX0NSMV9SRSkgICAgICAgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGVuYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUEFSSVRZIFBhcml0eSBDb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUEFSSVRZX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBjb250cm9sIGRpc2FibGVkICovCisjZGVmaW5lIExMX1VTQVJUX1BBUklUWV9FVkVOICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUENFICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQYXJpdHkgY29udHJvbCBlbmFibGVkIGFuZCBFdmVuIFBhcml0eSBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9VU0FSVF9QQVJJVFlfT0REICAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMpICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgT2RkIFBhcml0eSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19XQUtFVVAgV2FrZXVwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfV0FLRVVQX0lETEVMSU5FICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8ICBVU0FSVCB3YWtlIHVwIGZyb20gTXV0ZSBtb2RlIG9uIElkbGUgTGluZSAqLworI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfQUREUkVTU01BUksgICAgICAgICAgICAgVVNBUlRfQ1IxX1dBS0UgICAgICAgIC8qITwgIFVTQVJUIHdha2UgdXAgZnJvbSBNdXRlIG1vZGUgb24gQWRkcmVzcyBNYXJrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0RBVEFXSURUSCBEYXRhd2lkdGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9EQVRBV0lEVEhfN0IgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX00xICAgICAgICAgICAgLyohPCA3IGJpdHMgd29yZCBsZW5ndGggOiBTdGFydCBiaXQsIDcgZGF0YSBiaXRzLCBuIHN0b3AgYml0cyAqLworI2RlZmluZSBMTF9VU0FSVF9EQVRBV0lEVEhfOEIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCA4IGJpdHMgd29yZCBsZW5ndGggOiBTdGFydCBiaXQsIDggZGF0YSBiaXRzLCBuIHN0b3AgYml0cyAqLworI2RlZmluZSBMTF9VU0FSVF9EQVRBV0lEVEhfOUIgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX00wICAgICAgICAgICAgLyohPCA5IGJpdHMgd29yZCBsZW5ndGggOiBTdGFydCBiaXQsIDkgZGF0YSBiaXRzLCBuIHN0b3AgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19PVkVSU0FNUExJTkcgT3ZlcnNhbXBsaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2ICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgLyohPCBPdmVyc2FtcGxpbmcgYnkgMTYgKi8KKyNkZWZpbmUgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzggICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9PVkVSOCAgICAgICAgLyohPCBPdmVyc2FtcGxpbmcgYnkgOCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19DTE9DSyBDbG9jayBTaWduYWwKKyAgKiBAeworICAqLworCisjZGVmaW5lIExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgIC8qITwgQ2xvY2sgc2lnbmFsIG5vdCBwcm92aWRlZCAqLworI2RlZmluZSBMTF9VU0FSVF9DTE9DS19FTkFCTEUgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOICAgICAgICAvKiE8IENsb2NrIHNpZ25hbCBwcm92aWRlZCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfTEFTVENMS1BVTFNFIExhc3QgQ2xvY2sgUHVsc2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfTk9fT1VUUFVUICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgVGhlIGNsb2NrIHB1bHNlIG9mIHRoZSBsYXN0IGRhdGEgYml0IGlzIG5vdCBvdXRwdXQgdG8gdGhlIFNDTEsgcGluICovCisjZGVmaW5lIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9PVVRQVVQgICAgICAgICAgICBVU0FSVF9DUjJfTEJDTCAgICAgICAgLyohPCBUaGUgY2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgaXMgb3V0cHV0IHRvIHRoZSBTQ0xLIHBpbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19QSEFTRSBDbG9jayBQaGFzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1BIQVNFXzFFREdFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBUaGUgZmlyc3QgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIGVkZ2UgKi8KKyNkZWZpbmUgTExfVVNBUlRfUEhBU0VfMkVER0UgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DUEhBICAgICAgICAvKiE8IFRoZSBzZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUE9MQVJJVFkgQ2xvY2sgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9QT0xBUklUWV9MT1cgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgU3RlYWR5IGxvdyB2YWx1ZSBvbiBTQ0xLIHBpbiBvdXRzaWRlIHRyYW5zbWlzc2lvbiB3aW5kb3cqLworI2RlZmluZSBMTF9VU0FSVF9QT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NQT0wgICAgICAgIC8qITwgU3RlYWR5IGhpZ2ggdmFsdWUgb24gU0NMSyBwaW4gb3V0c2lkZSB0cmFuc21pc3Npb24gd2luZG93ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1NUT1BCSVRTIFN0b3AgQml0cworICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1NUT1BCSVRTXzBfNSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwLjUgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDEgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMV81ICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjJfU1RPUF8wIHwgVVNBUlRfQ1IyX1NUT1BfMSkgICAgICAvKiE8IDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9TVE9QXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDIgc3RvcCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1RYUlggVFggUlggUGlucyBTd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfVFhSWF9TVEFOREFSRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgYXJlIHVzZWQgYXMgZGVmaW5lZCBpbiBzdGFuZGFyZCBwaW5vdXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfVFhSWF9TV0FQUEVEICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjJfU1dBUCkgICAgICAvKiE8IFRYIGFuZCBSWCBwaW5zIGZ1bmN0aW9ucyBhcmUgc3dhcHBlZC4gICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUlhQSU5fTEVWRUwgUlggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9SWFBJTl9MRVZFTF9TVEFOREFSRCAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgUlggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovCisjZGVmaW5lIExMX1VTQVJUX1JYUElOX0xFVkVMX0lOVkVSVEVEICAgICAgICAgICAoVVNBUlRfQ1IyX1JYSU5WKSAgICAgLyohPCBSWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfVFhQSU5fTEVWRUwgVFggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9UWFBJTl9MRVZFTF9TVEFOREFSRCAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgVFggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovCisjZGVmaW5lIExMX1VTQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVEICAgICAgICAgICAoVVNBUlRfQ1IyX1RYSU5WKSAgICAgLyohPCBUWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQklOQVJZX0xPR0lDIEJpbmFyeSBEYXRhIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBpbiBwb3NpdGl2ZS9kaXJlY3QgbG9naWMuICgxPUgsIDA9TCkgKi8KKyNkZWZpbmUgTExfVVNBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFICAgICAgICAgIFVTQVJUX0NSMl9EQVRBSU5WICAgICAvKiE8IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZSBzZW5kL3JlY2VpdmVkIGluIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMuICgxPUwsIDA9SCkuIFRoZSBwYXJpdHkgYml0IGlzIGFsc28gaW52ZXJ0ZWQuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0JJVE9SREVSIEJpdCBPcmRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0JJVE9SREVSX0xTQkZJUlNUICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfQklUT1JERVJfTVNCRklSU1QgICAgICAgICAgICAgIFVTQVJUX0NSMl9NU0JGSVJTVCAgICAvKiE8IGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19BVVRPQkFVRF9ERVRFQ1RfT04gQXV0b2JhdWQgRGV0ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX1NUQVJUQklUICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNZWFzdXJlbWVudCBvZiB0aGUgc3RhcnQgYml0IGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX0ZBTExJTkdFREdFIFVTQVJUX0NSMl9BQlJNT0RFXzAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGYWxsaW5nIGVkZ2UgdG8gZmFsbGluZyBlZGdlIG1lYXN1cmVtZW50LiBSZWNlaXZlZCBmcmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBzaW5nbGUgYml0ID0gMSAtPiBGcmFtZSA9IFN0YXJ0MTB4eHh4eHggKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzdGX0ZSQU1FICAgIFVTQVJUX0NSMl9BQlJNT0RFXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAweDdGIGZyYW1lIGRldGVjdGlvbiAqLworI2RlZmluZSBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fNTVfRlJBTUUgICAgKFVTQVJUX0NSMl9BQlJNT0RFXzEgfCBVU0FSVF9DUjJfQUJSTU9ERV8wKSAvKiE8IDB4NTUgZnJhbWUgZGV0ZWN0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0FERFJFU1NfREVURUNUIEFkZHJlc3MgTGVuZ3RoIERldGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzRCICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCA0LWJpdCBhZGRyZXNzIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfN0IgICAgICAgICAgICAgIFVTQVJUX0NSMl9BRERNNyAgICAgICAvKiE8IDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIChpbiA4LWJpdCBkYXRhIG1vZGUpIG1ldGhvZCBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19IV0NPTlRST0wgSGFyZHdhcmUgQ29udHJvbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0hXQ09OVFJPTF9OT05FICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfSFdDT05UUk9MX1JUUyAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19SVFNFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJUUyBvdXRwdXQgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHJlcXVlc3RlZCB3aGVuIHRoZXJlIGlzIHNwYWNlIGluIHRoZSByZWNlaXZlIGJ1ZmZlciAqLworI2RlZmluZSBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0NUU0UgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ1RTIG1vZGUgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHRyYW5zbWl0dGVkIHdoZW4gdGhlIG5DVFMgaW5wdXQgaXMgYXNzZXJ0ZWQgKHRpZWQgdG8gMCkgKi8KKyNkZWZpbmUgTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMgICAgICAgICAgICAgIChVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFKSAgICAvKiE8IENUUyBhbmQgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1dBS0VVUF9PTiBXYWtldXAgQWN0aXZhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBhZGRyZXNzIG1hdGNoICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCAgICAgICAgICAgICBVU0FSVF9DUjNfV1VTXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBTdGFydCBiaXQgZGV0ZWN0aW9uICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX1dVU18wIHwgVVNBUlRfQ1IzX1dVU18xKSAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBSWE5FICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0lSREFfUE9XRVIgSXJEQSBQb3dlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0lSREFfUE9XRVJfTk9STUFMICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBJckRBIG5vcm1hbCBwb3dlciBtb2RlICovCisjZGVmaW5lIExMX1VTQVJUX0lSREFfUE9XRVJfTE9XICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfSVJMUCAgICAgICAgLyohPCBJckRBIGxvdyBwb3dlciBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0xJTkJSRUFLX0RFVEVDVCBMSU4gQnJlYWsgRGV0ZWN0aW9uIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0xJTkJSRUFLX0RFVEVDVF8xMEIgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCAxMC1iaXQgYnJlYWsgZGV0ZWN0aW9uIG1ldGhvZCBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTFCICAgICAgICAgICAgVVNBUlRfQ1IyX0xCREwgICAgICAgIC8qITwgMTEtYml0IGJyZWFrIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfREVfUE9MQVJJVFkgRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RFX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgIFVTQVJUX0NSM19ERVAgICAgICAgICAvKiE8IERFIHNpZ25hbCBpcyBhY3RpdmUgbG93ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0RNQV9SRUdfREFUQSBETUEgUmVnaXN0ZXIgRGF0YQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIExMX1VTQVJUX0RNQV9SRUdfREFUQV9SRUNFSVZFICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgcmVjZXB0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9NYWNyb3MgVVNBUlQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFVTQVJUIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX1VTQVJUX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gVVNBUlQgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9VU0FSVF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FTV9FeHBvcnRlZF9NYWNyb3NfSGVscGVyIEV4cG9ydGVkX01hY3Jvc19IZWxwZXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbXB1dGUgVVNBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kCisgICogICAgICAgICBleHBlY3RlZCBCYXVkIFJhdGUgaW4gOCBiaXRzIHNhbXBsaW5nIG1vZGUgKDMyIGJpdHMgdmFsdWUgb2YgVVNBUlRESVYgaXMgcmV0dXJuZWQpCisgICogQHBhcmFtICBfX1BFUklQSENMS19fIFBlcmlwaGVyYWwgQ2xvY2sgZnJlcXVlbmN5IHVzZWQgZm9yIFVTQVJUIGluc3RhbmNlCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZCByYXRlIHZhbHVlIHRvIGFjaGlldmUKKyAgKiBAcmV0dmFsIFVTQVJURElWIHZhbHVlIHRvIGJlIHVzZWQgZm9yIEJSUiByZWdpc3RlciBmaWxsaW5nIGluIE92ZXJTYW1wbGluZ184IGNhc2UKKyAgKi8KKyNkZWZpbmUgX19MTF9VU0FSVF9ESVZfU0FNUExJTkc4KF9fUEVSSVBIQ0xLX18sIF9fQkFVRFJBVEVfXykgKCgoKF9fUEVSSVBIQ0xLX18pKjJVKSArICgoX19CQVVEUkFURV9fKS8yVSkpLyhfX0JBVURSQVRFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENvbXB1dGUgVVNBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kCisgICogICAgICAgICBleHBlY3RlZCBCYXVkIFJhdGUgaW4gMTYgYml0cyBzYW1wbGluZyBtb2RlICgzMiBiaXRzIHZhbHVlIG9mIFVTQVJURElWIGlzIHJldHVybmVkKQorICAqIEBwYXJhbSAgX19QRVJJUEhDTEtfXyBQZXJpcGhlcmFsIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBVU0FSVCBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWQgcmF0ZSB2YWx1ZSB0byBhY2hpZXZlCisgICogQHJldHZhbCBVU0FSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZyBpbiBPdmVyU2FtcGxpbmdfMTYgY2FzZQorICAqLworI2RlZmluZSBfX0xMX1VTQVJUX0RJVl9TQU1QTElORzE2KF9fUEVSSVBIQ0xLX18sIF9fQkFVRFJBVEVfXykgKCgoX19QRVJJUEhDTEtfXykgKyAoKF9fQkFVRFJBVEVfXykvMlUpKS8oX19CQVVEUkFURV9fKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBFbmFibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX1VTQVJUX0VuYWJsZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIERpc2FibGUgKGFsbCBVU0FSVCBwcmVzY2FsZXJzIGFuZCBvdXRwdXRzIGFyZSBkaXNhYmxlZCkKKyAgKiBAbm90ZSAgIFdoZW4gVVNBUlQgaXMgZGlzYWJsZWQsIFVTQVJUIHByZXNjYWxlcnMgYW5kIG91dHB1dHMgYXJlIHN0b3BwZWQgaW1tZWRpYXRlbHksCisgICogICAgICAgICBhbmQgY3VycmVudCBvcGVyYXRpb25zIGFyZSBkaXNjYXJkZWQuIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBVU0FSVCBpcyBrZXB0LCBidXQgYWxsIHRoZSBzdGF0dXMKKyAgKiAgICAgICAgIGZsYWdzLCBpbiB0aGUgVVNBUlR4X0lTUiBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIFVTQVJUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSkgPT0gKFVTQVJUX0NSMV9VRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBlbmFibGVkIGluIFNUT1AgTW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBlbmFibGVkLCBVU0FSVCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgbW9kZSwgcHJvdmlkZWQgdGhhdAorICAqICAgICAgICAgVVNBUlQgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSBvciBMU0UgaW4gUkNDLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJblN0b3BNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNBUlQgZGlzYWJsZWQgaW4gU1RPUCBNb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGRpc2FibGVkLCBVU0FSVCBpcyBub3QgYWJsZSB0byB3YWtlIHVwIHRoZSBNQ1UgZnJvbSBTdG9wIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBVU0FSVCBpcyBlbmFibGVkIGluIFNUT1AgTW9kZSAoYWJsZSB0byB3YWtlIHVwIE1DVSBmcm9tIFN0b3AgbW9kZSBvciBub3QpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pID09IChVU0FSVF9DUjFfVUVTTSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBDbG9jayBlbmFibGVkIGluIFNUT1AgTW9kZQorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgVVNBUlQgQ2xvY2sgaXMgZW5hYmxlZCB3aGlsZSBpbiBTVE9QIG1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBVQ0VTTSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUNsb2NrSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVDbG9ja0luU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVUNFU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIGNsb2NrIGRpc2FibGVkIGluIFNUT1AgTW9kZQorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgVVNBUlQgQ2xvY2sgaXMgZGlzYWJsZWQgd2hpbGUgaW4gU1RPUCBtb2RlCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVUNFU00gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlQ2xvY2tJblN0b3BNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVDbG9ja0luU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19VQ0VTTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgVVNBUlQgY2xvY2sgaXMgZW5hYmxlZCBpbiBTVE9QIE1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBVQ0VTTSAgICAgICAgIExMX1VTQVJUX0lzQ2xvY2tFbmFibGVkSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNDbG9ja0VuYWJsZWRJblN0b3BNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1VDRVNNKSA9PSAoVVNBUlRfQ1IzX1VDRVNNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZXIgRW5hYmxlIChSZWNlaXZlciBpcyBlbmFibGVkIGFuZCBiZWdpbnMgc2VhcmNoaW5nIGZvciBhIHN0YXJ0IGJpdCkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURpcmVjdGlvblJ4CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURpcmVjdGlvblJ4KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlciBEaXNhYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRGlyZWN0aW9uUngKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURpcmVjdGlvblJ4KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0dGVyIEVuYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uVHgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uVHgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0dGVyIERpc2FibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVEaXJlY3Rpb25UeAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRGlyZWN0aW9uVHgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9URSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHNpbXVsdGFuZW91c2x5IGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVzCisgICogICAgICAgICBvZiBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX1VTQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX1VTQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRElSRUNUSU9OX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fVFhfUlgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb24pCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSwgVHJhbnNmZXJEaXJlY3Rpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcyBvZiBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX1VTQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX1VTQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRElSRUNUSU9OX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fVFhfUlgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRUcmFuc2ZlckRpcmVjdGlvbihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfVEUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUGFyaXR5IChlbmFibGVkL2Rpc2FibGVkIGFuZCBwYXJpdHkgbW9kZSBpZiBlbmFibGVkKS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBpZiBoYXJkd2FyZSBwYXJpdHkgY29udHJvbCAoZ2VuZXJhdGlvbiBhbmQgZGV0ZWN0aW9uKSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqICAgICAgICAgV2hlbiB0aGUgcGFyaXR5IGNvbnRyb2wgaXMgZW5hYmxlZCAoT2RkIG9yIEV2ZW4pLCBjb21wdXRlZCBwYXJpdHkgYml0IGlzIGluc2VydGVkIGF0IHRoZSBNU0IgcG9zaXRpb24KKyAgKiAgICAgICAgICg5dGggb3IgOHRoIGJpdCBkZXBlbmRpbmcgb24gZGF0YSB3aWR0aCkgYW5kIHBhcml0eSBpcyBjaGVja2VkIG9uIHRoZSByZWNlaXZlZCBkYXRhLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfVVNBUlRfU2V0UGFyaXR5XG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX1VTQVJUX1NldFBhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX09ERAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0UGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUGFyaXR5KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfUENFLCBQYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQYXJpdHkgY29uZmlndXJhdGlvbiAoZW5hYmxlZC9kaXNhYmxlZCBhbmQgcGFyaXR5IG1vZGUgaWYgZW5hYmxlZCkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQUyAgICAgICAgICAgIExMX1VTQVJUX0dldFBhcml0eVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgUENFICAgICAgICAgICBMTF9VU0FSVF9HZXRQYXJpdHkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX09ERAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFBhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfUENFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFJlY2VpdmVyIFdha2UgVXAgbWV0aG9kIGZyb20gTXV0ZSBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfVVNBUlRfU2V0V2FrZVVwTWV0aG9kCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9JRExFTElORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9BRERSRVNTTUFSSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgTWV0aG9kKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfV0FLRSwgTWV0aG9kKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUmVjZWl2ZXIgV2FrZSBVcCBtZXRob2QgZnJvbSBNdXRlIG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBXQUtFICAgICAgICAgIExMX1VTQVJUX0dldFdha2VVcE1ldGhvZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9JRExFTElORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9BRERSRVNTTUFSSworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFdha2VVcE1ldGhvZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfV0FLRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBXb3JkIGxlbmd0aCAoaS5lLiBuYiBvZiBkYXRhIGJpdHMsIGV4Y2x1ZGluZyBzdGFydCBhbmQgc3RvcCBiaXRzKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE0wICAgICAgICAgICAgTExfVVNBUlRfU2V0RGF0YVdpZHRoXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBNMSAgICAgICAgICAgIExMX1VTQVJUX1NldERhdGFXaWR0aAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfN0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldERhdGFXaWR0aChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IERhdGFXaWR0aCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX00sIERhdGFXaWR0aCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFdvcmQgbGVuZ3RoIChpLmUuIG5iIG9mIGRhdGEgYml0cywgZXhjbHVkaW5nIHN0YXJ0IGFuZCBzdG9wIGJpdHMpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTTAgICAgICAgICAgICBMTF9VU0FSVF9HZXREYXRhV2lkdGhcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfR2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREFUQVdJRFRIXzdCCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREFUQVdJRFRIXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREFUQVdJRFRIXzlCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWxsb3cgc3dpdGNoIGJldHdlZW4gTXV0ZSBNb2RlIGFuZCBBY3RpdmUgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsKK30KKworLyoqCisgICogQGJyaWVmICBQcmV2ZW50IE11dGUgTW9kZSB1c2UuIFNldCBSZWNlaXZlciBpbiBhY3RpdmUgbW9kZSBwZXJtYW5lbnRseS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBNTUUgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVNdXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHN3aXRjaCBiZXR3ZWVuIE11dGUgTW9kZSBhbmQgQWN0aXZlIG1vZGUgaXMgYWxsb3dlZAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZE11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpID09IChVU0FSVF9DUjFfTU1FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBPdmVyc2FtcGxpbmcgdG8gOC1iaXQgb3IgMTYtYml0IG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBPVkVSOCAgICAgICAgIExMX1VTQVJUX1NldE92ZXJTYW1wbGluZworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBPdmVyU2FtcGxpbmcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0T3ZlclNhbXBsaW5nKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgT3ZlclNhbXBsaW5nKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfT1ZFUjgsIE92ZXJTYW1wbGluZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIE92ZXJzYW1wbGluZyBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgT1ZFUjggICAgICAgICBMTF9VU0FSVF9HZXRPdmVyU2FtcGxpbmcKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldE92ZXJTYW1wbGluZyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfT1ZFUjgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgaWYgQ2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgaXMgb3V0cHV0IHRvIHRoZSBTQ0xLIHBpbiBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkNMICAgICAgICAgIExMX1VTQVJUX1NldExhc3RDbGtQdWxzZU91dHB1dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBMYXN0Qml0Q2xvY2tQdWxzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRMYXN0Q2xrUHVsc2VPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBMYXN0Qml0Q2xvY2tQdWxzZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCQ0wsIExhc3RCaXRDbG9ja1B1bHNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBDbG9jayBwdWxzZSBvZiB0aGUgbGFzdCBkYXRhIGJpdCBvdXRwdXQgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgKExhc3QgYml0IENsb2NrIHB1bHNlIG91dHB1dCB0byB0aGUgU0NMSyBwaW4gb3Igbm90KQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCQ0wgICAgICAgICAgTExfVVNBUlRfR2V0TGFzdENsa1B1bHNlT3V0cHV0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9PVVRQVVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRMYXN0Q2xrUHVsc2VPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCQ0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIHBoYXNlIG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDUEhBICAgICAgICAgIExMX1VTQVJUX1NldENsb2NrUGhhc2UKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tQaGFzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzFFREdFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMkVER0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldENsb2NrUGhhc2UoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBDbG9ja1BoYXNlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BIQSwgQ2xvY2tQaGFzZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHBoYXNlIG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDUEhBICAgICAgICAgIExMX1VTQVJUX0dldENsb2NrUGhhc2UKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzJFREdFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0Q2xvY2tQaGFzZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BIQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgcG9sYXJpdHkgb2YgdGhlIGNsb2NrIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfU2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0Q2xvY2tQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IENsb2NrUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUE9MLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gcG9sYXJpdHkgb2YgdGhlIGNsb2NrIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfR2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRDbG9ja1BvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIENsb2NrIHNpZ25hbCBmb3JtYXQgKFBoYXNlIFBvbGFyaXR5IGFuZCBjaG9pY2UgYWJvdXQgb3V0cHV0IG9mIGxhc3QgYml0IGNsb2NrIHB1bHNlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbG9jayBQaGFzZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsb2NrIFBvbGFyaXR5IGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRDbG9ja1BvbGFyaXR5KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gT3V0cHV0IG9mIExhc3QgYml0IENsb2NrIHB1bHNlIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRMYXN0Q2xrUHVsc2VPdXRwdXQoKSBmdW5jdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQSEEgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2tcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2tcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIExCQ0wgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2sKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGhhc2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzJFREdFCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0hJR0gKKyAgKiBAcGFyYW0gIExCQ1BPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfTk9fT1VUUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQ2xvY2soVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQaGFzZSwgdWludDMyX3QgUG9sYXJpdHksIHVpbnQzMl90IExCQ1BPdXRwdXQpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUEhBIHwgVVNBUlRfQ1IyX0NQT0wgfCBVU0FSVF9DUjJfTEJDTCwgUGhhc2UgfCBQb2xhcml0eSB8IExCQ1BPdXRwdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDbG9jayBvdXRwdXQgb24gU0NMSyBwaW4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DTEtFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDbG9jayBvdXRwdXQgb24gU0NMSyBwaW4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIENsb2NrIG91dHB1dCBvbiBTQ0xLIHBpbiBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTQ0xLT3V0cHV0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRTQ0xLT3V0cHV0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DTEtFTikgPT0gKFVTQVJUX0NSMl9DTEtFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzBfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFN0b3BCaXRzKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIHN0b3AgYml0cworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfR2V0U3RvcEJpdHNMZW5ndGgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18wXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFN0b3BCaXRzTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIENoYXJhY3RlciBmcmFtZSBmb3JtYXQgKERhdGF3aWR0aCwgUGFyaXR5IGNvbnRyb2wsIFN0b3AgQml0cykKKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gRGF0YSBXaWR0aCBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0RGF0YVdpZHRoKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gUGFyaXR5IENvbnRyb2wgYW5kIG1vZGUgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldFBhcml0eSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFN0b3AgYml0cyBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKSBmdW5jdGlvbgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0NoYXJhY3RlclxuCisgICogICAgICAgICBDUjEgICAgICAgICAgTTAgICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0NoYXJhY3RlcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfN0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUIKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0RECisgICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzBfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBEYXRhV2lkdGgsIHVpbnQzMl90IFBhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdG9wQml0cykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9NLCBQYXJpdHkgfCBEYXRhV2lkdGgpOworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWC9SWCBwaW5zIHN3YXBwaW5nIHNldHRpbmcuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1dBUCAgICAgICAgICBMTF9VU0FSVF9TZXRUWFJYU3dhcAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBTd2FwQ29uZmlnIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUlhfU1dBUFBFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VFhSWFN3YXAoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBTd2FwQ29uZmlnKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgU3dhcENvbmZpZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgVFgvUlggcGlucyBzd2FwcGluZyBjb25maWd1cmF0aW9uLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfVVNBUlRfR2V0VFhSWFN3YXAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFJYX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TV0FQUEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0VFhSWFN3YXAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NXQVApKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUlggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYSU5WICAgICAgICAgTExfVVNBUlRfU2V0UlhQaW5MZXZlbAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQaW5JbnZNZXRob2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1JYUElOX0xFVkVMX0lOVkVSVEVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRSWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUGluSW52TWV0aG9kKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlhJTlYsIFBpbkludk1ldGhvZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgUlggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYyBjb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhJTlYgICAgICAgICBMTF9VU0FSVF9HZXRSWFBpbkxldmVsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFJYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWElOViAgICAgICAgIExMX1VTQVJUX1NldFRYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGluSW52TWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhQSU5fTEVWRUxfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VFhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFBpbkludk1ldGhvZCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1RYSU5WLCBQaW5JbnZNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMgY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYSU5WICAgICAgICAgTExfVVNBUlRfR2V0VFhQaW5MZXZlbAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRUWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9UWElOVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBCaW5hcnkgZGF0YSBsb2dpYy4KKyAgKiBAbm90ZSAgIEFsbG93IHRvIGRlZmluZSBob3cgTG9naWNhbCBkYXRhIGZyb20gdGhlIGRhdGEgcmVnaXN0ZXIgYXJlIHNlbmQvcmVjZWl2ZWQgOgorICAqICAgICAgICAgZWl0aGVyIGluIHBvc2l0aXZlL2RpcmVjdCBsb2dpYyAoMT1ILCAwPUwpIG9yIGluIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMgKDE9TCwgMD1IKQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIERBVEFJTlYgICAgICAgTExfVVNBUlRfU2V0QmluYXJ5RGF0YUxvZ2ljCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFMb2dpYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0QmluYXJ5RGF0YUxvZ2ljKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgRGF0YUxvZ2ljKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfREFUQUlOViwgRGF0YUxvZ2ljKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBCaW5hcnkgZGF0YSBjb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgREFUQUlOViAgICAgICBMTF9VU0FSVF9HZXRCaW5hcnlEYXRhTG9naWMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfTkVHQVRJVkUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRCaW5hcnlEYXRhTG9naWMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdHJhbnNmZXIgYml0IG9yZGVyIChlaXRoZXIgTGVzcyBvciBNb3N0IFNpZ25pZmljYW50IEJpdCBGaXJzdCkKKyAgKiBAbm90ZSAgIE1TQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuCisgICogICAgICAgICBMU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIGRhdGEgYml0IDAgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1TQkZJUlNUICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBCaXRPcmRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJVE9SREVSX0xTQkZJUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklUT1JERVJfTVNCRklSU1QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRyYW5zZmVyQml0T3JkZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBCaXRPcmRlcikKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX01TQkZJUlNULCBCaXRPcmRlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRyYW5zZmVyIGJpdCBvcmRlciAoZWl0aGVyIExlc3Mgb3IgTW9zdCBTaWduaWZpY2FudCBCaXQgRmlyc3QpCisgICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqICAgICAgICAgTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX1VTQVJUX0dldFRyYW5zZmVyQml0T3JkZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9MU0JGSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJVE9SREVSX01TQkZJUlNUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0VHJhbnNmZXJCaXRPcmRlcihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQXV0byBCYXVkLVJhdGUgRGV0ZWN0aW9uCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVBdXRvQmF1ZFJhdGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlQXV0b0JhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEF1dG8gQmF1ZC1SYXRlIERldGVjdGlvbgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUkVOICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUF1dG9CYXVkUmF0ZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlQXV0b0JhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUJSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIEF1dG8gQmF1ZC1SYXRlIERldGVjdGlvbiBtZWNoYW5pc20gaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUkVOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkQXV0b0JhdWQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZEF1dG9CYXVkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJFTikgPT0gKFVTQVJUX0NSMl9BQlJFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQXV0byBCYXVkLVJhdGUgbW9kZSBiaXRzCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSTU9ERSAgICAgICBMTF9VU0FSVF9TZXRBdXRvQmF1ZFJhdGVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEF1dG9CYXVkUmF0ZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fRkFMTElOR0VER0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fN0ZfRlJBTUUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fNTVfRlJBTUUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEF1dG9CYXVkUmF0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBBdXRvQmF1ZFJhdGVNb2RlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUJSTU9ERSwgQXV0b0JhdWRSYXRlTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIEF1dG8gQmF1ZC1SYXRlIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJNT0RFICAgICAgIExMX1VTQVJUX0dldEF1dG9CYXVkUmF0ZU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fRkFMTElOR0VER0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fN0ZfRlJBTUUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fNTVfRlJBTUUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRBdXRvQmF1ZFJhdGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJNT0RFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJlY2VpdmVyIFRpbWVvdXQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSVE9FTiAgICAgICAgIExMX1VTQVJUX0VuYWJsZVJ4VGltZW91dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVSeFRpbWVvdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUmVjZWl2ZXIgVGltZW91dAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJUT0VOICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVJ4VGltZW91dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlUnhUaW1lb3V0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIFJlY2VpdmVyIFRpbWVvdXQgZmVhdHVyZSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlRPRU4gICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRSeFRpbWVvdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pID09IChVU0FSVF9DUjJfUlRPRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUuCisgICogQG5vdGUgICBUaGlzIGlzIHVzZWQgaW4gbXVsdGlwcm9jZXNzb3IgY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AgbW9kZSwKKyAgKiAgICAgICAgIGZvciB3YWtlIHVwIHdpdGggYWRkcmVzcyBtYXJrIGRldGVjdGlvbi4KKyAgKiBAbm90ZSAgIDRiaXRzIGFkZHJlc3Mgbm9kZSBpcyB1c2VkIHdoZW4gNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcuCisgICogICAgICAgICAoYjctYjQgc2hvdWxkIGJlIHNldCB0byAwKQorICAqICAgICAgICAgOGJpdHMgYWRkcmVzcyBub2RlIGlzIHVzZWQgd2hlbiA3LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNy4KKyAgKiAgICAgICAgIChUaGlzIGlzIHVzZWQgaW4gbXVsdGlwcm9jZXNzb3IgY29tbXVuaWNhdGlvbiBkdXJpbmcgTXV0ZSBtb2RlIG9yIFN0b3AgbW9kZSwKKyAgKiAgICAgICAgIGZvciB3YWtlIHVwIHdpdGggNy1iaXQgYWRkcmVzcyBtYXJrIGRldGVjdGlvbi4KKyAgKiAgICAgICAgIFRoZSBNU0Igb2YgdGhlIGNoYXJhY3RlciBzZW50IGJ5IHRoZSB0cmFuc21pdHRlciBzaG91bGQgYmUgZXF1YWwgdG8gMS4KKyAgKiAgICAgICAgIEl0IG1heSBhbHNvIGJlIHVzZWQgZm9yIGNoYXJhY3RlciBkZXRlY3Rpb24gZHVyaW5nIG5vcm1hbCByZWNlcHRpb24sCisgICogICAgICAgICBNdXRlIG1vZGUgaW5hY3RpdmUgKGZvciBleGFtcGxlLCBlbmQgb2YgYmxvY2sgZGV0ZWN0aW9uIGluIE1vZEJ1cyBwcm90b2NvbCkuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB3aG9sZSByZWNlaXZlZCBjaGFyYWN0ZXIgKDgtYml0KSBpcyBjb21wYXJlZCB0byB0aGUgQUREWzc6MF0KKyAgKiAgICAgICAgIHZhbHVlIGFuZCBDTUYgZmxhZyBpcyBzZXQgb24gbWF0Y2gpCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREICAgICAgICAgICBMTF9VU0FSVF9Db25maWdOb2RlQWRkcmVzc1xuCisgICogICAgICAgICBDUjIgICAgICAgICAgQURETTcgICAgICAgICBMTF9VU0FSVF9Db25maWdOb2RlQWRkcmVzcworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBBZGRyZXNzTGVuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfNEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF83QgorICAqIEBwYXJhbSAgTm9kZUFkZHJlc3MgNCBvciA3IGJpdCBBZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnTm9kZUFkZHJlc3MoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBBZGRyZXNzTGVuLCB1aW50MzJfdCBOb2RlQWRkcmVzcykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCB8IFVTQVJUX0NSMl9BRERNNywKKyAgICAgICAgICAgICAodWludDMyX3QpKEFkZHJlc3NMZW4gfCAoTm9kZUFkZHJlc3MgPDwgVVNBUlRfQ1IyX0FERF9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIDggYml0IEFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUgYXMgc2V0IGluIEFERCBmaWVsZCBvZiBDUjIuCisgICogQG5vdGUgICBJZiA0LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNywKKyAgKiAgICAgICAgIG9ubHkgNGJpdHMgKGIzLWIwKSBvZiByZXR1cm5lZCB2YWx1ZSBhcmUgcmVsZXZhbnQgKGIzMS1iNCBhcmUgbm90IHJlbGV2YW50KQorICAqICAgICAgICAgSWYgNy1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcsCisgICogICAgICAgICBvbmx5IDhiaXRzIChiNy1iMCkgb2YgcmV0dXJuZWQgdmFsdWUgYXJlIHJlbGV2YW50IChiMzEtYjggYXJlIG5vdCByZWxldmFudCkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBREQgICAgICAgICAgIExMX1VTQVJUX0dldE5vZGVBZGRyZXNzCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldE5vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BREQpID4+IFVTQVJUX0NSMl9BRERfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gTGVuZ3RoIG9mIE5vZGUgQWRkcmVzcyB1c2VkIGluIEFkZHJlc3MgRGV0ZWN0aW9uIG1vZGUgKDctYml0IG9yIDQtYml0KQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERE03ICAgICAgICAgTExfVVNBUlRfR2V0Tm9kZUFkZHJlc3NMZW4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF80QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzdCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0Tm9kZUFkZHJlc3NMZW4oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERE03KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJUUyBIVyBGbG93IENvbnRyb2wKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVSVFNIV0Zsb3dDdHJsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZVJUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVFMgSFcgRmxvdyBDb250cm9sCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVJUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZVJUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ1RTIEhXIEZsb3cgQ29udHJvbAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUNUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlQ1RTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENUUyBIVyBGbG93IENvbnRyb2wKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlQ1RTSFdGbG93Q3RybAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlQ1RTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBIVyBGbG93IENvbnRyb2wgbW9kZSAoYm90aCBDVFMgYW5kIFJUUykKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9TZXRIV0Zsb3dDdHJsXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX1NldEhXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgSGFyZHdhcmVGbG93Q29udHJvbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX1JUUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9DVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfUlRTX0NUUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0SFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IEhhcmR3YXJlRmxvd0NvbnRyb2wpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UsIEhhcmR3YXJlRmxvd0NvbnRyb2wpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBIVyBGbG93IENvbnRyb2wgY29uZmlndXJhdGlvbiAoYm90aCBDVFMgYW5kIFJUUykKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9HZXRIV0Zsb3dDdHJsXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX0dldEhXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9SVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgT25lIGJpdCBzYW1wbGluZyBtZXRob2QKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPTkVCSVQgICAgICAgIExMX1VTQVJUX0VuYWJsZU9uZUJpdFNhbXAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlT25lQml0U2FtcChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PTkVCSVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgT25lIGJpdCBzYW1wbGluZyBtZXRob2QKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPTkVCSVQgICAgICAgIExMX1VTQVJUX0Rpc2FibGVPbmVCaXRTYW1wCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVPbmVCaXRTYW1wKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT05FQklUKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBPbmUgYml0IHNhbXBsaW5nIG1ldGhvZCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT05FQklUICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRPbmVCaXRTYW1wCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRPbmVCaXRTYW1wKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PTkVCSVQpID09IChVU0FSVF9DUjNfT05FQklUKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBPdmVycnVuIGRldGVjdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfVVNBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE92ZXJydW4gZGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT1ZSRElTICAgICAgICBMTF9VU0FSVF9EaXNhYmxlT3ZlcnJ1bkRldGVjdAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIE92ZXJydW4gZGV0ZWN0aW9uIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZE92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZE92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUykgIT0gVVNBUlRfQ1IzX09WUkRJUykgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCBldmVudCB0eXBlIGZvciBXYWtlIFVQIEludGVycnVwdCBGbGFnIChXVVNbMTowXSBiaXRzKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VTICAgICAgICAgICBMTF9VU0FSVF9TZXRXS1VQVHlwZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUeXBlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX0FERFJFU1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fUlhORQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0V0tVUFR5cGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUeXBlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VTLCBUeXBlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZXZlbnQgdHlwZSBmb3IgV2FrZSBVUCBJbnRlcnJ1cHQgRmxhZyAoV1VTWzE6MF0gYml0cykKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfVVNBUlRfR2V0V0tVUFR5cGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fQUREUkVTUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9TVEFSVEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0V0tVUFR5cGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0FSVCBCUlIgcmVnaXN0ZXIgZm9yIGFjaGlldmluZyBleHBlY3RlZCBCYXVkIFJhdGUgdmFsdWUuCisgICogQG5vdGUgICBDb21wdXRlIGFuZCBzZXQgVVNBUlRESVYgdmFsdWUgaW4gQlJSIFJlZ2lzdGVyIChmdWxsIEJSUiBjb250ZW50KQorICAqICAgICAgICAgYWNjb3JkaW5nIHRvIHVzZWQgUGVyaXBoZXJhbCBDbG9jaywgT3ZlcnNhbXBsaW5nIG1vZGUsIGFuZCBleHBlY3RlZCBCYXVkIFJhdGUgdmFsdWVzCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGFuZCBCYXVkIHJhdGUgdmFsdWVzIHByb3ZpZGVkIGFzIGZ1bmN0aW9uIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHZhbGlkCisgICogICAgICAgICAoQmF1ZCByYXRlIHZhbHVlICE9IDApCisgICogQG5vdGUgICBJbiBjYXNlIG9mIG92ZXJzYW1wbGluZyBieSAxNiBhbmQgOCwgQlJSIGNvbnRlbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMTZkLgorICAqIEBybXRvbGwgQlJSICAgICAgICAgIEJSUiAgICAgICAgICAgTExfVVNBUlRfU2V0QmF1ZFJhdGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGVyaXBoQ2xrIFBlcmlwaGVyYWwgQ2xvY2sKKyAgKiBAcGFyYW0gIE92ZXJTYW1wbGluZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR18xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR184CisgICogQHBhcmFtICBCYXVkUmF0ZSBCYXVkIFJhdGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEJhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUGVyaXBoQ2xrLCB1aW50MzJfdCBPdmVyU2FtcGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCYXVkUmF0ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdXNhcnRkaXY7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGJycnRlbXA7CisKKyAgaWYgKE92ZXJTYW1wbGluZyA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkKKyAgeworICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShfX0xMX1VTQVJUX0RJVl9TQU1QTElORzgoUGVyaXBoQ2xrLCBCYXVkUmF0ZSkpOworICAgIGJycnRlbXAgPSB1c2FydGRpdiAmIDB4RkZGMFU7CisgICAgYnJydGVtcCB8PSAodWludDE2X3QpKCh1c2FydGRpdiAmICh1aW50MTZfdCkweDAwMEZVKSA+PiAxVSk7CisgICAgVVNBUlR4LT5CUlIgPSBicnJ0ZW1wOworICB9CisgIGVsc2UKKyAgeworICAgIFVTQVJUeC0+QlJSID0gKHVpbnQxNl90KShfX0xMX1VTQVJUX0RJVl9TQU1QTElORzE2KFBlcmlwaENsaywgQmF1ZFJhdGUpKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IEJhdWQgUmF0ZSB2YWx1ZSwgYWNjb3JkaW5nIHRvIFVTQVJURElWIHByZXNlbnQgaW4gQlJSIHJlZ2lzdGVyCisgICogICAgICAgICAoZnVsbCBCUlIgY29udGVudCksIGFuZCB0byB1c2VkIFBlcmlwaGVyYWwgQ2xvY2sgYW5kIE92ZXJzYW1wbGluZyBtb2RlIHZhbHVlcworICAqIEBub3RlICAgSW4gY2FzZSBvZiBub24taW5pdGlhbGl6ZWQgb3IgaW52YWxpZCB2YWx1ZSBzdG9yZWQgaW4gQlJSIHJlZ2lzdGVyLCB2YWx1ZSAwIHdpbGwgYmUgcmV0dXJuZWQuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIG92ZXJzYW1wbGluZyBieSAxNiBhbmQgOCwgQlJSIGNvbnRlbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMTZkLgorICAqIEBybXRvbGwgQlJSICAgICAgICAgIEJSUiAgICAgICAgICAgTExfVVNBUlRfR2V0QmF1ZFJhdGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGVyaXBoQ2xrIFBlcmlwaGVyYWwgQ2xvY2sKKyAgKiBAcGFyYW0gIE92ZXJTYW1wbGluZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR18xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR184CisgICogQHJldHZhbCBCYXVkIFJhdGUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRCYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFBlcmlwaENsaywgdWludDMyX3QgT3ZlclNhbXBsaW5nKQoreworICByZWdpc3RlciB1aW50MzJfdCB1c2FydGRpdjsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYnJycmVzdWx0ID0gMHgwVTsKKworICB1c2FydGRpdiA9IFVTQVJUeC0+QlJSOworCisgIGlmICh1c2FydGRpdiA9PSAwVSkKKyAgeworICAgIC8qIERvIG5vdCBwZXJmb3JtIGEgZGl2aXNpb24gYnkgMCAqLworICB9CisgIGVsc2UgaWYgKE92ZXJTYW1wbGluZyA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkKKyAgeworICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KSgodXNhcnRkaXYgJiAweEZGRjBVKSB8ICgodXNhcnRkaXYgJiAweDAwMDdVKSA8PCAxVSkpIDsKKyAgICBpZiAodXNhcnRkaXYgIT0gMFUpCisgICAgeworICAgICAgYnJycmVzdWx0ID0gKFBlcmlwaENsayAqIDJVKSAvIHVzYXJ0ZGl2OworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoKHVzYXJ0ZGl2ICYgMHhGRkZGVSkgIT0gMFUpCisgICAgeworICAgICAgYnJycmVzdWx0ID0gUGVyaXBoQ2xrIC8gdXNhcnRkaXY7CisgICAgfQorICB9CisgIHJldHVybiAoYnJycmVzdWx0KTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUmVjZWl2ZXIgVGltZSBPdXQgVmFsdWUgKGV4cHJlc3NlZCBpbiBuYiBvZiBiaXRzIGR1cmF0aW9uKQorICAqIEBybXRvbGwgUlRPUiAgICAgICAgIFJUTyAgICAgICAgICAgTExfVVNBUlRfU2V0UnhUaW1lb3V0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDAwRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRSeFRpbWVvdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUaW1lb3V0KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+UlRPUiwgVVNBUlRfUlRPUl9SVE8sIFRpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZWNlaXZlciBUaW1lIE91dCBWYWx1ZSAoZXhwcmVzc2VkIGluIG5iIG9mIGJpdHMgZHVyYXRpb24pCisgICogQHJtdG9sbCBSVE9SICAgICAgICAgUlRPICAgICAgICAgICBMTF9VU0FSVF9HZXRSeFRpbWVvdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDAwRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0UnhUaW1lb3V0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX1JUTykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBCbG9jayBMZW5ndGggdmFsdWUgaW4gcmVjZXB0aW9uCisgICogQHJtdG9sbCBSVE9SICAgICAgICAgQkxFTiAgICAgICAgICBMTF9VU0FSVF9TZXRCbG9ja0xlbmd0aAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBCbG9ja0xlbmd0aCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEJsb2NrTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgQmxvY2tMZW5ndGgpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX0JMRU4sIEJsb2NrTGVuZ3RoIDw8IFVTQVJUX1JUT1JfQkxFTl9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBCbG9jayBMZW5ndGggdmFsdWUgaW4gcmVjZXB0aW9uCisgICogQHJtdG9sbCBSVE9SICAgICAgICAgQkxFTiAgICAgICAgICBMTF9VU0FSVF9HZXRCbG9ja0xlbmd0aAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRCbG9ja0xlbmd0aChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+UlRPUiwgVVNBUlRfUlRPUl9CTEVOKSA+PiBVU0FSVF9SVE9SX0JMRU5fUG9zKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0lSREEgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBJcmRhIGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJckRBIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJcmRhCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlyZGEoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJckRBIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSXJkYQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSXJkYShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIElyREEgbW9kZSBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSXJkYQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSXJkYShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJFTikgPT0gKFVTQVJUX0NSM19JUkVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBJckRBIFBvd2VyIE1vZGUgKE5vcm1hbCBvciBMb3cgUG93ZXIpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIElSTFAgICAgICAgICAgTExfVVNBUlRfU2V0SXJkYVBvd2VyTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9JUkRBX1BPV0VSX05PUk1BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0lSREFfUE9XRVJfTE9XCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRJcmRhUG93ZXJNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUG93ZXJNb2RlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJMUCwgUG93ZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBJckRBIFBvd2VyIE1vZGUgY29uZmlndXJhdGlvbiAoTm9ybWFsIG9yIExvdyBQb3dlcikKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJMUCAgICAgICAgICBMTF9VU0FSVF9HZXRJcmRhUG93ZXJNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSVJEQV9QT1dFUl9OT1JNQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8yRURHRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldElyZGFQb3dlck1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSTFApKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSXJkYSBwcmVzY2FsZXIgdmFsdWUsIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBVU0FSVCBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgIHRvIGFjaGlldmUgdGhlIElyZGEgTG93IFBvd2VyIGZyZXF1ZW5jeSAoOCBiaXRzIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIEdUUFIgICAgICAgICBQU0MgICAgICAgICAgIExMX1VTQVJUX1NldElyZGFQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUHJlc2NhbGVyVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRJcmRhUHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUHJlc2NhbGVyVmFsdWUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX1BTQywgKHVpbnQxNl90KVByZXNjYWxlclZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gSXJkYSBwcmVzY2FsZXIgdmFsdWUsIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBVU0FSVCBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgIHRvIGFjaGlldmUgdGhlIElyZGEgTG93IFBvd2VyIGZyZXF1ZW5jeSAoOCBiaXRzIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIEdUUFIgICAgICAgICBQU0MgICAgICAgICAgIExMX1VTQVJUX0dldElyZGFQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgSXJkYSBwcmVzY2FsZXIgdmFsdWUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRikKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRJcmRhUHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX1BTQykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fU21hcnRjYXJkIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8gU21hcnRjYXJkIGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgTkFDSyB0cmFuc21pc3Npb24KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE5BQ0sgICAgICAgICAgTExfVVNBUlRfRW5hYmxlU21hcnRjYXJkTkFDSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmROQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX05BQ0spOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU21hcnRjYXJkIE5BQ0sgdHJhbnNtaXNzaW9uCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBOQUNLICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmROQUNLCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmROQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfTkFDSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgU21hcnRjYXJkIE5BQ0sgdHJhbnNtaXNzaW9uIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE5BQ0sgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkU21hcnRjYXJkTkFDSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkU21hcnRjYXJkTkFDSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfTkFDSykgPT0gKFVTQVJUX0NSM19OQUNLKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlU21hcnRjYXJkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1NDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU21hcnRjYXJkIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgU21hcnRjYXJkIG1vZGUgaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTbWFydGNhcmQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFNtYXJ0Y2FyZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NFTikgPT0gKFVTQVJUX0NSM19TQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTbWFydGNhcmQgQXV0by1SZXRyeSBDb3VudCB2YWx1ZSAoU0NBUkNOVFsyOjBdIGJpdHMpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgYml0LWZpZWxkIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJldHJpZXMgaW4gdHJhbnNtaXQgYW5kIHJlY2VpdmUsIGluIFNtYXJ0Y2FyZCBtb2RlLgorICAqICAgICAgICAgSW4gdHJhbnNtaXNzaW9uIG1vZGUsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiByZXRyaWVzLCBiZWZvcmUKKyAgKiAgICAgICAgIGdlbmVyYXRpbmcgYSB0cmFuc21pc3Npb24gZXJyb3IgKEZFIGJpdCBzZXQpLgorICAqICAgICAgICAgSW4gcmVjZXB0aW9uIG1vZGUsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9yIGVycm9uZW91cyByZWNlcHRpb24gdHJpYWxzLCBiZWZvcmUgZ2VuZXJhdGluZyBhCisgICogICAgICAgICByZWNlcHRpb24gZXJyb3IgKFJYTkUgYW5kIFBFIGJpdHMgc2V0KQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFNDQVJDTlQgICAgICAgTExfVVNBUlRfU2V0U21hcnRjYXJkQXV0b1JldHJ5Q291bnQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQXV0b1JldHJ5Q291bnQgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT03CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IEF1dG9SZXRyeUNvdW50KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NBUkNOVCwgQXV0b1JldHJ5Q291bnQgPDwgVVNBUlRfQ1IzX1NDQVJDTlRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gU21hcnRjYXJkIEF1dG8tUmV0cnkgQ291bnQgdmFsdWUgKFNDQVJDTlRbMjowXSBiaXRzKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NBUkNOVCAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTbWFydGNhcmQgQXV0by1SZXRyeSBDb3VudCB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT03KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFNtYXJ0Y2FyZEF1dG9SZXRyeUNvdW50KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0FSQ05UKSA+PiBVU0FSVF9DUjNfU0NBUkNOVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTbWFydGNhcmQgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sKKyAgKiAgICAgICAgIHNvdXJjZSB0byBwcm92aWRlIHRoZSBTTUFSVENBUkQgQ2xvY2sgKDUgYml0cyB2YWx1ZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgR1RQUiAgICAgICAgIFBTQyAgICAgICAgICAgTExfVVNBUlRfU2V0U21hcnRjYXJkUHJlc2NhbGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFNtYXJ0Y2FyZFByZXNjYWxlcihVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9QU0MsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFNtYXJ0Y2FyZCBwcmVzY2FsZXIgdmFsdWUsIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBVU0FSVCBjbG9jaworICAqICAgICAgICAgc291cmNlIHRvIHByb3ZpZGUgdGhlIFNNQVJUQ0FSRCBDbG9jayAoNSBiaXRzIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBHVFBSICAgICAgICAgUFNDICAgICAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU21hcnRjYXJkIHByZXNjYWxlciB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRTbWFydGNhcmRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfUFNDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFNtYXJ0Y2FyZCBHdWFyZCB0aW1lIHZhbHVlLCBleHByZXNzZWQgaW4gbmIgb2YgYmF1ZCBjbG9ja3MgcGVyaW9kcworICAqICAgICAgICAgKEdUWzc6MF0gYml0cyA6IEd1YXJkIHRpbWUgdmFsdWUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIEdUUFIgICAgICAgICBHVCAgICAgICAgICAgIExMX1VTQVJUX1NldFNtYXJ0Y2FyZEd1YXJkVGltZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBHdWFyZFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRHdWFyZFRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBHdWFyZFRpbWUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX0dULCBHdWFyZFRpbWUgPDwgVVNBUlRfR1RQUl9HVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBTbWFydGNhcmQgR3VhcmQgdGltZSB2YWx1ZSwgZXhwcmVzc2VkIGluIG5iIG9mIGJhdWQgY2xvY2tzIHBlcmlvZHMKKyAgKiAgICAgICAgIChHVFs3OjBdIGJpdHMgOiBHdWFyZCB0aW1lIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBHVFBSICAgICAgICAgR1QgICAgICAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRHdWFyZFRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU21hcnRjYXJkIEd1YXJkIHRpbWUgdmFsdWUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRikKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRTbWFydGNhcmRHdWFyZFRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfR1QpID4+IFVTQVJUX0dUUFJfR1RfUG9zKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0hhbGZEdXBsZXggQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBIYWxmIER1cGxleCBmZWF0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFsZi1EdXBsZXggbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0VuYWJsZUhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYWxmLUR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZSBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYWxmLUR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSGFsZkR1cGxleAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpID09IChVU0FSVF9DUjNfSERTRUwpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9MSU4gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBMSU4gZmVhdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IExJTiBCcmVhayBEZXRlY3Rpb24gTGVuZ3RoCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCREwgICAgICAgICAgTExfVVNBUlRfU2V0TElOQnJrRGV0ZWN0aW9uTGVuCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIExJTkJETGVuZ3RoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xJTkJSRUFLX0RFVEVDVF8xMUIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldExJTkJya0RldGVjdGlvbkxlbihVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IExJTkJETGVuZ3RoKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJETCwgTElOQkRMZW5ndGgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBMSU4gQnJlYWsgRGV0ZWN0aW9uIExlbmd0aAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRMICAgICAgICAgIExMX1VTQVJUX0dldExJTkJya0RldGVjdGlvbkxlbgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xJTkJSRUFLX0RFVEVDVF8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTFCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0TElOQnJrRGV0ZWN0aW9uTGVuKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExJTiBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfRW5hYmxlTElOCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUxJTihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MSU5FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBMSU4gbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVMSU4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUxJTihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBMSU4gbW9kZSBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkTElOCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRMSU4oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKSA9PSAoVVNBUlRfQ1IyX0xJTkVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fREUgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBEcml2ZXIgRW5hYmxlIGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBERURUIChEcml2ZXIgRW5hYmxlIERlLUFzc2VydGlvbiBUaW1lKSwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERURUICAgICAgICAgIExMX1VTQVJUX1NldERFRGVhc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0REVEZWFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUaW1lKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVEVCwgVGltZSA8PCBVU0FSVF9DUjFfREVEVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBERURUIChEcml2ZXIgRW5hYmxlIERlLUFzc2VydGlvbiBUaW1lKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFRFQgICAgICAgICAgTExfVVNBUlRfR2V0REVEZWFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKSA6IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRERURlYXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVEVCkgPj4gVVNBUlRfQ1IxX0RFRFRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSksIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREVBVCAgICAgICAgICBMTF9VU0FSVF9TZXRERUFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRERUFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUaW1lKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVBVCwgVGltZSA8PCBVU0FSVF9DUjFfREVBVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBERUFUIChEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFQVQgICAgICAgICAgTExfVVNBUlRfR2V0REVBc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykgOiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0REVBc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERUFUKSA+PiBVU0FSVF9DUjFfREVBVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBEcml2ZXIgRW5hYmxlIChERSkgTW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlREVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURFTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVERU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURFTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUgaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkREVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRERU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSkgPT0gKFVTQVJUX0NSM19ERU0pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERVAgICAgICAgICAgIExMX1VTQVJUX1NldERFU2lnbmFsUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ERV9QT0xBUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRERVNpZ25hbFBvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERVAsIFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFUCAgICAgICAgICAgTExfVVNBUlRfR2V0REVTaWduYWxQb2xhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RFX1BPTEFSSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ERV9QT0xBUklUWV9MT1cKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRERVNpZ25hbFBvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERVApKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9BZHZhbmNlZENvbmZpZ3VyYXRpb24gQWR2YW5jZWQgQ29uZmlndXJhdGlvbnMgc2VydmljZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIEFzeW5jaHJvbm91cyBNb2RlIChVQVJUKQorICAqIEBub3RlICAgSW4gVUFSVCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gQ0xLRU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gU0NFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBJUkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVJcmRhKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gQXN5bmNocm9ub3VzIE1vZGUKKyAgKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQYXJpdHksIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZworICAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdBc3luY01vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICAvKiBJbiBBc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOLCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiwgSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTikpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gU3luY2hyb25vdXMgTW9kZQorICAqIEBub3RlICAgSW4gU3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSBVU0FSVCBpbiBTeW5jaHJvbm91cyBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gU2V0IENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gU3luY2hyb25vdXMgTW9kZQorICAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV29yZCBsZW5ndGgsIFBhcml0eSwgQ2xvY2sgUG9sYXJpdHksIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZworICAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfQ29uZmlnU3luY01vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnU3luY01vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICAvKiBJbiBTeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiwgSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTikpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBTeW5jaHJvbm91cyBtb2RlICovCisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DTEtFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gTElOIE1vZGUKKyAgKiBAbm90ZSAgIEluIExJTiBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgICogICAgICAgICAgIC0gU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXQgdGhlIFVBUlQvVVNBUlQgaW4gTElOIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIFNUT1AgaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVJcmRhKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBTZXQgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlTElOKCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIExJTiBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgTElOIEJyZWFrIERldGVjdGlvbiBMZW5ndGgsIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZworICAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnTElOTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIC8qIEluIExJTiBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIElSRU4sIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIFNldCB0aGUgVUFSVC9VU0FSVCBpbiBMSU4gbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIEhhbGYgRHVwbGV4IE1vZGUKKyAgKiBAbm90ZSAgIEluIEhhbGYgRHVwbGV4IG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBDTEtFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB0aGUgVUFSVC9VU0FSVCBpbiBIYWxmIER1cGxleCBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFsZi1EdXBsZXggbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIEhhbGYgRHVwbGV4IE1vZGUKKyAgKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQYXJpdHksIC4uLikgc2hvdWxkIGJlIHNldCB1c2luZworICAqICAgICAgICAgZGVkaWNhdGVkIGZ1bmN0aW9ucworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnSGFsZkR1cGxleE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICAvKiBJbiBIYWxmIER1cGxleCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOIGFuZCBJUkVOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSVJFTikpOworICAvKiBzZXQgdGhlIFVBUlQvVVNBUlQgaW4gSGFsZiBEdXBsZXggbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIFNtYXJ0Y2FyZCBNb2RlCisgICogQG5vdGUgICBJbiBTbWFydGNhcmQgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gY29uZmlndXJlcyBTdG9wIGJpdHMgdG8gMS41IGJpdHMgYW5kCisgICogICAgICAgICBzZXRzIHRoZSBVU0FSVCBpbiBTbWFydGNhcmQgbW9kZSAoU0NFTiBiaXQpLgorICAqICAgICAgICAgQ2xvY2sgT3V0cHV0IGlzIGFsc28gZW5hYmxlZCAoQ0xLRU4pLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVJcmRhKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDb25maWd1cmUgU1RPUCBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gU2V0IFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIFNtYXJ0Y2FyZCBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gU21hcnRjYXJkIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBJUkVOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIENvbmZpZ3VyZSBTdG9wIGJpdHMgdG8gMS41IGJpdHMgKi8KKyAgLyogU3luY2hyb25vdXMgbW9kZSBpcyBhY3RpdmF0ZWQgYnkgZGVmYXVsdCAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX1NUT1BfMCB8IFVTQVJUX0NSMl9TVE9QXzEgfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgLyogc2V0IHRoZSBVQVJUL1VTQVJUIGluIFNtYXJ0Y2FyZCBtb2RlICovCisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBJcmRhIE1vZGUKKyAgKiBAbm90ZSAgIEluIElSREEgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIHNldHMgdGhlIFVBUlQvVVNBUlQgaW4gSVJEQSBtb2RlIChJUkVOIGJpdCkuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENvbmZpZ3VyZSBTVE9QIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gU2V0IElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBJcmRhIE1vZGUKKyAgKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQb3dlciBtb2RlLCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0lyZGFNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gSVJEQSBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4sIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOIHwgVVNBUlRfQ1IyX1NUT1ApKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSERTRUwpKTsKKyAgLyogc2V0IHRoZSBVQVJUL1VTQVJUIGluIElSREEgbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gTXVsdGkgcHJvY2Vzc29yIE1vZGUKKyAgKiAgICAgICAgIChzZXZlcmFsIFVTQVJUcyBjb25uZWN0ZWQgaW4gYSBuZXR3b3JrLCBvbmUgb2YgdGhlIFVTQVJUcyBjYW4gYmUgdGhlIG1hc3RlciwKKyAgKiAgICAgICAgIGl0cyBUWCBvdXRwdXQgY29ubmVjdGVkIHRvIHRoZSBSWCBpbnB1dHMgb2YgdGhlIG90aGVyIHNsYXZlcyBVU0FSVHMpLgorICAqIEBub3RlICAgSW4gTXVsdGlQcm9jZXNzb3IgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIENMS0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIE11bHRpIHByb2Nlc3NvciBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXYWtlIFVwIE1ldGhvZCwgTm9kZSBhZGRyZXNzLCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gTXVsdGkgUHJvY2Vzc29yIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIElSRU4sIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSERTRUwgfCBVU0FSVF9DUjNfSVJFTikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUEUgICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19QRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUEUpID09IChVU0FSVF9JU1JfUEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEZyYW1pbmcgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRkUgICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19GRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfRkUpID09IChVU0FSVF9JU1JfRkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIE5vaXNlIGVycm9yIGRldGVjdGVkIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE5FICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX05FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX05FKSA9PSAoVVNBUlRfSVNSX05FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBPdmVyUnVuIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE9SRSAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX09SRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX09SRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfT1JFKSA9PSAoVVNBUlRfSVNSX09SRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgSURMRSBsaW5lIGRldGVjdGVkIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIElETEUgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0lETEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19JRExFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9JRExFKSA9PSAoVVNBUlRfSVNSX0lETEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJlYWQgRGF0YSBSZWdpc3RlciBOb3QgRW1wdHkgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhORSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhORQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JYTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JYTkUpID09IChVU0FSVF9JU1JfUlhORSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RDCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVEMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1RDKSA9PSAoVVNBUlRfSVNSX1RDKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRSAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhFKSA9PSAoVVNBUlRfSVNSX1RYRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgTElOIEJyZWFrIERldGVjdGlvbiBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgTEJERiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTEJECisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9MQkRGKSA9PSAoVVNBUlRfSVNSX0xCREYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENUUyBpbnRlcnJ1cHQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIENUU0lGICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX25DVFMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19uQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9DVFNJRikgPT0gKFVTQVJUX0lTUl9DVFNJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQ1RTIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDVFMgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19DVFMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19DVFMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0NUUykgPT0gKFVTQVJUX0lTUl9DVFMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJlY2VpdmVyIFRpbWUgT3V0IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJUT0YgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JUTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JUTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlRPRikgPT0gKFVTQVJUX0lTUl9SVE9GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBFbmQgT2YgQmxvY2sgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBFT0JGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19FT0IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0VPQkYpID09IChVU0FSVF9JU1JfRU9CRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQXV0by1CYXVkIFJhdGUgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUJSRSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQUJSRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0FCUkUpID09IChVU0FSVF9JU1JfQUJSRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQXV0by1CYXVkIFJhdGUgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUJSRiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQUJSCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQUJSKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9BQlJGKSA9PSAoVVNBUlRfSVNSX0FCUkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEJ1c3kgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQlVTWSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQlVTWQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0JVU1koVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0JVU1kpID09IChVU0FSVF9JU1JfQlVTWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQ2hhcmFjdGVyIE1hdGNoIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIENNRiAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0NNCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQ00oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0NNRikgPT0gKFVTQVJUX0lTUl9DTUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFNlbmQgQnJlYWsgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgU0JLRiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfU0JLCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfU0JLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9TQktGKSA9PSAoVVNBUlRfSVNSX1NCS0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJlY2VpdmUgV2FrZSBVcCBmcm9tIG11dGUgbW9kZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSV1UgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SV1UKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SV1UoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JXVSkgPT0gKFVTQVJUX0lTUl9SV1UpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBXVUYgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfV1VGKSA9PSAoVVNBUlRfSVNSX1dVRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXQgRW5hYmxlIEFja25vd2xlZGdlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFQUNLICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RFQUNLCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVEVBQ0soVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1RFQUNLKSA9PSAoVVNBUlRfSVNSX1RFQUNLKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlIEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSRUFDSyAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SRUFDSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JFQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9SRUFDSykgPT0gKFVTQVJUX0lTUl9SRUFDSykpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKKy8qIEZ1bmN0aW9uIGF2YWlsYWJsZSBvbmx5IG9uIGRldmljZXMgc3VwcG9ydGluZyBUcmFuc21pdCBDb21wbGV0ZSBiZWZvcmUgR3VhcmQgVGltZSBmZWF0dXJlICovCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTbWFydGNhcmQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDQkdUICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RDQkdUCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVENCR1QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1RDQkdUKSA9PSAoVVNBUlRfSVNSX1RDQkdUKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUGFyaXR5IEVycm9yIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBQRUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19QRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9QRUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBGcmFtaW5nIEVycm9yIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBGRUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19GRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfRkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9GRUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBOb2lzZSBFcnJvciBkZXRlY3RlZCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgTkNGICAgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX05FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19ORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX05DRiApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE92ZXJSdW4gRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIE9SRUNGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX09SRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfT1JFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfT1JFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIElETEUgbGluZSBkZXRlY3RlZCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgSURMRUNGICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfSURMRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0lETEVDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUQ0NGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19UQworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfVEMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9UQ0NGKTsKK30KKworI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKKy8qIEZ1bmN0aW9uIGF2YWlsYWJsZSBvbmx5IG9uIGRldmljZXMgc3VwcG9ydGluZyBUcmFuc21pdCBDb21wbGV0ZSBiZWZvcmUgR3VhcmQgVGltZSBmZWF0dXJlICovCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFNtYXJ0Y2FyZCBUcmFuc21pc3Npb24gQ29tcGxldGUgQmVmb3JlIEd1YXJkIFRpbWUgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIFRDQkdUQ0YgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1RDQkdUCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19UQ0JHVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1RDQkdUQ0YpOworfQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgTElOIEJyZWFrIERldGVjdGlvbiBGbGFnCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIExCRENGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0xCRAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfTEJEQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENUUyBJbnRlcnJ1cHQgRmxhZworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBDVFNDRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19uQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19uQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfQ1RTQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlY2VpdmVyIFRpbWUgT3V0IEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBSVE9DRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19SVE8KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1JUTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1JUT0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBFbmQgT2YgQmxvY2sgRmxhZworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgRU9CQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9FT0JDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhcmFjdGVyIE1hdGNoIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBDTUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19DTQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfQ00oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9DTUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIEZsYWcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFdVQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1dLVVAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9XVUNGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJRExFIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfSURMRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9JRExFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJYIE5vdCBFbXB0eSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWE5FSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1JYTkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUlhORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9UQworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVFggRW1wdHkgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9UWEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVFhFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUGFyaXR5IEVycm9yIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfUEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0NNCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSZWNlaXZlciBUaW1lb3V0IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJUT0lFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfUlRPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1JUTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEVuZCBPZiBCbG9jayBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVPQklFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0VPQihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9FT0JJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExJTiBCcmVhayBEZXRlY3Rpb24gSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCRElFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfTEJECisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEVycm9yIEludGVycnVwdAorICAqIEBub3RlICAgV2hlbiBzZXQsIEVycm9yIEludGVycnVwdCBFbmFibGUgQml0IGlzIGVuYWJsaW5nIGludGVycnVwdCBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgYSBmcmFtaW5nCisgICogICAgICAgICBlcnJvciwgb3ZlcnJ1biBlcnJvciBvciBub2lzZSBmbGFnIChGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIpLgorICAqICAgICAgICAgICAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkCisgICogICAgICAgICAgIDE6IEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9FUlJPUgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9FUlJPUihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDVFMgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1dLVVAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVUZJRSk7Cit9CisKKyNpZiBkZWZpbmVkKFVTQVJUX1RDQkdUX1NVUFBPUlQpCisvKiBGdW5jdGlvbiBhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzIHN1cHBvcnRpbmcgVHJhbnNtaXQgQ29tcGxldGUgYmVmb3JlIEd1YXJkIFRpbWUgZmVhdHVyZSAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRDQkdUSUUgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfVENCR1QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVENCR1QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVENCR1RJRSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIElETEUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfSURMRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSWCBOb3QgRW1wdHkgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhORUlFICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfUlhORQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfUlhORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfVEMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RDKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUWCBFbXB0eSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWEVJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9UWEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RYRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUlFICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9QRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9DTQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfQ00oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJlY2VpdmVyIFRpbWVvdXQgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlRPSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfUlRPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9SVE8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFbmQgT2YgQmxvY2sgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBFT0JJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9FT0IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0VPQihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0VPQklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExJTiBCcmVhayBEZXRlY3Rpb24gSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCRElFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0xCRAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJESUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXJyb3IgSW50ZXJydXB0CisgICogQG5vdGUgICBXaGVuIHNldCwgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBCaXQgaXMgZW5hYmxpbmcgaW50ZXJydXB0IGdlbmVyYXRpb24gaW4gY2FzZSBvZiBhIGZyYW1pbmcKKyAgKiAgICAgICAgIGVycm9yLCBvdmVycnVuIGVycm9yIG9yIG5vaXNlIGZsYWcgKEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgVVNBUlR4X0lTUiByZWdpc3RlcikuCisgICogICAgICAgICAgIDA6IEludGVycnVwdCBpcyBpbmhpYml0ZWQKKyAgKiAgICAgICAgICAgMTogQW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuIEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgVVNBUlR4X0lTUiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9FUlJPUgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ1RTIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9DVFMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpOworfQorCisjaWYgZGVmaW5lZChVU0FSVF9UQ0JHVF9TVVBQT1JUKQorLyogRnVuY3Rpb24gYXZhaWxhYmxlIG9ubHkgb24gZGV2aWNlcyBzdXBwb3J0aW5nIFRyYW5zbWl0IENvbXBsZXRlIGJlZm9yZSBHdWFyZCBUaW1lIGZlYXR1cmUgKi8KKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTbWFydGNhcmQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVENCR1RJRSAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfVENCR1QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RDQkdUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVENCR1RJRSk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgSURMRSBJbnRlcnJ1cHQgIHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfSURMRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKSA9PSAoVVNBUlRfQ1IxX0lETEVJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUlggTm90IEVtcHR5IEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFKSA9PSAoVVNBUlRfQ1IxX1JYTkVJRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1RDCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSkgPT0gKFVTQVJUX0NSMV9UQ0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBUWCBFbXB0eSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWEVJRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfVFhFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRSkgPT0gKFVTQVJUX0NSMV9UWEVJRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUlFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1BFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9QRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSkgPT0gKFVTQVJUX0NSMV9QRUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9DTQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfQ00oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpID09IChVU0FSVF9DUjFfQ01JRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSVE9JRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JUTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SVE9JRSkgPT0gKFVTQVJUX0NSMV9SVE9JRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRW5kIE9mIEJsb2NrIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRU9CSUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9FT0IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0VPQihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRU9CSUUpID09IChVU0FSVF9DUjFfRU9CSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIExJTiBCcmVhayBEZXRlY3Rpb24gSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCRElFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfTEJECisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9MQkQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCRElFKSA9PSAoVVNBUlRfQ1IyX0xCRElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0VSUk9SCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9FUlJPUihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKSA9PSAoVVNBUlRfQ1IzX0VJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQ1RTIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNJRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0NUUworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSkgPT0gKFVTQVJUX0NSM19DVFNJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVRklFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpID09IChVU0FSVF9DUjNfV1VGSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKFVTQVJUX1RDQkdUX1NVUFBPUlQpCisvKiBGdW5jdGlvbiBhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzIHN1cHBvcnRpbmcgVHJhbnNtaXQgQ29tcGxldGUgYmVmb3JlIEd1YXJkIFRpbWUgZmVhdHVyZSAqLworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRDQkdUSUUgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfVENCR1QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1RDQkdUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UQ0JHVElFKSA9PSAoVVNBUlRfQ1IzX1RDQkdUSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUFfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBNb2RlIGZvciByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgcmVjZXB0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BUiAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQVJlcV9SWAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1JYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKSA9PSAoVVNBUlRfQ1IzX0RNQVIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBNb2RlIGZvciB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgdHJhbnNtaXNzaW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BVCAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKSA9PSAoVVNBUlRfQ1IzX0RNQVQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVETUFEZWFjdE9uUnhFcnIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVETUFEZWFjdE9uUnhFcnIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURNQURlYWN0T25SeEVycihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yIGlzIGRpc2FibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRETUFEZWFjdE9uUnhFcnIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRERSRSkgPT0gKFVTQVJUX0NSM19ERFJFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgZGF0YSByZWdpc3RlciBhZGRyZXNzIHVzZWQgZm9yIERNQSB0cmFuc2ZlcgorICAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfVVNBUlRfRE1BX0dldFJlZ0FkZHJcbgorICAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfVVNBUlRfRE1BX0dldFJlZ0FkZHIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRE1BX1JFR19EQVRBX1RSQU5TTUlUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0RNQV9HZXRSZWdBZGRyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgRGlyZWN0aW9uKQoreworICByZWdpc3RlciB1aW50MzJfdCBkYXRhX3JlZ19hZGRyOworCisgIGlmIChEaXJlY3Rpb24gPT0gTExfVVNBUlRfRE1BX1JFR19EQVRBX1RSQU5TTUlUKQorICB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgVERSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoVVNBUlR4LT5URFIpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFJEUiByZWdpc3RlciAqLworICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKFVTQVJUeC0+UkRSKTsKKyAgfQorCisgIHJldHVybiBkYXRhX3JlZ19hZGRyOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgUmVjZWl2ZXIgRGF0YSByZWdpc3RlciAoUmVjZWl2ZSBEYXRhIHZhbHVlLCA4IGJpdHMpCisgICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9VU0FSVF9SZWNlaXZlRGF0YTgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9VU0FSVF9SZWNlaXZlRGF0YTgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKFVTQVJUeC0+UkRSLCBVU0FSVF9SRFJfUkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBSZWNlaXZlciBEYXRhIHJlZ2lzdGVyIChSZWNlaXZlIERhdGEgdmFsdWUsIDkgYml0cykKKyAgKiBAcm10b2xsIFJEUiAgICAgICAgICBSRFIgICAgICAgICAgIExMX1VTQVJUX1JlY2VpdmVEYXRhOQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MUZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfVVNBUlRfUmVjZWl2ZURhdGE5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoVVNBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBpbiBUcmFuc21pdHRlciBEYXRhIFJlZ2lzdGVyIChUcmFuc21pdCBEYXRhIHZhbHVlLCA4IGJpdHMpCisgICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9VU0FSVF9UcmFuc21pdERhdGE4CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfVHJhbnNtaXREYXRhOChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQ4X3QgVmFsdWUpCit7CisgIFVTQVJUeC0+VERSID0gVmFsdWU7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgaW4gVHJhbnNtaXR0ZXIgRGF0YSBSZWdpc3RlciAoVHJhbnNtaXQgRGF0YSB2YWx1ZSwgOSBiaXRzKQorICAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfVVNBUlRfVHJhbnNtaXREYXRhOQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MUZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9UcmFuc21pdERhdGE5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDE2X3QgVmFsdWUpCit7CisgIFVTQVJUeC0+VERSID0gVmFsdWUgJiAweDFGRlVMOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0V4ZWN1dGlvbiBFeGVjdXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlcXVlc3QgYW4gQXV0b21hdGljIEJhdWQgUmF0ZSBtZWFzdXJlbWVudCBvbiBuZXh0IHJlY2VpdmVkIGRhdGEgZnJhbWUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIFJRUiAgICAgICAgICBBQlJSUSAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RBdXRvQmF1ZFJhdGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdEF1dG9CYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsIFVTQVJUX1JRUl9BQlJSUSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVxdWVzdCBCcmVhayBzZW5kaW5nCisgICogQHJtdG9sbCBSUVIgICAgICAgICAgU0JLUlEgICAgICAgICBMTF9VU0FSVF9SZXF1ZXN0QnJlYWtTZW5kaW5nCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RCcmVha1NlbmRpbmcoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+UlFSLCBVU0FSVF9SUVJfU0JLUlEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFB1dCBVU0FSVCBpbiBtdXRlIG1vZGUgYW5kIHNldCB0aGUgUldVIGZsYWcKKyAgKiBAcm10b2xsIFJRUiAgICAgICAgICBNTVJRICAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RFbnRlck11dGVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RFbnRlck11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPlJRUiwgVVNBUlRfUlFSX01NUlEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlcXVlc3QgYSBSZWNlaXZlIERhdGEgZmx1c2gKKyAgKiBAbm90ZSAgIEFsbG93cyB0byBkaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhIHdpdGhvdXQgcmVhZGluZyB0aGVtLCBhbmQgYXZvaWQgYW4gb3ZlcnJ1bgorICAqICAgICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlFSICAgICAgICAgIFJYRlJRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdFJ4RGF0YUZsdXNoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RSeERhdGFGbHVzaChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsIFVTQVJUX1JRUl9SWEZSUSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVxdWVzdCBhIFRyYW5zbWl0IGRhdGEgZmx1c2gKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgUlFSICAgICAgICAgIFRYRlJRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdFR4RGF0YUZsdXNoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RUeERhdGFGbHVzaChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsIFVTQVJUX1JRUl9UWEZSUSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1VTQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpOworRXJyb3JTdGF0dXMgTExfVVNBUlRfSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIExMX1VTQVJUX0luaXRUeXBlRGVmICpVU0FSVF9Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1VTQVJUX1N0cnVjdEluaXQoTExfVVNBUlRfSW5pdFR5cGVEZWYgKlVTQVJUX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVVNBUlRfQ2xvY2tJbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiAqVVNBUlRfQ2xvY2tJbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1VTQVJUX0Nsb2NrU3RydWN0SW5pdChMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmICpVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTQVJUMSB8fCBVU0FSVDIgfHwgVVNBUlQ0IHx8IFVTQVJUNSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJMMHh4X0xMX1VTQVJUX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmwweHhfbGxfdXNiLmggYi9JbmMvc3RtMzJsMHh4X2xsX3VzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MWZmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJsMHh4X2xsX3VzYi5oCkBAIC0wLDAgKzEsMjI4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3VzYi5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVU0IgTG93IExheWVyIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJMMHh4X0xMX1VTQl9ICisjZGVmaW5lIFNUTTMyTDB4eF9MTF9VU0JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbF9kZWYuaCIKKworI2lmIGRlZmluZWQgKFVTQikKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0JfTEwKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAYnJpZWYgIFVTQiBNb2RlIGRlZmluaXRpb24KKyAgKi8KKworCisKK3R5cGVkZWYgZW51bQoreworICBVU0JfREVWSUNFX01PREUgID0gMAorfSBVU0JfTW9kZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVVNCIEluaXRpYWxpemF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBkZXZfZW5kcG9pbnRzOyAgICAgICAgICAgLyohPCBEZXZpY2UgRW5kcG9pbnRzIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgZGVwZW5kcyBvbiB0aGUgdXNlZCBVU0IgY29yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAxNSAqLworCisgIHVpbnQzMl90IHNwZWVkOyAgICAgICAgICAgICAgICAgICAvKiE8IFVTQiBDb3JlIHNwZWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgVVNCX0NvcmVfU3BlZWQgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgZXAwX21wczsgICAgICAgICAgICAgICAgIC8qITwgU2V0IHRoZSBFbmRwb2ludCAwIE1heCBQYWNrZXQgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IHBoeV9pdGZhY2U7ICAgICAgICAgICAgICAvKiE8IFNlbGVjdCB0aGUgdXNlZCBQSFkgaW50ZXJmYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgVVNCX0NvcmVfUEhZICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgU29mX2VuYWJsZTsgICAgICAgICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIG91dHB1dCBvZiB0aGUgU09GIHNpZ25hbC4gICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IGxvd19wb3dlcl9lbmFibGU7ICAgICAgICAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIExvdyBQb3dlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBscG1fZW5hYmxlOyAgICAgICAgICAgICAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSBCYXR0ZXJ5IGNoYXJnaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgYmF0dGVyeV9jaGFyZ2luZ19lbmFibGU7IC8qITwgRW5hYmxlIG9yIGRpc2FibGUgQmF0dGVyeSBjaGFyZ2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBVU0JfQ2ZnVHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCAgIG51bTsgICAgICAgICAgICAgLyohPCBFbmRwb2ludCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDE1ICAgICovCisKKyAgdWludDhfdCAgIGlzX2luOyAgICAgICAgICAgLyohPCBFbmRwb2ludCBkaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDEgICAgICovCisKKyAgdWludDhfdCAgIGlzX3N0YWxsOyAgICAgICAgLyohPCBFbmRwb2ludCBzdGFsbCBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDEgICAgICovCisKKyAgdWludDhfdCAgIHR5cGU7ICAgICAgICAgICAgLyohPCBFbmRwb2ludCB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIFVTQl9FUF9UeXBlICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICBkYXRhX3BpZF9zdGFydDsgIC8qITwgSW5pdGlhbCBkYXRhIFBJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMSAgICAgKi8KKworICB1aW50MTZfdCAgcG1hYWRyZXNzOyAgICAgICAvKiE8IFBNQSBBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMCBhbmQgTWF4X2FkZHIgPSAxSyAgICAqLworCisgIHVpbnQxNl90ICBwbWFhZGRyMDsgICAgICAgIC8qITwgUE1BIEFkZHJlc3MwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMCBhbmQgTWF4X2FkZHIgPSAxSyAgICAqLworCisgIHVpbnQxNl90ICBwbWFhZGRyMTsgICAgICAgIC8qITwgUE1BIEFkZHJlc3MxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMCBhbmQgTWF4X2FkZHIgPSAxSyAgICAqLworCisgIHVpbnQ4X3QgICBkb3VibGVidWZmZXI7ICAgIC8qITwgRG91YmxlIGJ1ZmZlciBlbmFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgMCBvciAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDE2X3QgIHR4X2ZpZm9fbnVtOyAgICAgLyohPCBUaGlzIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgVVNCIHBlcmlwaGVyYWxzICAgICovCisKKyAgdWludDMyX3QgIG1heHBhY2tldDsgICAgICAgLyohPCBFbmRwb2ludCBNYXggcGFja2V0IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDY0S0IgICovCisKKyAgdWludDhfdCAgICp4ZmVyX2J1ZmY7ICAgICAgLyohPCBQb2ludGVyIHRvIHRyYW5zZmVyIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgIHhmZXJfbGVuOyAgICAgICAgLyohPCBDdXJyZW50IHRyYW5zZmVyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgIHhmZXJfY291bnQ7ICAgICAgLyohPCBQYXJ0aWFsIHRyYW5zZmVyIGxlbmd0aCBpbiBjYXNlIG9mIG11bHRpIHBhY2tldCB0cmFuc2ZlciAgICAgICAgICAgICAgICAgICovCisKK30gVVNCX0VQVHlwZURlZjsKKworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9Db25zdGFudHMgUENEIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKworLyoqIEBkZWZncm91cCBVU0JfTExfRVAwX01QUyBVU0IgTG93IExheWVyIEVQMCBNUFMKKyAgKiBAeworICAqLworI2RlZmluZSBERVAwQ1RMX01QU182NCAgICAgICAgICAgICAgICAgICAgICAgICAwVQorI2RlZmluZSBERVAwQ1RMX01QU18zMiAgICAgICAgICAgICAgICAgICAgICAgICAxVQorI2RlZmluZSBERVAwQ1RMX01QU18xNiAgICAgICAgICAgICAgICAgICAgICAgICAyVQorI2RlZmluZSBERVAwQ1RMX01QU184ICAgICAgICAgICAgICAgICAgICAgICAgICAzVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0JfTExfRVBfVHlwZSBVU0IgTG93IExheWVyIEVQIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBFUF9UWVBFX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAwVQorI2RlZmluZSBFUF9UWVBFX0lTT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAxVQorI2RlZmluZSBFUF9UWVBFX0JVTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAyVQorI2RlZmluZSBFUF9UWVBFX0lOVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAzVQorI2RlZmluZSBFUF9UWVBFX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzVQorLyoqCisgICogQH0KKyAgKi8KKworI2RlZmluZSBCVEFCTEVfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMFUKKyNkZWZpbmUgUE1BX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVUKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVNCX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBVU0IgTG93IExheWVyIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0NvcmVJbml0KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfQ2ZnVHlwZURlZiBjZmcpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkluaXQoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9DZmdUeXBlRGVmIGNmZyk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRW5hYmxlR2xvYmFsSW50KFVTQl9UeXBlRGVmICpVU0J4KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9EaXNhYmxlR2xvYmFsSW50KFVTQl9UeXBlRGVmICpVU0J4KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXRDdXJyZW50TW9kZShVU0JfVHlwZURlZiAqVVNCeCwgVVNCX01vZGVUeXBlRGVmIG1vZGUpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX1NldERldlNwZWVkKFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90IHNwZWVkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9GbHVzaFJ4RmlmbyhVU0JfVHlwZURlZiAqVVNCeCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRmx1c2hUeEZpZm8oVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQzMl90IG51bSk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfQWN0aXZhdGVFbmRwb2ludChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RlYWN0aXZhdGVFbmRwb2ludChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VQU3RhcnRYZmVyKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfV3JpdGVQYWNrZXQoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgKnNyYywgdWludDhfdCBjaF9lcF9udW0sIHVpbnQxNl90IGxlbik7Cit2b2lkICAgICAgICAgICAgICpVU0JfUmVhZFBhY2tldChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCAqZGVzdCwgdWludDE2X3QgbGVuKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUFNldFN0YWxsKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBDbGVhclN0YWxsKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfU2V0RGV2QWRkcmVzcyhVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCBhZGRyZXNzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9EZXZDb25uZWN0KFVTQl9UeXBlRGVmICpVU0J4KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9EZXZEaXNjb25uZWN0KFVTQl9UeXBlRGVmICpVU0J4KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TdG9wRGV2aWNlKFVTQl9UeXBlRGVmICpVU0J4KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUDBfT3V0U3RhcnQoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgKnBzZXR1cCk7Cit1aW50MzJfdCAgICAgICAgICBVU0JfUmVhZEludGVycnVwdHMoVVNCX1R5cGVEZWYgKlVTQngpOwordWludDMyX3QgICAgICAgICAgVVNCX1JlYWREZXZBbGxPdXRFcEludGVycnVwdChVU0JfVHlwZURlZiAqVVNCeCk7Cit1aW50MzJfdCAgICAgICAgICBVU0JfUmVhZERldk91dEVQSW50ZXJydXB0KFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90IGVwbnVtKTsKK3VpbnQzMl90ICAgICAgICAgIFVTQl9SZWFkRGV2QWxsSW5FcEludGVycnVwdChVU0JfVHlwZURlZiAqVVNCeCk7Cit1aW50MzJfdCAgICAgICAgICBVU0JfUmVhZERldkluRVBJbnRlcnJ1cHQoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgZXBudW0pOwordm9pZCAgICAgICAgICAgICAgVVNCX0NsZWFySW50ZXJydXB0cyhVU0JfVHlwZURlZiAqVVNCeCwgdWludDMyX3QgaW50ZXJydXB0KTsKKworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0FjdGl2YXRlUmVtb3RlV2FrZXVwKFVTQl9UeXBlRGVmICpVU0J4KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9EZUFjdGl2YXRlUmVtb3RlV2FrZXVwKFVTQl9UeXBlRGVmICpVU0J4KTsKK3ZvaWQgVVNCX1dyaXRlUE1BKFVTQl9UeXBlRGVmICAqVVNCeCwgdWludDhfdCAqcGJVc3JCdWYsIHVpbnQxNl90IHdQTUFCdWZBZGRyLCB1aW50MTZfdCB3TkJ5dGVzKTsKK3ZvaWQgVVNCX1JlYWRQTUEoVVNCX1R5cGVEZWYgICpVU0J4LCB1aW50OF90ICpwYlVzckJ1ZiwgdWludDE2X3Qgd1BNQUJ1ZkFkZHIsIHVpbnQxNl90IHdOQnl0ZXMpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJMMHh4X0xMX1VTQl9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJsMHh4X2xsX3V0aWxzLmggYi9JbmMvc3RtMzJsMHh4X2xsX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczYzRjZAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmwweHhfbGxfdXRpbHMuaApAQCAtMCwwICsxLDI2OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF91dGlscy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVVElMUyBMTCBtb2R1bGUuCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBMTCBVVElMUyBkcml2ZXIgY29udGFpbnMgYSBzZXQgb2YgZ2VuZXJpYyBBUElzIHRoYXQgY2FuIGJlCisgICAgdXNlZCBieSB1c2VyOgorICAgICAgKCspIERldmljZSBlbGVjdHJvbmljIHNpZ25hdHVyZQorICAgICAgKCspIFRpbWluZyBmdW5jdGlvbnMKKyAgICAgICgrKSBQTEwgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fU1RNMzJMMHh4X0xMX1VUSUxTX0gKKyNkZWZpbmUgX19TVE0zMkwweHhfTExfVVRJTFNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVVElMU19MTCBVVElMUworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9Qcml2YXRlX0NvbnN0YW50cyBVVElMUyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIE1heCBkZWxheSBjYW4gYmUgdXNlZCBpbiBMTF9tRGVsYXkgKi8KKyNkZWZpbmUgTExfTUFYX0RFTEFZICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRlUKKworLyoqCisgKiBAYnJpZWYgVW5pcXVlIGRldmljZSBJRCByZWdpc3RlciBiYXNlIGFkZHJlc3MKKyAqLworI2RlZmluZSBVSURfQkFTRV9BRERSRVNTICAgICAgICAgICAgICBVSURfQkFTRQorCisvKioKKyAqIEBicmllZiBGbGFzaCBzaXplIGRhdGEgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCisgKi8KKyNkZWZpbmUgRkxBU0hTSVpFX0JBU0VfQUREUkVTUyAgICAgICAgRkxBU0hTSVpFX0JBU0UKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9Qcml2YXRlX01hY3JvcyBVVElMUyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRVNfSU5JVCBVVElMUyBFeHBvcnRlZCBzdHJ1Y3R1cmVzCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgVVRJTFMgUExMIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQTExNdWw7ICAgLyohPCBNdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIFBMTCBWQ08gaW5wdXQgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX1BMTF9NVUwKKworICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUygpLiAqLworCisgIHVpbnQzMl90IFBMTERpdjsgICAvKiE8IERpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBvdXRwdXQgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX1BMTF9ESVYgCisgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUygpLiAqLworfSBMTF9VVElMU19QTExJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBVVElMUyBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c2VzIGNsb2NrIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEFIQkNMS0RpdmlkZXI7ICAgICAgICAgLyohPCBUaGUgQUhCIGNsb2NrIChIQ0xLKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgc3lzdGVtIGNsb2NrIChTWVNDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfU1lTQ0xLX0RJVgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfU2V0QUhCUHJlc2NhbGVyKCkuICovCisKKyAgdWludDMyX3QgQVBCMUNMS0RpdmlkZXI7ICAgICAgICAvKiE8IFRoZSBBUEIxIGNsb2NrIChQQ0xLMSkgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIEFIQiBjbG9jayAoSENMSykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MTF9FQ19BUEIxX0RJVgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfU2V0QVBCMVByZXNjYWxlcigpLiAqLworCisgIHVpbnQzMl90IEFQQjJDTEtEaXZpZGVyOyAgICAgICAgLyohPCBUaGUgQVBCMiBjbG9jayAoUENMSzIpIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBBSEIgY2xvY2sgKEhDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfQVBCMl9ESVYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1NldEFQQjJQcmVzY2FsZXIoKS4gKi8KKworfSBMTF9VVElMU19DbGtJbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFVUSUxTIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVRJTFNfRUNfSFNFX0JZUEFTUyBIU0UgQnlwYXNzIGFjdGl2YXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VVElMU19IU0VCWVBBU1NfT0ZGICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IEhTRSBCeXBhc3MgaXMgbm90IGVuYWJsZWQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfSFNFQllQQVNTX09OICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgLyohPCBIU0UgQnlwYXNzIGlzIGVuYWJsZWQgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBVVElMUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0VGX0RFVklDRV9FTEVDVFJPTklDX1NJR05BVFVSRSBERVZJQ0UgRUxFQ1RST05JQyBTSUdOQVRVUkUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBXb3JkMCBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAgKiBAcmV0dmFsIFVJRFszMTowXQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFVJRF9Xb3JkMCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKVVJRF9CQVNFX0FERFJFU1MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdvcmQxIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQorICAqIEByZXR2YWwgVUlEWzYzOjMyXQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFVJRF9Xb3JkMSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKShVSURfQkFTRV9BRERSRVNTICsgMHgwNFUpKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXb3JkMiBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAgKiBAcmV0dmFsIFVJRFs5NTo2NF0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HZXRVSURfV29yZDIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoKigodWludDMyX3QgKikoVUlEX0JBU0VfQUREUkVTUyArIDB4MTRVKSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRmxhc2ggbWVtb3J5IHNpemUKKyAgKiBAbm90ZSAgIFRoaXMgYml0ZmllbGQgaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBkZXZpY2UgRmxhc2ggbWVtb3J5IGV4cHJlc3NlZCBpbgorICAqICAgICAgICAgS2J5dGVzLiBBcyBhbiBleGFtcGxlLCAweDA0MCBjb3JyZXNwb25kcyB0byA2NCBLYnl0ZXMuCisgICogQHJldHZhbCBGTEFTSF9TSVpFWzE1OjBdOiBGbGFzaCBtZW1vcnkgc2l6ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldEZsYXNoU2l6ZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKUZMQVNIU0laRV9CQVNFX0FERFJFU1MpKSAmIDB4RkZGRik7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVVElMU19MTF9FRl9ERUxBWSBERUxBWQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBDb3J0ZXgtTSBTeXNUaWNrIHNvdXJjZSBvZiB0aGUgdGltZSBiYXNlLgorICAqIEBwYXJhbSAgSENMS0ZyZXF1ZW5jeSBIQ0xLIGZyZXF1ZW5jeSBpbiBIeiAoY2FuIGJlIGNhbGN1bGF0ZWQgdGhhbmtzIHRvIFJDQyBoZWxwZXIgbWFjcm8pCisgICogQG5vdGUgICBXaGVuIGEgUlRPUyBpcyB1c2VkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCBjaGFuZ2luZyB0aGUgU3lzVGljayAKKyAgKiAgICAgICAgIGNvbmZpZ3VyYXRpb24gYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBmb3IgYSBkZWxheSB1c2UgcmF0aGVyIG9zRGVsYXkgUlRPUyBzZXJ2aWNlLgorICAqIEBwYXJhbSAgVGlja3MgTnVtYmVyIG9mIHRpY2tzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9Jbml0VGljayh1aW50MzJfdCBIQ0xLRnJlcXVlbmN5LCB1aW50MzJfdCBUaWNrcykKK3sKKyAgLyogQ29uZmlndXJlIHRoZSBTeXNUaWNrIHRvIGhhdmUgaW50ZXJydXB0IGluIDFtcyB0aW1lIGJhc2UgKi8KKyAgU3lzVGljay0+TE9BRCAgPSAodWludDMyX3QpKChIQ0xLRnJlcXVlbmN5IC8gVGlja3MpIC0gMVVMKTsgIC8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8KKyAgU3lzVGljay0+VkFMICAgPSAwVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovCisgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfAorICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgdGhlIFN5c3RpY2sgVGltZXIgKi8KK30KKwordm9pZCAgICAgICAgTExfSW5pdDFtc1RpY2sodWludDMyX3QgSENMS0ZyZXF1ZW5jeSk7Cit2b2lkICAgICAgICBMTF9tRGVsYXkodWludDMyX3QgRGVsYXkpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0VGX1NZU1RFTSBTWVNURU0KKyAgKiBAeworICAqLworCit2b2lkICAgICAgICBMTF9TZXRTeXN0ZW1Db3JlQ2xvY2sodWludDMyX3QgSENMS0ZyZXF1ZW5jeSk7CitFcnJvclN0YXR1cyBMTF9QTExfQ29uZmlnU3lzdGVtQ2xvY2tfSFNJKExMX1VUSUxTX1BMTEluaXRUeXBlRGVmICpVVElMU19QTExJbml0U3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9VVElMU19DbGtJbml0VHlwZURlZiAqVVRJTFNfQ2xrSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9QTExfQ29uZmlnU3lzdGVtQ2xvY2tfSFNFKHVpbnQzMl90IEhTRUZyZXF1ZW5jeSwgdWludDMyX3QgSFNFQnlwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMkwweHhfTExfVVRJTFNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMybDB4eF9sbF93d2RnLmggYi9JbmMvc3RtMzJsMHh4X2xsX3d3ZGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzZmMzYyCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMybDB4eF9sbF93d2RnLmgKQEAgLTAsMCArMSwzMTkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfd3dkZy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBXV0RHIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkwweHhfTExfV1dER19ICisjZGVmaW5lIFNUTTMyTDB4eF9MTF9XV0RHX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChXV0RHKQorCisvKiogQGRlZmdyb3VwIFdXREdfTEwgV1dERworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FeHBvcnRlZF9Db25zdGFudHMgV1dERyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfV1dER19SZWFkUmVnIGFuZCAgTExfV1dER19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9XV0RHX0NGUl9FV0kgICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9FV0kKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FQ19QUkVTQ0FMRVIgIFBSRVNDQUxFUgorKiBAeworKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzEgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfMiAgICAgICAgICAgICAgICAgV1dER19DRlJfV0RHVEJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzIgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfNCAgICAgICAgICAgICAgICAgV1dER19DRlJfV0RHVEJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzQgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfOCAgICAgICAgICAgICAgICAgKFdXREdfQ0ZSX1dER1RCXzAgfCBXV0RHX0NGUl9XREdUQl8xKSAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFdXREdfTExfRXhwb3J0ZWRfTWFjcm9zIFdXREcgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBXV0RHIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gV1dERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfV1dER19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFdXREcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBXV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1dXREdfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFdXREdfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFdXREcgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBXaW5kb3cgV2F0Y2hkb2cuIFRoZSB3YXRjaGRvZyBpcyBhbHdheXMgZGlzYWJsZWQgYWZ0ZXIgYSByZXNldC4KKyAgKiBAbm90ZSAgIEl0IGlzIGVuYWJsZWQgYnkgc2V0dGluZyB0aGUgV0RHQSBiaXQgaW4gdGhlIFdXREdfQ1IgcmVnaXN0ZXIsCisgICogICAgICAgICB0aGVuIGl0IGNhbm5vdCBiZSBkaXNhYmxlZCBhZ2FpbiBleGNlcHQgYnkgYSByZXNldC4KKyAgKiAgICAgICAgIFRoaXMgYml0IGlzIHNldCBieSBzb2Z0d2FyZSBhbmQgb25seSBjbGVhcmVkIGJ5IGhhcmR3YXJlIGFmdGVyIGEgcmVzZXQuCisgICogICAgICAgICBXaGVuIFdER0EgPSAxLCB0aGUgd2F0Y2hkb2cgY2FuIGdlbmVyYXRlIGEgcmVzZXQuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV0RHQSAgICAgICAgICBMTF9XV0RHX0VuYWJsZQorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfV1dER19FbmFibGUoV1dER19UeXBlRGVmICpXV0RHeCkKK3sKKyAgU0VUX0JJVChXV0RHeC0+Q1IsIFdXREdfQ1JfV0RHQSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIFdpbmRvdyBXYXRjaGRvZyBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV0RHQSAgICAgICAgICBMTF9XV0RHX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfSXNFbmFibGVkKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFdXREd4LT5DUiwgV1dER19DUl9XREdBKSA9PSAoV1dER19DUl9XREdBKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgV2F0Y2hkb2cgY291bnRlciB2YWx1ZSB0byBwcm92aWRlZCB2YWx1ZSAoNy1iaXRzIFRbNjowXSkKKyAgKiBAbm90ZSAgIFdoZW4gd3JpdGluZyB0byB0aGUgV1dER19DUiByZWdpc3RlciwgYWx3YXlzIHdyaXRlIDEgaW4gdGhlIE1TQiBiNiB0byBhdm9pZCBnZW5lcmF0aW5nIGFuIGltbWVkaWF0ZSByZXNldAorICAqICAgICAgICAgVGhpcyBjb3VudGVyIGlzIGRlY3JlbWVudGVkIGV2ZXJ5ICg0MDk2IHggMmV4cFdER1RCKSBQQ0xLIGN5Y2xlcworICAqICAgICAgICAgQSByZXNldCBpcyBwcm9kdWNlZCB3aGVuIGl0IHJvbGxzIG92ZXIgZnJvbSAweDQwIHRvIDB4M0YgKGJpdCBUNiBiZWNvbWVzIGNsZWFyZWQpCisgICogICAgICAgICBTZXR0aW5nIHRoZSBjb3VudGVyIGxvd2VyIHRoZW4gMHg0MCBjYXVzZXMgYW4gaW1tZWRpYXRlIHJlc2V0IChpZiBXV0RHIGVuYWJsZWQpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVCAgICAgICAgICAgICBMTF9XV0RHX1NldENvdW50ZXIKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvdW50ZXIgMC4uMHg3RiAoNyBiaXQgY291bnRlciB2YWx1ZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1dXREdfU2V0Q291bnRlcihXV0RHX1R5cGVEZWYgKldXREd4LCB1aW50MzJfdCBDb3VudGVyKQoreworICBNT0RJRllfUkVHKFdXREd4LT5DUiwgV1dER19DUl9ULCBDb3VudGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBXYXRjaGRvZyBDb3VudGVyIFZhbHVlICg3IGJpdHMgY291bnRlciB2YWx1ZSkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUICAgICAgICAgICAgIExMX1dXREdfR2V0Q291bnRlcgorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgNyBiaXQgV2F0Y2hkb2cgQ291bnRlciB2YWx1ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfR2V0Q291bnRlcihXV0RHX1R5cGVEZWYgKldXREd4KQoreworICByZXR1cm4gKFJFQURfQklUKFdXREd4LT5DUiwgV1dER19DUl9UKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0aW1lIGJhc2Ugb2YgdGhlIHByZXNjYWxlciAoV0RHVEIpLgorICAqIEBub3RlICAgUHJlc2NhbGVyIGlzIHVzZWQgdG8gYXBwbHkgcmF0aW8gb24gUENMSyBjbG9jaywgc28gdGhhdCBXYXRjaGRvZyBjb3VudGVyCisgICogICAgICAgICBpcyBkZWNyZW1lbnRlZCBldmVyeSAoNDA5NiB4IDJleHBXREdUQikgUENMSyBjeWNsZXMKKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBXREdUQiAgICAgICAgIExMX1dXREdfU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl84CisqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfV1dER19TZXRQcmVzY2FsZXIoV1dER19UeXBlRGVmICpXV0RHeCwgdWludDMyX3QgUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFdXREd4LT5DRlIsIFdXREdfQ0ZSX1dER1RCLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IFdhdGNoZG9nIFByZXNjYWxlciBWYWx1ZQorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIFdER1RCICAgICAgICAgTExfV1dER19HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfR2V0UHJlc2NhbGVyKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoV1dER3gtPkNGUiwgV1dER19DRlJfV0RHVEIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFdhdGNoZG9nIFdpbmRvdyB2YWx1ZSB0byBiZSBjb21wYXJlZCB0byB0aGUgZG93bmNvdW50ZXIgKDctYml0cyBXWzY6MF0pLgorICAqIEBub3RlICAgVGhpcyB3aW5kb3cgdmFsdWUgZGVmaW5lcyB3aGVuIHdyaXRlIGluIHRoZSBXV0RHX0NSIHJlZ2lzdGVyCisgICogICAgICAgICB0byBwcm9ncmFtIFdhdGNoZG9nIGNvdW50ZXIgaXMgYWxsb3dlZC4KKyAgKiAgICAgICAgIFdhdGNoZG9nIGNvdW50ZXIgdmFsdWUgdXBkYXRlIG11c3Qgb2NjdXIgb25seSB3aGVuIHRoZSBjb3VudGVyIHZhbHVlCisgICogICAgICAgICBpcyBsb3dlciB0aGFuIHRoZSBXYXRjaGRvZyB3aW5kb3cgcmVnaXN0ZXIgdmFsdWUuCisgICogICAgICAgICBPdGhlcndpc2UsIGEgTUNVIHJlc2V0IGlzIGdlbmVyYXRlZCBpZiB0aGUgNy1iaXQgV2F0Y2hkb2cgY291bnRlciB2YWx1ZQorICAqICAgICAgICAgKGluIHRoZSBjb250cm9sIHJlZ2lzdGVyKSBpcyByZWZyZXNoZWQgYmVmb3JlIHRoZSBkb3duY291bnRlciBoYXMgcmVhY2hlZAorICAqICAgICAgICAgdGhlIHdhdGNoZG9nIHdpbmRvdyByZWdpc3RlciB2YWx1ZS4KKyAgKiAgICAgICAgIFBoeXNpY2FsbHkgaXMgcG9zc2libGUgdG8gc2V0IHRoZSBXaW5kb3cgbG93ZXIgdGhlbiAweDQwIGJ1dCBpdCBpcyBub3QgcmVjb21tZW5kZWQuCisgICogICAgICAgICBUbyBnZW5lcmF0ZSBhbiBpbW1lZGlhdGUgcmVzZXQsIGl0IGlzIHBvc3NpYmxlIHRvIHNldCB0aGUgQ291bnRlciBsb3dlciB0aGFuIDB4NDAuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgVyAgICAgICAgICAgICBMTF9XV0RHX1NldFdpbmRvdworICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgV2luZG93IDB4MDAuLjB4N0YgKDcgYml0IFdpbmRvdyB2YWx1ZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1dXREdfU2V0V2luZG93KFdXREdfVHlwZURlZiAqV1dER3gsIHVpbnQzMl90IFdpbmRvdykKK3sKKyAgTU9ESUZZX1JFRyhXV0RHeC0+Q0ZSLCBXV0RHX0NGUl9XLCBXaW5kb3cpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IFdhdGNoZG9nIFdpbmRvdyBWYWx1ZSAoNyBiaXRzIHZhbHVlKQorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIFcgICAgICAgICAgICAgTExfV1dER19HZXRXaW5kb3cKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIDcgYml0IFdhdGNoZG9nIFdpbmRvdyB2YWx1ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfR2V0V2luZG93KFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoV1dER3gtPkNGUiwgV1dER19DRlJfVykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyBpZiB0aGUgV1dERyBFYXJseSBXYWtldXAgSW50ZXJydXB0IEZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGlzIHNldCBieSBoYXJkd2FyZSB3aGVuIHRoZSBjb3VudGVyIGhhcyByZWFjaGVkIHRoZSB2YWx1ZSAweDQwLgorICAqICAgICAgICAgSXQgbXVzdCBiZSBjbGVhcmVkIGJ5IHNvZnR3YXJlIGJ5IHdyaXRpbmcgMC4KKyAgKiAgICAgICAgIEEgd3JpdGUgb2YgMSBoYXMgbm8gZWZmZWN0LiBUaGlzIGJpdCBpcyBhbHNvIHNldCBpZiB0aGUgaW50ZXJydXB0IGlzIG5vdCBlbmFibGVkLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEVXSUYgICAgICAgICAgTExfV1dER19Jc0FjdGl2ZUZsYWdfRVdLVVAKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9XV0RHX0lzQWN0aXZlRmxhZ19FV0tVUChXV0RHX1R5cGVEZWYgKldXREd4KQoreworICByZXR1cm4gKChSRUFEX0JJVChXV0RHeC0+U1IsIFdXREdfU1JfRVdJRikgPT0gKFdXREdfU1JfRVdJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgRmxhZyAoRVdJRikKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBFV0lGICAgICAgICAgIExMX1dXREdfQ2xlYXJGbGFnX0VXS1VQCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX0NsZWFyRmxhZ19FV0tVUChXV0RHX1R5cGVEZWYgKldXREd4KQoreworICBXUklURV9SRUcoV1dER3gtPlNSLCB+V1dER19TUl9FV0lGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRWFybHkgV2FrZXVwIEludGVycnVwdC4KKyAgKiBAbm90ZSAgIFdoZW4gc2V0LCBhbiBpbnRlcnJ1cHQgb2NjdXJzIHdoZW5ldmVyIHRoZSBjb3VudGVyIHJlYWNoZXMgdmFsdWUgMHg0MC4KKyAgKiAgICAgICAgIFRoaXMgaW50ZXJydXB0IGlzIG9ubHkgY2xlYXJlZCBieSBoYXJkd2FyZSBhZnRlciBhIHJlc2V0CisgICogQHJtdG9sbCBDRlIgICAgICAgICAgRVdJICAgICAgICAgICBMTF9XV0RHX0VuYWJsZUlUX0VXS1VQCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX0VuYWJsZUlUX0VXS1VQKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIFNFVF9CSVQoV1dER3gtPkNGUiwgV1dER19DRlJfRVdJKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFYXJseSBXYWtldXAgSW50ZXJydXB0IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBFV0kgICAgICAgICAgIExMX1dXREdfSXNFbmFibGVkSVRfRVdLVVAKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9XV0RHX0lzRW5hYmxlZElUX0VXS1VQKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFdXREd4LT5DRlIsIFdXREdfQ0ZSX0VXSSkgPT0gKFdXREdfQ0ZSX0VXSSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFdXREcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJMMHh4X0xMX1dXREdfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvTGljZW5zZS5tZCBiL0xpY2Vuc2UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmOTA4ZgotLS0gL2Rldi9udWxsCisrKyBiL0xpY2Vuc2UubWQKQEAgLTAsMCArMSwzIEBACisjIENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MKKworVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIHVuZGVyIHRoZSAqKkJTRCAzLUNsYXVzZSoqIGxpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGlzIGxpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBbaGVyZV0oaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UpLgpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCmluZGV4IGRmMmI1ZjUuLmQ3NTJiZDUgMTAwNjQ0Ci0tLSBhL1JFQURNRS5tZAorKysgYi9SRUFETUUubWQKQEAgLTEsMiArMSw0NSBAQAotIyBzdG0zMmwweHhfaGFsX2RyaXZlcgotUHJvdmlkZXMgdGhlIFNUTTMyQ3ViZSBNQ1UgQ29tcG9uZW50ICJoYWxfZHJpdmVyIiBvZiB0aGUgU1RNMzJMMCBzZXJpZXMuCisjIFNUTTMyQ3ViZUwwIEhBTCBEcml2ZXIgTUNVIENvbXBvbmVudAorCisjIyBPdmVydmlldworCisqKlNUTTMyQ3ViZSoqIGlzIGFuIFNUTWljcm9lbGVjdHJvbmljcyBvcmlnaW5hbCBpbml0aWF0aXZlIHRvIGVhc2UgdGhlIGRldmVsb3BlcnMgbGlmZSBieSByZWR1Y2luZyBlZmZvcnRzLCB0aW1lIGFuZCBjb3N0LgorCisqKlNUTTMyQ3ViZSoqIGNvdmVycyB0aGUgb3ZlcmFsbCBTVE0zMiBwcm9kdWN0cyBwb3J0Zm9saW8uIEl0IGluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBlbWJlZGRlZCBzb2Z0d2FyZSBwbGF0Zm9ybSwgZGVsaXZlcmVkIGZvciBlYWNoIFNUTTMyIHNlcmllcy4KKyAgICogVGhlIENNU0lTIG1vZHVsZXMgKGNvcmUgYW5kIGRldmljZSkgY29ycmVzcG9uZGluZyB0byB0aGUgQVJNKHRtKSBjb3JlIGltcGxlbWVudGVkIGluIHRoaXMgU1RNMzIgcHJvZHVjdAorICAgKiBUaGUgU1RNMzIgSEFMLUxMIGRyaXZlcnMgOiBhbiBhYnN0cmFjdGlvbiBkcml2ZXJzIGxheWVyLCB0aGUgQVBJIGVuc3VyaW5nIG1heGltaXplZCBwb3J0YWJpbGl0eSBhY3Jvc3MgdGhlIFNUTTMyIHBvcnRmb2xpbworICAgKiBUaGUgQlNQIERyaXZlcnMgb2YgZWFjaCBldmFsdWF0aW9uIG9yIGRlbW9uc3RyYXRpb24gYm9hcmQgcHJvdmlkZWQgYnkgdGhpcyBTVE0zMiBzZXJpZXMKKyAgICogQSBjb25zaXN0ZW50IHNldCBvZiBtaWRkbGV3YXJlcyBjb21wb25lbnRzIHN1Y2ggYXMgUlRPUywgVVNCLCBGYXRGUywgR3JhcGhpY3MsIFNUTTMyX1RvdWNoU2Vuc2luZ19MaWJyYXJ5IC4uLgorICAgKiBBIGZ1bGwgc2V0IG9mIHNvZnR3YXJlIHByb2plY3RzIChiYXNpYyBleGFtcGxlcywgYXBwbGljYXRpb25zIG9yIGRlbW9uc3RyYXRpb25zKSBmb3IgZWFjaCBib2FyZCBwcm92aWRlZCBieSB0aGlzIFNUTTMyIHNlcmllcworCitUd28gbW9kZWxzIG9mIHB1YmxpY2F0aW9uIGFyZSBwcm9wb3NlZCBmb3IgdGhlIFNUTTMyQ3ViZSBlbWJlZGRlZCBzb2Z0d2FyZToKKyAgICogVGhlIG1vbm9saXRoaWMgKipNQ1UgUGFja2FnZSoqIDogYWxsIFNUTTMyQ3ViZSBzb2Z0d2FyZSBtb2R1bGVzIG9mIG9uZSBTVE0zMiBzZXJpZXMgYXJlIHByZXNlbnQgKERyaXZlcnMsIE1pZGRsZXdhcmVzLCBQcm9qZWN0cywgVXRpbGl0aWVzKSBpbiB0aGUgcmVwbyAodXN1YWwgbmFtZSAqKlNUTTMyQ3ViZXh4KiosIHh4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNUTTMyIHNlcmllcykKKyAgICogVGhlICoqTUNVIGNvbXBvbmVudCoqIDogcHJvZ3Jlc3NpdmVseSBmcm9tIE5vdmVtYmVyIDIwMTksIGVhY2ggU1RNMzJDdWJlIHNvZnR3YXJlIG1vZHVsZSBiZWluZyBwYXJ0IG9mIHRoZSBTVE0zMkN1YmUgTUNVIFBhY2thZ2UsIHdpbGwgYmUgZGVsaXZlcmVkIGFzIGFuIGluZGl2aWR1YWwgcmVwbywgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc2VsZWN0IGFuZCBnZXQgb25seSB0aGUgcmVxdWlyZWQgc29mdHdhcmUgZnVuY3Rpb25zLgorCisjIyBEZXNjcmlwdGlvbgorCitUaGlzICoqc3RtMzJsMHh4X2hhbF9kcml2ZXIqKiBNQ1UgY29tcG9uZW50IHJlcG8gaXMgb25lIGVsZW1lbnQgb2YgdGhlIFNUTTMyQ3ViZUwwIE1DVSBlbWJlZGRlZCBzb2Z0d2FyZSBwYWNrYWdlLCBwcm92aWRpbmcgdGhlICoqSEFMLUxMIERyaXZlcnMqKiBwYXJ0LgorCisjIyBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisKK1RoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBbaGVyZV0oaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UpLgorCisjIyBDb21wYXRpYmlsaXR5IGluZm9ybWF0aW9uCisKK0luIHRoaXMgdGFibGUsIHlvdSBjYW4gZmluZCB0aGUgc3VjY2Vzc2l2ZSB2ZXJzaW9ucyBvZiB0aGlzIEhBTC1MTCBEcml2ZXIgY29tcG9uZW50LCBpbiBsaW5lIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbnMgb2YgdGhlIGZ1bGwgTUNVIHBhY2thZ2U6CisKK0l0IGlzICoqY3J1Y2lhbCoqIHRoYXQgeW91IHVzZSBhIGNvbnNpc3RlbnQgc2V0IG9mIHZlcnNpb25zIGZvciB0aGUgQ01TSVMgQ29yZSAtIENNU0lTIERldmljZSAtIEhBTCwgYXMgbWVudGlvbmVkIGluIHRoaXMgdGFibGUuCisKK0hBTCBEcml2ZXIgTDAgfCBDTVNJUyBEZXZpY2UgTDAgfCBDTVNJUyBDb3JlIHwgV2FzIGRlbGl2ZXJlZCBpbiB0aGUgZnVsbCBNQ1UgcGFja2FnZQorLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUYWcgdjEuMTAuMiB8IFRhZyB2MS45LjAgfCBUYWcgdjQuNV9jbTAgfCBUYWcgdjEuMTEuMiAoYW5kIGZvbGxvd2luZywgaWYgYW55LCB0aWxsIG5leHQgbmV3IHRhZykKKworVGhlIGZ1bGwgKipTVE0zMkN1YmVMMCoqIE1DVSBwYWNrYWdlIGlzIGF2YWlsYWJsZSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9TVE0zMkN1YmVMMCkuCisKKyMjIFRyb3VibGVzaG9vdGluZworCitJZiB5b3UgaGF2ZSBhbnkgaXNzdWUgd2l0aCB0aGUgKipTb2Z0d2FyZSBjb250ZW50Kiogb2YgdGhpcyByZXBvLCB5b3UgY2FuIFtmaWxlIGFuIGlzc3VlIG9uIEdpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9zdG0zMmwweHhfaGFsX2RyaXZlci9pc3N1ZXMvbmV3KS4KKworRm9yIGFueSBvdGhlciBxdWVzdGlvbiByZWxhdGVkIHRvIHRoZSBwcm9kdWN0LCB0aGUgdG9vbHMsIHRoZSBlbnZpcm9ubWVudCwgeW91IGNhbiBzdWJtaXQgYSB0b3BpYyBvbiB0aGUgW1NUIENvbW11bml0eS9TVE0zMiBNQ1VzIGZvcnVtXShodHRwczovL2NvbW11bml0eS5zdC5jb20vcy9ncm91cC8wRjkwWDAwMDAwMEFYc0FTQVcvc3RtMzItbWN1cykuCmRpZmYgLS1naXQgYS9SZWxlYXNlX05vdGVzLmh0bWwgYi9SZWxlYXNlX05vdGVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwYmJmYwotLS0gL2Rldi9udWxsCisrKyBiL1JlbGVhc2VfTm90ZXMuaHRtbApAQCAtMCwwICsxLDYzNyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbCB4bWxuczp2PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+PGhlYWQ+Cis8c2NyaXB0PjxlbmRub3RlPjxoZWFkPgorPHNjcmlwdD48ZW5kbm90ZT48aGVhZD4KKzxzY3JpcHQ+PGVuZG5vdGU+PGhlYWQ+Cis8c2NyaXB0PjxlbmRub3RlPjxoZWFkPgorPHNjcmlwdD48L3NjcmlwdD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPGxpbmsgcmVsPSJGaWxlLUxpc3QiIGhyZWY9IlJlbGVhc2VfTm90ZXNfZmlsZXMvZmlsZWxpc3QueG1sIj4KKzxsaW5rIHJlbD0iRWRpdC1UaW1lLURhdGEiIGhyZWY9IlJlbGVhc2VfTm90ZXNfZmlsZXMvZWRpdGRhdGEubXNvIj48dGl0bGU+UmVsZWFzZSBOb3RlcyBmb3IgU1RNMzJMMHh4IEhBTCBEcml2ZXJzPC90aXRsZT4KKworPHN0eWxlPgorZGl2LlNlY3Rpb24xIHsKK3BhZ2U6IFNlY3Rpb24xOworZm9udC1mYW1pbHk6IEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmOworfQoraDEgeworZm9udC1zaXplOiAyNHB0OworZm9udC13ZWlnaHQ6IGJvbGQ7Citmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Cit0ZXh0LWFsaWduOiBjZW50ZXI7Citjb2xvcjogIzMzNjZmZjsKK30KK2gyIHsKK21hcmdpbjogMTJwdCAwaW4gM3B0OworcGFnZS1icmVhay1hZnRlcjogYXZvaWQ7Citmb250LXdlaWdodDogYm9sZDsKK2ZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsKK2JhY2tncm91bmQtY29sb3I6ICMzMzY2ZmY7Citjb2xvcjogd2hpdGU7CitwYWRkaW5nLWxlZnQ6IDVweDsKK2ZvbnQtc2l6ZTogMTZwdDsKK30KK2gzIHsKK21hcmdpbi1sZWZ0OiAwaW47Citmb250LXdlaWdodDogYm9sZDsKK2ZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsKK2JhY2tncm91bmQtY29sb3I6ICMzMzY2ZmY7Cit3aWR0aDogMjAwcHg7CittYXJnaW4tcmlnaHQ6IDUwMHB0OworY29sb3I6IHdoaXRlOworcGFkZGluZy1sZWZ0OiA1cHg7CitwYWRkaW5nLXRvcDogMnB4OworcGFkZGluZy1ib3R0b206IDJweDsKK2ZvbnQtc2l6ZTogMTJwdDsKK30KK2g0IHsKK2ZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsKK2ZvbnQtd2VpZ2h0OiBib2xkOwordGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Citmb250LXNpemU6IDEycHQ7Cit9CitwIHsKK21hcmdpbjogMHB4IDBweCAwcHggMGluOworZm9udC1mYW1pbHk6IEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmOworcGFkZGluZy10b3A6IDNweDsKK3BhZGRpbmctYm90dG9tOiAzcHg7Citmb250LXNpemU6IDEycHQ7Cit9Cit1bCB7Citmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7CittYXJnaW4tdG9wOiAzcHg7CittYXJnaW4tYm90dG9tOiAzcHg7Citmb250LXNpemU6IDEwcHQ7Cit9CitjYXB0aW9uIHsKK21hcmdpbi10b3A6IDEwcHg7Citmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Citmb250LXNpemU6IDExcHQ7Cit9CitociB7Cit3aWR0aDogMTAwJTsKK30KKy5ndWlkYW5jZSB7CitiYWNrZ3JvdW5kLWNvbG9yOiAjZTViOGI3OworZm9udC1zdHlsZTogaXRhbGljOworZm9udC1mYW1pbHk6IEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmOworcGFkZGluZy10b3A6IDNweDsKK3BhZGRpbmctYm90dG9tOiAzcHg7CittYXJnaW4tdG9wOiAzcHg7CittYXJnaW4tYm90dG9tOiAzcHg7Citmb250LXNpemU6IDEwcHQ7Cit9CisuZ3VpZGFuY2VfdGl0bGUgeworZm9udC1zdHlsZTogbm9ybWFsOworZm9udC13ZWlnaHQ6IGJvbGQ7Cit0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK2ZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsKK2ZvbnQtc2l6ZTogMTBwdDsKK30KKy50aWNrZXRzIHsKK2JvcmRlcjogMXB0IHNvbGlkICM5Y2MyZTU7Citmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7CittYXJnaW4tYm90dG9tOiAzcHg7CittYXJnaW4tdG9wOiAzcHg7Citmb250LXNpemU6IDEwcHQ7Cit9CisudGlja2V0cyB0aCB7Citib3JkZXI6IDFwdCBzb2xpZCAjOWNjMmU1OworZm9udC1zaXplOiAxMnB0OworYmFja2dyb3VuZC1jb2xvcjogIzM5YTlkYzsKK2NvbG9yOiB3aGl0ZTsKK3RleHQtYWxpZ246IGNlbnRlcjsKK30KKy50aWNrZXRzIHRkIHsKK2JvcmRlcjogMXB0IHNvbGlkICM5Y2MyZTU7CittaW4taGVpZ2h0OiAzMnB4OworfQordHI6bnRoLWNoaWxkKGV2ZW4pIHtiYWNrZ3JvdW5kLWNvbG9yOiAjY2VlMmYyO30KK3RyOm50aC1jaGlsZChldmVuKSB7YmFja2dyb3VuZC1jb2xvcjogI2U4ZjFmOTt9CisudG9waWMxIHsKK21hcmdpbi10b3A6IDNweDsKK21hcmdpbi1ib3R0b206IDNweDsKK21hcmdpbi1sZWZ0OiA0MHB4OworfQorLnRvcGljMiB7CittYXJnaW4tdG9wOiAzcHg7CittYXJnaW4tYm90dG9tOiAzcHg7Cit9CisudG9waWMzIHsKK21hcmdpbi10b3A6IDNweDsKK21hcmdpbi1ib3R0b206IDNweDsKK21hcmdpbi1sZWZ0OiAyMHB4OworfQorI3B1cnBvc2UgeworbWFyZ2luLXRvcDogM3B4OworbWFyZ2luLWJvdHRvbTogM3B4OworfQorI2lkZW50aWZpY2F0aW9uIHsKK21hcmdpbi10b3A6IDNweDsKK21hcmdpbi1ib3R0b206IDNweDsKK30KKzwvc3R5bGU+PCEtLVtpZiAhbXNvXT4gPHN0eWxlPiB2XDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9IG9cOioge2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpO30gd1w6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fSAuc2hhcGUge2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpO30gPC9zdHlsZT4gPCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+IDxvOkRvY3VtZW50UHJvcGVydGllcz4gPG86QXV0aG9yPlNUTWljcm9lbGVjdHJvbmljczwvbzpBdXRob3I+IDxvOkxhc3RBdXRob3I+UmFvdWYgSG9zbmk8L286TGFzdEF1dGhvcj4gPG86UmV2aXNpb24+Njk8L286UmV2aXNpb24+IDxvOlRvdGFsVGltZT4xNTM8L286VG90YWxUaW1lPiA8bzpDcmVhdGVkPjIwMDktMDItMjdUMTk6MjY6MDBaPC9vOkNyZWF0ZWQ+IDxvOkxhc3RTYXZlZD4yMDA5LTA3LTIxVDE2OjE2OjAwWjwvbzpMYXN0U2F2ZWQ+IDxvOlBhZ2VzPjE8L286UGFnZXM+IDxvOldvcmRzPjQxMDwvbzpXb3Jkcz4gPG86Q2hhcmFjdGVycz4yMzM5PC9vOkNoYXJhY3RlcnM+IDxvOkNvbXBhbnk+U1RNaWNyb2VsZWN0cm9uaWNzPC9vOkNvbXBhbnk+IDxvOkxpbmVzPjE5PC9vOkxpbmVzPiA8bzpQYXJhZ3JhcGhzPjU8L286UGFyYWdyYXBocz4gPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Mjc0NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4gPG86VmVyc2lvbj4xMS44MTMyPC9vOlZlcnNpb24+IDwvbzpEb2N1bWVudFByb3BlcnRpZXM+IDwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPiA8dzpXb3JkRG9jdW1lbnQ+IDx3Olpvb20+MTEwPC93Olpvb20+IDx3OlNwZWxsaW5nU3RhdGU+Q2xlYW48L3c6U3BlbGxpbmdTdGF0ZT4gPHc6R3JhbW1hclN0YXRlPkNsZWFuPC93OkdyYW1tYXJTdGF0ZT4gPHc6VmFsaWRhdGVBZ2FpbnN0U2NoZW1hcy8+IDx3OlNhdmVJZlhNTEludmFsaWQ+ZmFsc2U8L3c6U2F2ZUlmWE1MSW52YWxpZD4gPHc6SWdub3JlTWl4ZWRDb250ZW50PmZhbHNlPC93Oklnbm9yZU1peGVkQ29udGVudD4gPHc6QWx3YXlzU2hvd1BsYWNlaG9sZGVyVGV4dD5mYWxzZTwvdzpBbHdheXNTaG93UGxhY2Vob2xkZXJUZXh0PiA8dzpCcm93c2VyTGV2ZWw+TWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcjQ8L3c6QnJvd3NlckxldmVsPiA8L3c6V29yZERvY3VtZW50PiA8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4gPHc6TGF0ZW50U3R5bGVzIERlZkxvY2tlZFN0YXRlPSJmYWxzZSIgTGF0ZW50U3R5bGVDb3VudD0iMTU2Ij4gPC93OkxhdGVudFN0eWxlcz4gPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDEwXT4gPHN0eWxlPiAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLyB0YWJsZS5Nc29Ob3JtYWxUYWJsZSB7bXNvLXN0eWxlLW5hbWU6IlRhYmxlIE5vcm1hbCI7IG1zby10c3R5bGUtcm93YmFuZC1zaXplOjA7IG1zby10c3R5bGUtY29sYmFuZC1zaXplOjA7IG1zby1zdHlsZS1ub3Nob3c6eWVzOyBtc28tc3R5bGUtcGFyZW50OiIiOyBtc28tcGFkZGluZy1hbHQ6MGluIDUuNHB0IDBpbiA1LjRwdDsgbXNvLXBhcmEtbWFyZ2luOjBpbjsgbXNvLXBhcmEtbWFyZ2luLWJvdHRvbTouMDAwMXB0OyBtc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47IGZvbnQtc2l6ZToxMC4wcHQ7IGZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOyBtc28tYW5zaS1sYW5ndWFnZTojMDQwMDsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IzA0MDA7IG1zby1iaWRpLWxhbmd1YWdlOiMwNDAwO30gPC9zdHlsZT4gPCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+IDxvOnNoYXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQiIHNwaWRtYXg9IjYxNDYiLz4gPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+IDxvOnNoYXBlbGF5b3V0IHY6ZXh0PSJlZGl0Ij4gPG86aWRtYXAgdjpleHQ9ImVkaXQiIGRhdGE9IjEiLz4gPC9vOnNoYXBlbGF5b3V0PjwveG1sPjwhW2VuZGlmXS0tPjwvaGVhZD4KKzxib2R5IGxpbms9ImJsdWUiIHZsaW5rPSJibHVlIj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK3ZhciB0b2dnbGVfaGlzdF9kaXNwID0gdHJ1ZTsKK2Z1bmN0aW9uIHRvZ2dsZV9oaXN0b3J5KCkKK3sKK2lmICh0b2dnbGVfaGlzdF9kaXNwKQorewordG9nZ2xlX2hpc3RfZGlzcCA9IGZhbHNlOwordmFyIGZpbHRlcl9vZmZfdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJIaWRlIEhpc3RvcnkiKTsKK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWx0ZXJfaGlzdCcpLmlubmVySFRNTCA9ICIiOworZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbHRlcl9oaXN0JykuYXBwZW5kQ2hpbGQoZmlsdGVyX29mZl90ZXh0KTsKK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJoaXN0b3J5IikuaGlkZGVuID0gZmFsc2U7Cit9CitlbHNlCit7Cit0b2dnbGVfaGlzdF9kaXNwID0gdHJ1ZTsKK3ZhciBmaWx0ZXJfb25fdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJTaG93IEhpc3RvcnkiKTsKK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWx0ZXJfaGlzdCcpLmlubmVySFRNTCA9ICIiOworZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbHRlcl9oaXN0JykuYXBwZW5kQ2hpbGQoZmlsdGVyX29uX3RleHQpOworZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImhpc3RvcnkiKS5oaWRkZW4gPSB0cnVlOworfQorfTwvc2NyaXB0PgorPGRpdiBzdHlsZT0id2lkdGg6IDEwMzRweDsiIGNsYXNzPSJTZWN0aW9uMSI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogOHB0OyBmb250LWZhbWlseTogJnF1b3Q7QXJpYWwmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsdWU7Ij48L3NwYW4+PHNtYWxsPjxhIGhyZWY9Ii4uLy4uL1JlbGVhc2VfTm90ZXMuaHRtbCI+QmFjayB0byBSZWxlYXNlIHBhZ2U8L2E+PC9zbWFsbD4KKzxkaXYgaWQ9ImhlYWRlciI+Cis8aDEgc3R5bGU9Im1hcmdpbi1ib3R0b206IDAuMjVpbjsgdGV4dC1hbGlnbjogY2VudGVyOyIgYWxpZ249ImNlbnRlciI+UmVsZWFzZQorTm90ZXMgZm9yJm5ic3A7PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMjBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHJnYig1MSwgMTAyLCAyNTUpOyI+U1RNMzJMMHh4CitIQUwgRHJpdmVyczwvc3Bhbj48L2gxPgorPHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPkNvcHlyaWdodCAyMDE3CitTVE1pY3JvZWxlY3Ryb25pY3M8L3A+Cis8cCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O0FyaWFsJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPjxpbWcgc3R5bGU9ImJvcmRlcjogMHB4IHNvbGlkIDsgd2lkdGg6IDExMnB4OyBoZWlnaHQ6IDgzcHg7IiBhbHQ9IiIgaWQ9Il94MDAwMF9pMTAyNiIgc3JjPSJfaHRtcmVzYy9zdF9sb2dvLnBuZyI+PC9zcGFuPjwvcD4KKzwvZGl2PgorPGRpdiBpZD0ibGljZW5zZSIgY2xhc3M9InRvcGljMSI+Cis8aDI+TGljZW5zZTwvaDI+CitUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UKK2xpY2Vuc2UsIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGNvbXBvbmVudCBleGNlcHQgaW4KK2NvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKzxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YSBocmVmPSJodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZSIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlPC9hPjwvcD4KKzwvZGl2PgorPGJyPgorPGRpdiBpZD0icmVsZWFzZV9jb250YWluZXIiIGNsYXNzPSJ0b3BpYzEiPgorPGRpdiBjbGFzcz0idG9waWMyIiBpZD0iaWRlbnRpZmljYXRpb24iPjxzbWFsbD4KKzwvc21hbGw+PGgzIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxzbWFsbD5WMS4xMC4yIC8gMjItRmVicnVhcnktMjAxOTwvc21hbGw+PC9oMz48c21hbGw+Cis8L3NtYWxsPjwvZGl2PgorPGRpdiBjbGFzcz0idG9waWMzIiBpZD0iY2hhbmdlcyI+Cis8aDQ+PGJpZz5NYWluIGNoYW5nZXM8L2JpZz48L2g0PjxiaWc+VXBkYXRlIG9mJm5ic3A7SEFMIGRyaXZlcnM8L2JpZz48dWw+PGxpPjxiaWc+VXBkYXRlIG9mIEhBTCZuYnNwO2RyaXZlciB0byBpbmNsdWRlIGxhdGVzdCBjb3JyZWN0aW9ucyBhbmQmbmJzcDtlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBjb2RlLjwvYmlnPjxicj48L2xpPjwvdWw+PGg0PjxiaWc+RGV0YWlsczwvYmlnPjwvaDQ+PHVsPjxsaSBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48YmlnPkhBTCZuYnNwOzwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPlVwZGF0ZWQgSEFMX0dldFVJRCgpIGZ1bmN0aW9ucyB0byBjb3JyZWN0IGFkZHJlc3Mgb2Zmc2V0LjwvYmlnPjxicj48L2xpPjwvdWw+PC91bD48dWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+TGVnYWN5Jm5ic3A7PC9iaWc+PC9saT48dWw+PGxpPjxiaWc+VXBkYXRlZCBzdG0zMl9oYWxfbGVnYWN5LmggZmlsZSB0byA8L2JpZz48YmlnPmFkZCBtaXNzaW5nIGRlZmluaXRpb25zIGFuZCBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBjb2RlPC9iaWc+PGJpZz4uPC9iaWc+PC9saT48L3VsPjwvdWw+PGJyPjx1bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5UaGUgVjEuMTAuMiB2ZXJzaW9uIGNvbnRhaW5zIGFsbCB0aGUgdXBkYXRlcyBpbXBsZW1lbnRlZCBpbiBWMS4xMC4xIHZlcnNpb24uIEZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWZlciB0byB0aGUgSGlzdG9yeS48L2JpZz48L2xpPjwvdWw+PGJyPjxicj48YnI+PC9kaXY+Cis8YnI+Cis8L2Rpdj4KKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0MHB4OyI+PGJ1dHRvbiBpZD0iZmlsdGVyX2hpc3QiIG9uY2xpY2s9InRvZ2dsZV9oaXN0b3J5KCkiPlNob3cKK0hpc3Rvcnk8L2J1dHRvbj48YnI+Cis8L2Rpdj4KKzxkaXYgaWQ9Imhpc3RvcnkiIGNsYXNzPSJ0b3BpYzEiIGhpZGRlbj0iIj4KKzxoMj5VcGRhdGUgSGlzdG9yeTwvaDI+Cis8Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7Ij48YnI+PC9zcGFuPjwvdT48L2I+PGgzIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMTAuMSAvPGJpZz4mbmJzcDs8L2JpZz48L3NwYW4+PHNtYWxsPjA4LUZlYnJ1YXJ5LTIwMTk8L3NtYWxsPjwvaDM+PGg0PjxiaWc+TWFpbiBjaGFuZ2VzPC9iaWc+PC9oND48YmlnPlVwZGF0ZSBvZiZuYnNwO0hBTCBkcml2ZXJzPC9iaWc+PHVsPjxsaT48YmlnPlVwZGF0ZSBvZiBIQUwgRkxBU0gsIFJDQyBhbmQgU1BJIGRyaXZlcnMgdG8gaW5jbHVkZSBsYXRlc3QgY29ycmVjdGlvbnMuPC9iaWc+PC9saT48L3VsPjxicj48aDQ+PGJpZz5EZXRhaWxzPC9iaWc+PC9oND48dWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIFJDQzwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPlVwZGF0ZWQgSEFMX1JDQ19Pc2NDb25maWcoKSB0byBhZGQgbWlzc2luZyBjaGVja3MgYW5kIHRvIG1vZGlmeSByZXR1cm4gc3RhdHVzLjwvYmlnPjwvbGk+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUwgRkxBU0g8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5VcGRhdGVkIEhBTF9GTEFTSF9VbmxvY2soKSBhbmQgSEFMX0ZMQVNIX09CX1VubG9jaygpIHRvIGhhbmRsZSBpbnRlcnJ1cHRzIGRpc2FibGluZy48L2JpZz48L2xpPjwvdWw+PHVsPjxsaT48YmlnPlVwZGF0ZWQgRkxBU0hfT0JfR2V0UkRQKCkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IFJEUCBsZXZlbC48L2JpZz48L2xpPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIFNQSTwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPlVwZGF0ZWQgSEFMIFNQSSBkcml2ZXIgdG8gaGFuZGxlIFNUTTMyTDAgZXJyYXRhc2hlZXRzLjwvYmlnPjwvbGk+PC91bD48L3VsPjxicj48YnI+Jm5ic3A7IDxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjEwLjAgLyAyNi1PY3RvYmVyLTIwMTg8L3NwYW4+PGJyPjwvaDM+PGg0PjxiaWc+TWFpbiBjaGFuZ2VzPC9iaWc+PC9oND48YmlnPk1ham9yIHVwZGF0ZSBvZiZuYnNwO0hBTCBhbmQgTG93IExheWVyIGRyaXZlcnM8L2JpZz48dWw+PGxpPjxiaWc+QWRkIHN1cHBvcnQgb2YgbmV3IEwwIFZhbHVlIExpbmUgZGV2aWNlczwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIHN1cHBvcnQgb2YgSEFMIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgc2V2ZXJhbCBlbmhhbmNlbWVudHMgaW1wbGVtZW50YXRpb248L2JpZz48L2xpPjxsaT48YmlnPkZpeCBrbm93biBkZWZlY3RzIHRvIGJlIGFsaWduZWQgd2l0aCBvdGhlcnMgU1RNMzIgc2VyaWVzPC9iaWc+PC9saT48L3VsPjxicj48aDQ+PGJpZz5EZXRhaWxzPC9iaWc+PC9oND48dWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFML0xMIGdlbmVyaWM8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BZGQgc3VwcG9ydCBvZiA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgY2FsbGJhY2sgcmVnaXN0cmF0aW9uPC9zcGFuPiBmZWF0dXJlPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+VGhlIGZlYXR1cmU8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij4gZGlzYWJsZWQgYnkgZGVmYXVsdDwvc3Bhbj4gaXMgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIEhBTCBkcml2ZXJzOjwvYmlnPjwvbGk+PC91bD48dWw+PHVsPjxsaT48YmlnPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkFEQywgQ09NUCwgREFDLCBJMkMsIEkyUywgSVJEQSwgTFBUSU0sIFBDRCwgUk5HLCBSVEMsIFNNQVJUQ0FSRCwgU01CVVMsIFNQSSwgVElNLCBUU0MsIFVBUlQsIFVTQVJUPC9zcGFuPiBhbmQgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+V1dERzwvc3Bhbj48L2JpZz48L2xpPjwvdWw+PC91bD48dWw+PGxpPjxiaWc+VGhlIGZlYXR1cmUgbWF5IGJlIGVuYWJsZWQgaW5kaXZpZHVhbGx5IHBlciBIQUwgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPlBQUDwvc3Bhbj4gZHJpdmVyIGJ5IHNldHRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5pdGlvbiBVU0VfSEFMXzxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5QUFA8L3NwYW4+X1JFR0lTVEVSX0NBTExCQUNLUwordG8mbmJzcDsxVSBpbiBzdG0zMmwweHhfaGFsX2NvbmYuaCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gZmlsZSAodGVtcGxhdGUKK2ZpbGUgc3RtMzJsMHh4X2hhbF9jb25mX3RlbXBsYXRlLmggYXZhaWxhYmxlIGZyb20mbmJzcDsKK0RyaXZlcnMvU1RNMzJMMHh4X0hBTF9Ecml2ZXIvSW5jKTwvYmlnPjwvbGk+PC91bD48dWw+PGxpPjxiaWc+T25jZQorZW5hYmxlZCwgdGhlIHVzZXIgYXBwbGljYXRpb24gbWF5IHJlc29ydCB0byBIQUxfUFBQX1JlZ2lzdGVyQ2FsbGJhY2soKQordG8gcmVnaXN0ZXIgc3BlY2lmaWMgY2FsbGJhY2sgZnVuY3Rpb24ocykgYW5kIHVucmVnaXN0ZXIgaXQodGhlbSkgd2l0aAorSEFMXzxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5QUFA8L3NwYW4+X1VuUmVnaXN0ZXJDYWxsYmFjaygpLjwvYmlnPjwvbGk+PC91bD48L3VsPjwvdWw+PHVsPjx1bD48bGk+PGJpZz5VcGRhdGVkIEhBTC9MTCBEcml2ZXIgY29tcGxpYW5jeSB3aXRoIE1JU1JBIEMgMjAwNCBydWxlczwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPk1JU1JBIEMgMjAwNCBydWxlcyAxMC40LCAxMS40LCAxMi40PC9iaWc+PC9saT48L3VsPjxsaT48YmlnPlVwZGF0ZWQgSEFML0xMIERyaXZlciBjb21wbGlhbmN5IHdpdGggTUlTUkEgQyAyMDEyIHJ1bGVzPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+TUlTUkEgQyAyMDEyIHJ1bGVzIDE2LjMsIDE3LjQsIDIxLjE8L2JpZz48L2xpPjwvdWw+PC91bD48L3VsPjx1bD48dWw+PGxpPjxiaWc+Q29ycmVjdGVkIERveHlnZW4gdGFncyBpbiBtYWNyb3MgZGVzY3JpcHRpb24gdG8gaGF2ZSBnZW5lcmF0ZSBjb3JyZWN0IENITSBmb3JtYXQuPC9iaWc+PC9saT48bGk+PGJpZz5zdG0zMmwweHhfaGFsX2RlZi5oPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+VXBkYXRlZCBmaWxlIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIGZyb20gX19wYWNrZWQgZGVmaW5pdGlvbnMuPC9iaWc+PC9saT48bGk+PGJpZz5VcGRhdGVkIFVOVVNFRCgpIG1hY3JvIHRvIGZpeCBjb21waWxhdGlvbiB3YXJuaW5nIHdpdGggZysrIGNvbXBpbGVyLjxicj48L2JpZz48L2xpPjxsaT48YmlnPlJlcGxhY2VkIGluY2x1ZGUgc3RkaW8uaCBieSBzdGRkZWYuaC48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgX19SQU1fRlVOQyBkZWZpbmUgdG8gbm90IGltcG9zZSBmdW5jdGlvbiB0eXBlLjxicj48L2JpZz48L2xpPjwvdWw+PGxpPjxiaWc+c3RtMzJsMHh4X2hhbF9jb25mX3RlbXBsYXRlLmg8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5VcGRhdGVkIGRlZmF1bHQgTVNJX1ZBTFVFIHJlc2V0IHZhbHVlIHNldCBpbiBTeXN0ZW1Db3JlQ2xvY2suPC9iaWc+PC9saT48bGk+PGJpZz5BZGRlZCBVU0VfU1BJX0NSQyBkZWZpbml0aW9uIHRvIGJlIGFsaWduZWQgd2l0aCBTUEkgZHJpdmVyLjwvYmlnPjwvbGk+PC91bD48L3VsPjwvdWw+PGJyPjx1bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUw8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BZGRlZCBIQUxfR2V0VUlEdzAoKSwgSEFMX0dldFVJRHcxKCkgYW5kIEhBTF9HZXRVSUR3MigpIGZvciA5Ni1iaXQgVUlELjwvYmlnPjwvbGk+PGxpPjxiaWc+TW9kaWZpZWQgZGVmYXVsdCBIQUxfRGVsYXkgaW1wbGVtZW50YXRpb24gdG8gZ3VhcmFudGVlIG1pbmltdW0gZGVsYXkuPGJyPjwvYmlnPjwvbGk+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUwvTEwgQURDPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+VXBkYXRlZCBJU19BRENfRU9DX1NFTEVDVElPTiBtYWNybyAocmVtb3ZlZCB1bnVzZWQgbGl0ZXJhbCkuPC9iaWc+PC9saT48bGk+PGJpZz5VcGRhdGVkIExMX0FEQ19Jbml0IGZ1bmN0aW9uIHRvIGFwcGx5IGNvcnJlY3QgY2xvY2sgc2V0dGluZ3MgaW4gaW5pdCBzdHJ1Y3R1cmUuPC9iaWc+PC9saT48bGk+PGJpZz5BZGRlZCBtaXNzaW5nIGRlZmluZSBmb3IgcmVndWxhciBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSBkZWZpbml0aW9ucy48L2JpZz48L2xpPjxsaT48YmlnPkFkZCBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZTwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFkZCBIQUxfQURDX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbmQgSEFMX0FEQ19VblJlZ2lzdGVyQ2FsbGJhY2soKSBBUElzPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgaWRlbnRpZmllcnMgaW4gSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBlbnVtZXJhdGVkIHR5cGVkZWY8YnI+PC9iaWc+PC9saT48L3VsPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIENPTVA8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5VcGRhdGVkCitIQUxfQ09NUF9Jbml0LCBIQUxfQ09NUEV4X0VuYWJsZVZSRUZJTlQsIEhBTF9DT01QRXhfRGlzYWJsZVZSRUZJTlQKK2Z1bmN0aW9ucyBhZnRlciByZWludHJvZHVjdGlvbiBvZiBFTl9WUkVGSU5UIGJpdCBpbiBTWVNDRkdfQ0ZHUjMKK3JlZ2lzdGVyLjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWRkIEhBTF9DT01QX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbmQgSEFMX0NPTVBfVW5SZWdpc3RlckNhbGxiYWNrKCkgQVBJczwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIGlkZW50aWZpZXJzIGluIEhBTF9DT01QX0NhbGxiYWNrSURUeXBlRGVmIGVudW1lcmF0ZWQgdHlwZWRlZjwvYmlnPjwvbGk+PC91bD48L3VsPjwvdWw+PHVsPjxsaSBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48YmlnPkhBTCBDT1JURVg8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5Nb2RpZmllZCBIQUxfTVBVX0VuYWJsZSgpL0hBTF9NUFVfRGlzYWJsZSgpIGZ1bmN0aW9ucyB0byBhbGxvdyBjbGVhciBvZiB0aGUgd2hvbGUgY29udHJvbCByZWdpc3Rlci48L2JpZz48L2xpPjwvdWw+PC91bD48dWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIENSQzwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFsaWduZWQgSEFML0xMIENSQyBkcml2ZXIgd2l0aCBsYXRlc3QgdXBkYXRlcyBhbmQgZW5oYW5jZW1lbnRzLjwvYmlnPjwvbGk+PGxpPjxiaWc+VXBkYXRlZCBDUkMgZHJpdmVyIHRvIHJlbW92ZSBjb21waWxhdGlvbiB3YXJuaW5ncy48L2JpZz48L2xpPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIERBQzwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFkZCBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZTwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFkZCBIQUxfREFDX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbmQgSEFMX0RBQ19VblJlZ2lzdGVyQ2FsbGJhY2soKSBBUElzPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgaWRlbnRpZmllcnMgaW4gSEFMX0RBQ19DYWxsYmFja0lEVHlwZURlZiBlbnVtZXJhdGVkIHR5cGVkZWY8L2JpZz48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUwvTEwgRE1BPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWxpZ25lZCBIQUwvTEwgRE1BIGRyaXZlcnMgd2l0aCA8L2JpZz48YmlnPmxhdGVzdCB1cGRhdGVzIGFuZCBlbmhhbmNlbWVudHM8L2JpZz48YmlnPiAuPC9iaWc+PC9saT48L3VsPjxsaSBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48YmlnPkhBTCBGSVJFV0FMTDwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkVuc3VyZWQgTm9uLVZvbGF0aWxlIERhdGEgU2VnbWVudCBsZW5ndGggaXMgc2V0IHRvIHByb3RlY3QgY29kZSBzZWdtZW50LjwvYmlnPjwvbGk+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUwgRkxBU0g8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5Db3JyZWN0ZWQgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIEhBTF9GbGFzaF9Mb2NrIGFuZCBIQUxfRmxhc2hfVW5sb2NrLjwvYmlnPjwvbGk+PGxpPjxiaWc+Q29ycmVjdGVkIF9fSEFMX0ZMQVNIX0JVRkZFUl9DQUNIRV9FTkFCTEUoKSBhbmQgX19IQUxfRkxBU0hfQlVGRkVSX0NBQ0hFX0RJU0FCTEUoKSBmb3IgRkxBU0ggQnVmZmVyIGNhY2hlIG1hbmFnZW1lbnQuPC9iaWc+PC9saT48bGk+PGJpZz5VcGRhdGVkIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fVW5sb2NrKCkgdG8gcHJvdGVjdCB3cml0aW5nIG9mIFBFS0VZMS9QRUtFWTIgYWdhaW5zdCBpbnRlcnJ1cHRzLjwvYmlnPjwvbGk+PGxpPjxiaWc+VXBkYXRlZCBJU19PQkVYIG1hY3JvIHRvIGZpeCBpc3N1ZSBpbiBGTEFTSF9EdWFsQm9vdCBFeGFtcGxlLjxicj48L2JpZz48L2xpPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+TEwgR1BJTzwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPlJlbmFtZWQgR1BJT19BRlJMX0FGUkx4IGFuZCBHUElPX0FGUkxfQUZSSHggYml0IHRvIEdQSU9fQUZSTF9BRlNFTHguPC9iaWc+PC9saT48L3VsPjxsaSBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48YmlnPkhBTC9MTCBJMkM8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BZGQgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmU8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BZGQKK0hBTF9JMkNfUmVnaXN0ZXJDYWxsYmFjaygpLCBIQUxfSTJDX1VuUmVnaXN0ZXJDYWxsYmFjaygpLAorSEFMX0kyQ19SZWdpc3RlckFkZHJDYWxsYmFjaygpIGFuZCBIQUxfSTJDX1VuUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKSBBUElzPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgaWRlbnRpZmllcnMgaW4gSEFMX0kyQ19DYWxsYmFja0lEVHlwZURlZiBlbnVtZXJhdGVkIHR5cGVkZWY8L2JpZz48L2xpPjwvdWw+PGxpPjxiaWc+QWRkZWQgbWlzc2luZyBjYXN0IGluIEkyQ19HRVRfRE1BX1JFTUFJTl9EQVRBIG1hY3JvIGRlZmluaXRpb24uPC9iaWc+PC9saT48bGk+PGJpZz5VcGRhdGVkIEkyQ19XYWl0T25SWE5FRmxhZ1VudGlsVGltZW91dCBmdW5jdGlvbiB0byBjaGVjayBJMkNfRkxBR19SWE5FLjwvYmlnPjwvbGk+PGxpPjxiaWc+VXBkYXRlZCBjb21tZW50cyBhYm91dCBEZXZpY2UgQWRkcmVzcyBwYXJhbWV0ZXIgKERldkFkZHJlc3MpIGRlc2NyaXB0aW9uIGluIEkyQyBmdW5jdGlvbnMgaGVhZGVyLjwvYmlnPjwvbGk+PGxpPjxiaWc+VXBkYXRlZAorSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVCBkZWZpbml0aW9uIGJ5IGFkZGluZworSTJDX0xBU1RfRlJBTUVfTk9fU1RPUCBvcHRpb24sIHdoaWNoIGFsbG93cyB0byBjYWxsIHRyYW5zbWl0IG9yIHJlY2VpdmUKK2F0IGFueSBrbm93IHRpbWUuPC9iaWc+PC9saT48bGk+PGJpZz5BZGRlZCByZXN0YXJ0IGNvbmRpdGlvbiBmb3IgZWFjaCBjYWxsIG9mIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfeHh4eF9JVC48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgRXJyb3JDb2RlIHRvIGNvcnJlY3Qgd3JvbmcgcmV0dXJuZWQgdmFsdWUgYWZ0ZXIgd2FpdGluZyB1bnRpbCBCVVNZIGZsYWcgaXMgcmVzZXQuPC9iaWc+PC9saT48bGk+PGJpZz5VcGRhdGVkIGVycm9yIG1hbmFnZW1lbnQgaW4gSTJDX0lUU2xhdmVDcGx0KCkgZnVuY3Rpb24uPC9iaWc+PC9saT48bGk+PGJpZz5Db3JyZWN0ZWQgaXNzdWUgaW4gSEFMX0kyQ19NZW1fUmVhZF9ETUEoKSBmdW5jdGlvbi48L2JpZz48L2xpPjxsaT48YmlnPkNvcnJlY3RlZCBpc3N1ZSBpbiBJMkMgc2xhdmUgd2hlbiBtYXN0ZXIgc2VuZHMgUkVTVEFSVCBpbnN0ZWFkIG9mIFNUT1AuPC9iaWc+PC9saT48bGk+PGJpZz5GaXggaXNzdWUgd2l0aCBjbGVhcmluZyBBRERSIGZsYWcgaW4gSTJDX0lUU2xhdmVDcGx0KCkgZnVuY3Rpb24uPC9iaWc+PC9saT48bGk+PGJpZz5GaXggTUlTUkFDMjAxMiBpc3N1ZTwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPlJlbmFtZWQgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVChETUEpIHRvIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVChETUEpLjwvYmlnPjwvbGk+PC91bD48dWw+PGxpPjxiaWc+UmVuYW1lZCBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfSVQoRE1BKSB0byBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVChETUEpLjwvYmlnPjwvbGk+PC91bD48dWw+PGxpPjxiaWc+UmVuYW1lZCBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQoRE1BKSB0byBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9JVChETUEpLjwvYmlnPjwvbGk+PC91bD48dWw+PGxpPjxiaWc+UmVuYW1lZCBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVChETUEpIHRvIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfSVQoRE1BKS48YnI+PC9iaWc+PC9saT48L3VsPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIEkyUzwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFsaWduZWQgSEFMIEkyUzwvYmlnPjxiaWc+IDwvYmlnPjxiaWc+ZHJpdmVyIHdpdGggbGF0ZXN0IHVwZGF0ZXMgYW5kIGVuaGFuY2VtZW50cy48L2JpZz48L2xpPjxsaT48YmlnPkFkZCBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZTwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFkZCBIQUxfSTJTX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbmQgSEFMX0kyU19VblJlZ2lzdGVyQ2FsbGJhY2soKSBBUElzPC9iaWc+PC9saT48L3VsPjx1bD48bGk+PGJpZz5BZGQgY2FsbGJhY2sgaWRlbnRpZmllcnMgaW4gSEFMX0kyU19DYWxsYmFja0lEVHlwZURlZiBlbnVtZXJhdGVkIHR5cGVkZWY8YnI+PC9iaWc+PC9saT48L3VsPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIElSREE8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BbGlnbmVkIEhBTCBJUkRBIGRyaXZlciB3aXRoIGxhdGVzdCB1cGRhdGVzIGFuZCBlbmhhbmNlbWVudHMuPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmU8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BZGQgSEFMX0lSREFfUmVnaXN0ZXJDYWxsYmFjaygpIGFuZCBIQUxfSVJEQV9VblJlZ2lzdGVyQ2FsbGJhY2soKSBBUElzPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgaWRlbnRpZmllcnMgaW4gSEFMX0lSREFfQ2FsbGJhY2tJRFR5cGVEZWYgZW51bWVyYXRlZCB0eXBlZGVmPGJyPjwvYmlnPjwvbGk+PC91bD48L3VsPjxsaSBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48YmlnPkhBTC9MTCBMUFRJTTwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFsaWduZWQgSEFML0xMIExQVElNIGRyaXZlciB3aXRoJm5ic3A7PC9iaWc+PGJpZz51cGRhdGVzIGFuZCBlbmhhbmNlbWVudHM8L2JpZz48YmlnPi48L2JpZz48L2xpPjxsaT48YmlnPkNvcnJlY3RlZCBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMSBhbmQgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDMgZGVmaW5pdGlvbnMgYWNjb3JkaW5nIHRvIHN1cHBvcnRlZCBkZXZpY2VzLjwvYmlnPjwvbGk+PGxpPjxiaWc+Q29ycmVjdGVkIG1hbmFnZW1lbnQgb2YgRVhUSSBsaW5lIGR1cmluZyBMUFRJTSB3YWtldXA8YnI+PC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmU8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BZGQgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbmQgSEFMX0xQVElNX1VuUmVnaXN0ZXJDYWxsYmFjaygpIEFQSXM8L2JpZz48L2xpPjxsaT48YmlnPkFkZCBjYWxsYmFjayBpZGVudGlmaWVycyBpbiBIQUxfTFBUSU1fQ2FsbGJhY2tJRFR5cGVEZWYgZW51bWVyYXRlZCB0eXBlZGVmPGJyPjwvYmlnPjwvbGk+PC91bD48L3VsPjxsaSBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48YmlnPkhBTC9MTCBQV1I8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5SZW5hbWUgTExfUFdSX0lzQWN0aXZlRmxhZ19WT1NGKCkgdG8gTExfUFdSX0lzQWN0aXZlRmxhZ19WT1MoKSB0byBiZSBjb21wbGlhbnQgd2l0aCBhbGwgU1RNMzIgZmFtaWxpZXMuPC9iaWc+PC9saT48bGk+PGJpZz5VcGRhdGVkIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUoKSB0byBhZGQgTk9QIHRvIGVuc3VyZSBhbGwgcGVuZGluZyBpbnN0cnVjdGlvbnMgYXJlIGZsdXNoZWQgYmVmb3JlIGVudGVyaW5nIGxvdyBwb3dlciBtb2RlLjxicj48L2JpZz48L2xpPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIFJORzwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFsaWduZWQgSEFMIFJORyBkcml2ZXIgd2l0aCBsYXRlc3QgdXBkYXRlcyBhbmQgZW5oYW5jZW1lbnRzLjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWRkCitIQUxfUk5HX1JlZ2lzdGVyQ2FsbGJhY2soKSwgSEFMX1JOR19VblJlZ2lzdGVyQ2FsbGJhY2soKSwKK0hBTF9STkdfUmVnaXN0ZXJSZWFkeURhdGFDYWxsYmFjaygpIGFuZAorSEFMX1JOR19VblJlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soKSBBUElzPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgaWRlbnRpZmllcnMgaW4gSEFMX1JOR19DYWxsYmFja0lEVHlwZURlZiBlbnVtZXJhdGVkIHR5cGVkZWY8L2JpZz48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUwvTEwgUkNDPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+VXBkYXRlZCBIQUxfUkNDX09zY0NvbmZpZygpLCB3aGljaCByZXR1cm5zIEhBTF9FUlJPUiB0byBhcHBseSBIU0kgZGl2aWRlciA0IHdoZW4gSFNJIHVzZWQgYXMgY2xvY2sgc291cmNlPC9iaWc+PGJpZz4uPC9iaWc+PC9saT48bGk+PGJpZz5VcGRhdGVkIEhBTF9SQ0NfT3NjQ29uZmlnKCkgdG8gcmVzZXQgSFNJIG9uIHN0YXRlIHdoZW4gUkNDX0hTSV9PVVRFTiBjb25maWd1cmF0aW9uIGlzIHNlbGVjdGVkIC48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgdmFsdWUgb2YgUkNDX0ZMQUdfRldSU1QuPC9iaWc+PC9saT48bGk+PGJpZz5DaGFuZ2VkIEhBTF9SQ0NfRGVJbml0KCkgdG8gSEFMX1N0YXR1c1R5cGVEZWYuPGJyPjwvYmlnPjwvbGk+PGxpPjxiaWc+VXBkYXRlZCBIQUxfUkNDX0RlSW5pdCgpIGFuZCBMTF9SQ0NfRGVJbml0KCkmbmJzcDt0byBhbHNvIGNsZWFyIGludGVycnVwdHMgYW5kIHJlc2V0IGZsYWdzLjwvYmlnPjwvbGk+PGxpPjxiaWc+VXBkYXRlZCBIQUxfUkNDX0RlSW5pdCgpIGFuZCBMTF9SQ0NfRGVJbml0KCkgdG8gYWRkIGNoZWNrIG9uIFBMTFJEWSBiZWZvcmUgY2xlYXJpbmcgUExMQ0ZHUiByZWdpc3Rlci48L2JpZz48L2xpPjxsaT48YmlnPkFkZGVkIG5ldyBMTF9SQ0NfUExMX1NldE1haW5Tb3VyY2UgbWFjcm8gdG8gc2V0IHRoZSBQTEwgc291cmNlIHdpdGhvdXQgZW5hYmxpbmcgYW55IFBMTC48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpIGJ5IGNoZWNraW5nIEhTSURJVkYgZm9yIGRpdmlkZXIgNCB3aGVuIEhTSSBpcyB1c2VkLjwvYmlnPjwvbGk+PGxpPjxiaWc+VXBkYXRlZCBIQUxfUkNDX09zY0NvbmZpZygpIHRvIG5vdCByZXR1cm4gSEFMX0VSUk9SIGlmIHJlcXVlc3QgcmVwZWF0cyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLjxicj48L2JpZz48L2xpPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFML0xMIFJUQzwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFsaWduZWQgSEFML0xMIFJUQyZuYnNwOyBkcml2ZXIgd2l0aCZuYnNwOzwvYmlnPjxiaWc+bGF0ZXN0PC9iaWc+PGJpZz4gPC9iaWc+PGJpZz51cGRhdGVzIGFuZCBlbmhhbmNlbWVudHM8L2JpZz48YmlnPi48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgUlRDIGRyaXZlciB0byB1c2UgdGhlIGJpdCBSVENfQ1JfQktQIGluc3RlYWQgb2YgUlRDX0NSX0JDSy48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgaW1wbGVtZW50YXRpb24gb2YgTExfUlRDX0RBVEVfR2V0KCkgZnVuY3Rpb24oKS48L2JpZz48L2xpPjxsaT48YmlnPkNvcnJlY3RlZCBfX0hBTF9SVENfVEFNUEVSX0dFVF9JVCgpIG1hY3JvIGRlZmluaXRpb24uPGJyPjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWRkIEhBTF9SVENfUmVnaXN0ZXJDYWxsYmFjaygpIGFuZCBIQUxfUlRDX1VuUmVnaXN0ZXJDYWxsYmFjaygpIEFQSXM8L2JpZz48L2xpPjxsaT48YmlnPkFkZCBjYWxsYmFjayBpZGVudGlmaWVycyBpbiBIQUxfUlRDX0NhbGxiYWNrSURUeXBlRGVmIGVudW1lcmF0ZWQgdHlwZWRlZjxicj48L2JpZz48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUwgU01BUlRDQVJEPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWxpZ25lZCBIQUwgPC9iaWc+PGJpZz5TTUFSVENBUkQgPC9iaWc+PGJpZz5kcml2ZXIgd2l0aCBsYXRlc3QgdXBkYXRlcyBhbmQgZW5oYW5jZW1lbnRzLjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWRkIEhBTF9TTUFSVENBUkRfUmVnaXN0ZXJDYWxsYmFjaygpIGFuZCBIQUxfU01BUlRDQVJEX1VuUmVnaXN0ZXJDYWxsYmFjaygpIEFQSXM8L2JpZz48L2xpPjxsaT48YmlnPkFkZCBjYWxsYmFjayBpZGVudGlmaWVycyBpbiBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmIGVudW1lcmF0ZWQgdHlwZWRlZjxicj48L2JpZz48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUwgU01CVVM8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BbGlnbmVkIEhBTCA8L2JpZz48YmlnPlNNQlVTIDwvYmlnPjxiaWc+ZHJpdmVyIHdpdGggbGF0ZXN0IHVwZGF0ZXMgYW5kIGVuaGFuY2VtZW50cy48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgSEFMX1NNQlVTX0VSX0lSUUhhbmRsZXIgZnVuY3Rpb24gdG8gbWFuYWdlIFNNQlVTIGludGVycnVwdHMgZXJyb3IgaGFuZGxlci48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgU01CVVNfVHJhbnNmZXJDb25maWcgZnVuY3Rpb24gKEkyQ19DUjIgcmVnaXN0ZXIgdXBkYXRlKS48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgY29tbWVudHMgYWJvdXQgRGV2aWNlIEFkZHJlc3MgcGFyYW1ldGVyIChEZXZBZGRyZXNzKSBkZXNjcmlwdGlvbiBpbiBTTUJVUyBmdW5jdGlvbnMgaGVhZGVyLjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWRkCitIQUxfU01CVVNfUmVnaXN0ZXJDYWxsYmFjaygpLCBIQUxfU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrKCksCitIQUxfU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKSBhbmQgSEFMX1NNQlVTX1VuUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKQorQVBJczwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIGlkZW50aWZpZXJzIGluIEhBTF9TTUJVU19DYWxsYmFja0lEVHlwZURlZiBlbnVtZXJhdGVkIHR5cGVkZWY8YnI+PC9iaWc+PC9saT48L3VsPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFML0xMIFNQSTwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFsaWduZWQgSEFML0xMIFNQSTwvYmlnPjxiaWc+IDwvYmlnPjxiaWc+ZHJpdmVyIHdpdGggbGF0ZXN0IHVwZGF0ZXMgYW5kIGVuaGFuY2VtZW50cy48L2JpZz48L2xpPjxsaT48YmlnPkZpeGVkIGlzc3VlIGluIEhBTF9TUElfVHJhbnNtaXQoKSBhbmQgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmUoKSBmdW5jdGlvbnMuPC9iaWc+PC9saT48bGk+PGJpZz5SZW1vdmVkIGRlZmluZSBMTF9TUElfU1JfVURSIHdoaWNoIGF2YWlsYWJsZSBvbmx5IGZvciBJMlMgZmVhdHVyZS48YnI+PC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmU8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BZGQgSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKCkgYW5kIEhBTF9TUElfVW5SZWdpc3RlckNhbGxiYWNrKCkgQVBJczwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIGlkZW50aWZpZXJzIGluIEhBTF9TUElfQ2FsbGJhY2tJRFR5cGVEZWYgZW51bWVyYXRlZCB0eXBlZGVmPGJyPjwvYmlnPjwvbGk+PC91bD48L3VsPjxsaSBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48YmlnPkhBTC9MTCBUSU08L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BbGlnbmVkIEwwIEhBTC9MTCBUSU0gZHJpdmVyIHdpdGgmbmJzcDs8L2JpZz48YmlnPmxhdGVzdCA8L2JpZz48YmlnPnVwZGF0ZXMgYW5kIGVuaGFuY2VtZW50czwvYmlnPjxiaWc+LjwvYmlnPjwvbGk+PGxpPjxiaWc+Rml4ZWQgZXJyb3IgaW4gTExfVElNX0VuYWJsZVVwZGF0ZUV2ZW50LCBMTF9USU1fRGlzYWJsZVVwZGF0ZUV2ZW50IGZ1bmN0aW9ucy48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgY29tbWVudHMgaW4gSEFML0xMIGZ1bmN0aW9ucyB0byBkZXNjcmliZSBob3cgdG8gc3dpdGNoIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgQWxpZ25lZCBEb3duIG1vZGUuPC9iaWc+PC9saT48bGk+PGJpZz5Db3JyZWN0ZWQgb2Zmc2V0IGRlZmluaXRpb25zIChUSU1fRE1BQkFTRV9ETUFSLCBUSU1fRE1BQkFTRV9PUikgZm9yIGJ1cnN0IGFjY2Vzcy48L2JpZz48L2xpPjxsaT48YmlnPlVwZGF0ZWQgSEFMX1RJTV9PbmVQdWxzZV94eHggZnVuY3Rpb25zIHRvIHByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmdzLjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIHN1cHBvcnQgb2YgcHJlbG9hZCBjb250cm9sIGluIEhBTCBUSU0gQVBJLjwvYmlnPjwvbGk+PGxpPjxiaWc+UmVtb3ZlZCB1c2FnZSBvZiBTVE0zMkwwIGRldmljZSBjb21waWxhdGlvbiBzd2l0Y2ggaW4gcmVtYXAgY29uc3RhbnQgYW5kIEhBTF9USU1FeF9SZW1hcENvbmZpZyBkZWZpbml0aW9ucy48L2JpZz48L2xpPjxsaT48YmlnPlJlbW92ZSByZWZlcmVuY2UgdG8gVElNeF9TTUNSLk9DQ1MgcmVsYXRlZCBjb25zdGFudHMvZnVuY3Rpb25zLCBub3Qgc3VwcG9ydGVkIGJ5IEwwIHNlcmllLjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWRkIEhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjaygpIGFuZCBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjaygpIEFQSXM8L2JpZz48L2xpPjxsaT48YmlnPkFkZCBjYWxsYmFjayBpZGVudGlmaWVycyBpbiBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIGVudW1lcmF0ZWQgdHlwZWRlZjxicj48L2JpZz48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUwgVFNDPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWxpZ25lZCBIQUwgVFNDIGRyaXZlciB3aXRoJm5ic3A7PC9iaWc+PGJpZz5sYXRlc3Q8L2JpZz48YmlnPiA8L2JpZz48YmlnPnVwZGF0ZXMgYW5kIGVuaGFuY2VtZW50czwvYmlnPjxiaWc+LjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWRkIEhBTF9UU0NfUmVnaXN0ZXJDYWxsYmFjaygpIGFuZCBIQUxfVFNDX1VuUmVnaXN0ZXJDYWxsYmFjaygpIEFQSXM8L2JpZz48L2xpPjwvdWw+PHVsPjxsaT48YmlnPkFkZCBjYWxsYmFjayBpZGVudGlmaWVycyBpbiBIQUxfVFNDX0NhbGxiYWNrSURUeXBlRGVmIGVudW1lcmF0ZWQgdHlwZWRlZjxicj48L2JpZz48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5IQUwvTEwgVUFSVC9VU0FSVC9MUFVBUlQ8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BbGlnbmVkIEhBTCZuYnNwOzwvYmlnPjxiaWc+VUFSVC9VU0FSVC9MUFVBUlQ8L2JpZz48YmlnPiBkcml2ZXJzIHdpdGggbGF0ZXN0IHVwZGF0ZXMgYW5kIGVuaGFuY2VtZW50cy48L2JpZz48L2xpPjxsaT48YmlnPkFsaWduZWQgX19IQUxfVUFSVF9HRVRfSVQgYW5kIF9fSEFMX1VBUlRfR0VUX0lUX1NPVVJDRSBtYWNyb3Mgd2l0aCBvdGhlcnMgc2VyaWVzLjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIG1pc3NpbmcgSEFMX1VBUlRFeF9FbmFibGVDbG9ja1N0b3BNb2RlKCkgZnVuY3Rpb24uPGJyPjwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlPC9iaWc+PC9saT48dWw+PGxpPjxiaWc+QWRkIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbmQgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgQVBJczwvYmlnPjwvbGk+PGxpPjxiaWc+QWRkIGNhbGxiYWNrIGlkZW50aWZpZXJzIGluIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIGVudW1lcmF0ZWQgdHlwZWRlZjwvYmlnPjwvbGk+PC91bD48dWw+PGxpPjxiaWc+QWRkIEhBTF9VU0FSVF9SZWdpc3RlckNhbGxiYWNrKCkgYW5kIEhBTF9VU0FSVF9VblJlZ2lzdGVyQ2FsbGJhY2soKSBBUElzPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgaWRlbnRpZmllcnMgaW4gSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmIGVudW1lcmF0ZWQgdHlwZWRlZjxicj48L2JpZz48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJpZz5MTCBVVElMUzwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkNvcnJlY3RlZCBMTF9HZXRVSURfV29yZDIgZnVuY3Rpb24gdG8gZml4IGVycm9yIGluIFVJRCBmbGFzaCBsb2NhdGlvbi48L2JpZz48L2xpPjxsaT48YmlnPkZpeGVkIG1pc21hdGNoIHJldHVybiB0eXBlIGluIExMX0dldFBhY2thZ2VUeXBlKHZvaWQpLjwvYmlnPjwvbGk+PGxpPjxiaWc+VXBkYXRlIFVUSUxTX01BWF9GUkVRVUVOQ1lfU0NBTEUzIHZhbHVlLjxicj48L2JpZz48L2xpPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIFVTQjwvYmlnPjwvbGk+PHVsPjxsaT48YmlnPkFsaWduZWQgSEFMIFVTQiBkcml2ZXIgd2l0aCBsYXRlc3QgdXBkYXRlcyBhbmQgZW5oYW5jZW1lbnRzLjwvYmlnPjwvbGk+PGxpPjxiaWc+PGZvbnQgc2l6ZT0iLTEiPjxiaWc+VXBncmFkZSB0byBVU0IgRGV2aWNlIExpYnJhcnkgdjIuNS4xLjwvYmlnPjwvZm9udD48L2JpZz48L2xpPjwvdWw+PGxpIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxiaWc+SEFMIFdXREc8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BbGlnbmVkIEhBTCBXV0RHIGRyaXZlciB3aXRoIGxhdGVzdCB1cGRhdGVzIGFuZCBlbmhhbmNlbWVudHMuPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmU8L2JpZz48L2xpPjx1bD48bGk+PGJpZz5BZGQgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjaygpIGFuZCBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soKSBBUElzPC9iaWc+PC9saT48bGk+PGJpZz5BZGQgY2FsbGJhY2sgaWRlbnRpZmllcnMgaW4gSEFMX1dXREdfQ2FsbGJhY2tJRFR5cGVEZWYgZW51bWVyYXRlZCB0eXBlZGVmPGJyPjwvYmlnPjwvbGk+PC91bD48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuOS4wIC8gMTItSmFudWFyeS0yMDE4PC9zcGFuPjwvaDM+CisKKzxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij48L3NwYW4+PC91PjwvYj4KKworPHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPkludGVybmFsIFJlbGVhc2UuPC9zcGFuPjwvbGk+PC91bD4KKzxiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij48L3NwYW4+PC91PjwvYj48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS44LjIgLyAyNS1BdWd1c3QtMjAxNzwvc3Bhbj48L2gzPgorCis8YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorQ2hhbmdlczwvc3Bhbj48L3U+PC9iPgorCis8dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPk1haW50ZW5hbmNlIHJlbGVhc2UgdG8gZml4IGtub3duIGRlZmVjdHMuPC9zcGFuPjwvbGk+PC91bD4KKzxiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij48L3NwYW4+PC91PjwvYj48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwvTEwgZ2VuZXJpYzwvc3Bhbj48L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPjo8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgdGV4dC1pbmRlbnQ6IDBweDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC1zdHJldGNoOiBub3JtYWw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5SZW1vdmVkIERBVEUgYW5kIFZFUlNJT04gZmllbGRzIGZyb20gaGVhZGVyIGZpbGVzLjwvc3Bhbj48L2xpPjxsaT48c3BhbiBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHRleHQtaW5kZW50OiAwcHg7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC1zdHJldGNoOiBub3JtYWw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5VcGRhdGVkIENITSBVc2VyIE1hbnVhbCBmb3IgRHJpdmVycy9TVE0zMkwweHhfSEFMX0RyaXZlci48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TEwgQURDPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIExMIEFEQyBkcml2ZXIgdG8gZXhjbHVkZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFIG1hY3JvIGZvciBTVE0zMkwwMTF4eCBkZXZpY2VzLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIENPTVA8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQgSEFMX0NPTVBfSW5pdCBtYW5hZ2UgZGVmYXVsdCBjYXNlIGFzIExQVElNMSBmb3IgQ09NUDEgYW5kIExQVElNMiBmb3IgQ09NUDIuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwvTEwgSTJDPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZXBsYWNlZCBQT1NJVElPTiB2YWwgbm90aW9uIGJ5IGFzc29jaWF0ZWQgSTJDX3h4eF9wb3MgQ01TSVMgZGVmaW5pdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkCitMTF9JMkNfSW5pdCgpIGZ1bmN0aW9uIHRvIGFkZCZuYnNwO2NvbmRpdGlvbiB0byB0ZXN0IHRoZSB2YWx1ZSBvZgorT3duQWRkcmVzczEgYmVmb3JlIGNhbGxpbmcgdGhlIGlubGluZSBMTCBmdW5jdGlvbgorTExfSTJDX0VuYWJsZU93bkFkZHJlc3MxKCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlZCBpbXBsZW1lbnRhdGlvbiBvZiBJMkNfVHJhbnNmZXJDb25maWcoKSBmdW5jdGlvbi48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTCBQQ0Q8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbW92ZWQgdGhlIGxvY2svdW5sb2NrIGZyb20gSEFMX1BDRF9FUF9SZWNlaXZlLzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTF9QQ0RfRVBfVHJhbnNtaXQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij4gZnVuY3Rpb25zLjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS44LjEgLyAxNC1BcHJpbC0yMDE3PC9zcGFuPjwvaDM+CisKKzxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCitDaGFuZ2VzPC9zcGFuPjwvdT48L2I+CisKKworPGI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPjwvc3Bhbj48L3U+PC9iPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwgTENEPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGUgb2Ygc3RtMzJsMHh4X2hhbF9sY2QuaCB0byBhdm9pZCBDKysgY29tcGlsYXRpb24gZXJyb3JzLjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS44LjAgLyAyNS1Ob3ZlbWJlci0yMDE2PC9zcGFuPjwvaDM+CisKKzxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCitDaGFuZ2VzPC9zcGFuPjwvdT48L2I+CisKKzx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+TWFpbnRlbmFuY2UgcmVsZWFzZSB0byBmaXgga25vd24gZGVmZWN0cy48L3NwYW4+PC9saT48L3VsPgorPGI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPjwvc3Bhbj48L3U+PC9iPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBnZW5lcmljPC9zcGFuPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGVkIEhBTCBEcml2ZXIgY29tcGxpYW5jeSB3aXRoPHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlczwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPjo8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgMi4yIChzb3VyY2UgY29kZSBzaGFsbCBvbmx5IHVzZSAvKiAmIzgyMzA7ICovIHN0eWxlIGNvbW1lbnRzKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgNS4yICh0bXByZWciIHZhcmlhYmxlIHNoYWxsIG5vdCBiZSB1c2VkIGluc2lkZSBNQUNSTyk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTAuMyAoaWxsZWdhbCBleHBsaWNpdCBjb252ZXJzaW9uIGZyb20mbmJzcDt0eXBlICJ1bnNpZ25lZCBpbnQiIHRvICJ1aW50MTZfdCAqKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5NSVNSQQorQyAyMDA0IHJ1bGUgMTAuNCAodmFsdWUgb2YgYSBjb21wbGV4IGV4cHJlc3Npb24gb2YgZmxvYXRpbmcgdHlwZSBzaGFsbAorb25seSBiZSBjYXN0IHRvIGEgZmxvYXRpbmcgdHlwZSB0aGF0IGlzIG5hcnJvd2VyIG9yIG9mIHRoZSBzYW1lIHNpemUpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5NSVNSQSBDIDIwMDQgcnVsZSAxMC42ICgnVScgc3VmZml4IGFwcGxpZWQgdG8gYWxsIGNvbnN0YW50cyBvZiAndW5zaWduZWQnIHR5cGUpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPk1JU1JBIEMgMjAwNCBydWxlIDEyLjYgKGxvZ2ljYWwgb3BlcmF0b3JzIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCBiaXR3aXNlIG9wZXJhdG9ycyk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlIDE0LjM8c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+KGEgbnVsbCBzdGF0ZW1lbnQgc2hhbGwgb25seSBvY2N1ciBvbiBhIGxpbmUgYnkgaXRzZWxmKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTQuODxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+KHN0YXRlbWVudCBmb3JtaW5nIHRoZSBib2R5IG9mIGEgc3dpdGNoLCB3aGlsZSwgZG8gJiM4MjMwOyB3aGlsZSBvciBmb3Igc3RhdGVtZW50IHNoYWxsIGJlIGEgY29tcG91bmQgc3RhdGVtZW50KTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5NSVNSQSBDIDIwMDQgcnVsZSAxNC45ICgnaWYge2V4cHJlc3Npb259JyAvICdlbHNlJyBjb25zdHJ1Y3Qgc2hhbGwgYmUgZm9sbG93ZWQgYnkgYSBjb21wb3VuZCBzdGF0ZW1lbnQpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPk1JU1JBIEMgMjAwNCBydWxlIDE5LjEwIChpbiBmdW5jdGlvbi1saWtlIG1hY3JvIGRlZmluaXRpb24sIGVhY2ggaW5zdGFuY2Ugb2YgYSBwYXJhbWV0ZXIgc2hhbGwgYmUgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXMpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPk1JU1JBIEMgMjAwNCBydWxlIDE5LjExIChhbGwgbWFjcm8gaWRlbnRpZmllcnMgaW4gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgc2hhbGwgYmUgZGVmaW5lZCBiZWZvcmUgdXNlKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TUlTUkEgQyAyMDA0IHJ1bGUgMTkuMTUgKHByZWNhdXRpb25zIHNoYWxsIGJlIHRha2VuIGluIG9yZGVyIHRvIHByZXZlbnQgdGhlIGNvbnRlbnRzIG9mIGEgaGVhZGVyIGZpbGUgYmVpbmcgaW5jbHVkZWQgdHdpY2UpPC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTC9MTCBBREM8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkNvcnJlY3RlZCBBRENfU0FNUExFVElNRV94Q1lDTEVfNSBuYW1pbmcgdG8gYmUgYWxpZ25lZCB0byByZWZlcmVuY2UgbWFudWFsLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkVuYWJsZWQgbWFuYWdlbWVudCBvZiBsb3cgcG93ZXIgYXV0by13YWl0OiBmbGFncyBtdXN0IGJlIGNsZWFyZWQmbmJzcDtieSB1c2VyIHdoZW4gZmV0Y2hpbmcgQURDIGNvbnZlcnNpb24gZGF0YS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5EaXNhYmxlZCBETUEgdHJhbnNmZXIgZHVyaW5nIEFEQyBjYWxpYnJhdGlvbi48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwgQ1JDPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIEhBTF9DUkNfRGVJbml0KCkgZnVuY3Rpb24gKHJlc3RvcmVkIElEUiBSZWdpc3RlciB0byBSZXNldCB2YWx1ZSkuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwgQ09NUDwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlZCBIQUxfQ09NUF9Jbml0KCkgZnVuY3Rpb24gdG8gY2xlYXIgRVhUSSBpbnRlcnJ1cHQgbW9kZSBpbiBjYXNlJm5ic3A7Y29tcGFyYXRvciBpcyByZS1jb25maWd1cmVkIGluIG1vZGUgdHJpZ2dlciBub25lLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQKK0hBTF9DT01QX0lSUUhhbmRsZXIoKSBmdW5jdGlvbiBpbiB3aW5kb3cgbW9kZSwgc28gdGhhdCBib3RoIEVYVEkgZmxhZ3MKK2FyZSZuYnNwO2NsZWFyZWQgYW5kIEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5CitvbmNlLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQKK0hBTCBDT01QIGluaXQoKSBmdW5jdGlvbjogVnJlZkludCBzdGFydHVwIGRlbGF5IGlzIHRha2VuIGludG8gYWNjb3VudCwKK3dpdGggZGVsYXkgb2YgZHVyYXRpb24gQ09NUF9ERUxBWV9WT0xUQUdFX1NDQUxFUl9TVEFCX1VTLiZuYnNwOzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQgSEFMX0NPTVBFeF9FbmFibGVWUkVGSU5UKCkgYnkgYWRkaW5nIFdhaXQgVGltZS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTCBETUE8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlByb3ZpZGVkIG5ldyBmdW5jdGlvbiBIQUxfRE1BX0Fib3J0X0lUKCkgdG8gYWJvcnQmbmJzcDtjdXJyZW50IERNQSB0cmFuc2ZlciB1bmRlciBpbnRlcnJ1cHQgbW9kZTxicj53aXRob3V0IHBvbGxpbmcgZm9yIERNQSBlbmFibGUgYml0Ljwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIEZMQVNIPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIEhBTF9GTEFTSF9JUlFIYW5kbGVyKCksIEhBTF9GTEFTSEV4X0VyYXNlX0lUKCksIEhBTF9GTEFTSF9Qcm9ncmFtX0lUKCksIGFuZDxicj5IQUxfRkxBU0hFeF9FcmFzZV9JVCgpIGZ1bmN0aW9ucy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZW5hbWVkIEhBTF9GTEFTSFJBTUZVTkNfR2V0RXJyb3IoKSBzdG8gSEFMX0ZMQVNIRXhfR2V0RXJyb3IoKS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTCBHUElPPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIElTX0dQSU9fUElOKCkgbWFjcm8gdG8gY292ZXIgZnVsbCB1MzIgYml0cy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIEhBTF9HUElPX0RlSW5pdCgpIGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSBHUElPIHBvcnQgbW9kZSByZWdpc3RlciB0byBpbnB1dCBzdGF0ZS48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwgSTJDPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5BbGlnbmVkIEhBTCBJMkMgZHJpdmVyIHdpdGggdGhlIG5ldyBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkZWQgc3VwcG9ydCBvZiByZXBlYXRlZCBzdGFydCBmZWF0dXJlIHdpdGggdGhlIGZvbGxvd2luZyBuZXcgQVBJczwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCgpLCBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfSVQoKSBhbmQgSEFMX0kyQ19NYXN0ZXJfQWJvcnRfSVQoKSwmbmJzcDs8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5IQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQoKSBhbmQgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1JlY2VpdmVfSVQoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTF9JMkNfRW5hYmxlTGlzdGVuX0lUKCkgYW5kIEhBTF9JMkNfRGlzYWJsZUxpc3Rlbl9JVCgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TmV3IHVzZXIgY2FsbGJhY2tzIEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrKCkgYW5kIEhBTF9JMkNfQWRkckNhbGxiYWNrKCk8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlJld29ya2VkIERNQSBlbmQgcHJvY2VzcyBhbmQgSTJDIGVycm9yIG1hbmFnZW1lbnQgZHVyaW5nIERNQSB0cmFuc2Zlci48YnI+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBXYWl0T25GbGFnIG1hbmFnZW1lbnQgKHRpbWVvdXQgbWVhc3VyZW1lbnQgc2hvdWxkIGJlIGFsd2F5cyBjdW11bGF0aXZlKS48YnI+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+T3B0aW1pemVkIEhBTF9JMkNfWFhfSVJRSGFuZGxlcigpIGZ1bmN0aW9ucyAocmVhZCBzdGF0dXMgcmVnaXN0ZXJzIG9ubHkgb25jZSkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+QWRkZWQgZXJyb3IgbWFuYWdlbWVudCBpbiBjYXNlIG9mIERNQSB0cmFuc2ZlciB0aHJvdWdoIEhBTF9ETUFfQWJvcnRfSVQoKSBhbmQgRE1BIFhmZXJBYm9ydENhbGxiYWNrKCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBIQUxfSTJDRXhfRW5hYmxlRmFzdE1vZGVQbHVzKCkgZW5hYmxpbmcgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IHRocm91Z2ggQ0ZHUjIgcmVnaXN0ZXIuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+RGlzYWJsZWQgSTJDX09BUnhfRU4gYml0IGJlZm9yZSBhbnkgY29uZmlndXJhdGlvbiBpbiBPQVIxIG9yIDIgaW4gSEFMX0kyQ19Jbml0KCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkCitJMkNfRklSU1RfQU5EX05FWFRfRlJBTUUgZm9yIEkyQyBTZXF1ZW50aWFsIHRyYW5zZmVyIG9wdGlvbnM6IGFsbG93IHRvCittYW5hZ2UgYSBzZXF1ZW5jZSB3aXRoIHN0YXJ0IGNvbmRpdGlvbiwgYWRkcmVzcyBhbmQgZGF0YSB0byB0cmFuc2Zlcgord2l0aG91dCBhIGZpbmFsIHN0b3AgY29uZGl0aW9uLCBhbiB0aGVuIHBlcm1pdCBhIGNhbGwgdG8gdGhlIHNhbWUKK21hc3RlciBzZXF1ZW50aWFsIGludGVyZmFjZSBzZXZlcmFsIHRpbWVzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCgpIGZ1bmN0aW9uICh3cm9uZyBzdGF0ZSBjaGVjaykuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TW92ZWQgSTJDX05PX09QVElPTl9GUkFNRSB0byBwcml2YXRlIHNlY3Rpb24uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlZCBJMkMgZHJpdmVyIGRvY3VtZW50YXRpb24gY29uY2VybmluZyBJMkMgYWRkcmVzcyBtYW5hZ2VtZW50PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZWQgSTJDIGRyaXZlciB0byByZXNldCBzdGF0ZSB0byBMSVNURU4gYmVmb3JlIGNhbGxpbmcgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1RyYW5zbWl0X0lUKCkgZnVuY3Rpb24uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTCBJMlM8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlZCBMTF9JMlNfSW5pdCgpIGZ1bmN0aW9uIHRvIHVzZSBkZWZhdWx0IG91IGNvbXB1dGVkIHZhbHVlcyBmb3IgcHJlc2NhbGVyLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIElXREc8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPk92ZXJhbGwgZHJpdmVyIHJld29yayBmb3IgYmV0dGVyIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlJlbW92ZWQgSEFMX0lXREdfU3RhcnQoKSwgSEFMX0lXREdfTXNwSW5pdCgpIGFuZCBIQUxfSVdER19HZXRTdGF0ZSgpIEFQSXMuPC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+SEFMIFBXUjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBuZXcgSEFMX1BXUkV4X0dldFZvbHRhZ2VSYW5nZSgpZnVuY3Rpb24gcmV0dXJuaW5nIFZvbHRhZ2UgU2NhbGluZyByYW5nZSwgdG8gYmUgYWxpZ25lZCB3aXRoIEwxIHNlcmllLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5IQUwgUkNDPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkFsaWduZWQgSEFMIFJDQyBkcml2ZXIgd2l0aCBvdGhlcnMgc2VyaWVzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UmVuYW1lZCBSQ0NfUExMTVVMX3ggdG8gUkNDX1BMTF9NVUx4IGFuZCBSQ0NfUExMRElWX3ggdG8gUkNDX1BMTF9ESVZ4LCB0byBiZSBhbGlnbmVkIHdpdGggTDEgc2VyaWUuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIGRlY2xhcmF0aW9uIG9mIEhBTF9SQ0NfTk1JX0lSUUhhbmRsZXIoKSBmdW5jdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQmbmJzcDtIQUwgSVJRSGFuZGxlciBhbmQgY2FsbGJhY2tzIEFQSSBmb3IgQ1JTIG1hbmFnZW1lbnQuPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5IQUwgU01CVVM8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+QWxpZ25lZCBkcml2ZXIgd2l0aCBvdGhlcnMgc2VyaWVzOiBmaXgga25vd24gZGVmZWN0cyBhbmQgYWRkZWQgc2V2ZXJhbCBlbmhhbmNlbWVudHMgaW1wbGVtZW50YXRpb248L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+QWRkZWQgc3VwcG9ydCBvZiBuZXcgZmVhdHVyZSBab25lIFJlYWQvV3JpdGUuPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5IQUwgU1BJPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkFkZGVkIG1pc3NpbmcgX19JTyBpbiBTUElfSGFuZGxlVHlwZURlZiBkZWZpbml0aW9uLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5IQUwgVElNPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkNvcnJlY3RlZCBUSU0yMl9FVFJfR1BJTyBhbmQgVElNMjJfRVRSX0xTRSBkZWZpbml0aW9ucyBmb3IgU1RNMzJMMDExeHggYW5kIFNUTTMyTDAyMXh4IGRldmljZXMuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTCBVQVJULVVTQVJUIC8gSVJEQSAvIFNNQVJUQ0FSRDwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBtaXNzaW5nIF9fSU8gaW4gVUFSVC88L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VU0FSVC88L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5JUkRBLzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlNNQVJUQ0FSRDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPl9IYW5kbGVUeXBlRGVmIGRlZmluaXRpb24gKGZvciBUeFhmZXJDb3VudCBhbmQgUnhYZmVyQ291bnQpLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TW9kaWZpZWQgVUFSVC88L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5TTUFSVENBUkQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij4gY29uZmlndXJhdGlvbiBzZXF1ZW5jZSBvcmRlciBpbiBIQUxfVUFSVC88L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5TTUFSVENBUkQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5fSW5pdCgpIGZ1bmN0aW9uLCB0byBhdm9pZCBpc3N1ZSBvbiBUcmFuc21pdCBsaW5lIHdoZW4gVUFSVC88L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5TTUFSVENBUkQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5fU2V0Q29uZmlnKCkgaXMgY2FsbGVkIGJlZm9yZSBVQVJULzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlNNQVJUQ0FSRDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPl9BZHZGZWF0dXJlQ29uZmlnKCkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZW1vdmVkIFJYTkUgY2hlY2sgaW4gVUFSVC9VU0FSVC9JUkRBLzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlNNQVJUQ0FSRDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPl9SZWNlaXZlX0lUKCkgZnVuY3Rpb24sIGFzIFJYTkUgaXMgYWxyZWFkeSBjbGVhcmVkIGJ5IHJlYWRpbmcgUkRSLCBvciBieSB3cml0aW5nIDEgdG8gUlhGUlEgaW4gdGhlIFJRUiByZWdpc3Rlci48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJldmlld2VkIFVBUlQvPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5JUkRBLzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlNNQVJUQ0FSRDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPiBzdGF0ZSBtYWNoaW5lIHRvIGF2b2lkIGNhc2VzIHdoZXJlIFVBUlQvPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SVJEQS9TTUFSVENBUkQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij4gc3RhdGUgaXMgb3ZlcndyaXR0ZW4gYnkgVUFSVC88L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5JUkRBL1NNQVJUQ0FSRDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPiBJUlEuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+RW5zdXJlIHByb3BlciBhbGlnbm1lbnQgb2YgZGF0YSBwb2ludGVyIGluIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGZ1bmN0aW9ucyB0byBhdm9pZCB0b29sY2hhaW4gY29tcGlsYXRpb24gaGFyZGZhdWx0Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPk9wdGltaXplZCBXYWl0T25GbGFnIG1hbmFnZW1lbnQgaW4gSEFMX1VBUlQvVVNBUlQvPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SVJEQTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPi88L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5TTUFSVENBUkQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5fVHJhbnNtaXQoKSBmdW5jdGlvbi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5PcHRpbWl6ZWQgYWxsIEhBTCBJUlEgSGFuZGxlciByb3V0aW5lcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5JbXBsZW1lbnRlZAorbmV3IEFQSXMgZm9yIEhBTCBVQVJUL1VTQVJUL0lSREEvU01BUlRDQVJEIEFib3J0IG1hbmFnZW1lbnQ6CitIQUxfUFBQX0Fib3J0KCksIEhBTF9QUFBfQWJvcnRUcmFuc21pdCgpLAorSEFMX1BQUF9BYm9ydFJlY2VpdmUoKSwmbmJzcDtIQUxfUFBQX0Fib3J0X0lUKCksCitIQUxfUFBQX0Fib3J0VHJhbnNtaXRfSVQoKSwgSEFMX1BQUF9BYm9ydFJlY2VpdmVfSVQoKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBkZWZpbml0aW9uIG9mJm5ic3A7VVNBUlRfU1RPUEJJVFNfMF81IChpbiBhZGRpdGlvbiB0byAxLCAxLjUsIDIgc3RvcCBiaXRzKS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIFVTQVJUX0dFVENMT0NLU09VUkNFKCkgbWFjcm8gZGVmaW5pdGlvbiBpbiBvcmRlciB0byByZWZsZWN0IFVTQVJUIGluc3RhbmNlcyBhdmFpbGFiaWxpdHkgb24gTDAgZGV2aWNlcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGVkIEhBTF9VQVJUX0luaXQoKSB0aGF0IGNhbiBub3QgYmUgcGVyZm9ybWVkIG9uIFVTQVJUNCBhbmQgVVNBUlQ1IGluc3RhbmNlcyBmb3IgTDA3eC9MMDh4Ljxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogd2luZG93dGV4dDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+SEFMIFVTQjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBtaXNzaW5nIFVTQl9DTlRSX1NPRk0gaW4gdGhlIHNldHRpbmcgb2Ygd0ludGVycnVwdF9NYXNrIGdsb2JhbCB2YXJpYWJsZS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IHdpbmRvd3RleHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQgSEFMX1BDRF9BY3RpdmF0ZVJlbW90ZVdha2V1cCgpIGFuZCBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoKSBmdW5jdGlvbnMgdG8gY2hlY2sgb24gTFBNIHN0YXRlIGJlZm9yZSBVU0IgcmVzdW1lLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiB3aW5kb3d0ZXh0OyBsaW5lLWhlaWdodDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIFdXREc8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPk92ZXJhbGwgZHJpdmVyIHJld29yayBmb3IgYmV0dGVyIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlJlbW92ZSBIQUxfV1dER19TdGFydCgpLCBIQUxfV1dER19TdGFydF9JVCgpLCBIQUxfV1dER19Nc3BEZUluaXQoKSBhbmQgSEFMX1dXREdfR2V0U3RhdGUoKSBBUElzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZQordGhlIEhBTF9XV0RHX1JlZnJlc2goV1dER19IYW5kbGVUeXBlRGVmICpod3dkZywgdWludDMyX3QgY291bnRlcikmbmJzcDsKK2Z1bmN0aW9uIGFuZCBBUEkmbmJzcDsgYnkgcmVtb3ZpbmcgdGhlJm5ic3A7ICJjb3VudGVyIiBwYXJhbWV0ZXIuPC9zcGFuPjwvbGk+PC91bD48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNy4wIC8gMzEtTWF5LTIwMTY8L3NwYW4+PC9oMz4KKworPGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KK0NoYW5nZXM8L3NwYW4+PC91PjwvYj4KKworPHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5NYWludGVuYW5jZSByZWxlYXNlIHRvIGZpeCBrbm93biBkZWZlY3RzLjwvc3Bhbj48L2xpPjwvdWw+Cis8Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+PC9zcGFuPjwvdT48L2I+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFML0xMIENPTVA8L3NwYW4+IHVwZGF0ZTxicj48L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkZWQKK21pc3NpbmcgZGVmaW5pdGlvbiBmb3IgQ09NUF9JTlBVVF9QTFVTX0lPNiBhbmQKK0xMX0NPTVBfSU5QVVRfUExVU19JTzYsIHN1cHBvcnRlZCBieSBTVE0zMkwwIENhdGVnb3J5MSAoU1RNMzJMMDExeHgsCitTVE0zMkwwMjF4eCkuPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PGJyPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbW92ZWQgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzMgZGVmaW5pdGlvbi48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZW5hbWVkIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8yIHRvIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIuPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VGhlIEVYVEkgc2V0LXVwIGlzIG5vdyBtYW5hZ2VkIGJ5Jm5ic3A7SEFMX0NPTVBfSW5pdCgpIGZ1bmN0aW9uLCB1c2luZyB1cGRhdGVkIGRlZmluaXRpb25zIG9mCitDT01QX1RSSUdHRVJNT0RFX3h4eC48YnI+VGhlcmVmb3JlLCB0aGUgZnVuY3Rpb25zJm5ic3A7IEhBTF9DT01QX1N0YXJ0X0lUKCkgYW5kIEhBSF9DT01QX1N0b3BfSVQoKSBoYXZlIGJlZW4gcmVtb3ZlZC48YnI+SW4gYW55IG1vZGUsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHVzZSBIQUxfQ09NUF9TdGFydCgpIGFuZCBIQUxfQ09NUF9TdG9wKCkuPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkZvciBpbmZvcm1hdGlvbiwgdGhpcyB1cGRhdGUgd2FzIGFscmVhZHkgYXZhaWxhYmxlIGluJm5ic3A7VjEuNi4wLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjwvdWw+PC91bD48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUlRDIDwvc3Bhbj51cGRhdGU8YnI+PC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZWQgSEFMX1JUQ0V4X1NldFdha2VVcFRpbWVyX0lUKCkgZnVuY3Rpb24gYnkgYWRkaW5nIGNsZWFyIG9mIFdha2UtVXAgZmxhZyBiZWZvcmUgZW5hYmxpbmcgdGhlIGludGVycnVwdC48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48L3VsPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBMQ0QgPC9zcGFuPnVwZGF0ZTxicj48L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Q29ycmVjdGVkIFNZU0NGRyBMQ0QgRXh0ZXJuYWwgQ2FwYWNpdG9ycyBkZWZpbml0aW9ucy48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBuZXcgX19IQUxfU1lTQ0ZHX1ZMQ0RfQ0FQQV9DT05GSUcoKSBtYWNybyB0byBjb25maWd1cmUgdGhlIFZMQ0QgRGVjb3VwbGluZyBjYXBhY2l0YW5jZSBjb25uZWN0aW9uLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkFkZGVkIG5ldyBfX0hBTF9TWVNDRkdfR0VUX1ZMQ0RfQ0FQQV9DT05GSUcoKSBtYWNybyB0byByZXR1cm4gdGhlIGRlY291cGxpbmcgb2YgTENEIGNhcGFjaXRhbmNlPGJyPmNvbmZpZ3VyZWQgYnkgdXNlci48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGRlZCBMQ0QgVm9sdGFnZSBvdXRwdXQgYnVmZmVyIGVuYWJsZSBtYWNybyBkZWZpbml0aW9ucy48YnI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS42LjAvIDE1LUFwcmlsLTIwMTY8L3NwYW4+PC9oMz4KKworPGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KK0NoYW5nZXM8L3NwYW4+PC91PjwvYj4KKworPHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Rmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZSBzdXBwb3J0aW5nIHRoZSBMb3cgTGV2ZWwgZHJpdmVycyBmb3IgdGhlIFNUTTMyTDB4eCBmYW1pbHk6Jm5ic3A7PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxicj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5Mb3cKK0xheWVyIGRyaXZlcnMgQVBJcyBwcm92aWRlIHJlZ2lzdGVyIGxldmVsIHByb2dyYW1taW5nOiB0aGV5IHJlcXVpcmUKK2RlZXAga25vd2xlZGdlIG9mIHBlcmlwaGVyYWxzIGRlc2NyaWJlZCBpbiBTVE0zMkwweHggUmVmZXJlbmNlIE1hbnVhbC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5Mb3cKK0xheWVyIGRyaXZlcnMgYXJlIGF2YWlsYWJsZSBmb3I6IEFEQywgQ09NUCwgQ09SVEVYLCBDUkMsIENSUyxEQUMsIERNQSwKK0VYVEksIEdQSU8sIEkyQywgSVdERywgTFBUSU0sIExQVUFSVCwgUFdSLCBSQ0MsIFJORywgUlRDLCBTUEksIFRJTSwKK1VTQVJULCBXV0RHIHBlcmlwaGVyYWxzIGFuZCBhZGRpdGlvbmFsIExvdyBMZXZlbCBCdXMsIFN5c3RlbSBhbmQKK1V0aWxpdGllcyBBUElzLiA8YnI+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+TG93IExheWVyIGRyaXZlcnMgQVBJcyBhcmUgaW1wbGVtZW50ZWQgYXMgc3RhdGljIGlubGluZSBmdW5jdGlvbiBpbiBuZXcgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkluYy9zdG0zMmwweHhfbGxfcHBwLmg8L3NwYW4+IGZpbGVzIGZvciBQUFAgcGVyaXBoZXJhbHMsIHRoZXJlIGlzIG5vIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgZWFjaCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+c3RtMzJsMHh4X2xsX3BwcC5oPC9zcGFuPiBmaWxlIG11c3QgYmUgaW5jbHVkZWQgaW4gdXNlciBjb2RlLjxicj48YnI+PC9zcGFuPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5VPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5wZGF0ZXMgb2YgdGhlJm5ic3A7SEFMIDombmJzcDs8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxicj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPkhBTF9TWVNDRkdfRW5hYmxlVlJFRklOVCgpIGFuZCBIQUxfU1lTQ0ZHX0Rpc2FibGVWUkVGSU5UKCkgZnVuY3Rpb25zIGFuZCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyI+SEFMX1ZSRUZJTlRfQ21kIG1hY3JvIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7Ij5zdXBwcmVzc2VkIHNpbmNlJm5ic3A7VlJFRklOVCBpcyBtYW5hZ2VkIGJ5IHRoZSBzeXN0ZW0uPGJyPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TZXZlcmFsIHVwZGF0ZXMgb24gZGVkaWNhdGVkIEhBTCBhcyBzcGVjaWZpZWQgaW4gdGhlIGxpc3QgYmVsb3cuIFRoZSBtYWpvciBjaGFuZ2VzIGNvbmNlcm5zIEhBTF9DT01QIGFuZCBIQUxfVUFSVC48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGJyPjxiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5MaXN0IG9mIEhBTCB1cGRhdGVzIG9yIGNvcnJlY3Rpb25zIHByb3ZpZGVkIGJ5IHRoaXMgcmVsZWFzZTo8L3NwYW4+PC91PjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9InRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUw8L3NwYW4+IDwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPnVwZGF0ZTwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5DaGFuZ2UgdGhlIHdheSB0aGUgQVBCIEFIQiBwcmVzY2FsZXIgdGFibGUgaXMgZGVmaW5lZCBpbnNpZGUgdGhlIEhBTC48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5DaGFuZ2UgdGhlIHZhcmlhYmxlICd1d1RpY2snIGZyb20gJ3N0YXRpYycgdG8gJ2dsb2JhbCcuPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Q29tcGxpYW5jeSB3aXRoIE1JU1JBIEMgMjAwNCBydWxlIDEwLjYgKEEgIlUiIHN1ZmZpeCBzaGFsbCBiZSBhcHBsaWVkIHRvIGFsbCBjb25zdGFudHMgb2YgdW5zaWduZWQgdHlwZSk8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Db21wbGlhbmN5Cit3aXRoIE1JU1JBIEMgMjAwNCBydWxlIDE2LjQuIChUaGUgaWRlbnRpZmllcnMgdXNlZCBpbiB0aGUgZGVjbGFyYXRpb24KK2FuZCBkZWZpbml0aW9uIG9mIGEgZnVuY3Rpb24gc2hhbGwgYmUgaWRlbnRpY2FsKSZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENPTVA8L3NwYW4+IHVwZGF0ZTxicj48L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TWFqb3IgcmV3b3JrIG9uIHRoZSBsb2NrIGFuZCBvbiB0aGUgc3RhdGUgbWFjaGluZSBhc3NvY2lhdGVkIHRvIHRoZSBDT01QIEhBTDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPi48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5PcHRpbWl6YXRpb24gb2Ygc2V2ZXJhbCBmdW5jdGlvbnMgYW5kIHVuaWZvcm1pemF0aW9uIG9mIHRoZSBkcml2ZXIgd2l0aGluIHRoZSB3aG9sZSBTVE0zMiBmYW1pbHkuPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ1JZUFQ8L3NwYW4+IHVwZGF0ZTwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Db3JyZWN0IHRoZSZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPnVzYWdlIG9mIHNldmVyYWwgY29tcGlsYXRpb24gc3dpdGNoZXMgcmVsYXRlZCB0byBTVE0zMkwwODF4eC48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBETUE8L3NwYW4+IHVwZGF0ZTwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGQmbmJzcDt0aGUgZm9sbG93aW5nIG1hY3JvIDogSEFMX0RNQV9HRVRfQ09VTlRFUjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPi48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBGTEFTSDwvc3Bhbj4gdXBkYXRlPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZSB0aGUgdHdvIGZvbGxvd2luZyBtYWNyb3MgOiBfX0hBTF9GTEFTSF9QUkVGRVRDSF9CVUZGRVJfRU5BQkxFIGFuZCA8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5fX0hBTF9GTEFTSF9QUkVGRVRDSF9CVUZGRVJfRElTQUJMRTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPi48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBJUkRBPC9zcGFuPiB1cGRhdGU8L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SW1wcm92ZSBtYW5hZ2VtZW50IG9mIHRoZSBFSUUgYml0cyBmb3IgVHggYW5kIFJ4IHRyYW5zZmVycy4gPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSTJDPC9zcGFuPiB1cGRhdGU8L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWxsb3cgSTJDIHRyYW5zbWlzc2lvbiB3aXRoIGRhdGEgc2l6ZSBlcXVhbCB0byAwPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Ljwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkFkZCZuYnNwO25ldyBtYWNybyBJU19JMkNfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFLiA8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBMUFRJTTwvc3Bhbj4gdXBkYXRlPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZSBvZiB0aGUgTFBUSU0gZHJpdmVyIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIGV4dGkgbGluZSAyMy4gPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVUFSVDwvc3Bhbj4gdXBkYXRlPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48YnI+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5JbXByb3ZlIDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVBUlQgc3RhdGUgbWFjaGluZSBiZWhhdmlvciBpPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+biBjYXNlIG9mIGludGVycnVwdHM8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij4uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlIDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPnRoZSBtYWNyb3MKK1VBUlRfRElWX1NBTVBMSU5HOCBhbmQgVUFSVF9ESVZfU0FNUExJTkcxNiB0byBjb3JyZWN0IDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVBUlQgYmF1ZHJhdGUgY2FsY3VsYXRpb248L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGQmbmJzcDthbiBSWERBVEEgZmx1c2ggcmVxdWVzdCBpbnNpZGUgdGhlIFVBUlRfUmVjZWl2ZV9JVCBmdW5jdGlvbiB3aGVuIHRoZSBSeFN0YXRlIGlzIG5vdCBpbiByZWNlcHRpb24gc3RhdGUuPGJyPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJDQzwvc3Bhbj4gdXBkYXRlPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48YnI+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Db3JyZWN0IHRoZSBzZXR1cCBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlICdTeXN0ZW1Db3JlQ2xvY2snPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+LiZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZSBvZiB0aGUgQ1JTIGludGVycnVwdCBzb3VyY2VzLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbmFtZWQgPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UkNDX0NSU19TWU5DV0FSTSZuYnNwOyBpbnRvIDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJDQ19DUlNfU1lOQ1dBUk4gYW5kJm5ic3A7PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+cmVuYW1lZDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPiBSQ0NfQ1JTX1RSSU1PViBpbnRvIFJDQ19DUlNfVFJJTU9WRi48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjUuMC8gOC1KYW51YXJ5LTIwMTY8L3NwYW4+PC9oMz4KKworPGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KK0NoYW5nZXM8L3NwYW4+PC91PjwvYj4KKworPHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsiIGltcHJvdmVtZW50cz0iIiBvZj0iIiB0aGU9IiIgaGFsPSIiPjwvc3Bhbj48c3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5VPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5wZGF0ZXMgb2YgdGhlJm5ic3A7SEFMIDombmJzcDs8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PGJyPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxicj4KKzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+LSBDb21wbGlhbmN5IHdpdGggTUlTUkEgY29kaW5nIHJ1bGVzIChNSVNSQSBDIDIwMDQgcnVsZSAxMC41IGV4Y2VwdCBmb3IgaGFsX3BjZC5jIGZpbGUgYW5kIE1JU1JBIEMgMjAwNCBydWxlIDUuMyk8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPi4mbmJzcDs8YnI+LSBTZXZlcmFsIGZ1bmN0aW9ucyBpbnNpZGUgdGhlIEhBTCBoYXZlIGJlZW4gdXBkYXRlZCBpbiBvcmRlciB0byBwcmV2ZW50IHVudXNlZCBhcmd1bWVudCBjb21waWxhdGlvbiB3YXJuaW5ncy48YnI+LSBUaGUgc3RhcnR1cCB0aW1lb3V0IHZhbHVlIGZvciBtYW55IGNsb2NrcyAoYXMgSFNFLCBIU0ksIExTSSwgTVNJLCBQTEwpIGhhdmUgYmVlbiB1cGRhdGVkIDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+dG8KK3JlYWNoIGEgbW9yZSBhY2N1cmF0ZSB2YWx1ZSAoYWxpZ25lbWVudCB0byB0aGUgRGF0YXNoZWV0KS48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxicj4tCitUaGUgbWFjcm8mbmJzcDtfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcoLi4pIGhhcyBiZWVuIHJlbW92ZWQKK3NpbmNlIHRoaXMgc2VydmljZSBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGhlIGZ1bmN0aW9uCitIQUxfU1lTVElDS19DTEtTb3VyY2VDb25maWcoKS48YnI+LSZuYnNwO1NldmVyYWwgdXBkYXRlcyBvbiBkZWRpY2F0ZWQgSEFMIGFzIHNwZWNpZmllZCBpbiB0aGUgbGlzdCBiZWxvdzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjwvdWw+PGJyPjxiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5MaXN0IG9mIEhBTCB1cGRhdGVzIG9yIGNvcnJlY3Rpb25zIHByb3ZpZGVkIGJ5IHRoaXMgcmVsZWFzZTwvc3Bhbj48L3U+PC9iPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij46PC9zcGFuPjwvdT48L2I+PGJyPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTDwvc3Bhbj4gPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+dXBkYXRlPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVwZGF0ZQordGhlIFNZU0NGR19CT09UX1NZU1RFTUZMQVNIIGRlZmluaXRpb24uIChTWVNDRkdfQk9PVF9TWVNURU1GTEFTSCBpcyBub3cKK2VxdWFsIHRvIFNZU0NGR19DRkdSMV9CT09UX01PREVfMCBpbnN0ZWFkIG9mCitTWVNDRkdfQ0ZHUjFfTUVNX01PREVfMCkmbmJzcDs8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5UaGUgSFNFX1NUQVJUVVBfVElNRU9VVCBpcyBub3cgZXF1YWwgdG8gMTAwIGluc3RlYWQgb2YgNTAwMC48YnI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBJMkM8L3NwYW4+IHVwZGF0ZTwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGUgdGhlIEhBTF9JMkNfU2xhdmVfUmVjZWl2ZSBmdW5jdGlvbi4gU3RvcmUgbGFzdCBkYXRhIHJlY2VpdmVkIHdoZW4gcmVxdWVzdGVkLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkltcHJvdmVtZW50IG9mIHRoZSBIQUxfSTJDX01hc3RlclJlY2VpdmUgZnVuY3Rpb24uIEVycm9yIG1hbmFnZW1lbnQgdXBkYXRlLiAoSEFMX0VSUk9SIGRldGVjdGlvbiB2ZXJzdXMgSEFMX1RJTUVPVVQpPGJyPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkltcHJvdmVtZW50CitvZiB0aGUgSTJDX01hc3RlclRyYW5zbWl0X0lTUiBmdW5jdGlvbi4gQWRkaW5nIG9mIHNldmVyYWwKK2Vycm9yJm5ic3A7Y2hlY2tzLCB1bmxvY2sgb2YgdGhlIHByb2Nlc3Mgd2hlbiByZXF1ZXN0ZWQuPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SW1wcm92ZW1lbnQKK29mIHRoZSBJMkNfTWFzdGVyUmVjZWl2ZV9ETUEgZnVuY3Rpb24uIEFkZGluZyBvZiBzZXZlcmFsCitlcnJvciZuYnNwO2NoZWNrcyBhbmQgYWJvcnQgRE1BIHdoZW4gcmVxdWVzdGVkLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFVBUlQ8L3NwYW4+IHVwZGF0ZTwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGUgdGhlIGNoZWNrIG9mIHBhcmFtZXRlcnMgaW5zaWRlIHRoZSBmdW5jdGlvbiBIQUxfTElOX1NlbmRCcmVhaygpLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkNvcnJlY3Rpb24KK29mIGFuIGVycm9yIHByZXNlbnQgb24gdGhlIFYxLjQuMCByZWxlYXNlLiBPbiB0aGUgVjEuNC4wIHJlbGVhc2UsIHRoZQorY2xvY2sgdXNlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uIFVTQVJUX1NldENvbmZpZyguLikgd2FzIG5ldmVyIHNldC48YnI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRE1BPC9zcGFuPiB1cGRhdGU8L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlIHRoZSBETUFfaGFuZGxlciBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gYmUgTUlTUkEtQyAyMDA0IHJ1bGUgNS4zIGNvbXBsaWFudC48YnI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU1BJPC9zcGFuPiB1cGRhdGU8L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlIHRoZSBTUElfaGFuZGxlciBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gYmUgTUlTUkEtQyAyMDA0IHJ1bGUgNS4zIGNvbXBsaWFudC48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0M8L3NwYW4+IHVwZGF0ZTwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGUgc3VwcG9ydCBvZiBSQ0NfTUMwMyB3aGVuIHJlcXVlc3RlZC48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGUgc3VwcG9ydCBvZiBkeW5hbWljIEhTRSBwcmVzY2FsZXIgY29uZmlndXJhdGlvbiBmb3IgTENEL1JUQyBwZXJpcGhlcmFscy48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Tb21lIHVwZGF0ZXMgaW5zaWRlIHRoZSBIQUxfUkNDX0Nsb2NrQ29uZmlnIGZ1bmN0aW9uLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlNvbWUKK3VwZGF0ZXMgaW5zaWRlIHRoZSBIQUxfUkNDX01DT0NvbmZpZyBmdW5jdGlvbi4gVGhlIGVuYWJsaW5nIG9mIHRoZSBNQ08KK2Nsb2NrcyAoX19NQzAxX0NMS19FTkFCTEUoKSBvciBfX01DTzJfQ0xLX0VOQUJMRSgpKSBpcyBkb25lIHNlcGFyYXRlbHkKK2RlcGVuZGluZyBvbiB0aGUgTUNPIHNlbGVjdGVkLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlRoZSBmdW5jdGlvbiBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcSgpIGhhcyBiZWVuIHJld29ya2VkLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlRoZQorZnVuY3Rpb24gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygpIGhhcyBiZWVuIHVwZGF0ZWQuIEEgbmV3IGVycm9yIGlzCitub3cgZGV0ZWN0ZWQgd2hlbiB0cnlpbmcgdG8gdXBkYXRlIHRoZSBIU0UgZGl2aWRlciBkeW5hbWljYWxseS48YnI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVFNDPC9zcGFuPiB1cGRhdGU8L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+U2V2ZXJhbCB1cGRhdGVzIGluc2lkZSB0aGUgSEFMX1RTQ19TdGFydCBmdW5jdGlvbiBhbmQgSEFMX1RTQ19Jbml0IGZ1bmN0aW9uLiBDaGVjayBvZiBpbnB1dCBwYXJhbWV0ZXJzPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQURDPC9zcGFuPiB1cGRhdGU8L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+VGhlIGNoYW5uZWwgMTYgKEFEQ19DSEFOTkVMXzE2KSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLjwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48L3VsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENPUlRFWDwvc3Bhbj48L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+VGhlCittYWNybyBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcoLi4pIGhhcyBiZWVuIHJlbW92ZWQgc2luY2UgdGhpcworc2VydmljZSBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGhlIGZ1bmN0aW9uCitIQUxfU1lTVElDS19DTEtTb3VyY2VDb25maWcoKS48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48YnI+PC9zcGFuPjwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48L3VsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEZMQVNIPC9zcGFuPiB1cGRhdGU8L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VGhlCityZXN0cmljdGlvbiB3aGljaCB3YXMgcHJlc2VudCBvbiBWMS40LjAgYW5kIGxpbmtlZCB0byB0aGUmbmJzcDtPUFRWRVJSCitiaXQgdXNhZ2Ugb24gU1RNMzJMMDMxeHggYW5kIFNUTTMyTDA0MXh4IGhhcyBiZWVuIHJlbW92ZWQuIFRoaXMgaXMgZHVlCit0byB0aGUgZmFjdCB0aGF0IHRoZSA8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5uZXcgU1RNMzJMMDMxeHgvPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+U1RNMzJMMDQxeHg8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij4gPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+ZGV2aWNlcyBzdXBwb3J0cyBub3cgdGhpcyBmZWF0dXJlLiBPbiB0aGUgZmlyc3QgcmV2aXNpb24gb2YgdGhlIDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlNUTTMyTDAzMXh4Lzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlNUTTMyTDAzMXh4IDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPmRldmljZXMgKFJldklEID0gJm5ic3A7IDB4MTAwMCByZXRyaWV2ZWQgdmlhIEhBTF9HZXRSRVZJRCgpKSwgdGhlIDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPk9QVFZFUlIKK2JpdCB3YXMgbm90IGZ1bmN0aW9uYWwuIFRoZSBPUFRWRVJSIChPcHRpb24gdmFsaWQgZXJyb3IgYml0KSBpcyBzZXQgYnkKK2hhcmR3YXJlIHdoZW4sIGR1cmluZyBhbiBPcHRpb24gYnl0ZSBsb2FkaW5nLCB0aGVyZSB3YXMgYSBtaXNtYXRjaCBmb3IKK29uZSBvciBtb3JlIGNvbmZpZ3VyYXRpb25zLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNC4wLyAxNi1PY3RvYmVyLTIwMTU8L3NwYW4+PC9oMz4KKzxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCitDaGFuZ2VzPC9zcGFuPjwvdT48L2I+CisKKzx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IiBpbXByb3ZlbWVudHM9IiIgb2Y9IiIgdGhlPSIiIGhhbD0iIj48L3NwYW4+PHNwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPiZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+U3VwcG9ydAorb2YmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkwwMTF4eCBhbmQgPC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+U1RNMzJMMDIxeHgKK3Nlcmllczxicj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48YnI+Cis8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPgorT24gU1RNMzJMMDExeHgvPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkwwMjF4eDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+LCBjb21wYXJlZCB0byZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+U1RNMzJMMDd4eHg8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPi88L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlNUTTMyTDA4eHh4PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4sIHNvbWUgb2YgdGhlIG1haW4gZGlmZmVyZW5jZXMgYXJlIGxpc3RlZCBoZXJlYWZ0ZXI8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+IDo8YnI+CistIFNSQU0gc2l6ZSBzZXQgdG8gMktCIChpbnN0ZWFkIG9mIDIwS0IpPGJyPgorLSBGbGFzaCBzaXplIHNldCB0byAxNktCIChpbnN0ZWFkIG9mIDE5MktCKTxicj4KKy0gR1BJTyBhdmFpbGFibGUgOkEsQixDIChpbnN0ZWFkIG9mIEEsQixDLEQsRSxIKTxicj4KKy0gVGltZXJzIGF2YWlsYWJsZSA6IFRJTTIsVElNMjEsTFBUSU0xIChpbnN0ZWFkIG9mCitUSU0yLFRJTTMsVElNNixUSU03LFRJTTIxLFRJTTIyLExQVElNMSk8YnI+PGJyPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5NaW5vciB1cGRhdGVzIG9mIHRoZSZuYnNwO0hBTCA6PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48YnI+PGI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPkxpc3Qgb2YgSEFMIHVwZGF0ZXMgb3IgY29ycmVjdGlvbnMgcHJvdmlkZWQgYnkgdGhpcyByZWxlYXNlPC9zcGFuPjwvdT48L2I+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPjo8L3NwYW4+PC91PjwvYj48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBDT01QPC9zcGFuPiB1cGRhdGU8L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlJm5ic3A7b2YgdGhlIG5vbiBpbnZlcnRpbmcgaW5wdXRzIGF2YWlsYWJsZSBvbiB0aGUgd2hvbGUgTDAgZmFtaWx5LiZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJDQzwvc3Bhbj4gPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+dXBkYXRlPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVzYWdlIG9mIGEgY29tbW9uIFBMTE11bFRhYmxlW10gZGVmaW5lZCBpbiBzeXN0ZW1fc3RtMzJsMHh4LmMuPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXBkYXRlIGluIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaWZmZXJlbnQgdGFtcGVycy48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5NaW5vciByZW5hbWluZyBvZiBzZXZlcmFsIG1hY3Jvcy48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFRJTUVSPC9zcGFuPiB1cGRhdGU8L3NtYWxsPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SGFuZGxlIGxvY2sgaW5pdGlhbGl6YXRpb24gaW4gYWxsIFRJTSBpbml0IGZ1bmN0aW9ucy48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBMQ0Q8L3NwYW4+IHVwZGF0ZTwvc21hbGw+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGQgc3VwcG9ydCBvZiBuZXcgTXV4U2VnbWVudCBmaWVsZCBpbnNpZGUgdGhlIGluaXQgc3RydWN0dXJlLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERNQTwvc3Bhbj4gdXBkYXRlPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkFsaWdubWVudCBvZiB0aGUgZGlmZmVyZW50IGNoYW5uZWxzIHdpdGhpbiB0aGUgTDAgZmFtaWx5Ljwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMy4wLyAwOS1TZXB0ZW1iZXItMjAxNTwvc3Bhbj48L2gzPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCitDaGFuZ2VzPC9zcGFuPjwvdT48L2I+Cis8dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyIgaW1wcm92ZW1lbnRzPSIiIG9mPSIiIHRoZT0iIiBoYWw9IiI+PC9zcGFuPjxzcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij4gPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPk1ham9yIHVwZGF0ZSBvZiB0aGUmbmJzcDsKK0hBTCBBUEkgOiZuYnNwOzxicj4KKzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PGJyPgorPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4KKy0KK2FsbCA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5NQUNST3M8L3NwYW4+IGFuZCA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MSVRFUkFMczwvc3Bhbj4gdmFsdWVzIGhhdmUgYmVlbiByZXdvcmtlZCB0byBhbGlnbiBhbGwgU1RNMzIgRmFtaWxpZXMgYXMgbXVjaCBhcyBwb3NzaWJsZTxicj4KKy0gPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SW1wb3J0YW50IGluZm9ybWF0aW9uPC9zcGFuPgorOiBBIHN0bTMyX2hhbF9sZWdhY3kuaCBmaWxlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBGVyBwYWNrYWdlIGluIG9yZGVyIHRvIHN1cHBvcnQKK3RoZSBvbGQgTUFDUk9zIGFuZCBMSVRFUkFMIHZhbHVlcyB1c2VkIGluIHRoZSBwcmV2aW91cyB2ZXJzaW9ucyBvZgorY3VzdG9tZXIgYXBwbGljYXRpb25zLiAodGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQsIGZyb20gSEFML0luYy9MZWdhY3kpPGJyPgorLSBJbiA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgTUFDUk9zPC9zcGFuPiBkZWZpbml0aW9ucyA6IGRvIHsgfSB3aGlsZSgwKSBoYXZlIGJlZW4gdXNlZCBpbiBtdWx0aSBzdGF0ZW1lbnQgbWFjcm9zIAorPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjwvdWw+Cis8dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+CitTdXBwb3J0CitvZiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlNUTTMyTDAzMXh4IGFuZCA8L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkwwNDF4eAorc2VyaWVzPGJyPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxicj4KKzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+CitPbiBTVE0zMkwwMzF4eC88L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlNUTTMyTDA0MXh4PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4sIGNvbXBhcmVkIHRvJm5ic3A7PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5TVE0zMkwwN3h4eDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Lzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+U1RNMzJMMDh4eHg8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPiwgdGhlIG1haW4gZGlmZmVyZW5jZXMgYXJlIGFzIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPmZvbGxvdzwvc3Bhbj4gOjxicj4KKy0gU1JBTSBzaXplIHNldCB0byA4S0IgKGluc3RlYWQgb2YgMjBLQik8YnI+CistIEZsYXNoIHNpemUgc2V0IHRvIDMyS0IgKGluc3RlYWQgb2YgMTkyS0IpPGJyPgorLSBHUElPIGF2YWlsYWJsZSA6QSxCLEMsSCAoaW5zdGVhZCBvZiBBLEIsQyxELEUsSCk8YnI+CistIFRpbWVycyBhdmFpbGFibGUgOiBUSU0yLFRJTTIxLFRJTTIyLExQVElNMSAoaW5zdGVhZCBvZgorVElNMixUSU0zLFRJTTYsVElNNyxUSU0yMSxUSU0yMixMUFRJTTEpPGJyPjxicj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPjwvc3Bhbj48L3U+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ij48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TGlzdCBvZiBIQUwgdXBkYXRlcyBvciBjb3JyZWN0aW9ucyBwcm92aWRlZCBieSB0aGlzIHJlbGVhc2U8L3NwYW4+PC91PjwvYj48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+Ojwvc3Bhbj48L3U+PC9iPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEFEQzwvc3Bhbj4gdXBkYXRlPC9zbWFsbD48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkFEQyBhc3NlcnQgcGFyYW0gbmVlZHMgdG8gYmUgbW9yZSBzcGVjaWZpYyBmb3IgZGlzY29udGludW91cyBtb2RlLCBuYiBvZiBkaXNjb250IGNvbnZlcnNpb25zPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QURDIGV4dGVybmFsIHRyaWdnZXIgZGVmaW5pdGlvbiBpcyBub3QgY29tcGxldGUgRmxhZyBFT1Mgc2hvdWxkIG5vdCBiZSByZXNldCBpbiBIQUxfQURDX0dldFZhbHVlKCk8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BREMgcG9sbCBmb3IgZXZlbnQgbXVzdCByZXR1cm4gdGltZW91dCBpbnN0ZWFkIG9mIGVycm9yPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QURDIHN0YXRlIG1hY2hpbmUgdXBkYXRlIC0gU3RhdGVzIHdpdGggYml0ZmllbGRzIGFyZSBub3cgdXNlZCBmb3IgYSBtb3JlIGFjY3VyYXRlIHN0YXR1cyZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkFEQyBydW4gaW4gTFBydW4gbW9kZSBuZWVkcyBTWVNDRkcgYnVmZmVycyBlbmFibGVkPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QURDX0NMT0NLX1NZTkNfUENMS19ESVZ4IHdhcyBub3QgY29ycmVjdDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJlbW92ZSBXYWl0TG9vcEluZGV4IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uIEhBTF9BRENfRW5hYmxlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QURDIHBhcmFtZXRlciAiQURDX1NPRlRXQVJFX1NUQVJUIiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFNUTTMyIGRldmljZXM8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BREMgcG9sbCBmb3IgY29udmVyc2lvbiBtdXN0IHJldHVybiBlcnJvciBzdGF0dXMgaW4gY2FzZSBvZiBBREMtRE1BIG1vZGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BREMgaWRlbnRpY2FsIGVycm9yIGNvZGUgcmV0dXJuZWQgZ2VuZXJhdGVzIGNvbmZ1c2lvbjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPklzc3VlIG9ic2VydmVkIHdpdGggQURDIHN0YXJ0IHNpbXVsdGFuZW91cyBjb21tYW5kczwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlRoZSBIQWxfRGVsYXkoKSBpcyBub3QgcmVxdWlyZWQgd2hlbiBBRFZSRUdFTiBpcyBzZXQ8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5bU1RNMzJMMDd4eHgvPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+U1RNMzJMMDh4eHg8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5dIEFEQyBJbnRlcmZhY2UgbW9kaWZpY2F0aW9uIDogQURDX0luaXQgc3RydWN0dXJlIHVwZGF0ZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPls8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5TVE0zMkwwN3h4eC88L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5TVE0zMkwwOHh4eDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPl0gQURDIEludGVyZmFjZSBtb2RpZmljYXRpb24gTG93UG93ZXJBdXRvT2ZmIGlzIG5vdyBMb3dQb3dlckF1dG9Qb3dlck9mZjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkFEQ19FbmFibGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgTG93UG93ZXJBdXRvT2ZmIGZ1bmN0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ09NUDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkNPTVBfVFJJR0dFUk1PREVfTk9ORSBtaXNzaW5nIGluIHN0bTMybDB4eF9oYWxfY29tcC5oPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Q09NUCB3cm9uZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWFjcm8gOiBJU19DT01QX1dJTkRPV01PREVfSU5TVEFOQ0U8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5NaXNwbGFjZWQgdXNlciBjYWxsYmFjayBhdCBIQUxfQ09NUF9JUlFIYW5kbGVyPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+RVhUSSBVc2FnZSBtb2RlbCB1cGRhdGUgLSBhZGQgTUFDUk9zIF9fSEFMX0NPTVBfQ09NUHhfRVhUSV9HRU5FUkFURV9TV0lUKCk8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5IQUwgQ09NUCB1cGRhdGUgaW4gSEFMX0NPTVBfTG9jaygpIHRvIGhhbmRsZSBzdGF0ZSBjaGFuZ2UgYW5kIHByZXZlbnQgQysrIGNvbXBpbGF0aW9uIGVycm9yPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkIHRoZSBMUFRJTSBDb21wYXJhdG9yIGNvbm5lY3Rpb248L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBDb3J0ZXg8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5bTUlTUkFdIGJpdHdpc2Ugb3BlcmF0b3JzIH4gYW5kICZsdDsmbHQ7IChNSVNSQSBDIDIwMDQgcnVsZSAxMC41KTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkNvcnRleCBUaGUgZnVuY3Rpb24gSEFMX05WSUNfR2V0UHJpb3JpdHkoSVJRbl9UeXBlIElSUW4pIHdhcyBtaXNzaW5nPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Q29ydGV4IEhBTF9OVklDX0Rpc2FibGVJUlEoKS9IQUxfTlZJQ19FbmFibGVJUlEoKSBBZGQgYSBjaGVjayBvbiBuZWdhdGl2ZSBwYXJhbWV0ZXIgdmFsdWVzPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ1JDPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+X19IQUxfQ1JDX1NFVF9JRFIgbWFjcm8gaW1wcm92ZW1lbnQ8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5DUkMgd3JvbmcgZGVmaW5pdGlvbiBvZiBfX0hBTF9DUkNfU0VUX0lEUiBtYWNybzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVuY29ycmVjdCBDUkMgZnVuY3Rpb25zIG5hbWluZywgcG9ydGFiaWxpdHkgZmFpbGluZywgb3V0IG9mIHRvcGljIGNvbW1lbnRzPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VXNlbGVzcyBBc3NpZ25tZW50IGluJm5ic3A7IHN0bTMybDB4eF9oYWxfY3JjLmMgZGV0ZWN0ZWQgYnkgQ29kZVNvbmFyPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgREFDPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TWlzc2luZyBkZWZpbmUgZm9yIERBQyBUcmlnZ2VyICgwMTA6IFRpbWVyIDMgQ0gzIGV2ZW50KTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkNvbXBsZXRlIERBQyB1cGRhdGUgYXMgcGVyIEhBTF9BUElfUmVmZXJlbmNlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+REFDIEhBTF9EQUNfU3RvcF9ETUEoKSBjb2RlIGNsZWFuIHVwPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX0RBQ19Db25maWdDaGFubmVsOiB1c2UgImhkYWMtJmd0O0luc3RhbmNlLSZndDtYWFgiIGluc3RlYWQgb2YgIkRBQy0mZ3Q7WFhYIjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPk5vCityZXNldCBvZiBwcmV2aW91cyBiaXRzIFdBVkV4IC8gTUFNUHggYmVmb3JlIHNldHRpbmcgdmFsdWVzIGluCitIQUxfREFDRXhfTm9pc2VXYXZlR2VuZXJhdGUgJmFtcDsgSEFMX0RBQ0V4X1RyaWFuZ2xlV2F2ZUdlbmVyYXRlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRE1BPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VGhlIGRlc2NyaXB0aW9uIG9mIF9fSEFMX0RNQV9HRVRfSVRfU09VUkNFKCkgd2FzIGluY29ycmVjdDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEZMQVNIPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+RkxBU0ggTWlzc2luZyBtYWNybyBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uIGlzc3VlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+RkxBU0hfUHJvZ3JhbV9JVCB1bmxvY2soKSBpc3N1ZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkZMQVNIIENyYXNoIGR1cmluZyBIQUxfRkxBU0hFeF9IYWxmUGFnZVByb2dyYW0gYW5kIEhBTF9GTEFTSEV4X1Byb2dyYW1QYXJhbGxlbEhhbGZQYWdlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+RkxBU0ggUmFtZnVuYyBlcnJvciBtYW5hZ2VtZW50PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+RkxBU0ggSVNfT1BUSU9OQllURShWQUxVRSkgaXMgbm90IGNvcnJlY3QgaWYgYWxsIG9wdGlvbnMgYXJlIHNlbGVjdGVkPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX0ZMQVNIIE90cGlvbiBCeXRlICJCb290Q29uZmlnIiBhbmQgIkJPT1RCaXQxQ29uZmlnIjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkZMQVNIIFNQUk1PRCBvcHRpb24gYml0IGlzIGltcGFjdGVkIGJ5IEZMQVNIX09CX1JEUENvbmZpZygpPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+X19IQUxfRkxBU0hfR0VUX0ZMQUcgd2FzIG5vdCBmdW5jdGlvbmFsPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgR1BJTzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkdQSU8mbmJzcDsgVGhlIENsZWFyIG9mIHRoZSBFeHRlcm5hbCBJbnRlcnJ1cHQgaXMgbm90IHByb3Blcmx5IGRvbmU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5HUElPIEdQSU9fU1BFRUQgTElURVJBTFMgcmVuYW1pbmc8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5HUElPX0FGIGZvciBMUFRJTSBpcyBubyBtb3JlIGNvbXBhdGlibGUgd2l0aCBIQUwgTDAgVjEuMTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkdQSU8gQUYyIGRlZmluZXMgZm9yIFJUQyBzaG91bGQgYmUgYWxpZ25lZCBmb3IgYWxsIEwwIGRldmljZXM8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5HUElPIEFGIGRlZmluZXMgZm9yIExQVElNMSBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCBkZXZpY2VzLjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkdQSU8gQnVnIGF0IEVYVGkgcmVnaXN0ZXIgR1BJTyBjb25maWcgaW4gSEFMX0dQSU9fSW5pdCgpIGZ1bmN0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+R1BJTyBHUElPX0FGNV9JMlMzZXh0IFVwZGF0ZSB0aGUgZGVmaW5lZCBuYW1lIHRvIGJlIG1vcmUgZ2VuZXJpYyZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkdQSU8gUHJvdGVjdCBpbml0IGZyb20gaW1wb3NzaWJsZSBBRiBjb25maWd1cmF0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+R1BJTyBpbnRlcnJ1cHQgbW9kZSBpcyBub3QgcmVzZXQ8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5HUElPIENoZWNrIG9mIHRoZSBQaW4gYXZhaWxhYmlsaXR5IGFjY29yZGluZyB0byB0aGUgR1BJTyBpbiB1c2U8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5HUElPIHJld29yayBHUElPX0dFVF9TT1VSQ0U8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5bPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+U1RNMzJMMDd4eHgvPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+U1RNMzJMMDh4eHg8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5dIEdQSU8gdXBkYXRlcyAoSEFMIGRyaXZlciBhbmQgYXNzb2NpYXRlZCB2YWxpZGF0aW9uIHRlc3QgcHJnKTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlRoZSBHRVRfR1BJT19TT1VSQ0UoKSBtYWNybyBpcyB3cm9uZ2x5IGltcGxlbWVudGVkPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+R1BJTyBhbHRlcm5hdGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gc3RtMzJsMHh4X2hhbF9ncGlvX2V4Lmggbm90IGFsaWduZWQgd2l0aCB0aGUgc3BlYzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkdQSU8gcHJpdmF0ZSBNYWNybyBfX0hBTF9HRVRfR1BJT19TT1VSQ0UgbXVzdCBiZSByZW5hbWVkIEdFVF9HUElPX1NPVVJDRTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEkyQzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPk5ldyBTWVNDRkcgRGVmaW5lIE1BQ1JPcyB0byBtYW5hZ2UgRk0rIG9uIEdQSU9zPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TkFDSyBpcyBub3QgdHJlYXRlZCBkdXJpbmcgd2FpdCBvbiBmbGFnIHRyZWF0bWVudDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEkyUzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkkyUyBIQUxfSTJTX1RyYW5zbWl0KCkgQVBJIHVwZGF0ZSB0byBrZWVwIHRoZSBjaGVjayBvbiBidXN5IGZsYWcgb25seSBmb3IgdGhlIHNsYXZlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+STJTIGJ1c3kgZmxhZyBpc3N1ZSZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkkyUyBNYW5hZ2VtZW50IG9mIHRoZSBiaXQgQVNUUkVOIGZvciB0aGUgSTJTIHZhcmlvdXMgbW9kZXM8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBMQ0Q8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5MQ0QgSEQgZmllbGQgaW5pdGlhbGl6YXRpb24gb2YgTENEX0ZDUiByZWdpc3RlciBpcyBtaXNzaW5nIGluIEhBTF9MQ0RfaW5pdCgpIGZ1bmN0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgTFBVQVJUPC9zcGFuPiAmbmJzcDt1cGRhdGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMIF9ESVZfTFBVQVJUIG1hY3JvIHBvc3NpYmxlIHZhbHVlIHNhdHVyYXRpb24mbmJzcDs8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5MUFVBUlQgQ1IzIHJlZ2lzdGVyIGJpdCAxMSBtdXN0IGJlIGtlcHQgYXQgcmVzZXQgdmFsdWUuPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUFdSPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Q29ydGV4IFNDUiBTTEVFUE9ORVhJVCBhbmQgU0VWT05QRU5EIGJpdHMgbWFuYWdlbWVudDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlBXUiBQVkQgZmVhdHVyZSBuZWVkIGZhbGxpbmcvcmlzaW5nIEV2ZW50IG1vZGVzPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UFdSIFJFR0xQRiBhbmQgVk9TRiBwb2xsaW5nIHJlcXVlc3Q8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0M8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SQ0MgQnVnIGluIEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TWlzc2luZyBSQ0MgSVJRIGhhbmRsZXIgZm9yIExTRSBDU1MgaW50ZXJydXB0PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TWlzc2luZyBleHRlcm5hbCBtYWNybyBfX0hBTF9SQ0NfTUNPX0NPTkZJRzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJDQyBFbmFibGUgYXV0b21hdGljYWxseSBiYWNrdXAgZG9tYWluPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SW4gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZywgUmVzZXQgYmFja3VwIGRvbWFpbiBvbmx5IGlmIFJUQyBjbG9jayBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJDQyB1cGRhdGUgTFNFX0NPTkZJRyB0byByZW1vdmUgdHJhbnNhY3Rpb24gTFNFIE9uIHRvIExTRSBCeXBhc3M8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Jc3N1ZSBvbiBNU0kgc2V0dGluZzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJld29yayBfX0hBTF9SQ0NfTFNFX0NPTkZJRyBtYWNybyB0byBtYW5hZ2UgY29ycmVjdGx5IExTRV9CeXBhc3M8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SZW5hbWUgSFNJNDhfVElNRU9VVF9WQUxVRSBpbnRvIFJDQ19IU0lfVElNRU9VVF9WQUxVRTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkFkZCBkZWZpbmVzIGZvciBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZV9TdGF0dXM8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5OZXcgSEFMIFJDQyBtYWNybyB0byBjb25maWd1cmUgdGhlIFNZU0NMSyBjbG9jayBzb3VyY2U8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Xcm9uZyBjYWxjdWxhdGlvbiBvZiBzeXNjbGsgaW4gY2FzZSBvZiBQTEwgY2xvY2tlZCBieSBIU0lfRGl2NDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJDQ19DUlNTdGF0dXNUeXBlRGVmIG11c3QgYmUgdHlwZWQgdWludDMyX3Q8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SQ0MgSW1wbGVtZW50IHdvcmthcm91bmQgdG8gY292ZXIgUkNDIGxpbWl0YXRpb24gcmVnYXJkaW5nIFBlcmlwaGVyYWwgZW5hYmxlIGRlbGF5PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UkNDIGlzc3VlIGluIEhBTF9SQ0NfT3NjQ29uZmlnIHdoZW4gUkNDX09zY0luaXRTdHJ1Y3QtJmd0O0hTRVN0YXRlID0gUkNDX0hTRV9CWVBBU1M8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SQ0MgQ2hlY2sgaWYgbmVlZCB0byBhZGQgaW50ZXJmYWNlIEhBTF9SQ0NFeF9HZXRQZXJpcGhDTEtGcmVxPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UkNDIEFkZCBhIGNvbW1lbnQgaW4gdGhlIEhvdyB0byB1c2Ugc2VjdGlvbiB0byBtZW50aW9uIHRoZSBQZXJpcGhlcmFsIGVuYWJsZSBkZWxheTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJDQyBTb21lIHZhbHVlcyBpbiBNU0lSYW5nZVRhYmxlIGFyZSB3cm9uZzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJDQyBtaXNzaW5nIG1hY3JvcyB0byBlYXNpbHkgRW5hYmxlL0Rpc2FibGUgSFNJNDgoUkMpIGNsb2NrIGZvciBSTkcgYW5hbG9nIGNvbmZpZzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJDQyBIU0VSRFkgbXVzdCBiZSBjaGVja2VkIGV2ZW4gaW4gSFNFX0JZUEFTUyBtb2RlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UkNDIEltcHJvdmUgSEFMX1JDQ19Pc2NDT25maWcoKSBmdW5jdGlvbjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJORzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJORyBUeXBlIGluY29uc2lzdGVuY3kgb2YgdmFsdWUgcmV0dXJuZWQgYnkgSEFMX1JOR19HZXRSYW5kb21OdW1iZXIoKSBhbmQgSEFMX1JOR19HZXRSYW5kb21OdW1iZXJfSVQoKSBmdW5jdGlvbnMuPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Uk5HIFByb2Nlc3MgbG9jayBhbmQgYXJyYXkgb2YgcmFuZG9tIG51bWJlcnMgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJORyBJbmNvcnJlY3QgRFJEWSBmbGFnIHJlc2V0dGluZzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJORyBJbmNvcnJlY3QgaW50ZXJydXB0IG1vZGUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Uk5HIEluY29ycmVjdCBUaW1lT3V0IGhhbmRsaW5nIGluIHBvbGxpbmcgbW9kZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb248L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSVEM8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SVEMgbWFjcm8gX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRVRfRkxBRyBlcnJvbmVvdXMgZGVmaW5pdGlvbjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlJUQyBhbGlnbm1lbnQgb2YgZGlmZmVyZW50IEhBTF9SVENfWFhJUlFIYW5kbGVyKCkgaW1wbGVtZW50YXRpb25zJm5ic3A7PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UlRDIEJpdHMgTWFzayBsaXRlcmFscyB0byBiZSB1c2VkIGluIG1hY3JvIGRlZmluaXRpb24mbmJzcDs8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SVEMgbWFjcm8gX19IQUxfUlRDX1RBTVBFUl9HRVRfSVQoKSBpc3N1ZSBpbiBwYXJhbTogX19JTlRFUlJVUFRfXyBAYXJnIGxpc3Q8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5SVEMgd3JvbmcgZGVzY3JpcHRpb24gb2YgdGhlIHN1YnNlY29uZCBpdGVtIG9mIFJUQ19UaW1lVHlwZURlZiBzdHJ1Y3R1cmUgaW4gdGhlIGhlYWRlciBmaWxlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+UlRDIFdVVFdGIGlzIG5vdCByZWxpYWJsZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTF9SVENfR2V0VGltZSBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gdGhlIGFjdHVhbCZuYnNwOyBzdWJmcmFjdGlvbjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPls8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5TVE0zMkwwMzF4eC88L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5TVE0zMkwwNDF4eDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPl0gUlRDIG1hY3JvcyByZW5hbWluZyBmb3IgUlRDX09VVFBVVF9SRU1BUF9YWCBhbmQgUlRDX1RJTUVTVEFNUFBJTl9YWDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkVuaGFuY2UgQG5vdGUgZGVzY3JpYmluZyB0aGUgdXNlIG9mIEhBTCBSVEMgQVBJcyZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNQSTwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlNQSSBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9ETUEoKSBSZW1vdmUgRE1BIFR4IENhbGxiYWNrIGluIGNhc2Ugb2YgUnhPbmx5IG1vZGUmbmJzcDs8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5TUEkgSGFuZGxlVHlwZURlZi5FcnJvckNvZGUgbXVzdCBiZSB0eXBlZCB1aW50MzJfdDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPldhcm5pbmdzIHdpdGggVHJ1ZSBTdHVkaW8gSURFICh0ZW1wcmVnIHZhcmlhYmxlIG5vdCB1c2VkKTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFRJTTwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlRJTSBwcm9ibGVtIHRvIHVzZSBFVFIgYXMgT0NyZWZDbGVhciBzb3VyY2U8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5USU0gV3JvbmcgcmVtYXBpbmcgb2YgdGhlIFRJTTJfRVRSPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VElNIHJlZ2lzdGVyIEJEVFIgZG9lcyBub3QgZXhpc3Q8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5UaGUgYXNzZXJ0IG9uIHRyaWdnZXIgcG9sYXJpdHkgZm9yIFRJMUZfRUQgc2hvdWxkIGJlIHJlbW92ZWQ8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5USU0gQWRkIG1hY3JvcyB0byBFTkFCTEUvRElTQUJMRSBVUlMgYml0IGluIFRJTSBDUjEgcmVnaXN0ZXI8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5USU0gSEFMX1RJTV9PQ19Db25maWdDaGFubmVsKCkgLyBIQUxfVElNX1BXTV9Db25maWdDaGFubmVsKCkgTWlzc2VkL1VudXNlZCBhc3NlcnQgcGFyYW0gdG8gYmUgYWRkZWQvcmVtb3ZlZDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlRJTSBSZW1vdmUgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9uaXphdGlvbl9ETUEoKSBmcm9tIEhBTF9USU0gQVBJPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VElNIFRyaWdnZXIgRE1BIHJlcXVlc3Qgc2hvdWxkIGJlIGFjdGl2YXRlZCB3aGVuIHdvcmtpbmcgd2l0aCBhIHNsYXZlIG1vZGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5USU0gVGltZXIgUmVnaXN0ZXIgQ29ycnVwdGlvbiB1c2luZyBIQUxfVElNX0lDX0NvbmZpZ0NoYW5uZWw8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5USU0gRE1BIHRyYW5zZmVyIHNob3VsZCBiZSBhYm9ydGVkIHdoZW4gc3RvcHBpbmcgYSBETUEgYnVyc3Q8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGQgIlRJTV9DSEFOTkVMX0FMTCIgYXMgYW4gYXJndW1lbnQgZm9yIGFsbCBFbmNvZGVyIFN0YXJ0L1N0b3AgcHJvY2VzcyBpbiB0aGUgY29tbWVudCBzZWN0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX1RJTV9ETUFEZWxheVB1bHNlQ3BsdCBjYWxsYmFjayBtaXNzaW5nIGluZm9ybWF0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX1RJTV9ETUFDYXB0dXJlQ3BsdCBjYWxsYmFjayBtaXNzaW5nIGluZm9ybWF0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VElNIFRyaWdnZXIgRE1BIHJlcXVlc3Qgc2hvdWxkIGJlIGFjdGl2YXRlZCB3aGVuIHdvcmtpbmcgd2l0aCBhIHNsYXZlIG1vZGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5USU0gVHJpZ2dlciBpbnRlcnJ1cHQgc2hvdWxkIGJlIGFjdGl2YXRlZCB3aGVuIHdvcmtpbmcgd2l0aCBhIHNsYXZlIG1vZGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5fX0hBTF9USU1fUFJFU0NBTEVSKCkgc2hhbGwgYmUgY29ycmVjdGVkOiB1c2UgJz0nIGluc3RlYWQgb2YgJ3w9Jzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFVBUlQvVVNBUlQ8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VQVJUIEluY29ycmVjdCBVQVJUIHNwZWVkIHNldHRpbmcgb24gSFNJIGNsb2NrPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+V3JvbmcgQmF1ZCBSYXRlIGNhbGN1bGF0aW9uIGluIGNhc2Ugb2YgT1ZFUjg8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VQVJUIG1pc3NpbmcgY2xvc2luZyBicmFja2V0IGluIGhlYWRlciBmaWxlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VUFSVCBDaXJjdWxhciBtb2RlIHdoZW4gdHJhbnNtaXR0aW5nIGRhdGEgbm90IHdlbGwgc3VwcG9ydGVkPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VUFSVC9MUFVBUlQgbnVtYmVyIG9mIHN0b3AgYml0cyB0byBjb3JyZWN0PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VVNBUlQgSW5jb3JyZWN0IG51bWJlciBvZiBzdG9wIGJpdHMgZGVmaW5pdGlvbjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVBUlQmbmJzcDsgSEFMX1VBUlRfSVJRSGFuZGxlciBmdW5jdGlvbiBub3QgY2xlYXJpbmcgY29ycmVjdGx5IHRoZSBpbnRlcnJ1cHQgZmxhZ3M8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VU0FSVCBTZXR0aW5nIG9mIEJSUiByZWdpc3RlciBiaXQzOjAgbm90IGlubGluZSB3aXRoIFJNIHdoZW4gT1ZFUjggc2FtcGxpbmcgbW9kZSBpcyB1c2VkPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VUFSVCBVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQgc2hvdWxkIG5vdCBhc3NpZ24gVUFSVCBoYW5kbGUgc3RhdGUgdG8gSEFMX1VBUlRfU1RBVEVfVElNRU9VVDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVTQVJUIFdyb25nIHZhbHVlcyB1c2VkIGFzIHBhcmFtZXRlciBvZiBfX0hBTF9VU0FSVF9DTEVBUl9JVCgpIGluIEhBTF9VU0FSVF9JUlFIYW5kbGVyKCk8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VU0FSVCBCUlIgc2V0dGluZyBpcyB3cm9uZyBjb21wYXJlZCB0byBCYXVkcmF0ZSB2YWx1ZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVTQVJUIEhBTF9VU0FSVF9Jbml0KCkgdXBkYXRlIHRvIHJlYWNoIG1heCBmcmVxdWVuY2llcyAoZW5hYmxlIG92ZXJzYW1wbGluZyBieSA4KTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVTQVJUIFVTQVJUX0RNQVJlY2VpdmVDcGx0KCkgVXBkYXRlIHRvIHNldCB0aGUgVVNBUlQgc3RhdGUgYWZ0ZXIgcGVyZm9ybWluZyB0aGUgdGVzdCBvbiBpdDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVBUlQgVGhlIGNvZGUgYXNzb2NpYXRlZCB0byBzZXZlcmFsIG1hY3JvcyBuZWVkIHRvIGJlIGNvbXBsZXRlZDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVTQVJUIFVBUlQgRE1BIGltcGxlbWVudGF0aW9uIGlzc3VlOiBtaXNzZWQgY2xlYXIgdGhlIFRDIGJpdCBpbiB0aGUgU1I8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5Xcm9uZyBVU0FSVF9JVF9DTSBkZWZpbmVkIHZhbHVlPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SXNzdWUgd2l0aCBMaW4gbW9kZSBkYXRhIGxlbmd0aDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPldyb25nIGRlc2NyaXB0aW9uIGZvciBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gd2l0aGluIEhBTCBVQVJUIGRyaXZlcjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkNoYW5nZSBVQVJUX0RNQVRyYW5zbWl0Q3BsdC0gbmV3IGltcGxlbWVudGF0aW9uIHRvIHJlbW92ZSBXYWl0T25GbGFnIGluIElTUjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkNoYW5nZSBVQVJUIFRYLUlUIGltcGxlbWVudGF0aW9uIHRvIHJlbW92ZSBXYWl0T25GbGFnIGluIElTUjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlRoZSBJU19VQVJUX09WRVJTQU1QTElORyhTQU1QTElORykgaXMgbm90IGNhbGxlZCBpbiBVQVJUX1NldENvbmZpZygpPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMIFVBUlQgZW5oYW5jZW1lbnQ6IHJlbW92ZSB0aGUgY2hlY2sgb24gUlhORSBmbGFnIGFmdGVyIHJlYWRpbmcgdGhlIERSIHJlZ2lzdGVyPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+VUFSVC9VU0FSVC9JUkRBL1NNQVJUQ0FSRCB0cmFuc21pdCBwcm9jZXNzIGVuaGFuY2VtZW50IHRvIHVzZSBUWEUgaW5zdGVhZCBvZiBUQzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkFkZCBNQUNSTyB0byBVQVJUIEhBTCB0byBjb250cm9sIENUUyBhbmQgUlRTIGZyb20gdGhlIGN1c3RvbWVyIGFwcGxpY2F0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUENEPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX1BDRF9FUF9UcmFuc21pdCgpIG5vdCBmdW5jdGlvbmFsPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMIFBDRCBjbGVhciBmbGFnIG1hY3JvcyBjb25maWd1cmF0aW9uPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QmFkIElOL09VVCBFbmRQb2ludCBwYXJhbWV0ZXIgYXJyYXkgc2l6ZTwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTCBQQ0QgbWlzcyAjZGVmaW5lIGZvciBlcDBfbXBzIHBhcmFtZXRlcjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlVTQiBIQUwgUENEIG1pc3NpbmcgI2RlZmluZSBQQ0RfU1BFRURfSElHSDxicj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48L3VsPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NtYWxsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjIuMAorLyAwNi1GZWItMjAxNTwvc3Bhbj48L2gzPgorPGJpZz48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvYmlnPgorPHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5IQUwKK2hhcworYmVlbiB1cGRhdGVkIHRvIHN1cHBvcnQgdGhlIFNUTTMyTDA3MXh4ICZuYnNwO1NUTTMyTDA3Mnh4CitTVE0zMkwwNzN4eCBTVE0zMkwwODJ4eCBTVE0zMkwwODN4eCBzZXJpZXM8L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRmxhc2g8L3NwYW4+IHVwZGF0ZSA8YnI+Cis8L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+Rmxhc2gKKzogJm5ic3A7MTkySyBEdWFsIEJhbmsmbmJzcDs8L3NwYW4+PC9saT48L3VsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBUSU08L3NwYW4+IHVwZGF0ZQorOiZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5Gb3VyCituZXcgaW5zdGFuY2VzICZuYnNwOzombmJzcDs8L3NwYW4+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPlRJTTMsIFRJTTcsIFRJTTIxLCBUSU0yMjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVVNBUlQ8L3NwYW4+IHVwZGF0ZSA6PC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPlR3bworbmV3IGluc3RhbmNlcyA6Jm5ic3A7VVNBUlQgNCwgVVNBUlQgNTwvc3Bhbj48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEkyQzwvc3Bhbj4gdXBkYXRlIDo8L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+T25lCituZXcgaW5zdGFuY2UgSTJDMzwvc3Bhbj48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEdQSU88L3NwYW4+IHVwZGF0ZSA6PC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPkdQSU8KK1BvcnQgRTwvc3Bhbj48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERBQzwvc3Bhbj4gdXBkYXRlIDo8L3NwYW4+PC9saT48dWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+QQorc2Vjb25kIGNoYW5uZWwgaGFzIGJlZW4gaW50cm9kdWNlZDwvc3Bhbj48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEZJUkVXQUxMPC9zcGFuPgoraW50cm9kdWN0aW9uPGJyPgorPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+QWxsCitvdGhlciA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSVBzPC9zcGFuPgoraGF2ZSBhbHNvIGJlZW4gdXBkYXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgb3ZlcmFsbCBIQUwgYWxpZ25tZW50CitlZmZvcnQgb2YgYWxsIHRoZSBTVE0zMiBmYW1pbHk8L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5Nb3JlCit0aGFuIDEyMCBjb3JyZWN0aW9ucyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgc2luY2UgdGhlIHByZXZpb3VzIFYxLjEuMAorZGVsaXZlcnk8YnI+Cis8L3NwYW4+PC9saT48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5Lbm93biBsaW1pdGF0aW9uczwvc3Bhbj4gOjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPjxsaT5JbnRyb2R1Y2VkCithIEZXIHBhdGNoIHRvIGRlYWN0aXZhdGUgdGhlIEhXIFNQSS1WMi4zIGNvcnJlY3Rpb24gaW4gY2FzZSBvZiBJMlMgUENNCitTaG9ydCBtb2RlIHVzYWdlIChQbGVhc2UgcmVmZXIgdG8gdGhlIFNUTTMyTDA3M3h4IEVycmF0YSBTaGVldCBmb3IgbW9yZQorZGV0YWlscykuIEluIHRoaXMgdXNlIGNhc2UsIHdlIGNvbWUgYmFjayB0byB0aGUgSFcgU1BJIDIuMiBiZWhhdmlvcgord2hpY2ggaXMgY29ycmVjdCBmb3IgdGhlIEkyUyBQQ00gc2hvcnQgbW9kZTwvbGk+PC91bD48L3VsPgorPGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMS4wCisvIDE4LUp1bmUtMjAxNDwvc3Bhbj48L2gzPgorPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tcmlnaHQ6IDBjbTsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD4KKzx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c21hbGw+Cis8L3NtYWxsPgorPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIGdlbmVyaWM8L3NwYW4+IHVwZGF0ZTxicj4KKzwvc3Bhbj48L3NtYWxsPjwvcD4KKzwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkZpeAorZmxhZyBjbGVhciBwcm9jZWR1cmU6IHVzZSBhdG9taWMgd3JpdGUgb3BlcmF0aW9uIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Ij0iCis8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPmluc3RlYWQKK29mIHJlYWR5LW1vZGlmeS13cml0ZSBvcGVyYXRpb24gInw9IiBvciAiJmFtcDs9Ijwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Rml4CitvbiBUaW1lb3V0IG1hbmFnZW1lbnQsIFRpbWVvdXQgdmFsdWUgc2V0IHRvIDAgcGFzc2VkIHRvIEFQSQorYXV0b21hdGljYWxseSBleGl0cyB0aGUgZnVuY3Rpb24gYWZ0ZXIgY2hlY2tpbmcgdGhlIGZsYWcgd2l0aG91dCBhbnkKK3dhaXQ8L3NwYW4+PGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Q29tbW9uCit1cGRhdGUgZm9yPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4KK3RoZSBmb2xsb3dpbmcgY29tbXVuaWNhdGlvbiBwZXJpcGhlcmFsczogU1BJLCBVQVJULCBVU0FSVCBhbmQgSVJEQTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Cis8L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQKK0RNQSBjaXJjdWxhciBtb2RlIHN1cHBvcnQ8YnI+Cis8L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJlbW92ZQorbG9jayBmcm9tIHJlY3Vyc2l2ZSBwcm9jZXNzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48YnI+Cis8L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkCituZXcgbWFjcm8gX19IQUxfUkVTRVRfSEFORExFX1NUQVRFIHRvIHJlc2V0IGEgZ2l2ZW4gaGFuZGxlIHN0YXRlPC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5XaGVuCitVU0VfUlRPUyA9PSAxIChpbiBzdG0zMmwweHhfaGFsX2NvbmYuaCksIHRoZSBfX0hBTF9MT0NLKCkgaXMgbm90CitkZWZpbmVkIGluc3RlYWQgb2YgYmVpbmcgZGVmaW5lZCBlbXB0eTwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7Ij5Vc2UKKyYjODIyMDtfX0lPIGNvbnN0JiM4MjIxOyBpbnN0ZWFkIG9mCismIzgyMjA7X19JJiM4MjIxOywgdG8gYXZvaWQgYW55IGNvbXBpbGF0aW9uIGlzc3VlIHdoZW4gX19jcGx1c3BsdXMgc3dpdGNoIGlzIGRlZmluZWQ8L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorbmV3IGZ1bmN0aW9ucyBmb3IgdGhlIERCR01DVSBtb2R1bGU8L3NwYW4+PC9zbWFsbD48L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfRW5hYmxlREJHU2xlZXBNb2RlKCk8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX0Rpc2FibGVEQkdTbGVlcE1vZGUoKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfRW5hYmxlREJHU3RvcE1vZGUoKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfRGlzYWJsZURCR1N0b3BNb2RlKCk8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX0VuYWJsZURCR1N0YW5kYnlNb2RlKCk8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX0Rpc2FibGVEQkdTdGFuZGJ5TW9kZSgpPC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDExNSU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiB3aW5kb3d0ZXh0OyI+TWlzY2VsbGFuZW91cworY29tbWVudHMgdXBkYXRlPC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIFdvcmRTZWN0aW9uMSIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBGTEFTSCA8L3NwYW4+dXBkYXRlIDxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9wPgorPHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorbmV3IGZ1bmN0aW9uczogPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9GTEFTSEV4X09CX1NlbGVjdFBDUk9QKCk8L3NwYW4+CithbmQgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9GTEFTSEV4X09CX0RlU2VsZWN0UENST1AoKTwvc3Bhbj48bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+U29tZQorZnVuY3Rpb25zIHdhcyByZW5hbWVkIGFuZCBtb3ZlZCB0byB0aGUgZXh0ZW5zaW9uIGZpbGVzCisoc3RtMzJsMHh4X2hhbF9mbGFzaF9leC5oLy5jKTxicj4KKzwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJlbmFtZQorPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkZMQVNIX0hhbGZQYWdlUHJvZ3JhbSgpPC9zcGFuPgoraW50byA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX0ZMQVNIRXhfSGFsZlBhZ2VQcm9ncmFtKCk8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJlbmFtZQorPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkZMQVNIX0VuYWJsZVJ1blBvd2VyRG93bigpPC9zcGFuPgoraW50byA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX0ZMQVNIRXhfRW5hYmxlUnVuUG93ZXJEb3duKCk8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJlbmFtZQorPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkZMQVNIX0Rpc2FibGVSdW5Qb3dlckRvd24oKTwvc3Bhbj4KK2ludG8gPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9GTEFTSEV4X0Rpc2FibGVSdW5Qb3dlckRvd24oKTwvc3Bhbj48bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+UmVuYW1lCithbGw8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+CitIQUxfREFUQV9FRVBST01FeF94eHgoKTwvc3Bhbj4gZnVuY3Rpb25zIGludG8gPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9GTEFTSEV4X0RBVEFFRVBST01feHh4KCk8L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogd2luZG93dGV4dDsiPk5vdGU6CithbGlhc2VzIGhhcyBiZWVuIGFkZGVkIHRvIGtlZXAgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb248L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PC91bD4KKzxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTE1JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHdpbmRvd3RleHQ7Ij48YnI+Cis8L3NwYW4+PC9zbWFsbD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5HUElPIDwvc3Bhbj51cGRhdGU8bzpwPjwvbzpwPjxicj4KKzwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJlbW92ZQorPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPklTX0dFVF9HUElPX1BJTjwvc3Bhbj4KK21hY3JvPG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorYSBuZXcgZnVuY3Rpb24gPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9HUElPX0xvY2tQaW4oKTwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlByaXZhdGUKK01hY3JvIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5fX0hBTF9HRVRfR1BJT19TT1VSQ0U8L3NwYW4+CityZW5hbWVkIGludG8gPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkdFVF9HUElPX1NPVVJDRQorPGJyPgorPC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBETUE8L3NwYW4+IHVwZGF0ZTxicj4KKzwvc3Bhbj48L3NtYWxsPjwvcD4KKzwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkZpeAoraW4mbmJzcDs8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX0RNQV9Qb2xsRm9yVHJhbnNmZXIoKTwvc3Bhbj4KK3RvIHNldCBlcnJvciBjb2RlIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5IQUxfRE1BX0VSUk9SX1RFCis8L3NwYW4+aW4gY2FzZSBvZiA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX0VSUk9SPC9zcGFuPiBzdGF0dXM8L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PC91bD4KKzxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PGJyPgorPC9zcGFuPjwvc21hbGw+Cis8dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCBXb3JkU2VjdGlvbjEiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBXUjwvc3Bhbj4gdXBkYXRlPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGJyPgorPC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIFdvcmRTZWN0aW9uMSIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX1BXUl9QVkRDb25maWcoKTwvc3Bhbj46CithZGQgY2xlYXIgb2YgdGhlIEVYVEkgdHJpZ2dlciBiZWZvcmUgbmV3IGNvbmZpZ3VyYXRpb24gPGJyPgorPC9zcGFuPjwvc21hbGw+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCBXb3JkU2VjdGlvbjEiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Rml4CitpbiA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX1BXUl9FbnRlclNUQU5EQllNb2RlKCk8L3NwYW4+Cit0byBub3QgY2xlYXIgV2FrZXVwIGZsYWcgKFdVRiksIHdoaWNoIG5lZWQgdG8gYmUgY2xlYXJlZCBhdCBhcHBsaWNhdGlvbgorbGV2ZWwgYmVmb3JlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbjxicj4KKzwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0M8L3NwYW4+IHVwZGF0ZTxicj4KKzwvc3Bhbj48L3NtYWxsPjwvcD4KKzwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFsbG93Cit0byBjYWxpYnJhdGUgdGhlIEhTSSB3aGVuIGl0IGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZTxicj4KKzwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+Rml4CitpbXBsZW1lbnRhdGlvbiBvZiA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SVNfUkNDX09TQ0lMTEFUT1JUWVBFKCk8L3NwYW4+CittYWNybzxicj4KKzwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBBREM8L3NwYW4+IHVwZGF0ZTxicj4KKzwvc3Bhbj48L3NtYWxsPjwvcD4KKzwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlVwZGF0ZQorQURDIGludGVybmFsIGNoYW5uZWxzIG1hcHBpbmc6IFRFTVBTRU5TT1IgY29ubmVjdGVkIHRvIEFEQ19DSEFOTkVMXzE4CithbmQgVkxDRCBtYXBwZWQgdG8gQURDX0NIQU5ORUxfMTYgPGJyPgorPC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5Ta2lwCitwb2xsaW5nIGZvciBBRFJEWSBmbGFnIHdoZW4gTG93IFBvd2VyIEF1dG8gT2ZmIG1vZGUgaXMgZW5hYmxlZDxicj4KKzwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBDT01QPC9zcGFuPiB1cGRhdGU8YnI+Cis8L3NwYW4+PC9zbWFsbD48L3A+Cis8dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkCis8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+TFBUSU1Db25uZWN0aW9uPC9zcGFuPgorZmllbGQgaW4gdGhlIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5DT01QX0luaXRUeXBlRGVmPC9zcGFuPgorc3RydWN0dXJlLjxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQKK25ldyBkZWZpbmVzOiA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+Q09NUF9MUFRJTUNPTk5FQ1RJT05fRElTQUJMRUQ8L3NwYW4+LAorPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkNPTVBfTFBUSU1DT05ORUNUSU9OX0VOQUJMRUQ8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorbmV3IG1hY3JvIElTX0NPTVBfTFBUSU1DT05ORUNUSU9OPG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+Cis8L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIFdvcmRTZWN0aW9uMSIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBMUFRJTSA8L3NwYW4+dXBkYXRlPGJyPgorPC9zcGFuPjwvc21hbGw+PC9wPgorPC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkCis8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+Q0tQT0wgPC9zcGFuPmNvbmZpZ3VyYXRpb24KK2ZvciBlbmNvZGVyIG1vZDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5lPC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCBXb3JkU2VjdGlvbjEiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzbWFsbD4KKzwvc21hbGw+Cis8cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+V1dERyA8L3NwYW4+dXBkYXRlPGJyPgorPC9zcGFuPjwvc21hbGw+PC9wPgorPC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+TWlzY2VsbGFuZW91cworbWlub3IgdXBkYXRlIG9uIHRoZSBzb3VyY2UgY29kZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIFdvcmRTZWN0aW9uMSIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5JV0RHIDwvc3Bhbj51cGRhdGU8YnI+Cis8L3NwYW4+PC9zbWFsbD48L3A+Cis8L2xpPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5NaXNjZWxsYW5lb3VzCittaW5vciB1cGRhdGUgb24gdGhlIHNvdXJjZSBjb2RlPC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIFdvcmRTZWN0aW9uMSIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5DUkMgPC9zcGFuPnVwZGF0ZTxicj4KKzwvc3Bhbj48L3NtYWxsPjwvcD4KKzx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5Tb21lCitmdW5jdGlvbnMgd2FzIHJlbmFtZWQgYW5kIG1vdmVkIHRvIHRoZSBleHRlbnNpb24gZmlsZXMKKyhzdG0zMmwweHhfaGFsX2NyY19leC5oLy5jKTwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zdHlsZTogaXRhbGljOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX0NSQ19JbnB1dF9EYXRhX1JldmVyc2UoKTwvc3Bhbj4KK3JlbmFtZWQgaW50byA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX0NSQ0V4X0lucHV0X0RhdGFfUmV2ZXJzZSgpPC9zcGFuPjxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX0NSQ19PdXRwdXRfRGF0YV9SZXZlcnNlKCk8L3NwYW4+CityZW5hbWVkIGludG8gPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlKCk8L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMTUlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogd2luZG93dGV4dDsiPk5vdGU6CithbGlhc2VzIGhhcyBiZWVuIGFkZGVkIHRvIGtlZXAgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb248L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PC91bD4KKzwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwgV29yZFNlY3Rpb24xIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c21hbGw+Cis8L3NtYWxsPgorPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkNSWVAgPC9zcGFuPnVwZGF0ZTxicj4KKzwvc3Bhbj48L3NtYWxsPjwvcD4KKzx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5IQUxfQ1JZUF9Db21wdXRhdGlvbkNwbHRDYWxsYmFjaygpPC9zcGFuPgorPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5yZW5hbWVkCitpbnRvIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXN0eWxlOiBpdGFsaWM7Ij5IQUxfQ1JZUEV4X0NvbXB1dGF0aW9uQ3BsdENhbGxiYWNrKCkKK2FuZCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPm1vdmVkCit0byB0aGUgZXh0ZW5zaW9uIGZpbGVzIChzdG0zMmwweHhfaGFsX2NyeXBfZXguaC8uYyk8L3NwYW4+PC9zbWFsbD48L2xpPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDExNSU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiB3aW5kb3d0ZXh0OyI+Tm90ZToKK2FsaWFzIGhhcyBiZWVuIGFkZGVkIHRvIGtlZXAgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb248L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+Cis8L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c21hbGw+Cis8L3NtYWxsPgorPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkkyQzwvc3Bhbj4gdXBkYXRlPGJyPgorPC9zcGFuPjwvc21hbGw+PC9wPgorPC9saT48dWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkCittYW5hZ2VtZW50IG9mIE5BQ0sgZXZlbnQgaW4gTWFzdGVyIHRyYW5zbWl0dGVyIG1vZGUgYW5kIFNsYXZlCit0cmFuc21pdHRlci9yZWNlaXZlciBtb2RlcyAob25seSBpbiBwb2xsaW5nIG1vZGUpLCBpbiB0aGF0IGNhc2UgdGhlCitjdXJyZW50IHRyYW5zZmVyIGlzIHN0b3BwZWQuPC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+Cis8L3NtYWxsPgorPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPlNNQlVTIDwvc3Bhbj51cGRhdGU8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvcD4KKzwvbGk+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorYSBuZXcgZnVuY3Rpb246IDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5IQUxfU01CVVNfRGlzYWJsZUxpc3Rlbl9JVCgpPC9zcGFuPjwvc3Bhbj48YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQKK2FsaWFzZXMgZm9yIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIDxicj4KKzwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaSBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4jZGVmaW5lCitIQUxfU01CVVNfU2xhdmVfTGlzdGVuX0lUJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitIQUxfU01CVVNfRW5hYmxlTGlzdGVuX0lUPC9zcGFuPjwvc21hbGw+PC9saT48bGkgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+I2RlZmluZQorSEFMX1NNQlVTX1NsYXZlQWRkckNhbGxiYWNrJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitIQUxfU01CVVNfQWRkckNhbGxiYWNrPC9zcGFuPjwvc21hbGw+PC9saT48bGkgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+I2RlZmluZQorSEFMX1NNQlVTX1NsYXZlTGlzdGVuQ3BsdENhbGxiYWNrIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2s8L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkCithbGlhcyA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX1NNQlVTX1NUQVRFX1NMQVZFX0xJU1RFTjwvc3Bhbj4KK2ZvciB0aGUgY29uc3RhbnQgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9TTUJVU19TVEFURV9MSVNURU48L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIFdvcmRTZWN0aW9uMSIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5VQVJUIDwvc3Bhbj51cGRhdGU8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvcD4KKzx1bD48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfVUFSVF9XYWtldXBDYWxsYmFjazwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPigpPC9zcGFuPiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPnJlbmFtZWQKK2ludG8mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhBTF9VQVJUX1dha2V1cENhbGxiYWNrPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigpCithbmQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5tb3ZlZAordG8gdGhlIGV4dGVuc2lvbiBmaWxlcyAoc3RtMzJsMHh4X2hhbF9jcnlwX2V4LmgvLmMpPC9zcGFuPjwvc21hbGw+PC9saT48bGk+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4KK0FkZAorbmV3IG1hY3JvcyB0byBjb250cm9sIENUUyBhbmQgUlRTPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48YnI+Cis8L3NwYW4+PC9zbWFsbD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorc3BlY2lmaWMgbWFjcm9zIHRvIG1hbmFnZSB0aGUgZmxhZ3MgY2xlYXJlZCBvbmx5IGJ5IGEgc29mdHdhcmUgc2VxdWVuY2U8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5fX0hBTF9VQVJUX0NMRUFSX1BFRkxBRygpPG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5fX0hBTF9VQVJUX0NMRUFSX0ZFRkxBRygpPG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5fX0hBTF9VQVJUX0NMRUFSX05FRkxBRygpPG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5fX0hBTF9VQVJUX0NMRUFSX09SRUZMQUcoKTxvOnA+PC9vOnA+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PC9zbWFsbD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPl9fSEFMX1VBUlRfQ0xFQVJfSURMRUZMQUcoKTwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQKK3NldmVyYWwgZW5oYW5jZW1lbnRzIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBkcml2ZXIgZnVuY3Rpb25hbGl0aWVzIDxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+UmVtb3ZlCit0aGUgY2hlY2sgb24gUlhORSBzZXQgYWZ0ZXIgcmVhZGluZyB0aGUgRGF0YSBpbiB0aGUgRFIgcmVnaXN0ZXI8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+VXBkYXRlCit0aGUgdHJhbnNtaXQgcHJvY2Vzc2VzIHRvIHVzZSBUWEUgaW5zdGVhZCBvZiBUQzwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+VXBkYXRlCis8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+SEFMX1VBUlRfVHJhbnNtaXRfSVQoKTwvc3Bhbj4KK3RvIGVuYWJsZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+VUFSVF9JVF9UWEU8L3NwYW4+CitpbnN0ZWFkIG9mIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5VQVJUX0lUX1RDPC9zcGFuPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48L3VsPgorPC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBVU0FSVDwvc3Bhbj4gdXBkYXRlPGJyPgorPC9zcGFuPjwvc21hbGw+PC9wPgorPC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkCitzcGVjaWZpYyBtYWNyb3MgdG8gbWFuYWdlIHRoZSBmbGFncyBjbGVhcmVkIG9ubHkgYnkgYSBzb2Z0d2FyZSBzZXF1ZW5jZTwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5fX0hBTF9VU0FSVF9DTEVBUl9QRUZMQUcoKTxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjx1bCBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+X19IQUxfVVNBUlRfQ0xFQVJfRkVGTEFHKCk8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48dWwgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPl9fSEFMX1VTQVJUX0NMRUFSX05FRkxBRygpPG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5fX0hBTF9VU0FSVF9DTEVBUl9PUkVGTEFHKCk8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPl9fSEFMX1VTQVJUX0NMRUFSX0lETEVGTEFHKCk8L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlVwZGF0ZQorPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9VU0FSVF9UcmFuc21pdF9JVCgpPC9zcGFuPgordG8gZW5hYmxlIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5VU0FSVF9JVF9UWEU8L3NwYW4+CitpbnN0ZWFkIG9mIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5VU0FSVF9JVF9UQzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBJUkRBPC9zcGFuPiB1cGRhdGU8YnI+Cis8L3NwYW4+PC9zbWFsbD48L3A+Cis8dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkCitzcGVjaWZpYyBtYWNyb3MgdG8gbWFuYWdlIHRoZSBmbGFncyBjbGVhcmVkIG9ubHkgYnkgYSBzb2Z0d2FyZSBzZXF1ZW5jZTwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+X19IQUxfSVJEQV9DTEVBUl9QRUZMQUcoKTxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBmb250LXN0eWxlOiBpdGFsaWM7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPl9fSEFMXworSVJEQSBfQ0xFQVJfRkVGTEFHKCk8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgZm9udC1zdHlsZTogaXRhbGljOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5fX0hBTF8KK0lSREEgX0NMRUFSX05FRkxBRygpPG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+X19IQUxfCitJUkRBIF9DTEVBUl9PUkVGTEFHKCk8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPl9fSEFMXyBJUkRBIF9DTEVBUl9JRExFRkxBRygpPC9zcGFuPjxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorc2V2ZXJhbCBlbmhhbmNlbWVudHMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGRyaXZlciBmdW5jdGlvbmFsaXRpZXM8L3NwYW4+PC9zbWFsbD48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iY2lyY2xlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5SZW1vdmUKK3RoZSBjaGVjayBvbiBSWE5FIHNldCBhZnRlciByZWFkaW5nIHRoZSBEYXRhIGluIHRoZSBEUiByZWdpc3Rlcjwvc3Bhbj48YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvc21hbGw+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5VcGRhdGUKKzxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5IQUxfSVJEQV9UcmFuc21pdF9JVCgpPC9zcGFuPgordG8gZW5hYmxlIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5JUkRBX0lUX1RYRTwvc3Bhbj4KK2luc3RlYWQgb2YgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPklSREFfSVRfVEM8L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAordGhlIGZvbGxvd2luZyBBUElzIHVzZWQgd2l0aGluIERNQSBwcm9jZXNzIDxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgZm9udC1zdHlsZTogaXRhbGljOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfU3RhdHVzVHlwZURlZgorSEFMX0lSREFfRE1BUGF1c2UoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1N0YXR1c1R5cGVEZWYKK0hBTF9JUkRBX0RNQVJlc3VtZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTs8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgZm9udC1zdHlsZTogaXRhbGljOyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfU3RhdHVzVHlwZURlZgorSEFMX0lSREFfRE1BU3RvcChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgPG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+dm9pZAorSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOzxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+dm9pZAorSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOzwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PC91bD4KKzwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzbWFsbD4KKzwvc21hbGw+Cis8cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU01BUlRDQVJEPC9zcGFuPiB1cGRhdGU8YnI+Cis8L3NwYW4+PC9zbWFsbD48L3A+Cis8L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQKK3NwZWNpZmljIG1hY3JvcyB0byBtYW5hZ2UgdGhlIGZsYWdzIGNsZWFyZWQgb25seSBieSBhIHNvZnR3YXJlIHNlcXVlbmNlPC9zcGFuPjwvc21hbGw+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+X19IQUxfU01BUlRDQVJEX0NMRUFSX1BFRkxBRygpPG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPl9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GRUZMQUcoKTxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5fX0hBTF9TTUFSVENBUkRfQ0xFQVJfTkVGTEFHKCk8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+X19IQUxfU01BUlRDQVJEX0NMRUFSX09SRUZMQUcoKTxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+X19IQUxfU01BUlRDQVJEX0NMRUFSX0lETEVGTEFHKCk8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkCitzZXZlcmFsIGVuaGFuY2VtZW50cyB3aXRob3V0IGFmZmVjdGluZyB0aGUgZHJpdmVyIGZ1bmN0aW9uYWxpdGllczwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorYSBuZXcgc3RhdGUgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWF9SWDwvc3Bhbj4KK2FuZCBhbGwgcHJvY2Vzc2VzIGhhcyBiZWVuIHVwZGF0ZWQgYWNjb3JkaW5nbHk8L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsPjxsaT48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlVwZGF0ZQorPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9TTUFSVENBUkRfVHJhbnNtaXRfSVQoKTwvc3Bhbj4KK3RvIGVuYWJsZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+U01BUlRDQVJEX0lUX1RYRTwvc3Bhbj4KK2luc3RlYWQgb2YgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPlNNQVJUQ0FSRF9JVF9UQzwvc3Bhbj48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PC91bD48L3VsPgorPHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+PGJyPgorPC9zcGFuPjwvc3Bhbj48L3NtYWxsPgorPHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNQSTwvc3Bhbj4gdXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkJ1Z3MKK2ZpeDwvc3Bhbj48L3NtYWxsPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlNQSQoraW50ZXJmYWNlIGlzIHVzZWQgaW4gc3luY2hyb25vdXMgcG9sbGluZyBtb2RlOiBhdCBoaWdoIGNsb2NrIHJhdGVzIGxpa2UKK1NQSSBwcmVzY2FsZXIgMiBhbmQgNCwgY2FsbGluZyA8YnI+CitIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZSgpIHJldHVybnMgd2l0aCBlcnJvciBIQUxfVElNRU9VVDwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQSgpPC9zcGFuPgorZG9lcyBub3QgY2xlYW4gdXAgdGhlIFRYIERNQSwgc28gYW55IHN1YnNlcXVlbnQgU1BJIGNhbGxzIHJldHVybiB0aGUKK0RNQSBlcnJvcjwvc3Bhbj48L3NtYWxsPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPkhBTF9TUElfVHJhbnNtaXRfRE1BKCk8L3NwYW4+CitpcyBmYWlsaW5nIHdoZW4gZGF0YSBzaXplIGlzIGVxdWFsIHRvIDEgYnl0ZTwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQKK3RoZSBmb2xsb3dpbmcgQVBJcyB1c2VkIHdpdGhpbiB0aGUgRE1BIHByb2Nlc3M8bzpwPjwvbzpwPjwvc3Bhbj48L3NtYWxsPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImNpcmNsZSI+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfU3RhdHVzVHlwZURlZgorSEFMX1NQSV9ETUFQYXVzZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfU3RhdHVzVHlwZURlZgorSEFMX1NQSV9ETUFSZXN1bWUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOzxvOnA+PC9vOnA+PC9zcGFuPjwvc21hbGw+PC9saT48L3VsPjx1bCBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1N0YXR1c1R5cGVEZWYKK0hBTF9TUElfRE1BU3RvcChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij52b2lkCitIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij52b2lkCitIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij52b2lkCitIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTs8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9zbWFsbD48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBUU0M8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvc21hbGw+PC9wPgorPC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiPjxzbWFsbD4KKzwvc21hbGw+Cis8cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5GaXgKK3ZhbHVlIG9mIHRoZSBjb25zdGFudCA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+VFNDX0FDUV9NT0RFX1NZTkNIUk88L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9wPgorPC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7Ij48c21hbGw+Cis8L3NtYWxsPgorPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzbWFsbD48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBDRCA8L3NwYW4+dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij48L3NwYW4+PC9zbWFsbD48L3A+Cis8L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyI+PHNtYWxsPgorPC9zbWFsbD4KKzxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIj48c21hbGw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkFkZAorbmV3IG1hY3JvIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5fX0hBTF9VU0JfRVhUSV9HRU5FUkFURV9TV0lUKCk8L3NwYW4+PC9zcGFuPjwvc21hbGw+PC9wPgorPC9saT48L3VsPjwvdWw+Cis8aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4wLjAKKy8gMjItQXByaWwtMjAxNDwvc3Bhbj48L2gzPgorPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tcmlnaHQ6IDBjbTsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD4KKzx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5GaXJzdAorb2ZmaWNpYWwgcmVsZWFzZS48L3NwYW4+PC9saT48L3VsPjxicj48Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7Ij48L3NwYW4+PC91PjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxicj48L3NwYW4+Cis8L2Rpdj4KKzxkaXYgaWQ9InByb2R1Y3RfZG9jIiBjbGFzcz0idG9waWMxIj4KKzxocj4KKzxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij5Gb3IgY29tcGxldGUKK2RvY3VtZW50YXRpb24gb24gU1RNMzIgTWljcm9jb250cm9sbGVyczxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPjwvc3Bhbj48L3NwYW4+LAordmlzaXQ6Jm5ic3A7PGEgaHJlZj0iaHR0cDovL3d3dy5zdC5jb20vU1RNMzIiIHRhcmdldD0iX2JsYW5rIj53d3cuc3QuY29tL1NUTTMyPC9hPjwvcD4KKzxicj4KKzwvZGl2PgorPC9kaXY+Cis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsLmMgYi9TcmMvc3RtMzJsMHh4X2hhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNTUyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbC5jCkBAIC0wLDAgKzEsNjE4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGlzIHRoZSBjb21tb24gcGFydCBvZiB0aGUgSEFMIGluaXRpYWxpemF0aW9uCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIGNvbW1vbiBIQUwgZHJpdmVyIGNvbnRhaW5zIGEgc2V0IG9mIGdlbmVyaWMgYW5kIGNvbW1vbiBBUElzIHRoYXQgY2FuIGJlCisgICAgdXNlZCBieSB0aGUgUFBQIHBlcmlwaGVyYWwgZHJpdmVycyBhbmQgdGhlIHVzZXIgdG8gc3RhcnQgdXNpbmcgdGhlIEhBTC4KKyAgICBbLi5dCisgICAgVGhlIEhBTCBjb250YWlucyB0d28gQVBJcyBjYXRlZ29yaWVzOgorICAgICAgICAgKCspIENvbW1vbiBIQUwgQVBJcworICAgICAgICAgKCspIFNlcnZpY2VzIEhBTCBBUElzCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfTU9EVUxFX0VOQUJMRUQKKworLyoqIEBhZGR0b2dyb3VwIEhBTAorICAqIEBicmllZiBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0NvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1ZlcnNpb24gSEFMIFZlcnNpb24KKyAgKiBAeworICAqLworCisvKioKKyAqIEBicmllZiBTVE0zMkwweHggSEFMIERyaXZlciB2ZXJzaW9uIG51bWJlcgorICovCisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9WRVJTSU9OX01BSU4gICAoMHgwMVUpIC8qITwgWzMxOjI0XSBtYWluIHZlcnNpb24gKi8KKyNkZWZpbmUgX19TVE0zMkwweHhfSEFMX1ZFUlNJT05fU1VCMSAgICgweDBBVSkgLyohPCBbMjM6MTZdIHN1YjEgdmVyc2lvbiAqLworI2RlZmluZSBfX1NUTTMyTDB4eF9IQUxfVkVSU0lPTl9TVUIyICAgKDB4MDJVKSAvKiE8IFsxNTo4XSAgc3ViMiB2ZXJzaW9uICovCisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9WRVJTSU9OX1JDICAgICAoMHgwMFUpIC8qITwgWzc6MF0gIHJlbGVhc2UgY2FuZGlkYXRlICovCisjZGVmaW5lIF9fU1RNMzJMMHh4X0hBTF9WRVJTSU9OICAgICAgICAgKChfX1NUTTMyTDB4eF9IQUxfVkVSU0lPTl9NQUlOIDw8IDI0VSlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfChfX1NUTTMyTDB4eF9IQUxfVkVSU0lPTl9TVUIxIDw8IDE2VSlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfChfX1NUTTMyTDB4eF9IQUxfVkVSU0lPTl9TVUIyIDw8IDhVIClcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfChfX1NUTTMyTDB4eF9IQUxfVkVSU0lPTl9SQykpCisKKyNkZWZpbmUgSURDT0RFX0RFVklEX01BU0sgICAgKCh1aW50MzJfdCkweDAwMDAwRkZGVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfVmFyaWFibGVzCisgICogQHsKKyAgKi8KK19fSU8gdWludDMyX3QgdXdUaWNrOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEluaXRpYWxpemUgdGhlIEZsYXNoIGludGVyZmFjZSwgdGhlIE5WSUMgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbCBjbG9jaworICAgICAgICAgIGNvbmZpZ3VyYXRpb24uIEl0IGluaXRpYWxpemVzIHRoZSBzb3VyY2Ugb2YgdGltZSBiYXNlIGFsc28gd2hlbiB0aW1lb3V0CisgICAgICAgICAgaXMgbmVlZGVkIGFuZCB0aGUgYmFja3VwIGRvbWFpbiB3aGVuIGVuYWJsZWQuCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSBjb21tb24gcGFydCBvZiB0aGUgSEFMLgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgdGltZSBiYXNlIHNvdXJjZSB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZAorICAgICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LgorICAgICAgICAoKyspIFN5c1RpY2sgdGltZXIgaXMgdXNlZCBieSBkZWZhdWx0IGFzIHNvdXJjZSBvZiB0aW1lIGJhc2UsIGJ1dCB1c2VyCisgICAgICAgICAgICAgY2FuIGV2ZW50dWFsbHkgaW1wbGVtZW50IGhpcyBwcm9wZXIgdGltZSBiYXNlIHNvdXJjZSAoYSBnZW5lcmFsIHB1cnBvc2UKKyAgICAgICAgICAgICB0aW1lciBmb3IgZXhhbXBsZSBvciBvdGhlciB0aW1lIHNvdXJjZSksIGtlZXBpbmcgaW4gbWluZCB0aGF0IFRpbWUgYmFzZQorICAgICAgICAgICAgIGR1cmF0aW9uIHNob3VsZCBiZSBrZXB0IDFtcyBzaW5jZSBQUFBfVElNRU9VVF9WQUxVRXMgYXJlIGRlZmluZWQgYW5kCisgICAgICAgICAgICAgaGFuZGxlZCBpbiBtaWxsaXNlY29uZHMgYmFzaXMuCisgICAgICAgICgrKykgVGltZSBiYXNlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKEhBTF9Jbml0VGljayAoKSkgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9ncmFtIGFmdGVyIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUKKyAgICAgICAgICAgICB3aGVuIGNsb2NrIGlzIGNvbmZpZ3VyZWQsIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4KKyAgICAgICAgKCsrKSBTb3VyY2Ugb2YgdGltZSBiYXNlIGlzIGNvbmZpZ3VyZWQgIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQgcmVndWxhcgorICAgICAgICAgICAgIHRpbWUgaW50ZXJ2YWxzLiBDYXJlIG11c3QgYmUgdGFrZW4gaWYgSEFMX0RlbGF5KCkgaXMgY2FsbGVkIGZyb20gYQorICAgICAgICAgICAgIHBlcmlwaGVyYWwgSVNSIHByb2Nlc3MsIHRoZSBUaWNrIGludGVycnVwdCBsaW5lIG11c3QgaGF2ZSBoaWdoZXIgcHJpb3JpdHkKKyAgICAgICAgICAgIChudW1lcmljYWxseSBsb3dlcikgdGhhbiB0aGUgcGVyaXBoZXJhbCBpbnRlcnJ1cHQuIE90aGVyd2lzZSB0aGUgY2FsbGVyCisgICAgICAgICAgICBJU1IgcHJvY2VzcyB3aWxsIGJlIGJsb2NrZWQuCisgICAgICAgKCsrKSBmdW5jdGlvbnMgYWZmZWN0aW5nIHRpbWUgYmFzZSBjb25maWd1cmF0aW9ucyBhcmUgZGVjbGFyZWQgYXMgX193ZWFrCisgICAgICAgICAgICAgdG8gbWFrZSAgb3ZlcnJpZGUgcG9zc2libGUgIGluIGNhc2Ugb2Ygb3RoZXIgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIEZsYXNoIHByZWZldGNoLCBGbGFzaCBwcmVyZWFkIGFuZCBCdWZmZXIgY2FjaGUsCisgICogICAgICAgIENvbmZpZ3VyZXMgdGltZSBiYXNlIHNvdXJjZSwgTlZJQyBhbmQgTG93IGxldmVsIGhhcmR3YXJlCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyIHJlc2V0IGFuZCBiZWZvcmUKKyAgKiAgICAgICB0aGUgY2xvY2sgY29uZmlndXJhdGlvbgorICAqIEBub3RlIFRoZSB0aW1lIGJhc2UgY29uZmlndXJhdGlvbiBpcyBiYXNlZCBvbiBNU0kgY2xvY2sgd2hlbiBleGl0aW5nIGZyb20gUmVzZXQuCisgICogICAgICAgT25jZSBkb25lLCB0aW1lIGJhc2UgdGljayBzdGFydCBpbmNyZW1lbnRpbmcuCisgICogICAgICAgIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLFN5c3RpY2sgaXMgdXNlZCBhcyBzb3VyY2Ugb2YgdGltZSBiYXNlLgorICAqICAgICAgICB0aGUgdGljayB2YXJpYWJsZSBpcyBpbmNyZW1lbnRlZCBlYWNoIDFtcyBpbiBpdHMgSVNSLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXQodm9pZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDb25maWd1cmUgQnVmZmVyIGNhY2hlLCBGbGFzaCBwcmVmZXRjaCwgIEZsYXNoIHByZXJlYWQgKi8KKyNpZiAoQlVGRkVSX0NBQ0hFX0RJU0FCTEUgIT0gMCkKKyAgX19IQUxfRkxBU0hfQlVGRkVSX0NBQ0hFX0RJU0FCTEUoKTsKKyNlbmRpZiAvKiBCVUZGRVJfQ0FDSEVfRElTQUJMRSAqLworCisjaWYgKFBSRVJFQURfRU5BQkxFICE9IDApCisgIF9fSEFMX0ZMQVNIX1BSRVJFQURfQlVGRkVSX0VOQUJMRSgpOworI2VuZGlmIC8qIFBSRVJFQURfRU5BQkxFICovCisKKyNpZiAoUFJFRkVUQ0hfRU5BQkxFICE9IDApCisgIF9fSEFMX0ZMQVNIX1BSRUZFVENIX0JVRkZFUl9FTkFCTEUoKTsKKyNlbmRpZiAvKiBQUkVGRVRDSF9FTkFCTEUgKi8KKworICAvKiBVc2UgU3lzVGljayBhcyB0aW1lIGJhc2Ugc291cmNlIGFuZCBjb25maWd1cmUgMW1zIHRpY2sgKGRlZmF1bHQgY2xvY2sgYWZ0ZXIgUmVzZXQgaXMgTVNJKSAqLworICBpZiAoSEFMX0luaXRUaWNrKFRJQ0tfSU5UX1BSSU9SSVRZKSAhPSBIQUxfT0spCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX01zcEluaXQoKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gZGUtaW5pdGlhbGl6ZXMgY29tbW9uIHBhcnQgb2YgdGhlIEhBTCBhbmQgc3RvcHMgdGhlIHNvdXJjZQorICAqICAgICAgICBvZiB0aW1lIGJhc2UuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBvcHRpb25hbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EZUluaXQodm9pZCkKK3sKKyAgLyogUmVzZXQgb2YgYWxsIHBlcmlwaGVyYWxzICovCisgIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19BUEIxX1JFTEVBU0VfUkVTRVQoKTsKKworICBfX0hBTF9SQ0NfQVBCMl9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQVBCMl9SRUxFQVNFX1JFU0VUKCk7CisKKyAgX19IQUxfUkNDX0FIQl9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQUhCX1JFTEVBU0VfUkVTRVQoKTsKKworICBfX0hBTF9SQ0NfSU9QX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19JT1BfUkVMRUFTRV9SRVNFVCgpOworCisgIC8qIERlLUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfTXNwRGVJbml0KCk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBNU1AuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTXNwSW5pdCh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBNU1AuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTXNwRGVJbml0KHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIHNvdXJjZSBvZiB0aGUgdGltZSBiYXNlOgorICAqICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZAorICAqICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIKKyAgKiAgICAgICByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgcmVjb25maWd1cmVkICBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuCisgICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UuCisgICogICAgICAgSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMuCisgICogICAgICAgQ2FyZSBtdXN0IGJlIHRha2VuIGlmIEhBTF9EZWxheSgpIGlzIGNhbGxlZCBmcm9tIGEgcGVyaXBoZXJhbCBJU1IgcHJvY2VzcywKKyAgKiAgICAgICBUaGUgU3lzVGljayBpbnRlcnJ1cHQgbXVzdCBoYXZlIGhpZ2hlciBwcmlvcml0eSAobnVtZXJpY2FsbHkgbG93ZXIpCisgICogICAgICAgdGhhbiB0aGUgcGVyaXBoZXJhbCBpbnRlcnJ1cHQuIE90aGVyd2lzZSB0aGUgY2FsbGVyIElTUiBwcm9jZXNzIHdpbGwgYmUgYmxvY2tlZC4KKyAgKiAgICAgICBUaGUgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrICB0byBiZSBvdmVyd3JpdHRlbiAgaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgIGltcGxlbWVudGF0aW9uICBpbiB1c2VyIGZpbGUuCisgICogQHBhcmFtIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sodWludDMyX3QgVGlja1ByaW9yaXR5KQoreworICBIQUxfU3RhdHVzVHlwZURlZiAgc3RhdHVzID0gSEFMX09LOworCisgIC8qQ29uZmlndXJlIHRoZSBTeXNUaWNrIHRvIGhhdmUgaW50ZXJydXB0IGluIDFtcyB0aW1lIGJhc2lzKi8KKyAgaWYgKEhBTF9TWVNUSUNLX0NvbmZpZyhTeXN0ZW1Db3JlQ2xvY2svMTAwMFVMKSAhPSAwVSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKkNvbmZpZ3VyZSB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgKi8KKyAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShTeXNUaWNrX0lSUW4sIFRpY2tQcmlvcml0eSwgMCk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgICBIQUwgQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSEFMIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgUHJvdmlkZSBhIHRpY2sgdmFsdWUgaW4gbWlsbGlzZWNvbmQKKyAgICAgICgrKSBQcm92aWRlIGEgYmxvY2tpbmcgZGVsYXkgaW4gbWlsbGlzZWNvbmQKKyAgICAgICgrKSBTdXNwZW5kIHRoZSB0aW1lIGJhc2Ugc291cmNlIGludGVycnVwdAorICAgICAgKCspIFJlc3VtZSB0aGUgdGltZSBiYXNlIHNvdXJjZSBpbnRlcnJ1cHQKKyAgICAgICgrKSBHZXQgdGhlIEhBTCBBUEkgZHJpdmVyIHZlcnNpb24KKyAgICAgICgrKSBHZXQgdGhlIGRldmljZSBpZGVudGlmaWVyCisgICAgICAoKykgR2V0IHRoZSBkZXZpY2UgcmV2aXNpb24gaWRlbnRpZmllcgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5jcmVtZW50IGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siCisgICogICAgICAgIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgorICAqIEBub3RlIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCB0aGlzIHZhcmlhYmxlIGlzIGluY3JlbWVudGVkIGVhY2ggMW1zCisgICogICAgICAgaW4gU3lzVGljayBJU1IuCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fd2VhayB0byBiZSBvdmVyd3JpdHRlbiBpbiBjYXNlIG9mIG90aGVyCisgICogICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gdXNlciBmaWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0luY1RpY2sodm9pZCkKK3sKKyAgdXdUaWNrKys7Cit9CisKKy8qKgorICAqIEBicmllZiBQcm92aWRlcyBhIHRpY2sgdmFsdWUgaW4gbWlsbGlzZWNvbmQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgICogQHJldHZhbCB0aWNrIHZhbHVlCisgICovCitfX3dlYWsgdWludDMyX3QgSEFMX0dldFRpY2sodm9pZCkKK3sKKyAgcmV0dXJuIHV3VGljazsKK30KKworLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgbWluaW11bSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiYXNlZAorICAqICAgICAgICBvbiB2YXJpYWJsZSBpbmNyZW1lbnRlZC4KKyAgKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAsIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UuCisgICogICAgICAgSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMgd2hlcmUgdXdUaWNrCisgICogICAgICAgaXMgaW5jcmVtZW50ZWQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgICogQHBhcmFtIERlbGF5IHNwZWNpZmllcyB0aGUgZGVsYXkgdGltZSBsZW5ndGgsIGluIG1pbGxpc2Vjb25kcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9EZWxheSh1aW50MzJfdCBEZWxheSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgdWludDMyX3Qgd2FpdCA9IERlbGF5OworCisgIC8qIEFkZCBhIHBlcmlvZCB0byBndWFyYW50eSBtaW5pbXVtIHdhaXQgKi8KKyAgaWYgKHdhaXQgPCBIQUxfTUFYX0RFTEFZKQorICB7CisgICAgd2FpdCsrOworICB9CisKKyAgd2hpbGUoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpIDwgd2FpdCkKKyAgeworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBTdXNwZW5kcyB0aGUgVGljayBpbmNyZW1lbnQuCisgICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gLCBTeXNUaWNrIHRpbWVyIGlzIHRoZSBzb3VyY2Ugb2YgdGltZSBiYXNlLiBJdCBpcworICAqICAgICAgIHVzZWQgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyBhdCByZWd1bGFyIHRpbWUgaW50ZXJ2YWxzLiBPbmNlIEhBTF9TdXNwZW5kVGljaygpCisgICogICAgICAgaXMgY2FsbGVkLCB0aGUgU3lzVGljayBpbnRlcnJ1cHQgd2lsbCBiZSBkaXNhYmxlZCBhbmQgc28gVGljayBpbmNyZW1lbnQKKyAgKiAgICAgICBpcyBzdXNwZW5kZWQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKK3sKKyAgLyogRGlzYWJsZSBTeXNUaWNrIEludGVycnVwdCAqLworICBTeXNUaWNrLT5DVFJMICY9IH5TeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2s7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXN1bWVzIHRoZSBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAsIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UuIEl0IGlzCisgICogICAgICAgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMuIE9uY2UgSEFMX1Jlc3VtZVRpY2soKQorICAqICAgICAgIGlzIGNhbGxlZCwgdGhlIFN5c1RpY2sgaW50ZXJydXB0IHdpbGwgYmUgZW5hYmxlZCBhbmQgc28gVGljayBpbmNyZW1lbnQKKyAgKiAgICAgICBpcyByZXN1bWVkLgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrIHRvIGJlIG92ZXJ3cml0dGVuIGluIGNhc2Ugb2Ygb3RoZXIKKyAgKiAgICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gdXNlciBmaWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCkKK3sKKyAgLyogRW5hYmxlIFN5c1RpY2sgSW50ZXJydXB0ICovCisgIFN5c1RpY2stPkNUUkwgIHw9IFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zazsKK30KKworLyoqCisgICogQGJyaWVmIFJldHVybnMgdGhlIEhBTCByZXZpc2lvbgorICAqIEByZXR2YWwgdmVyc2lvbjogMHhYWVpSICg4Yml0cyBmb3IgZWFjaCBkZWNpbWFsLCBSIGZvciBSQykKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRIYWxWZXJzaW9uKHZvaWQpCit7CisgIHJldHVybiBfX1NUTTMyTDB4eF9IQUxfVkVSU0lPTjsKK30KKworLyoqCisgICogQGJyaWVmIFJldHVybnMgdGhlIGRldmljZSByZXZpc2lvbiBpZGVudGlmaWVyLgorICAqIEByZXR2YWwgRGV2aWNlIHJldmlzaW9uIGlkZW50aWZpZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRSRVZJRCh2b2lkKQoreworICByZXR1cm4oKERCR01DVS0+SURDT0RFKSA+PiAxNlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGRldmljZSBpZGVudGlmaWVyLgorICAqIEByZXR2YWwgRGV2aWNlIGlkZW50aWZpZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRERVZJRCh2b2lkKQoreworICAgcmV0dXJuKChEQkdNQ1UtPklEQ09ERSkgJiBJRENPREVfREVWSURfTUFTSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAgKiBAcmV0dmFsIERldmljZSBpZGVudGlmaWVyCisgICovCit1aW50MzJfdCBIQUxfR2V0VUlEdzAodm9pZCkKK3sKKyAgcmV0dXJuKFJFQURfUkVHKCooKHVpbnQzMl90ICopVUlEX0JBU0UpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgc2Vjb25kIHdvcmQgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uIDk2IGJpdHMpCisgICogQHJldHZhbCBEZXZpY2UgaWRlbnRpZmllcgorICAqLwordWludDMyX3QgSEFMX0dldFVJRHcxKHZvaWQpCit7CisgIHJldHVybihSRUFEX1JFRygqKCh1aW50MzJfdCAqKShVSURfQkFTRSArIDB4MDRVKSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSB0aGlyZCB3b3JkIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQorICAqIEByZXR2YWwgRGV2aWNlIGlkZW50aWZpZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRVSUR3Mih2b2lkKQoreworICByZXR1cm4oUkVBRF9SRUcoKigodWludDMyX3QgKikoVUlEX0JBU0UgKyAweDE0VSkpKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgICBIQUwgRGVidWcgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhBTCBEZWJ1ZyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSBEZWJ1ZyBtb2R1bGUgZHVyaW5nIFNMRUVQIG1vZGUKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSBEZWJ1ZyBtb2R1bGUgZHVyaW5nIFNUT1AgbW9kZQorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIERlYnVnIG1vZHVsZSBkdXJpbmcgU1RBTkRCWSBtb2RlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTTEVFUCBtb2RlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9EQkdNQ1VfRW5hYmxlREJHU2xlZXBNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TTEVFUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU0xFRVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RPUCBtb2RlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUodm9pZCkKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfREJHX1NUT1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUT1AgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdG9wTW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVE9QKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RBTkRCWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGxvdyBwb3dlciBtb2RlIGJlaGF2aW9yIHdoZW4gdGhlIE1DVSBpcyBpbiBEZWJ1ZyBtb2RlLgorICAqIEBwYXJhbSBQZXJpcGg6IHNwZWNpZmllcyB0aGUgbG93IHBvd2VyIG1vZGUuCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIERCR01DVV9TTEVFUDogS2VlcCBkZWJ1Z2dlciBjb25uZWN0aW9uIGR1cmluZyBTTEVFUCBtb2RlCisgICogICAgIEBhcmcgREJHTUNVX1NUT1A6IEtlZXAgZGVidWdnZXIgY29ubmVjdGlvbiBkdXJpbmcgU1RPUCBtb2RlCisgICogICAgIEBhcmcgREJHTUNVX1NUQU5EQlk6IEtlZXAgZGVidWdnZXIgY29ubmVjdGlvbiBkdXJpbmcgU1RBTkRCWSBtb2RlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9EQkdNQ1VfREJHX0VuYWJsZUxvd1Bvd2VyQ29uZmlnKHVpbnQzMl90IFBlcmlwaCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RCR01DVV9QRVJJUEgoUGVyaXBoKSk7CisKKyAgREJHTUNVLT5DUiB8PSBQZXJpcGg7CisKK30KKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBsb3cgcG93ZXIgbW9kZSBiZWhhdmlvciB3aGVuIHRoZSBNQ1UgaXMgaW4gRGVidWcgbW9kZS4KKyAgKiBAcGFyYW0gUGVyaXBoOiBzcGVjaWZpZXMgdGhlIGxvdyBwb3dlciBtb2RlLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBEQkdNQ1VfU0xFRVA6IEtlZXAgZGVidWdnZXIgY29ubmVjdGlvbiBkdXJpbmcgU0xFRVAgbW9kZQorICAqICAgICBAYXJnIERCR01DVV9TVE9QOiBLZWVwIGRlYnVnZ2VyIGNvbm5lY3Rpb24gZHVyaW5nIFNUT1AgbW9kZQorICAqICAgICBAYXJnIERCR01DVV9TVEFOREJZOiBLZWVwIGRlYnVnZ2VyIGNvbm5lY3Rpb24gZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0RCR19EaXNhYmxlTG93UG93ZXJDb25maWcodWludDMyX3QgUGVyaXBoKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREJHTUNVX1BFUklQSChQZXJpcGgpKTsKKyAgeworICAgIERCR01DVS0+Q1IgJj0gflBlcmlwaDsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAqICBAYnJpZWYgICAgSEFMIFNZU0NGRyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIQUwgU1lTQ0ZHIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgUmV0dXJuIHRoZSBib290IG1vZGUKKyAgICAgICgrKSBTZWxlY3QgdGhlIG91dHB1dCBvZiBpbnRlcm5hbCByZWZlcmVuY2Ugdm9sdGFnZSAoVlJFRklOVCkKKyAgICAgICgrKSBMb2NrL1VubG9jayB0aGUgU1lTQ0ZHIFZSRUYgcmVnaXN0ZXIgdmFsdWVzCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgYm9vdCBtb2RlIGFzIGNvbmZpZ3VyZWQgYnkgdXNlci4KKyAgKiBAcmV0dmFsIFRoZSBib290IG1vZGUgYXMgY29uZmlndXJlZCBieSB1c2VyLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZQorICAqICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgIC0gMHgwMDAwMDAwMCA6IEJvb3QgaXMgY29uZmlndXJlZCBpbiBNYWluIEZsYXNoIG1lbW9yeQorICAqICAgICAgICAgICAgICAtIDB4MDAwMDAxMDAgOiBCb290IGlzIGNvbmZpZ3VyZWQgaW4gU3lzdGVtIEZsYXNoIG1lbW9yeQorICAqICAgICAgICAgICAgICAtIDB4MDAwMDAzMDAgOiBCb290IGlzIGNvbmZpZ3VyZWQgaW4gRW1iZWRkZWQgU1JBTSBtZW1vcnkKKyAgKi8KK3VpbnQzMl90ICBIQUxfU1lTQ0ZHX0dldEJvb3RNb2RlKHZvaWQpCit7CisgIHJldHVybiAoU1lTQ0ZHLT5DRkdSMSAmIFNZU0NGR19DRkdSMV9CT09UX01PREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgU2VsZWN0cyB0aGUgb3V0cHV0IG9mIGludGVybmFsIHJlZmVyZW5jZSB2b2x0YWdlIChWUkVGSU5UKS4KKyAgKiAgICAgICAgVGhlIFZSRUZJTlQgb3V0cHV0IGNhbiBiZSByb3V0ZWQgdG8oUEIwKSBvcgorICAqICAgICAgICAoUEIxKSBvciBib3RoLgorICAqIEBwYXJhbSBTWVNDRkdfVnJlZmludF9PVVRQVVQ6IG5ldyBzdGF0ZSBvZiB0aGUgVnJlZmludCBvdXRwdXQuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgU1lTQ0ZHX1ZSRUZJTlRfT1VUX05PTkUKKyAgKiAgICAgQGFyZyBTWVNDRkdfVlJFRklOVF9PVVRfUEIwCisgICogICAgIEBhcmcgU1lTQ0ZHX1ZSRUZJTlRfT1VUX1BCMQorICAqICAgICBAYXJnIFNZU0NGR19WUkVGSU5UX09VVF9QQjBfUEIxCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfVlJFRklOVF9PdXRwdXRTZWxlY3QodWludDMyX3QgU1lTQ0ZHX1ZyZWZpbnRfT1VUUFVUKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX1ZSRUZJTlRfT1VUX1NFTEVDVChTWVNDRkdfVnJlZmludF9PVVRQVVQpKTsKKworICAvKiBTZXQgdGhlIG91dHB1dCBWcmVmaW50IHBpbiAqLworICBTWVNDRkctPkNGR1IzICY9IH4oU1lTQ0ZHX0NGR1IzX1ZSRUZfT1VUKTsKKyAgU1lTQ0ZHLT5DRkdSMyB8PSAodWludDMyX3QpKFNZU0NGR19WcmVmaW50X09VVFBVVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgU1lTQ0ZHIFZSRUYgcmVnaXN0ZXIgdmFsdWVzCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfRW5hYmxlX0xvY2tfVlJFRklOVCh2b2lkKQoreworICAgIC8qIEVuYWJsZSB0aGUgTE9DSyBieSBzZXR0aW5nIFJFRl9MT0NLIGJpdCBpbiB0aGUgQ0ZHUjMgcmVnaXN0ZXIgKi8KKyAgICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19SRUZfTE9DSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5sb2NrIHRoZSBvdmVyYWxsIFNZU0NGRyBWUkVGIHJlZ2lzdGVyIHZhbHVlcworICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVfTG9ja19WUkVGSU5UKHZvaWQpCit7CisgICAgLyogRGlzYWJsZSB0aGUgTE9DSyBieSBzZXR0aW5nIFJFRl9MT0NLIGJpdCBpbiB0aGUgQ0ZHUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMywgU1lTQ0ZHX0NGR1IzX1JFRl9MT0NLKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBIQUxfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsX2FkYy5jIGIvU3JjL3N0bTMybDB4eF9oYWxfYWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyZWM2OQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX2FkYy5jCkBAIC0wLDAgKzEsMjQ5NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfYWRjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBBbmFsb2cgdG8gRGlnaXRhbCBDb252ZXJ0b3IgKEFEQykKKyAgKiAgICAgICAgICBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBvZiBBREMKKyAgKiAgICAgICAgICAgKyBPcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICAgKysgU3RhcnQsIHN0b3AsIGdldCByZXN1bHQgb2YgY29udmVyc2lvbnMgb2YgcmVndWxhcgorICAqICAgICAgICAgICAgICAgIGdyb3VwLCB1c2luZyAzIHBvc3NpYmxlIG1vZGVzOiBwb2xsaW5nLCBpbnRlcnJ1cHRpb24gb3IgRE1BLgorICAqICAgICAgICAgICArIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICAgKysgQ2hhbm5lbHMgY29uZmlndXJhdGlvbiBvbiByZWd1bGFyIGdyb3VwCisgICogICAgICAgICAgICAgKysgQW5hbG9nIFdhdGNoZG9nIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBTdGF0ZSBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBBREMgc3RhdGUgbWFjaGluZSBtYW5hZ2VtZW50CisgICogICAgICAgICAgICAgKysgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudAorICAqICAgICAgICAgIE90aGVyIGZ1bmN0aW9ucyAoZXh0ZW5kZWQgZnVuY3Rpb25zKSBhcmUgYXZhaWxhYmxlIGluIGZpbGUgCisgICogICAgICAgICAgInN0bTMybDB4eF9oYWxfYWRjX2V4LmMiLgorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEFEQyBwZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICgrKSAxMi1iaXQsIDEwLWJpdCwgOC1iaXQgb3IgNi1iaXQgY29uZmlndXJhYmxlIHJlc29sdXRpb24uCisKKyAgKCspIEludGVycnVwdCBnZW5lcmF0aW9uIGF0IHRoZSBlbmQgb2YgcmVndWxhciBjb252ZXJzaW9uIGFuZCBpbiBjYXNlIG9mIAorICAgICAgYW5hbG9nIHdhdGNoZG9nIG9yIG92ZXJydW4gZXZlbnRzLgorICAKKyAgKCspIFNpbmdsZSBhbmQgY29udGludW91cyBjb252ZXJzaW9uIG1vZGVzLgorICAKKyAgKCspIFNjYW4gbW9kZSBmb3IgY29udmVyc2lvbiBvZiBzZXZlcmFsIGNoYW5uZWxzIHNlcXVlbnRpYWxseS4KKyAgCisgICgrKSBEYXRhIGFsaWdubWVudCB3aXRoIGluLWJ1aWx0IGRhdGEgY29oZXJlbmN5LgorICAKKyAgKCspIFByb2dyYW1tYWJsZSBzYW1wbGluZyB0aW1lIChjb21tb24gZm9yIGFsbCBjaGFubmVscykKKyAgCisgICgrKSBFeHRlcm5hbCB0cmlnZ2VyICh0aW1lciBvciBFWFRJKSB3aXRoIGNvbmZpZ3VyYWJsZSBwb2xhcml0eQorICAKKyAgKCspIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gZm9yIHRyYW5zZmVyIG9mIGNvbnZlcnNpb25zIGRhdGEgb2YgcmVndWxhciBncm91cC4KKworICAoKykgQURDIGNhbGlicmF0aW9uCisgIAorICAoKykgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgCisgICgrKSBBREMgc3VwcGx5IHJlcXVpcmVtZW50czogMS42MiBWIHRvIDMuNiBWLgorICAKKyAgKCspIEFEQyBpbnB1dCByYW5nZTogZnJvbSBWcmVmLSAoY29ubmVjdGVkIHRvIFZzc2EpIHRvIFZyZWYrIChjb25uZWN0ZWQgdG8gCisgICAgICBWZGRhIG9yIHRvIGFuIGV4dGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlKS4KKworCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKworICAgICAqKiogQ29uZmlndXJhdGlvbiBvZiB0b3AgbGV2ZWwgcGFyYW1ldGVycyByZWxhdGVkIHRvIEFEQyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKworICAgICgjKSBFbmFibGUgdGhlIEFEQyBpbnRlcmZhY2UKKyAgICAgICAgKCsrKSBBcyBwcmVyZXF1aXNpdGUsIEFEQyBjbG9jayBtdXN0IGJlIGNvbmZpZ3VyZWQgYXQgUkNDIHRvcCBsZXZlbC4KKyAgICAgICAgICAgICBDYXV0aW9uOiBPbiBTVE0zMkwwLCBBREMgY2xvY2sgZnJlcXVlbmN5IG1heCBpcyAxNk1IeiAocmVmZXIKKyAgICAgICAgICAgICAgICAgICAgICB0byBkZXZpY2UgZGF0YXNoZWV0KS4KKyAgICAgICAgICAgICAgICAgICAgICBUaGVyZWZvcmUsIEFEQyBjbG9jayBwcmVzY2FsZXIgbXVzdCBiZSBjb25maWd1cmVkIGluIAorICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBzb3VyY2UgZnJlcXVlbmN5IHRvIHJlbWFpbiBiZWxvdworICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWF4aW11bSBmcmVxdWVuY3kuCisKKyAgICAgICAgKCsrKSBUd28gY2xvY2sgc2V0dGluZ3MgYXJlIG1hbmRhdG9yeTogCisgICAgICAgICAgICAgKCsrKykgQURDIGNsb2NrIChjb3JlIGNsb2NrLCBhbHNvIHBvc3NpYmx5IGNvbnZlcnNpb24gY2xvY2spLgorCisgICAgICAgICAgICAgKCsrKykgQURDIGNsb2NrIChjb252ZXJzaW9ucyBjbG9jaykuCisgICAgICAgICAgICAgICAgICAgVHdvIHBvc3NpYmxlIGNsb2NrIHNvdXJjZXM6IHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBUEIgY2xvY2sKKyAgICAgICAgICAgICAgICAgICBvciBhc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFEQyBkZWRpY2F0ZWQgSFNJIFJDIG9zY2lsbGF0b3IKKyAgICAgICAgICAgICAgICAgICAxNk1Iei4KKyAgICAgICAgICAgICAgICAgICBJZiBhc3luY2hyb25vdXMgY2xvY2sgaXMgc2VsZWN0ZWQsIHBhcmFtZXRlciAiSFNJU3RhdGUiIG11c3QgYmUgc2V0IGVpdGhlcjoKKyAgICAgICAgICAgICAgICAgICAtIHRvICIuLi5IU0lTdGF0ZSA9IFJDQ19IU0lfT04iIHRvIG1haW50YWluIHRoZSBIU0kxNiBvc2NpbGxhdG9yCisgICAgICAgICAgICAgICAgICAgICBhbHdheXMgZW5hYmxlZDogY2FuIGJlIHVzZWQgdG8gc3VwcGx5IHRoZSBtYWluIHN5c3RlbSBjbG9jay4KKworICAgICAgICAgICAgICgrKyspIEV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgSW50byBIQUxfQURDX01zcEluaXQoKSAocmVjb21tZW5kZWQgY29kZSBsb2NhdGlvbikgb3Igd2l0aAorICAgICAgICAgICAgICAgICAgIG90aGVyIGRldmljZSBjbG9jayBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAgICAoKysrKSBfX0hBTF9SQ0NfQURDMV9DTEtfRU5BQkxFKCk7ICAgICAgICAgICAgICAgICAobWFuZGF0b3J5KQorCisgICAgICAgICAgICAgICBIU0kgZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uYWw6IGlmIGFzeW5jaHJvbm91cyBjbG9jayBzZWxlY3RlZCkKKyAgICAgICAgICAgICAgICgrKyspIFJDQ19Pc2NJbml0VHlwZURlZiAgIFJDQ19Pc2NJbml0U3RydWN0dXJlOworICAgICAgICAgICAgICAgKCsrKykgUkNDX09zY0luaXRTdHJ1Y3R1cmUuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJOworICAgICAgICAgICAgICAgKCsrKykgUkNDX09zY0luaXRTdHJ1Y3R1cmUuSFNJMTZDYWxpYnJhdGlvblZhbHVlID0gUkNDX0hTSUNBTElCUkFUSU9OX0RFRkFVTFQ7CisgICAgICAgICAgICAgICAoKysrKSBSQ0NfT3NjSW5pdFN0cnVjdHVyZS5IU0lTdGF0ZSA9IFJDQ19IU0lfT047CisgICAgICAgICAgICAgICAoKysrKSBSQ0NfT3NjSW5pdFN0cnVjdHVyZS5QTEwuLi4gICAob3B0aW9uYWwgaWYgdXNlZCBmb3Igc3lzdGVtIGNsb2NrKQorICAgICAgICAgICAgICAgKCsrKykgSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0dXJlKTsKKworICAgICAgICAoKyspIEFEQyBjbG9jayBzb3VyY2UgYW5kIGNsb2NrIHByZXNjYWxlciBhcmUgY29uZmlndXJlZCBhdCBBREMgbGV2ZWwgd2l0aAorICAgICAgICAgICAgIHBhcmFtZXRlciAiQ2xvY2tQcmVzY2FsZXIiIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpLgorCisgICAgKCMpIEFEQyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICgrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIEFEQyBHUElPcworICAgICAgICAgICAgICB1c2luZyBtYWNybyBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpCisgICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGVzZSBBREMgcGlucyBpbiBhbmFsb2cgbW9kZQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfR1BJT19Jbml0KCkKKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIEFEQyB3aXRoIGludGVycnVwdGlvbnM6CisgICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgTlZJQyBmb3IgQURDCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUShBREN4X0lSUW4pCisgICAgICAgICAoKyspIEluc2VydCB0aGUgQURDIGludGVycnVwdGlvbiBoYW5kbGVyIGZ1bmN0aW9uIEhBTF9BRENfSVJRSGFuZGxlcigpIAorICAgICAgICAgICAgICBpbnRvIHRoZSBmdW5jdGlvbiBvZiBjb3JyZXNwb25kaW5nIEFEQyBpbnRlcnJ1cHRpb24gdmVjdG9yIAorICAgICAgICAgICAgICBBREN4X0lSUUhhbmRsZXIoKS4KKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIERNQToKKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBETUEgKERNQSBjaGFubmVsLCBtb2RlIG5vcm1hbCBvciBjaXJjdWxhciwgLi4uKQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfRE1BX0luaXQoKS4KKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBOVklDIGZvciBETUEKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfRW5hYmxlSVJRKERNQXhfQ2hhbm5lbHhfSVJRbikKKyAgICAgICAgICgrKykgSW5zZXJ0IHRoZSBBREMgaW50ZXJydXB0aW9uIGhhbmRsZXIgZnVuY3Rpb24gSEFMX0FEQ19JUlFIYW5kbGVyKCkgCisgICAgICAgICAgICAgIGludG8gdGhlIGZ1bmN0aW9uIG9mIGNvcnJlc3BvbmRpbmcgRE1BIGludGVycnVwdGlvbiB2ZWN0b3IgCisgICAgICAgICAgICAgIERNQXhfQ2hhbm5lbHhfSVJRSGFuZGxlcigpLgorCisgICAgICoqKiBDb25maWd1cmF0aW9uIG9mIEFEQywgZ3JvdXAgcmVndWxhciwgY2hhbm5lbHMgcGFyYW1ldGVycyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBBREMgcGFyYW1ldGVycyAocmVzb2x1dGlvbiwgZGF0YSBhbGlnbm1lbnQsIC4uLikKKyAgICAgICAgYW5kIHJlZ3VsYXIgZ3JvdXAgcGFyYW1ldGVycyAoY29udmVyc2lvbiB0cmlnZ2VyLCBzZXF1ZW5jZXIsIC4uLikKKyAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19Jbml0KCkuCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBjaGFubmVscyBmb3IgcmVndWxhciBncm91cCBwYXJhbWV0ZXJzIChjaGFubmVsIG51bWJlciwgCisgICAgICAgIGNoYW5uZWwgcmFuayBpbnRvIHNlcXVlbmNlciwgLi4uLCBpbnRvIHJlZ3VsYXIgZ3JvdXApCisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpLgorCisgICAgKCMpIE9wdGlvbmFsbHksIGNvbmZpZ3VyZSB0aGUgYW5hbG9nIHdhdGNoZG9nIHBhcmFtZXRlcnMgKGNoYW5uZWxzCisgICAgICAgIG1vbml0b3JlZCwgdGhyZXNob2xkcywgLi4uKQorICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygpLgorCisKKyAgICAoIykgV2hlbiBkZXZpY2UgaXMgaW4gbW9kZSBsb3ctcG93ZXIgKGxvdy1wb3dlciBydW4sIGxvdy1wb3dlciBzbGVlcCBvciBzdG9wIG1vZGUpLCAKKyAgICAgICAgZnVuY3Rpb24gIkhBTF9BRENFeF9FbmFibGVWUkVGSU5UKCkiIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBmdW5jdGlvbiBIQUxfQURDX0luaXQoKS4KKyAgICAgICAgSW4gY2FzZSBvZiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IgdG8gYmUgbWVhc3VyZWQ6CisgICAgICAgIGZ1bmN0aW9uICJIQUxfQURDRXhfRW5hYmxlVlJFRklOVFRlbXBTZW5zb3IoKSIgbXVzdCBiZSBjYWxsZWQgc2ltaWxhcmlsbHkKKworICAgICAqKiogRXhlY3V0aW9uIG9mIEFEQyBjb252ZXJzaW9ucyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKworICAgICgjKSBPcHRpb25hbGx5LCBwZXJmb3JtIGFuIGF1dG9tYXRpYyBBREMgY2FsaWJyYXRpb24gdG8gaW1wcm92ZSB0aGUKKyAgICAgICAgY29udmVyc2lvbiBhY2N1cmFjeQorICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDRXhfQ2FsaWJyYXRpb25fU3RhcnQoKS4KKworICAgICgjKSBBREMgZHJpdmVyIGNhbiBiZSB1c2VkIGFtb25nIHRocmVlIG1vZGVzOiBwb2xsaW5nLCBpbnRlcnJ1cHRpb24sCisgICAgICAgIHRyYW5zZmVyIGJ5IERNQS4KKworICAgICAgICAoKyspIEFEQyBjb252ZXJzaW9uIGJ5IHBvbGxpbmc6CisgICAgICAgICAgKCsrKykgQWN0aXZhdGUgdGhlIEFEQyBwZXJpcGhlcmFsIGFuZCBzdGFydCBjb252ZXJzaW9ucworICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfU3RhcnQoKQorICAgICAgICAgICgrKyspIFdhaXQgZm9yIEFEQyBjb252ZXJzaW9uIGNvbXBsZXRpb24gCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19Qb2xsRm9yQ29udmVyc2lvbigpCisgICAgICAgICAgKCsrKykgUmV0cmlldmUgY29udmVyc2lvbiByZXN1bHRzIAorICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKQorICAgICAgICAgICgrKyspIFN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdG9wKCkKKworICAgICAgICAoKyspIEFEQyBjb252ZXJzaW9uIGJ5IGludGVycnVwdGlvbjogCisgICAgICAgICAgKCsrKykgQWN0aXZhdGUgdGhlIEFEQyBwZXJpcGhlcmFsIGFuZCBzdGFydCBjb252ZXJzaW9ucworICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfU3RhcnRfSVQoKQorICAgICAgICAgICgrKyspIFdhaXQgZm9yIEFEQyBjb252ZXJzaW9uIGNvbXBsZXRpb24gYnkgY2FsbCBvZiBmdW5jdGlvbgorICAgICAgICAgICAgICAgIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpCisgICAgICAgICAgICAgICAgKHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB1c2VyIHByb2dyYW0pCisgICAgICAgICAgKCsrKykgUmV0cmlldmUgY29udmVyc2lvbiByZXN1bHRzIAorICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKQorICAgICAgICAgICgrKyspIFN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdG9wX0lUKCkKKworICAgICAgICAoKyspIEFEQyBjb252ZXJzaW9uIHdpdGggdHJhbnNmZXIgYnkgRE1BOgorICAgICAgICAgICgrKyspIEFjdGl2YXRlIHRoZSBBREMgcGVyaXBoZXJhbCBhbmQgc3RhcnQgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0YXJ0X0RNQSgpCisgICAgICAgICAgKCsrKykgV2FpdCBmb3IgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbiBieSBjYWxsIG9mIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCkgb3IgSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjaygpCisgICAgICAgICAgICAgICAgKHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHVzZXIgcHJvZ3JhbSkKKyAgICAgICAgICAoKysrKSBDb252ZXJzaW9uIHJlc3VsdHMgYXJlIGF1dG9tYXRpY2FsbHkgdHJhbnNmZXJyZWQgYnkgRE1BIGludG8KKyAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiB2YXJpYWJsZSBhZGRyZXNzLgorICAgICAgICAgICgrKyspIFN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdG9wX0RNQSgpCisKKyAgICAgWy4uXQorCisgICAgKEApIENhbGxiYWNrIGZ1bmN0aW9ucyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHVzZXIgcHJvZ3JhbToKKyAgICAgICgrQCkgSEFMX0FEQ19FcnJvckNhbGxiYWNrKCkKKyAgICAgICgrQCkgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soKSAoY2FsbGJhY2sgb2YgYW5hbG9nIHdhdGNoZG9nKQorICAgICAgKCtAKSBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKQorICAgICAgKCtAKSBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrCisKKyAgICAgKioqIERlaW5pdGlhbGl6YXRpb24gb2YgQURDICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorCisgICAgKCMpIERpc2FibGUgdGhlIEFEQyBpbnRlcmZhY2UKKyAgICAgICgrKykgQURDIGNsb2NrIGNhbiBiZSBoYXJkIHJlc2V0IGFuZCBkaXNhYmxlZCBhdCBSQ0MgdG9wIGxldmVsLgorICAgICAgICAoKyspIEhhcmQgcmVzZXQgb2YgQURDIHBlcmlwaGVyYWxzCisgICAgICAgICAgICAgdXNpbmcgbWFjcm8gX19BREN4X0ZPUkNFX1JFU0VUKCksIF9fQURDeF9SRUxFQVNFX1JFU0VUKCkuCisgICAgICAgICgrKykgQURDIGNsb2NrIGRpc2FibGUKKyAgICAgICAgICAgICB1c2luZyB0aGUgZXF1aXZhbGVudCBtYWNyby9mdW5jdGlvbnMgYXMgY29uZmlndXJhdGlvbiBzdGVwLgorICAgICAgICAgICAgICgrKyspIEV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgSW50byBIQUxfQURDX01zcERlSW5pdCgpIChyZWNvbW1lbmRlZCBjb2RlIGxvY2F0aW9uKSBvciB3aXRoCisgICAgICAgICAgICAgICAgICAgb3RoZXIgZGV2aWNlIGNsb2NrIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICAgICgrKyspIFJDQ19Pc2NJbml0U3RydWN0dXJlLk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTsKKyAgICAgICAgICAgICAgICgrKyspIFJDQ19Pc2NJbml0U3RydWN0dXJlLkhTSVN0YXRlID0gUkNDX0hTSV9PRkY7IChpZiBub3QgdXNlZCBmb3Igc3lzdGVtIGNsb2NrKQorICAgICAgICAgICAgICAgKCsrKykgSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0dXJlKTsKKworICAgICgjKSBBREMgcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAoKyspIERpc2FibGUgdGhlIGNsb2NrIGZvciB0aGUgQURDIEdQSU9zCisgICAgICAgICAgICAgIHVzaW5nIG1hY3JvIF9fSEFMX1JDQ19HUElPeF9DTEtfRElTQUJMRSgpCisKKyAgICAoIykgT3B0aW9uYWxseSwgaW4gY2FzZSBvZiB1c2FnZSBvZiBBREMgd2l0aCBpbnRlcnJ1cHRpb25zOgorICAgICAgICAgKCsrKSBEaXNhYmxlIHRoZSBOVklDIGZvciBBREMKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfRW5hYmxlSVJRKEFEQ3hfSVJRbikKKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIERNQToKKyAgICAgICAgICgrKykgRGVpbml0aWFsaXplIHRoZSBETUEKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0RNQV9Jbml0KCkuCisgICAgICAgICAoKyspIERpc2FibGUgdGhlIE5WSUMgZm9yIERNQQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfTlZJQ19FbmFibGVJUlEoRE1BeF9DaGFubmVseF9JUlFuKQorCisgICAgWy4uXQorCisgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisKKyAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTLCB3aGVuIHNldCB0byAxLAorICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICAgICBVc2UgRnVuY3Rpb25zIEByZWYgSEFMX0FEQ19SZWdpc3RlckNhbGxiYWNrKCkKKyAgICAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorICAgIFsuLl0KKworICAgICBGdW5jdGlvbiBAcmVmIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBDb252Q3BsdENhbGxiYWNrICAgICAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sKKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICAgIDogQURDIGVycm9yIGNhbGxiYWNrCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgICA6IEFEQyBNc3AgSW5pdCBjYWxsYmFjaworICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBBREMgTXNwIERlSW5pdCBjYWxsYmFjaworICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgWy4uXQorCisgICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9BRENfVW5SZWdpc3RlckNhbGxiYWNrIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgd2VhayBmdW5jdGlvbi4KKyAgICBbLi5dCisKKyAgICAgQHJlZiBIQUxfQURDX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgKCspIENvbnZDcGx0Q2FsbGJhY2sgICAgICAgICAgICAgICA6IEFEQyBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrCisgICAgICAgKCspIENvbnZIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA6IEFEQyBjb252ZXJzaW9uIERNQSBoYWxmLXRyYW5zZmVyIGNhbGxiYWNrCisgICAgICAgKCspIExldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayAgICAgICA6IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSBjYWxsYmFjaworICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICAgOiBBREMgZXJyb3IgY2FsbGJhY2sKKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgIDogQURDIE1zcCBJbml0IGNhbGxiYWNrCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgICA6IEFEQyBNc3AgRGVJbml0IGNhbGxiYWNrCisgICAgIFsuLl0KKworICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfQURDX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgQHJlZiBIQUxfQURDX1NUQVRFX1JFU0VUCisgICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgICAgZXhhbXBsZXMgQHJlZiBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfQURDX0Vycm9yQ2FsbGJhY2soKS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfQURDX0luaXQoKS8gQHJlZiBIQUxfQURDX0RlSW5pdCgpIG9ubHkgd2hlbgorICAgICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgIFsuLl0KKworICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9BRENfSW5pdCgpLyBAcmVmIEhBTF9BRENfRGVJbml0KCkKKyAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKSB3aGF0ZXZlciB0aGUgc3RhdGUuCisgICAgIFsuLl0KKworICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEByZWYgSEFMX0FEQ19TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICAgaW4gQHJlZiBIQUxfQURDX1NUQVRFX1JFQURZIG9yIEByZWYgSEFMX0FEQ19TVEFURV9SRVNFVCBzdGF0ZSwKKyAgICAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBbLi5dCisKKyAgICAgVGhlbiwgdGhlIHVzZXIgZmlyc3QgcmVnaXN0ZXJzIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICB1c2luZyBAcmVmIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX0FEQ19EZUluaXQoKQorICAgICBvciBAcmVmIEhBTF9BRENfSW5pdCgpIGZ1bmN0aW9uLgorICAgICBbLi5dCisKKyAgICAgV2hlbiB0aGUgY29tcGlsYXRpb24gZmxhZyBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwgY2FsbGJhY2tzCisgICAgIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCisgIAorICAgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBREMgQURDCisgICogQGJyaWVmIEFEQyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfQURDX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0NvbnN0YW50cyBBREMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBEZWxheSBmb3IgQURDIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWF4aW11bSBkZWxheSBpcyAxdXMgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciB0U1RBUlQpLiAqLworLyogVW5pdDogdXMgKi8KKyNkZWZpbmUgQURDX1NUQUJfREVMQVlfVVMgICAgICAgKCh1aW50MzJfdCkgMVUpCisKKy8qIERlbGF5IGZvciB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lLiAqLworLyogTWF4aW11bSBkZWxheSBpcyAxMHVzIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgdFNUQVJUKS4gKi8KKy8qIFVuaXQ6IHVzICovCisjZGVmaW5lIEFEQ19URU1QU0VOU09SX0RFTEFZX1VTICgodWludDMyX3QpIDEwVSkgCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0Z1bmN0aW9ucyBBREMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEFEQ19FbmFibGUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEFEQ19EaXNhYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBBRENfQ29udmVyc2lvblN0b3AoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworc3RhdGljIHZvaWQgQURDX0RNQUNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEFEQ19ETUFIYWxmQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgQURDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEFEQ19EZWxheU1pY3JvU2Vjb25kKHVpbnQzMl90IG1pY3JvU2Vjb25kKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnMgQURDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBBREMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIEFEQy4gCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgQURDLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBBREMgcGVyaXBoZXJhbCBhbmQgcmVndWxhciBncm91cCBhY2NvcmRpbmcgdG8gIAorICAqICAgICAgICAgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gc3RydWN0dXJlICJBRENfSW5pdFR5cGVEZWYiLgorICAqIEBub3RlICAgQXMgcHJlcmVxdWlzaXRlLCBBREMgY2xvY2sgbXVzdCBiZSBjb25maWd1cmVkIGF0IFJDQyB0b3AgbGV2ZWwKKyAgKiAgICAgICAgIGRlcGVuZGluZyBvbiBwb3NzaWJsZSBjbG9jayBzb3VyY2VzOiBBUEIgY2xvY2sgb2YgSFNJIGNsb2NrLgorICAqICAgICAgICAgU2VlIGNvbW1lbnRlZCBleGFtcGxlIGNvZGUgYmVsb3cgdGhhdCBjYW4gYmUgY29waWVkIGFuZCB1bmNvbW1lbnRlZAorICAqICAgICAgICAgaW50byBIQUxfQURDX01zcEluaXQoKS4KKyAgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBBREMgTVNQIChIQUxfQURDX01zcEluaXQoKSkgb25seSB3aGVuCisgICogICAgICAgICBjb21pbmcgZnJvbSBBREMgc3RhdGUgcmVzZXQuIEZvbGxvd2luZyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byByZWNvbmZpZ3VyZSBzb21lIHBhcmFtZXRlcnMgb2YgQURDX0luaXRUeXBlRGVmICAKKyAgKiAgICAgICAgIHN0cnVjdHVyZSBvbiB0aGUgZmx5LCB3aXRob3V0IG1vZGlmeWluZyBNU1AgY29uZmlndXJhdGlvbi4gSWYgQURDICAKKyAgKiAgICAgICAgIE1TUCBoYXMgdG8gYmUgbW9kaWZpZWQgYWdhaW4sIEhBTF9BRENfRGVJbml0KCkgbXVzdCBiZSBjYWxsZWQKKyAgKiAgICAgICAgIGJlZm9yZSBIQUxfQURDX0luaXQoKS4KKyAgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgCisgICogICAgICAgICAiQURDX0luaXRUeXBlRGVmIi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgQURDIHdpdGhpbiAyIHNjb3Blczogc2NvcGUgb2YgZW50aXJlIAorICAqICAgICAgICAgQURDIGFuZCBzY29wZSBvZiByZWd1bGFyIGdyb3VwLiBGb3IgcGFyYW1ldGVycyBkZXRhaWxzLCBzZWUgY29tbWVudHMgCisgICogICAgICAgICBvZiBzdHJ1Y3R1cmUgIkFEQ19Jbml0VHlwZURlZiIuCisgICogQG5vdGUgICBXaGVuIGRldmljZSBpcyBpbiBtb2RlIGxvdy1wb3dlciAobG93LXBvd2VyIHJ1biwgbG93LXBvd2VyIHNsZWVwIG9yIHN0b3AgbW9kZSksIAorICAqICAgICAgICAgZnVuY3Rpb24gIkhBTF9BRENFeF9FbmFibGVWUkVGSU5UKCkiIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBmdW5jdGlvbiBIQUxfQURDX0luaXQoKSAKKyAgKiAgICAgICAgIChpbiBjYXNlIG9mIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zOiBmdW5jdGlvbiBIQUxfQURDX0RlSW5pdCgpIG11c3QgYmUgY2FsbGVkIGZpcnN0KS4KKyAgKiAgICAgICAgIEluIGNhc2Ugb2YgaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yIHRvIGJlIG1lYXN1cmVkOgorICAqICAgICAgICAgZnVuY3Rpb24gIkhBTF9BRENFeF9FbmFibGVWUkVGSU5UVGVtcFNlbnNvcigpIiBtdXN0IGJlIGNhbGxlZCBzaW1pbGFyaWxseS4gIAorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0luaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgCisgIC8qIENoZWNrIEFEQyBoYW5kbGUgKi8KKyAgaWYoaGFkYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DTE9DS1BSRVNDQUxFUihoYWRjLT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfUkVTT0xVVElPTihoYWRjLT5Jbml0LlJlc29sdXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19EQVRBX0FMSUdOKGhhZGMtPkluaXQuRGF0YUFsaWduKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0NBTl9NT0RFKGhhZGMtPkluaXQuU2NhbkNvbnZNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRVhUVFJJR19FREdFKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udkVkZ2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FWFRUUklHKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0LkRNQUNvbnRpbnVvdXNSZXF1ZXN0cykpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VPQ19TRUxFQ1RJT04oaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19PVkVSUlVOKGhhZGMtPkluaXQuT3ZlcnJ1bikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0Lkxvd1Bvd2VyQXV0b1dhaXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5Mb3dQb3dlckZyZXF1ZW5jeU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9Qb3dlck9mZikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1NBTVBMRV9USU1FKGhhZGMtPkluaXQuU2FtcGxpbmdUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nTW9kZSkpOworCisgIC8qIEFzIHByZXJlcXVpc2l0ZSwgaW50byBIQUxfQURDX01zcEluaXQoKSwgQURDIGNsb2NrIG11c3QgYmUgY29uZmlndXJlZCAgICAqLworICAvKiBhdCBSQ0MgdG9wIGxldmVsIGRlcGVuZGluZyBvbiBib3RoIHBvc3NpYmxlIGNsb2NrIHNvdXJjZXM6ICAgICAgICAgICAgICAgKi8KKyAgLyogQVBCIGNsb2NrIG9yIEhTSSBjbG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFJlZmVyIHRvIGhlYWRlciBvZiB0aGlzIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBvbiBjbG9jayBlbmFibGluZyBwcm9jZWR1cmUqLworICAKKyAgLyogQWN0aW9ucyBwZXJmb3JtZWQgb25seSBpZiBBREMgaXMgY29taW5nIGZyb20gc3RhdGUgcmVzZXQ6ICAgICAgICAgICAgICAgICovCisgIC8qIC0gSW5pdGlhbGl6YXRpb24gb2YgQURDIE1TUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBlbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoaGFkYy0+U3RhdGUgPT0gSEFMX0FEQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEluaXRpYWxpemUgQURDIGVycm9yIGNvZGUgKi8KKyAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgIAorICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoYWRjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworICAgIAorI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBJbml0IHRoZSBBREMgQ2FsbGJhY2sgc2V0dGluZ3MgKi8KKyAgICBoYWRjLT5Db252Q3BsdENhbGxiYWNrICAgICAgICAgICAgICA9IEhBTF9BRENfQ29udkNwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgPSBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayAgICAgID0gSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5FcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICA9IEhBTF9BRENfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgCisgICAgaWYgKGhhZGMtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhhZGMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICB9CisgICAgCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBIQUxfQURDX01zcEluaXQoaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgCisgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIHBhcmFtZXRlcnMgaWYgcHJldmlvdXMgcHJlbGltaW5hcnkgYWN0aW9ucyBhcmUgICAgICAqLyAKKyAgLyogY29ycmVjdGx5IGNvbXBsZXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGFuZCBpZiB0aGVyZSBpcyBubyBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXAgKEFEQyBjYW4gYmUgICAgICAqLworICAvKiBlbmFibGVkIGFueXdheSwgaW4gY2FzZSBvZiBjYWxsIG9mIHRoaXMgZnVuY3Rpb24gdG8gdXBkYXRlIGEgcGFyYW1ldGVyICAgKi8KKyAgLyogb24gdGhlIGZseSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgfHwKKyAgICAgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUihoYWRjKSAhPSBSRVNFVCkgICkKKyAgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgQURDIHN0YXRlICovCisgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZLAorICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwpOworCisgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAqLworICAvKiAgLSBBREMgY2xvY2sgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIEFEQyBjbG9jayBwcmVzY2FsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gQURDIFJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoQURDX0lTX0VOQUJMRShoYWRjKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIFNvbWUgcGFyYW1ldGVycyBvZiB0aGlzIHJlZ2lzdGVyIGFyZSBub3QgcmVzZXQsIHNpbmNlIHRoZXkgYXJlIHNldCAgICovCisgICAgLyogYnkgb3RoZXIgZnVuY3Rpb25zIGFuZCBtdXN0IGJlIGtlcHQgaW4gY2FzZSBvZiB1c2FnZSBvZiB0aGlzICAgICAgICAgKi8KKyAgICAvKiBmdW5jdGlvbiBvbiB0aGUgZmx5ICh1cGRhdGUgb2YgYSBwYXJhbWV0ZXIgb2YgQURDX0luaXRUeXBlRGVmICAgICAgICAqLworICAgIC8qIHdpdGhvdXQgbmVlZGluZyB0byByZWNvbmZpZ3VyZSBhbGwgb3RoZXIgQURDIGdyb3Vwcy9jaGFubmVscyAgICAgICAgICovCisgICAgLyogcGFyYW1ldGVycyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgIC0gaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aHM6IFZiYXQsIHRlbXBlcmF0dXJlIHNlbnNvciwgVnJlZiAgICAgICAqLworICAgIC8qICAgICAoc2V0IGludG8gSEFMX0FEQ19Db25maWdDaGFubmVsKCkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBjbG9jazogY2xvY2sgc291cmNlIFBDTEsgb3IgYXN5bmNocm9ub3VzIHdpdGggCisgICAgc2VsZWN0YWJsZSBwcmVzY2FsZXIgKi8KKyAgICBfX0hBTF9BRENfQ0xPQ0tfUFJFU0NBTEVSKGhhZGMpOworICAgIAorICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gUmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEgJj0gfiggQURDX0NGR1IxX1JFUyk7CisgICAgaGFkYy0+SW5zdGFuY2UtPkNGR1IxIHw9IGhhZGMtPkluaXQuUmVzb2x1dGlvbjsgICAgCisgIH0KKyAgCisgIC8qIFNldCB0aGUgTG93IEZyZXF1ZW5jeSBtb2RlICovCisgIEFEQy0+Q0NSICY9ICh1aW50MzJfdCl+QURDX0NDUl9MRk1FTjsKKyAgQURDLT5DQ1IgfD1fX0hBTF9BRENfQ0NSX0xPV0ZSRVFVRU5DWShoYWRjLT5Jbml0Lkxvd1Bvd2VyRnJlcXVlbmN5TW9kZSk7ICAKKyAgIAorICAvKiBFbmFibGUgdm9sdGFnZSByZWd1bGF0b3IgKGlmIGRpc2FibGVkIGF0IHRoaXMgc3RlcCkgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FEVlJFR0VOKSkKKyAgeworICAgIC8qIFNldCBBRFZSRUdFTiBiaXQgKi8KKyAgICBoYWRjLT5JbnN0YW5jZS0+Q1IgfD0gQURDX0NSX0FEVlJFR0VOOworICB9CisgIAorICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gUmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIERhdGEgYWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBTY2FuIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gRXh0ZXJuYWwgdHJpZ2dlciB0byBzdGFydCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIEV4dGVybmFsIHRyaWdnZXIgcG9sYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBDb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gRE1BIGNvbnRpbnVvdXMgcmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIE92ZXJydW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBBdXRvRGVsYXkgZmVhdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gRGlzY29udGludW91cyBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGhhZGMtPkluc3RhbmNlLT5DRkdSMSAmPSB+KEFEQ19DRkdSMV9BTElHTiAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX1NDQU5ESVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfRVhUU0VMICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9FWFRFTiAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0NPTlQgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfRE1BQ0ZHICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9PVlJNT0QgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FVVERMWSAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVVUT0ZGICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9ESVNDRU4gICApOworICAKKyAgaGFkYy0+SW5zdGFuY2UtPkNGR1IxIHw9IChoYWRjLT5Jbml0LkRhdGFBbGlnbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TQ0FORElSKGhhZGMtPkluaXQuU2NhbkNvbnZNb2RlKSAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NPTlRJTlVPVVMoKHVpbnQzMl90KWhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlKSAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0RNQUNPTlRSRVEoKHVpbnQzMl90KWhhZGMtPkluaXQuRE1BQ29udGludW91c1JlcXVlc3RzKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFkYy0+SW5pdC5PdmVycnVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9BRENfQ0ZHUjFfQXV0b0RlbGF5KGhhZGMtPkluaXQuTG93UG93ZXJBdXRvV2FpdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0FEQ19DRkdSMV9BVVRPRkYoaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9Qb3dlck9mZikpOworICAKKyAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaWYgdHJpZ2dlciBzZWxlY3Rpb24gaXMgZGlmZmVyZW50IG9mIHNvZnR3YXJlICAqLworICAvKiBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGU6IFRoaXMgY29uZmlndXJhdGlvbiBrZWVwcyB0aGUgaGFyZHdhcmUgZmVhdHVyZSBvZiBwYXJhbWV0ZXIgICAgICAgKi8KKyAgLyogICAgICAgRXh0ZXJuYWxUcmlnQ29udkVkZ2UgInRyaWdnZXIgZWRnZSBub25lIiBlcXVpdmFsZW50IHRvICAgICAgICAgICAqLworICAvKiAgICAgICBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChoYWRjLT5Jbml0LkV4dGVybmFsVHJpZ0NvbnYgIT0gQURDX1NPRlRXQVJFX1NUQVJUKQorICB7CisgICAgaGFkYy0+SW5zdGFuY2UtPkNGR1IxIHw9IGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udkVkZ2U7CisgIH0KKyAgCisgIC8qIEVuYWJsZSBkaXNjb250aW51b3VzIG1vZGUgb25seSBpZiBjb250aW51b3VzIG1vZGUgaXMgZGlzYWJsZWQgKi8KKyAgaWYgKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkKKyAgeworICAgIGlmIChoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSA9PSBESVNBQkxFKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGdyb3VwIHJlZ3VsYXIgZGlzY29udGludW91cyBtb2RlICovCisgICAgICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEgfD0gKEFEQ19DRkdSMV9ESVNDRU4pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQURDIHJlZ3VsYXIgZ3JvdXAgZGlzY29udGludW91cyB3YXMgaW50ZW5kZWQgdG8gYmUgZW5hYmxlZCwgICAgICAgICovCisgICAgICAvKiBidXQgQURDIHJlZ3VsYXIgZ3JvdXAgbW9kZXMgY29udGludW91cyBhbmQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgKi8KKyAgICAgIC8qIGNhbm5vdCBiZSBlbmFibGVkIHNpbXVsdGFuZW91c2x5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgCisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgIAorICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgfQorICB9CisgIAorICBpZiAoaGFkYy0+SW5pdC5PdmVyc2FtcGxpbmdNb2RlID09IEVOQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19BRENfT1ZFUlNBTVBMSU5HX1JBVElPKGhhZGMtPkluaXQuT3ZlcnNhbXBsZS5SYXRpbykpOworICAgIGFzc2VydF9wYXJhbShJU19BRENfUklHSFRfQklUX1NISUZUKGhhZGMtPkluaXQuT3ZlcnNhbXBsZS5SaWdodEJpdFNoaWZ0KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19UUklHR0VSRURfT1ZFUlNBTVBMSU5HX01PREUoaGFkYy0+SW5pdC5PdmVyc2FtcGxlLlRyaWdnZXJlZE1vZGUpKTsKKworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgT3ZlcnNhbXBsZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBPdmVyc2FtcGxpbmcgUmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gUmlnaHQgYml0IHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIFRyaWdnZXJlZCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIgJj0gfiggQURDX0NGR1IyX09WU1IgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9UT1ZTICk7CisgICAgCisgICAgaGFkYy0+SW5zdGFuY2UtPkNGR1IyIHw9ICggaGFkYy0+SW5pdC5PdmVyc2FtcGxlLlJhdGlvICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnNhbXBsZS5SaWdodEJpdFNoaWZ0ICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWRjLT5Jbml0Lk92ZXJzYW1wbGUuVHJpZ2dlcmVkTW9kZSApOworICAgIAorICAgIC8qIEVuYWJsZSBPdmVyU2FtcGxpbmcgbW9kZSAqLworICAgICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIgfD0gQURDX0NGR1IyX09WU0U7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoSEFMX0lTX0JJVF9TRVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLCBBRENfQ0ZHUjJfT1ZTRSkpCisgICAgeworICAgICAgLyogRGlzYWJsZSBPdmVyU2FtcGxpbmcgbW9kZSBpZiBuZWVkZWQgKi8KKyAgICAgIGhhZGMtPkluc3RhbmNlLT5DRkdSMiAmPSB+QURDX0NGR1IyX09WU0U7CisgICAgfQorICB9ICAgIAorICAKKyAgLyogQ2xlYXIgdGhlIG9sZCBzYW1wbGluZyB0aW1lICovCisgIGhhZGMtPkluc3RhbmNlLT5TTVBSICY9ICh1aW50MzJfdCkofkFEQ19TTVBSX1NNUFIpOworICAKKyAgLyogU2V0IHRoZSBuZXcgc2FtcGxlIHRpbWUgKi8KKyAgaGFkYy0+SW5zdGFuY2UtPlNNUFIgfD0gaGFkYy0+SW5pdC5TYW1wbGluZ1RpbWU7CisgIAorICAvKiBDbGVhciBBREMgZXJyb3IgY29kZSAqLworICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworCisgIC8qIFNldCB0aGUgQURDIHN0YXRlICovCisgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworCisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZSB0aGUgQURDIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQKKyAgKiAgICAgICAgIHZhbHVlcywgd2l0aCBkZWluaXRpYWxpemF0aW9uIG9mIHRoZSBBREMgTVNQLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3M6IHJlc2V0IG9mIEFEQyBjb21tb24gcmVnaXN0ZXJzIGlzIGRvbmUgCisgICogICAgICAgICBvbmx5IGlmIGFsbCBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCByZXNldCBvZiB0aGVzZSBjb21tb24gcGFyYW1ldGVycyByZXNldCBpcyAgCisgICogICAgICAgICBieXBhc3NlZCB3aXRob3V0IGVycm9yIHJlcG9ydGluZzogaXQgY2FuIGJlIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBpbgorICAqICAgICAgICAgY2FzZSBvZiByZXNldCBvZiBhIHNpbmdsZSBBREMgd2hpbGUgdGhlIG90aGVyIEFEQ3Mgc2hhcmluZyB0aGUgc2FtZSAKKyAgKiAgICAgICAgIGNvbW1vbiBncm91cCBpcyBzdGlsbCBydW5uaW5nLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0RlSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayBBREMgaGFuZGxlICovCisgIGlmKGhhZGMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBTZXQgQURDIHN0YXRlICovCisgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisgIAorICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiByZWd1bGFyIGdyb3VwICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMpOworICAKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7ICAgCisgICAgLyogRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAgIAorICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyAhPSBIQUxfRVJST1IpCisgICAgeworICAgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSAqLworICAgICAgaGFkYy0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFQURZOworICAgIH0KKyAgfQorICAKKyAgCisgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIHBhcmFtZXRlcnMgaWYgcHJldmlvdXMgcHJlbGltaW5hcnkgYWN0aW9ucyBhcmUgICAgICAqLyAKKyAgLyogY29ycmVjdGx5IGNvbXBsZXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyAhPSBIQUxfRVJST1IpCisgIHsKKyAgICAKKyAgICAvKiA9PT09PT09PT09IFJlc2V0IEFEQyByZWdpc3RlcnMgPT09PT09PT09PSAqLworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIElFUiAqLworICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfQVdEIHwgQURDX0lUX09WUiB8IEFEQ19JVF9FT0NBTCB8IEFEQ19JVF9FT1MgfCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSVRfRU9DIHwgQURDX0lUX1JEWSB8IEFEQ19JVF9FT1NNUCApKTsKKyAgCisgICAgICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIElTUiAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19BV0QgfCBBRENfRkxBR19FT0NBTCB8IEFEQ19GTEFHX09WUiB8IEFEQ19GTEFHX0VPUyB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPU01QIHwgQURDX0ZMQUdfUkRZKSk7CisgIAorICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENSICovCisgICAgLyogRGlzYWJsZSB2b2x0YWdlIHJlZ3VsYXRvciAqLworICAgIC8qIE5vdGU6IFJlZ3VsYXRvciBkaXNhYmxlIHVzZWZ1bCBmb3IgcG93ZXIgc2F2aW5nICovCisgICAgLyogUmVzZXQgQURWUkVHRU4gYml0ICovCisgICAgaGFkYy0+SW5zdGFuY2UtPkNSICY9IH5BRENfQ1JfQURWUkVHRU47CisgICAgCisgICAgLyogQml0cyBBRENfQ1JfQURTVFAsIEFEQ19DUl9BRFNUQVJUIGFyZSBpbiBhY2Nlc3MgbW9kZSAicmVhZC1zZXQiOiBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZSAqLworICAgIC8qIE5vIGFjdGlvbiAqLworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IxICovCisgICAgaGFkYy0+SW5zdGFuY2UtPkNGR1IxICY9IH4oQURDX0NGR1IxX0FXRENIICB8IEFEQ19DRkdSMV9BV0RFTiAgfCBBRENfQ0ZHUjFfQVdEU0dMIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9ESVNDRU4gfCBBRENfQ0ZHUjFfQVVUT0ZGIHwgQURDX0NGR1IxX0FVVERMWSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQ09OVCAgIHwgQURDX0NGR1IxX09WUk1PRCB8IEFEQ19DRkdSMV9FWFRFTiAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0VYVFNFTCB8IEFEQ19DRkdSMV9BTElHTiAgfCBBRENfQ0ZHUjFfUkVTICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9TQ0FORElSfCBBRENfQ0ZHUjFfRE1BQ0ZHIHwgQURDX0NGR1IxX0RNQUVOKTsKKyAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQ0ZHUjIgKi8KKyAgICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIgJj0gfihBRENfQ0ZHUjJfVE9WUyAgfCBBRENfQ0ZHUjJfT1ZTUyAgfCBBRENfQ0ZHUjJfT1ZTUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTRSAgfCBBRENfQ0ZHUjJfQ0tNT0RFICk7CisgIAorICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIgKi8KKyAgICBoYWRjLT5JbnN0YW5jZS0+U01QUiAmPSB+KEFEQ19TTVBSX1NNUFIpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSICovCisgICAgaGFkYy0+SW5zdGFuY2UtPlRSICY9IH4oQURDX1RSX0xUIHwgQURDX1RSX0hUKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDQUxGQUNUICovCisgICAgaGFkYy0+SW5zdGFuY2UtPkNBTEZBQ1QgJj0gfihBRENfQ0FMRkFDVF9DQUxGQUNUKTsKKyAgCisgIAorICAKKyAgCisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgRFIgKi8KKyAgICAvKiBiaXRzIGluIGFjY2VzcyBtb2RlIHJlYWQgb25seSwgbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUqLworICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDQUxGQUNUICovCisgICAgaGFkYy0+SW5zdGFuY2UtPkNBTEZBQ1QgJj0gfihBRENfQ0FMRkFDVF9DQUxGQUNUKTsKKyAgCisgICAgLyogPT09PT09PT09PSBIYXJkIHJlc2V0IEFEQyBwZXJpcGhlcmFsID09PT09PT09PT0gKi8KKyAgICAvKiBQZXJmb3JtcyBhIGdsb2JhbCByZXNldCBvZiB0aGUgZW50aXJlIEFEQyBwZXJpcGhlcmFsOiBBREMgc3RhdGUgaXMgICAgICovCisgICAgLyogZm9yY2VkIHRvIGEgc2ltaWxhciBzdGF0ZSBhZnRlciBkZXZpY2UgcG93ZXItb24uICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIElmIG5lZWRlZCwgY29weS1wYXN0ZSBhbmQgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgcmVzZXQgY29kZSBpbnRvICAgICAgKi8KKyAgICAvKiBmdW5jdGlvbiAidm9pZCBIQUxfQURDX01zcEluaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpIjogICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICBfX0hBTF9SQ0NfQURDMV9GT1JDRV9SRVNFVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICBfX0hBTF9SQ0NfQURDMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaWYgKGhhZGMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQURDX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLworICAgIH0KKyAgICAKKyAgICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGhhZGMtPk1zcERlSW5pdENhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIEhBTF9BRENfTXNwRGVJbml0KGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIAorICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovCisgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgICAKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgaGFkYy0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUOworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEFEQyBNU1AuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfTXNwSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Nc3BJbml0IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgQURDIE1TUC4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ19Nc3BEZUluaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfTXNwRGVJbml0IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovIAorfQorCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgQURDIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGFkYyBQb2ludGVyIHRvIGEgQURDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBBREMuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQgICAgICBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0NPTlZFUlNJT05fSEFMRl9DQl9JRCAgICAgICAgICBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICAgQURDIGVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfSU5KX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQgIEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgIEFEQyBNc3AgSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgICBBREMgTXNwIERlSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19SZWdpc3RlckNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBBRENfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX1JFQURZKSAhPSAwKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0hBTEZfQ0JfSUQgOgorICAgICAgICBoYWRjLT5Db252SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQgOgorICAgICAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfRVJST1JfQ0JfSUQgOgorICAgICAgICBoYWRjLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoYWRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfQURDX1NUQVRFX1JFU0VUID09IGhhZGMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0FEQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhhZGMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGEgQURDIENhbGxiYWNrCisgICogICAgICAgICBBREMgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoYWRjIFBvaW50ZXIgdG8gYSBBRENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEFEQy4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEICAgICAgQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19DT05WRVJTSU9OX0hBTEZfQ0JfSUQgICAgICAgICAgQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQgICAgQURDIGFuYWxvZyB3YXRjaGRvZyAxIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgIEFEQyBlcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0lOSl9DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEICBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgICBBREMgTXNwIEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICAgQURDIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1VuUmVnaXN0ZXJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUFEWSkgIT0gMCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhhZGMtPkNvbnZDcGx0Q2FsbGJhY2sgPSBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfQ09OVkVSU0lPTl9IQUxGX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRCA6CisgICAgICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayA9IEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+RXJyb3JDYWxsYmFjayA9IEhBTF9BRENfRXJyb3JDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhhZGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIAorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfQURDX1NUQVRFX1JFU0VUID09IGhhZGMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0FEQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQURDX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIAorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIAorICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgQURDIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBBREMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgICAgICgrKSBQb2xsIGZvciBjb252ZXJzaW9uIGNvbXBsZXRlIG9uIHJlZ3VsYXIgZ3JvdXAuCisgICAgICAoKykgUG9sbCBmb3IgY29udmVyc2lvbiBldmVudC4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIHJlZ3VsYXIgY2hhbm5lbCBjb252ZXJzaW9uLgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgZW5hYmxlIGludGVycnVwdGlvbnMuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIGRpc2FibGUgaW50ZXJydXB0aW9ucy4KKyAgICAgICgrKSBIYW5kbGUgQURDIGludGVycnVwdCByZXF1ZXN0CisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMsIHN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOiBOb25lLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQZXJmb3JtIEFEQyBlbmFibGUgYW5kIGNvbnZlcnNpb24gc3RhcnQgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyAqLworICBpZiAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSKGhhZGMpID09IFJFU0VUKQorICB7CisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAgIC8qIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICAvKiBJZiBsb3cgcG93ZXIgbW9kZSBBdXRvUG93ZXJPZmYgaXMgZW5hYmxlZCwgcG93ZXItb24vb2ZmIHBoYXNlcyBhcmUgICAgICovCisgICAgLyogcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChoYWRjLT5Jbml0Lkxvd1Bvd2VyQXV0b1Bvd2VyT2ZmICE9IEVOQUJMRSkKKyAgICB7CisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgICAgfQorICAgIAorICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICAqLworICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfUkVHX0VPQyB8IEhBTF9BRENfU1RBVEVfUkVHX09WUiB8IEhBTF9BRENfU1RBVEVfUkVHX0VPU01QLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAKKyAgICAgIC8qIFJlc2V0IEFEQyBhbGwgZXJyb3IgY29kZSBmaWVsZHMgKi8KKyAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgCisgICAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyBhbmQgb3ZlcnJ1biBmbGFnICovCisgICAgICAvKiAoVG8gZW5zdXJlIG9mIG5vIHVua25vd24gc3RhdGUgZnJvbSBwb3RlbnRpYWwgcHJldmlvdXMgQURDICAgICAgICAgICAqLworICAgICAgLyogb3BlcmF0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MgfCBBRENfRkxBR19PVlIpKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIElmIHNvZnR3YXJlIHN0YXJ0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHN0YXJ0cyBpbW1lZGlhdGVseS4gICovCisgICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAqLworICAgICAgLyogdHJpZ2dlciBldmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGhhZGMtPkluc3RhbmNlLT5DUiB8PSBBRENfQ1JfQURTVEFSVDsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIChhbmQgaW5qZWN0ZWQgY2hhbm5lbHMgaW4gCisgICogICAgICAgICBjYXNlIG9mIGF1dG9faW5qZWN0aW9uIG1vZGUpLCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYyk7CisgIAorICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FpdCBmb3IgcmVndWxhciBncm91cCBjb252ZXJzaW9uIHRvIGJlIGNvbXBsZXRlZC4KKyAgKiBAbm90ZSAgIEFEQyBjb252ZXJzaW9uIGZsYWdzIEVPUyAoZW5kIG9mIHNlcXVlbmNlKSBhbmQgRU9DIChlbmQgb2YKKyAgKiAgICAgICAgIGNvbnZlcnNpb24pIGFyZSBjbGVhcmVkIGJ5IHRoaXMgZnVuY3Rpb24sIHdpdGggYW4gZXhjZXB0aW9uOgorICAqICAgICAgICAgaWYgbG93IHBvd2VyIGZlYXR1cmUgIkxvd1Bvd2VyQXV0b1dhaXQiIGlzIGVuYWJsZWQsIGZsYWdzIGFyZSAKKyAgKiAgICAgICAgIG5vdCBjbGVhcmVkIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGlzIGZlYXR1cmUgdW50aWwgZGF0YSByZWdpc3RlcgorICAqICAgICAgICAgaXMgcmVhZCB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0dldFZhbHVlKCkuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkIGluIGEgcGFydGljdWxhciBzZXR1cDogQURDIGNvbmZpZ3VyZWQgCisgICogICAgICAgICBpbiBETUEgbW9kZSBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbiAoQURDIGluaXQKKyAgKiAgICAgICAgIHBhcmFtZXRlciAiRU9DU2VsZWN0aW9uIiBzZXQgdG8gQURDX0VPQ19TSU5HTEVfQ09OVikuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIERNQSByZXNldHMgdGhlIGZsYWcgRU9DIGFuZCBwb2xsaW5nIGNhbm5vdCBiZQorICAqICAgICAgICAgcGVyZm9ybWVkIG9uIGVhY2ggY29udmVyc2lvbi4gTmV2ZXJ0aGVsZXNzLCBwb2xsaW5nIGNhbiBzdGlsbCAKKyAgKiAgICAgICAgIGJlIHBlcmZvcm1lZCBvbiB0aGUgY29tcGxldGUgc2VxdWVuY2UgKEFEQyBpbml0CisgICogICAgICAgICBwYXJhbWV0ZXIgIkVPQ1NlbGVjdGlvbiIgc2V0IHRvIEFEQ19FT0NfU0VRX0NPTlYpLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwOworICB1aW50MzJfdCB0bXBfRmxhZ19FT0MgICA9IDB4MDA7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogSWYgZW5kIG9mIGNvbnZlcnNpb24gc2VsZWN0ZWQgdG8gZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zICovCisgIGlmIChoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbiA9PSBBRENfRU9DX1NFUV9DT05WKQorICB7CisgICAgdG1wX0ZsYWdfRU9DID0gQURDX0ZMQUdfRU9TOworICB9CisgIC8qIElmIGVuZCBvZiBjb252ZXJzaW9uIHNlbGVjdGVkIHRvIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gKi8KKyAgZWxzZSAvKiBBRENfRU9DX1NJTkdMRV9DT05WICovCisgIHsKKyAgICAvKiBWZXJpZmljYXRpb24gdGhhdCBBREMgY29uZmlndXJhdGlvbiBpcyBjb21wbGlhbnQgd2l0aCBwb2xsaW5nIGZvciAgICAgICovCisgICAgLyogZWFjaCBjb252ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFBhcnRpY3VsYXIgY2FzZSBpcyBBREMgY29uZmlndXJlZCBpbiBETUEgbW9kZSBhbmQgQURDIHNlcXVlbmNlciB3aXRoICAgKi8KKyAgICAvKiBzZXZlcmFsIHJhbmtzIGFuZCBwb2xsaW5nIGZvciBlbmQgb2YgZWFjaCBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICovCisgICAgLyogRm9yIGNvZGUgc2ltcGxpY2l0eSBzYWtlLCB0aGlzIHBhcnRpY3VsYXIgY2FzZSBpcyBnZW5lcmFsaXplZCB0byAgICAgICAqLworICAgIC8qIEFEQyBjb25maWd1cmVkIGluIERNQSBtb2RlIGFuZCBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbi4gKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IxLCBBRENfQ0ZHUjFfRE1BRU4pKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0bXBfRmxhZ19FT0MgPSAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIEdldCB0aWNrIGNvdW50ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgIAorICAvKiBXYWl0IHVudGlsIEVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gb3Igc2VxdWVuY2UgY29udmVyc2lvbnMgZmxhZyBpcyByYWlzZWQgKi8KKyAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGFkYy0+SW5zdGFuY2UtPklTUiwgdG1wX0ZsYWdfRU9DKSkKKyAgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIHRpbWVvdXQgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9USU1FT1VUKTsKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lICovCisgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPQyk7CisgIAorICAvKiBEZXRlcm1pbmUgd2hldGhlciBhbnkgZnVydGhlciBjb252ZXJzaW9uIHVwY29taW5nIG9uIGdyb3VwIHJlZ3VsYXIgICAgICAgKi8KKyAgLyogYnkgZXh0ZXJuYWwgdHJpZ2dlciwgY29udGludW91cyBtb2RlIG9yIHNjYW4gc2VxdWVuY2Ugb24gZ29pbmcuICAgICAgICAgICovCisgIGlmKEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9SRUdVTEFSKGhhZGMpICAgICAgICAmJiAKKyAgICAgKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlID09IERJU0FCTEUpICAgKQorICB7CisgICAgLyogSWYgRW5kIG9mIFNlcXVlbmNlIGlzIHJlYWNoZWQsIGRpc2FibGUgaW50ZXJydXB0cyAqLworICAgIGlmKCBfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKSApCisgICAgeworICAgICAgLyogQWxsb3dlZCB0byBtb2RpZnkgYml0cyBBRENfSVRfRU9DL0FEQ19JVF9FT1Mgb25seSBpZiBiaXQgICAgICAgICAgICAgKi8KKyAgICAgIC8qIEFEU1RBUlQ9PTAgKG5vIGNvbnZlcnNpb24gb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSKGhhZGMpID09IFJFU0VUKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIEFEQyBlbmQgb2Ygc2luZ2xlIGNvbnZlcnNpb24gaW50ZXJydXB0IG9uIGdyb3VwIHJlZ3VsYXIgKi8KKyAgICAgICAgLyogTm90ZTogT3ZlcnJ1biBpbnRlcnJ1cHQgd2FzIGVuYWJsZWQgd2l0aCBFT0MgaW50ZXJydXB0IGluICAgICAgICAgICovCisgICAgICAgIC8qIEhBTF9TdGFydF9JVCgpLCBidXQgaXMgbm90IGRpc2FibGVkIGhlcmUgYmVjYXVzZSBjYW4gYmUgdXNlZCAgICAgICAqLworICAgICAgICAvKiBieSBvdmVycnVuIElSUSBwcm9jZXNzIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENoYW5nZSBBREMgc3RhdGUgdG8gZXJyb3Igc3RhdGUgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIENsZWFyIGVuZCBvZiBjb252ZXJzaW9uIGZsYWcgb2YgcmVndWxhciBncm91cCBpZiBsb3cgcG93ZXIgZmVhdHVyZSAgICAgICAqLworICAvKiAiTG93UG93ZXJBdXRvV2FpdCAiIGlzIGRpc2FibGVkLCB0byBub3QgaW50ZXJmZXJlIHdpdGggdGhpcyBmZWF0dXJlICAgICAgKi8KKyAgLyogdW50aWwgZGF0YSByZWdpc3RlciBpcyByZWFkIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKS4gICAgICAgICAgICovCisgIGlmIChoYWRjLT5Jbml0Lkxvd1Bvd2VyQXV0b1dhaXQgPT0gRElTQUJMRSkKKyAgeworICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUykpOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUG9sbCBmb3IgQURDIGV2ZW50LgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBFdmVudFR5cGUgdGhlIEFEQyBldmVudCB0eXBlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEFEQ19BV0RfRVZFTlQ6IEFEQyBBbmFsb2cgd2F0Y2hkb2cgZXZlbnQKKyAgKiAgICAgICAgICAgIEBhcmcgQURDX09WUl9FVkVOVDogQURDIE92ZXJydW4gZXZlbnQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZC4KKyAgKiBAbm90ZSAgIFRoZSByZWxldmFudCBmbGFnIGlzIGNsZWFyZWQgaWYgZm91bmQgdG8gYmUgc2V0LCBleGNlcHQgZm9yIEFEQ19GTEFHX09WUi4KKyAgKiAgICAgICAgIEluZGVlZCwgdGhlIGxhdHRlciBpcyByZXNldCBvbmx5IGlmIGhhZGMtPkluaXQuT3ZlcnJ1biBmaWVsZCBpcyBzZXQgIAorICAqICAgICAgICAgdG8gQURDX09WUl9EQVRBX09WRVJXUklUVEVOLiBPdGhlcndpc2UsIGRhdGEgcmVnaXN0ZXIgbWF5IGJlIHBvdGVudGlhbGx5IG92ZXJ3cml0dGVuIAorICAqICAgICAgICAgYnkgYSBuZXcgY29udmVydGVkIGRhdGEgYXMgc29vbiBhcyBPVlIgaXMgY2xlYXJlZC4KKyAgKiAgICAgICAgIFRvIHJlc2V0IE9WUiBmbGFnIG9uY2UgdGhlIHByZXNlcnZlZCBkYXRhIGlzIHJldHJpZXZlZCwgdGhlIHVzZXIgY2FuIHJlc29ydAorICAqICAgICAgICAgdG8gbWFjcm8gX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfT1ZSKTsgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1BvbGxGb3JFdmVudChBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgRXZlbnRUeXBlLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsgCisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VWRU5UX1RZUEUoRXZlbnRUeXBlKSk7CisgIAorICAvKiBHZXQgdGljayBjb3VudCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAKKyAgLyogQ2hlY2sgc2VsZWN0ZWQgZXZlbnQgZmxhZyAqLworICB3aGlsZShfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgRXZlbnRUeXBlKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gdGltZW91dCAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1RJTUVPVVQpOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBzd2l0Y2goRXZlbnRUeXBlKQorICB7CisgIC8qIEFuYWxvZyB3YXRjaGRvZyAobGV2ZWwgb3V0IG9mIHdpbmRvdykgZXZlbnQgKi8KKyAgY2FzZSBBRENfQVdEX0VWRU5UOgorICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDEpOworICAgIAorICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRCk7CisgICAgYnJlYWs7CisgICAgCisgIC8qIE92ZXJydW4gZXZlbnQgKi8KKyAgZGVmYXVsdDogLyogQ2FzZSBBRENfT1ZSX0VWRU5UICovCisgICAgLyogSWYgb3ZlcnJ1biBpcyBzZXQgdG8gb3ZlcndyaXRlIHByZXZpb3VzIGRhdGEsIG92ZXJydW4gZXZlbnQgaXMgbm90ICAgICAqLworICAgIC8qIGNvbnNpZGVyZWQgYXMgYW4gZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAoY2YgcmVmIG1hbnVhbCAiTWFuYWdpbmcgY29udmVyc2lvbnMgd2l0aG91dCB1c2luZyB0aGUgRE1BIGFuZCB3aXRob3V0ICovCisgICAgLyogb3ZlcnJ1biAiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJydW4gPT0gQURDX09WUl9EQVRBX1BSRVNFUlZFRCkKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19PVlIpOworICAgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBvdmVycnVuICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9PVlIpOworICAgIH0KKyAgICAKKyAgICAvKiBDbGVhciBBREMgT3ZlcnJ1biBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfT1ZSKTsKKyAgICBicmVhazsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMsIHN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCB3aXRoIGludGVycnVwdGlvbi4KKyAgKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uIGFjY29yZGluZyB0byBpbml0aWFsaXphdGlvbgorICAqICAgICAgICAgc2V0dGluZyA6IEVPQyAoZW5kIG9mIGNvbnZlcnNpb24pLCBFT1MgKGVuZCBvZiBzZXF1ZW5jZSksIAorICAqICAgICAgICAgT1ZSIG92ZXJydW4uCisgICogICAgICAgICBFYWNoIG9mIHRoZXNlIGludGVycnVwdGlvbnMgaGFzIGl0cyBkZWRpY2F0ZWQgY2FsbGJhY2sgZnVuY3Rpb24uCisgICogQG5vdGUgICBUbyBndWFyYW50ZWUgYSBwcm9wZXIgcmVzZXQgb2YgYWxsIGludGVycnVwdGlvbnMgb25jZSBhbGwgdGhlIG5lZWRlZAorICAqICAgICAgICAgY29udmVyc2lvbnMgYXJlIG9idGFpbmVkLCBIQUxfQURDX1N0b3BfSVQoKSBtdXN0IGJlIGNhbGxlZCB0byBlbnN1cmUgCisgICogICAgICAgICBhIGNvcnJlY3Qgc3RvcCBvZiB0aGUgSVQtYmFzZWQgY29udmVyc2lvbnMuCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBIQUxfQURDX1N0YXJ0X0lUKCkgZG9lc24ndCBlbmFibGUgdGhlIEVuZCBPZiBTYW1wbGluZyAKKyAgKiAgICAgICAgIGludGVycnVwdGlvbi4gSWYgcmVxdWlyZWQgKGUuZy4gaW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgd2l0aCB0cmlnZ2VyCisgICogICAgICAgICBtb2RlKSwgdGhlIHVzZXIgbXVzdDoKKyAgKiAgICAgICAgICAxLiBmaXJzdCBjbGVhciB0aGUgRU9TTVAgZmxhZyBpZiBzZXQgd2l0aCBtYWNybyBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19FT1NNUCkgICAgICAgICAgICAgCisgICogICAgICAgICAgMi4gdGhlbiBlbmFibGUgdGhlIEVPU01QIGludGVycnVwdCB3aXRoIG1hY3JvIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0VPU01QKSAgICAgCisgICogICAgICAgICAgYmVmb3JlIGNhbGxpbmcgSEFMX0FEQ19TdGFydF9JVCgpLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0YXJ0X0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQZXJmb3JtIEFEQyBlbmFibGUgYW5kIGNvbnZlcnNpb24gc3RhcnQgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyAqLworICBpZiAoQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSKGhhZGMpID09IFJFU0VUKQorICB7CisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAgIC8qIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICAvKiBJZiBsb3cgcG93ZXIgbW9kZSBBdXRvUG93ZXJPZmYgaXMgZW5hYmxlZCwgcG93ZXItb24vb2ZmIHBoYXNlcyBhcmUgICAgICovCisgICAgLyogcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChoYWRjLT5Jbml0Lkxvd1Bvd2VyQXV0b1Bvd2VyT2ZmICE9IEVOQUJMRSkKKyAgICB7CisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgICAgfQorICAgIAorICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICAqLworICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfUkVHX0VPQyB8IEhBTF9BRENfU1RBVEVfUkVHX09WUiB8IEhBTF9BRENfU1RBVEVfUkVHX0VPU01QLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAKKyAgICAgIC8qIFJlc2V0IEFEQyBhbGwgZXJyb3IgY29kZSBmaWVsZHMgKi8KKyAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgCisgICAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyBhbmQgb3ZlcnJ1biBmbGFnICovCisgICAgICAvKiAoVG8gZW5zdXJlIG9mIG5vIHVua25vd24gc3RhdGUgZnJvbSBwb3RlbnRpYWwgcHJldmlvdXMgQURDICAgICAgICAgICAqLworICAgICAgLyogb3BlcmF0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MgfCBBRENfRkxBR19PVlIpKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIEFEQyBlbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQgKi8KKyAgICAgIC8qIEVuYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8gIAorICAgICAgc3dpdGNoKGhhZGMtPkluaXQuRU9DU2VsZWN0aW9uKQorICAgICAgeworICAgICAgICBjYXNlIEFEQ19FT0NfU0VRX0NPTlY6IAorICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9FT0MpOworICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgKEFEQ19JVF9FT1MgfCBBRENfSVRfT1ZSKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIGNhc2UgQURDX0VPQ19TSU5HTEVfQ09OViAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgKEFEQ19JVF9FT0MgfCBBRENfSVRfRU9TIHwgQURDX0lUX09WUikpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5LiAgKi8KKyAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICovCisgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaGFkYy0+SW5zdGFuY2UtPkNSIHw9IEFEQ19DUl9BRFNUQVJUOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9CVVNZOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBncm91cCBpbiAKKyAgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgaW50ZXJydXRpb24gb2YgCisgICogICAgICAgICBlbmQtb2YtY29udmVyc2lvbiwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIDEuIFN0b3AgcG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcsIG9uIEFEQyBncm91cCByZWd1bGFyICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMpOworICAKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IGZvciByZWd1bGFyIGdyb3VwICovCisgICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCAoQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MgfCBBRENfSVRfT1ZSKSk7CisgICAgCisgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAgIAorICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgfQorICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMsIHN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgdHJhbnNmZXIgcmVzdWx0IHRocm91Z2ggRE1BLgorICAqIEBub3RlICAgSW50ZXJydXB0aW9ucyBlbmFibGVkIGluIHRoaXMgZnVuY3Rpb246CisgICogICAgICAgICBvdmVycnVuIChpZiBhcHBsaWNhYmxlKSwgRE1BIGhhbGYgdHJhbnNmZXIsIERNQSB0cmFuc2ZlciBjb21wbGV0ZS4gCisgICogICAgICAgICBFYWNoIG9mIHRoZXNlIGludGVycnVwdGlvbnMgaGFzIGl0cyBkZWRpY2F0ZWQgY2FsbGJhY2sgZnVuY3Rpb24uCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIERlc3RpbmF0aW9uIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIExlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gQURDIHBlcmlwaGVyYWwgdG8gbWVtb3J5IChpbiBieXRlcykKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0YXJ0X0RNQShBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QqIHBEYXRhLCB1aW50MzJfdCBMZW5ndGgpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFBlcmZvcm0gQURDIGVuYWJsZSBhbmQgY29udmVyc2lvbiBzdGFydCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nICovCisgIGlmIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGFkYyk7CisKKyAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgLyogSWYgbG93IHBvd2VyIG1vZGUgQXV0b1Bvd2VyT2ZmIGlzIGVuYWJsZWQsIHBvd2VyLW9uL29mZiBwaGFzZXMgYXJlICAgICAgICovCisgICAgLyogcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGhhZGMtPkluaXQuTG93UG93ZXJBdXRvUG93ZXJPZmYgIT0gRU5BQkxFKQorICAgIHsKKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKyAgICB9CisgICAgCisgICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIC0gQ2xlYXIgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gcmVzdWx0cyAgICovCisgICAgICAvKiAtIFNldCBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9DIHwgSEFMX0FEQ19TVEFURV9SRUdfT1ZSIHwgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVAsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsKKyAgICAgIAorICAgICAgLyogUmVzZXQgQURDIGFsbCBlcnJvciBjb2RlIGZpZWxkcyAqLworICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgICAgIAorICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgKi8KKyAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyQ3BsdENhbGxiYWNrID0gQURDX0RNQUNvbnZDcGx0OworICAgICAgCisgICAgICAvKiBTZXQgdGhlIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IEFEQ19ETUFIYWxmQ29udkNwbHQ7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyRXJyb3JDYWxsYmFjayA9IEFEQ19ETUFFcnJvcjsKKyAgICAgIAorICAgICAgCisgICAgICAvKiBNYW5hZ2UgQURDIGFuZCBETUEgc3RhcnQ6IEFEQyBvdmVycnVuIGludGVycnVwdGlvbiwgRE1BIHN0YXJ0LCBBREMgICAqLworICAgICAgLyogc3RhcnQgKGluIGNhc2Ugb2YgU1cgc3RhcnQpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIAorICAgICAgLyogQ2xlYXIgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcgYW5kIG92ZXJydW4gZmxhZyAqLworICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyAgICAgICAgICAgKi8KKyAgICAgIC8qIG9wZXJhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBBREMgRE1BIG1vZGUgKi8KKyAgICAgIGhhZGMtPkluc3RhbmNlLT5DRkdSMSB8PSBBRENfQ0ZHUjFfRE1BRU47CisgICAgICAKKyAgICAgIC8qIFN0YXJ0IHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgSEFMX0RNQV9TdGFydF9JVChoYWRjLT5ETUFfSGFuZGxlLCAodWludDMyX3QpJmhhZGMtPkluc3RhbmNlLT5EUiwgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpOworICAgICAgCisgICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogSWYgc29mdHdhcmUgc3RhcnQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gc3RhcnRzIGltbWVkaWF0ZWx5LiAgKi8KKyAgICAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbnZlcnNpb24gd2lsbCBzdGFydCBhdCBuZXh0ICovCisgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaGFkYy0+SW5zdGFuY2UtPkNSIHw9IEFEQ19DUl9BRFNUQVJUOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9CVVNZOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBncm91cCBpbiAKKyAgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZSAKKyAgKiAgICAgICAgIEFEQyBwZXJpcGhlcmFsLgorICAqICAgICAgICAgRWFjaCBvZiB0aGVzZSBpbnRlcnJ1cHRpb25zIGhhcyBpdHMgZGVkaWNhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wX0RNQShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIDEuIFN0b3AgcG90ZW50aWFsIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gb24gZ29pbmcgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYyk7CisgIAorICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBEaXNhYmxlIEFEQyBETUEgKEFEQyBETUEgY29uZmlndXJhdGlvbiBBRENfQ0ZHUl9ETUFDRkcgaXMga2VwdCkgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IxLCBBRENfQ0ZHUjFfRE1BRU4pOworICAgIAorICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsIChpbiBjYXNlIG9mIERNQSBpbiBjaXJjdWxhciBtb2RlIG9yIHN0b3AgICAgICAgKi8KKyAgICAvKiB3aGlsZSBETUEgdHJhbnNmZXIgaXMgb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhhZGMtPkRNQV9IYW5kbGUpOworICAgIAorICAgIC8qIENoZWNrIGlmIERNQSBjaGFubmVsIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsKKyAgICB9CisgICAgCisgICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsKKyAgICAKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIC8qIFVwZGF0ZSAidG1wX2hhbF9zdGF0dXMiIG9ubHkgaWYgRE1BIGNoYW5uZWwgZGlzYWJsaW5nIHBhc3NlZCwgdG8ga2VlcCAgKi8KKyAgICAvKiBpbiBtZW1vcnkgYSBwb3RlbnRpYWwgZmFpbGluZyBzdGF0dXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgQURDX0Rpc2FibGUoaGFkYyk7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICB9CisgICAgCisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gcmVzdWx0LgorICAqIEBub3RlICAgUmVhZGluZyByZWdpc3RlciBEUiBhdXRvbWF0aWNhbGx5IGNsZWFycyBBREMgZmxhZyBFT0MKKyAgKiAgICAgICAgIChBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uKS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2xlYXIgQURDIGZsYWcgRU9TIAorICAqICAgICAgICAgKEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9uKS4KKyAgKiAgICAgICAgIE9jY3VycmVuY2Ugb2YgZmxhZyBFT1MgcmlzaW5nOgorICAqICAgICAgICAgIC0gSWYgc2VxdWVuY2VyIGlzIGNvbXBvc2VkIG9mIDEgcmFuaywgZmxhZyBFT1MgaXMgZXF1aXZhbGVudAorICAqICAgICAgICAgICAgdG8gZmxhZyBFT0MuCisgICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2Ygc2V2ZXJhbCByYW5rcywgZHVyaW5nIHRoZSBzY2FuCisgICogICAgICAgICAgICBzZXF1ZW5jZSBmbGFnIEVPQyBvbmx5IGlzIHJhaXNlZCwgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbiBzZXF1ZW5jZQorICAqICAgICAgICAgICAgYm90aCBmbGFncyBFT0MgYW5kIEVPUyBhcmUgcmFpc2VkLgorICAqICAgICAgICAgVG8gY2xlYXIgdGhpcyBmbGFnLCBlaXRoZXIgdXNlIGZ1bmN0aW9uOgorICAqICAgICAgICAgaW4gcHJvZ3JhbW1pbmcgbW9kZWwgSVQ6IEByZWYgSEFMX0FEQ19JUlFIYW5kbGVyKCksIGluIHByb2dyYW1taW5nCisgICogICAgICAgICBtb2RlbCBwb2xsaW5nOiBAcmVmIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oKQorICAqICAgICAgICAgb3IgQHJlZiBfX0hBTF9BRENfQ0xFQVJfRkxBRygmaGFkYywgQURDX0ZMQUdfRU9TKS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhCisgICovCit1aW50MzJfdCBIQUxfQURDX0dldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIE5vdGU6IEVPQyBmbGFnIGlzIG5vdCBjbGVhcmVkIGhlcmUgYnkgc29mdHdhcmUgYmVjYXVzZSBhdXRvbWF0aWNhbGx5ICAgICAqLworICAvKiAgICAgICBjbGVhcmVkIGJ5IGhhcmR3YXJlIHdoZW4gcmVhZGluZyByZWdpc3RlciBEUi4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIC8qIFJldHVybiBBREMgY29udmVydGVkIHZhbHVlICovIAorICByZXR1cm4gaGFkYy0+SW5zdGFuY2UtPkRSOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBBREMgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0FEQ19JUlFIYW5kbGVyKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VPQ19TRUxFQ1RJT04oaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pKTsKKyAgCisgIC8qID09PT09PT09PT0gQ2hlY2sgRW5kIG9mIENvbnZlcnNpb24gZmxhZyBmb3IgcmVndWxhciBncm91cCA9PT09PT09PT09ICovCisgIGlmKCAoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0VPQykgJiYgX19IQUxfQURDX0dFVF9JVF9TT1VSQ0UoaGFkYywgQURDX0lUX0VPQykpIHx8IAorICAgICAgKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19FT1MpICYmIF9fSEFMX0FEQ19HRVRfSVRfU09VUkNFKGhhZGMsIEFEQ19JVF9FT1MpKSAgICkKKyAgeworICAgIC8qIFVwZGF0ZSBzdGF0ZSBtYWNoaW5lIG9uIGNvbnZlcnNpb24gc3RhdHVzIGlmIG5vdCBpbiBlcnJvciBzdGF0ZSAqLworICAgIGlmIChIQUxfSVNfQklUX0NMUihoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkpCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9DKTsKKyAgICB9CisgICAgCisgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCByZWd1bGFyICAgICAqLworICAgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIsIGNvbnRpbnVvdXMgbW9kZSBvciBzY2FuIHNlcXVlbmNlIG9uIGdvaW5nLiAgICAgICAgKi8KKyAgICBpZihBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUihoYWRjKSAgICAgICAgJiYgCisgICAgICAgKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlID09IERJU0FCTEUpICAgKQorICAgIHsKKyAgICAgIC8qIElmIEVuZCBvZiBTZXF1ZW5jZSBpcyByZWFjaGVkLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIGlmKCBfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKSApCisgICAgICB7CisgICAgICAgIC8qIEFsbG93ZWQgdG8gbW9kaWZ5IGJpdHMgQURDX0lUX0VPQy9BRENfSVRfRU9TIG9ubHkgaWYgYml0ICAgICAgICAgICAqLworICAgICAgICAvKiBBRFNUQVJUPT0wIChubyBjb252ZXJzaW9uIG9uIGdvaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUihoYWRjKSA9PSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBzaW5nbGUgY29udmVyc2lvbiBpbnRlcnJ1cHQgb24gZ3JvdXAgcmVndWxhciAqLworICAgICAgICAgIC8qIE5vdGU6IE92ZXJydW4gaW50ZXJydXB0IHdhcyBlbmFibGVkIHdpdGggRU9DIGludGVycnVwdCBpbiAgICAgICAgKi8KKyAgICAgICAgICAvKiBIQUxfU3RhcnRfSVQoKSwgYnV0IGlzIG5vdCBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgY2FuIGJlIHVzZWQgICAgICovCisgICAgICAgICAgLyogYnkgb3ZlcnJ1biBJUlEgcHJvY2VzcyBiZWxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9FT0MgfCBBRENfSVRfRU9TKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDaGFuZ2UgQURDIHN0YXRlIHRvIGVycm9yIHN0YXRlICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICAgIAorICAgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBOb3RlOiBpbnRvIGNhbGxiYWNrLCB0byBkZXRlcm1pbmUgaWYgY29udmVyc2lvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgICAgICovCisgICAgLyogICAgICAgZnJvbSBFT0Mgb3IgRU9TLCBwb3NzaWJpbGl0eSB0byB1c2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAiIGlmKCBfX0hBTF9BRENfR0VUX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0VPUykpICIgICAgICAgICAgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoYWRjLT5Db252Q3BsdENhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgCisgICAgLyogQ2xlYXIgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcgKi8KKyAgICAvKiBOb3RlOiBpbiBjYXNlIG9mIG92ZXJydW4gc2V0IHRvIEFEQ19PVlJfREFUQV9QUkVTRVJWRUQsIGVuZCBvZiAgICAgICAgICovCisgICAgLyogICAgICAgY29udmVyc2lvbiBmbGFncyBjbGVhciBpbmR1Y2VzIHRoZSByZWxlYXNlIG9mIHRoZSBwcmVzZXJ2ZWQgZGF0YS4qLworICAgIC8qICAgICAgIFRoZXJlZm9yZSwgaWYgdGhlIHByZXNlcnZlZCBkYXRhIHZhbHVlIGlzIG5lZWRlZCwgaXQgbXVzdCBiZSAgICAgKi8KKyAgICAvKiAgICAgICByZWFkIHByZWxpbWluYXJpbHkgaW50byBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKS4gICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogTWFuYWdlbWVudCBvZiBsb3cgcG93ZXIgYXV0by13YWl0IGVuYWJsZWQ6IGZsYWdzIG11c3QgYmUgY2xlYXJlZCAqLworICAgIC8qICAgICAgIGJ5IHVzZXIgd2hlbiBmZXRjaGluZyBBREMgY29udmVyc2lvbiBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBUaGlzIGNhc2UgaXMgbWFuYWdlZCBpbiBJUlEgaGFuZGxlciwgYnV0IHRoaXMgbG93LXBvd2VyIG1vZGUgICAgICovCisgICAgLyogICAgICAgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggcHJvZ3JhbW1pbmcgbW9kZWwgSVQgb3IgRE1BLiAgICAgICAgICAgICAqLworICAgIC8qICAgICAgIFJlZmVyIHRvIGNvbW1lbnQgb2YgcGFyYW1ldGVyICJMb3dQb3dlckF1dG9XYWl0Ii4gICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9XYWl0ICE9IEVOQUJMRSkKKyAgICB7CisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TKSk7CisgICAgfQorICB9CisgIAorICAvKiA9PT09PT09PT09IENoZWNrIGFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgPT09PT09PT09PSAqLworICBpZihfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEKSAmJiBfX0hBTF9BRENfR0VUX0lUX1NPVVJDRShoYWRjLCBBRENfSVRfQVdEKSkKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDEpOworICAgIAorI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgCisgICAgLyogQ2xlYXIgQURDIEFuYWxvZyB3YXRjaGRvZyBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEKTsKKyAgIAorICB9CisgIAorICAKKyAgLyogPT09PT09PT09PSBDaGVjayBPdmVycnVuIGZsYWcgPT09PT09PT09PSAqLworICBpZihfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfT1ZSKSAmJiBfX0hBTF9BRENfR0VUX0lUX1NPVVJDRShoYWRjLCBBRENfSVRfT1ZSKSkKKyAgeworICAgIC8qIElmIG92ZXJydW4gaXMgc2V0IHRvIG92ZXJ3cml0ZSBwcmV2aW91cyBkYXRhIChkZWZhdWx0IHNldHRpbmcpLCAgICAgICAgKi8KKyAgICAvKiBvdmVycnVuIGV2ZW50IGlzIG5vdCBjb25zaWRlcmVkIGFzIGFuIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKGNmIHJlZiBtYW51YWwgIk1hbmFnaW5nIGNvbnZlcnNpb25zIHdpdGhvdXQgdXNpbmcgdGhlIERNQSBhbmQgd2l0aG91dCAqLworICAgIC8qIG92ZXJydW4gIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBFeGNlcHRpb24gZm9yIHVzYWdlIHdpdGggRE1BIG92ZXJydW4gZXZlbnQgYWx3YXlzIGNvbnNpZGVyZWQgYXMgYW4gICAgICovCisgICAgLyogZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoaGFkYy0+SW5pdC5PdmVycnVuID09IEFEQ19PVlJfREFUQV9QUkVTRVJWRUQpICAgICAgICAgICAgfHwKKyAgICAgICAgSEFMX0lTX0JJVF9TRVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IxLCBBRENfQ0ZHUjFfRE1BRU4pICApCisgICAgeworICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG92ZXJydW4gKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX09WUik7CisgICAgICAKKyAgICAgIC8qIENsZWFyIEFEQyBvdmVycnVuIGZsYWcgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX09WUik7CisgICAgICAKKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoYWRjLT5FcnJvckNhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICAgIEhBTF9BRENfRXJyb3JDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgCisgICAgLyogQ2xlYXIgdGhlIE92ZXJydW4gZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX09WUik7CisgIH0KKyAgCit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJzaW9uIERNQSBoYWxmLXRyYW5zZmVyIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBBbmFsb2cgd2F0Y2hkb2cgMSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBBREMgZXJyb3IgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiAgICAgICAgIChBREMgY29udmVyc2lvbiB3aXRoIGludGVycnVwdGlvbiBvciB0cmFuc2ZlciBieSBETUEpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBlcnJvciBkdWUgdG8gb3ZlcnJ1biB3aGVuIHVzaW5nIEFEQyB3aXRoIERNQSB0cmFuc2ZlciAKKyAgKiAgICAgICAgIChIQUwgQURDIGhhbmRsZSBwYXJhbWF0ZXIgIkVycm9yQ29kZSIgdG8gc3RhdGUgIkhBTF9BRENfRVJST1JfT1ZSIik6CisgICogICAgICAgICAtIFJlaW5pdGlhbGl6ZSB0aGUgRE1BIHVzaW5nIGZ1bmN0aW9uICJIQUxfQURDX1N0b3BfRE1BKCkiLgorICAqICAgICAgICAgLSBJZiBuZWVkZWQsIHJlc3RhcnQgYSBuZXcgQURDIGNvbnZlcnNpb24gdXNpbmcgZnVuY3Rpb24KKyAgKiAgICAgICAgICAgIkhBTF9BRENfU3RhcnRfRE1BKCkiCisgICogICAgICAgICAgICh0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2xlYXJpbmcgb3ZlcnJ1biBmbGFnKQorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDX0Vycm9yQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfRXJyb3JDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgY2hhbm5lbHMgb24gcmVndWxhciBncm91cAorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgYW5hbG9nIHdhdGNoZG9nCisgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGEgY2hhbm5lbCB0byBiZSBhc3NpZ25lZCB0byBBREMgZ3JvdXAgcmVndWxhci4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgdXNhZ2Ugb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHM6CisgICogICAgICAgICBWcmVmSW50L1ZsY2QoU1RNMzJMMHgzeHggb25seSkvVGVtcFNlbnNvci4KKyAgKiAgICAgICAgIFNhbXBsaW5nIHRpbWUgY29uc3RyYWludHMgbXVzdCBiZSByZXNwZWN0ZWQgKHNhbXBsaW5nIHRpbWUgY2FuIGJlIAorICAqICAgICAgICAgYWRqdXN0ZWQgaW4gZnVuY3Rpb24gb2YgQURDIGNsb2NrIGZyZXF1ZW5jeSBhbmQgc2FtcGxpbmcgdGltZSAKKyAgKiAgICAgICAgIHNldHRpbmcpLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgdGltaW5ncyB2YWx1ZXMsIHBhcmFtZXRlcnMgVFNfdnJlZmludCwKKyAgKiAgICAgICAgIFRTX3ZsY2QgKFNUTTMyTDB4M3h4IG9ubHkpLCBUU190ZW1wICh2YWx1ZXMgcm91Z2ggb3JkZXI6IDV1cyB0byAxN3VzKS4KKyAgKiAgICAgICAgIFRoZXNlIGludGVybmFsIHBhdGhzIGNhbiBiZSBiZSBkaXNhYmxlZCB1c2luZyBmdW5jdGlvbiAKKyAgKiAgICAgICAgIEhBTF9BRENfRGVJbml0KCkuCisgICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5OgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBjaGFubmVsIGludG8gQURDIGdyb3VwIHJlZ3VsYXIsCisgICogICAgICAgICBmb2xsb3dpbmcgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvbmZpZ3VyZQorICAqICAgICAgICAgc29tZSBwYXJhbWV0ZXJzIG9mIHN0cnVjdHVyZSAiQURDX0NoYW5uZWxDb25mVHlwZURlZiIgb24gdGhlIGZseSwKKyAgKiAgICAgICAgIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBBREMuCisgICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIFJlZmVyIHRvIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAiQURDX0NoYW5uZWxDb25mVHlwZURlZiIuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgU3RydWN0dXJlIG9mIEFEQyBjaGFubmVsIGFzc2lnbmVkIHRvIEFEQyBncm91cCByZWd1bGFyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Db25maWdDaGFubmVsKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfQ2hhbm5lbENvbmZUeXBlRGVmKiBzQ29uZmlnKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoc0NvbmZpZy0+Q2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1JBTksoc0NvbmZpZy0+UmFuaykpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8KKyAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENoYW5uZWwgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBNYW5hZ2VtZW50IG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOiBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvciAgKi8KKyAgaWYgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUihoYWRjKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIGlmIChzQ29uZmlnLT5SYW5rICE9IEFEQ19SQU5LX05PTkUpCisgIHsKKyAgICAvKiBFbmFibGUgc2VsZWN0ZWQgY2hhbm5lbHMgKi8KKyAgICBoYWRjLT5JbnN0YW5jZS0+Q0hTRUxSIHw9ICh1aW50MzJfdCkoc0NvbmZpZy0+Q2hhbm5lbCAmIEFEQ19DSEFOTkVMX01BU0spOworICAgIAorICAgIC8qIE1hbmFnZW1lbnQgb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHM6IFZsY2QgKFNUTTMyTDB4M3h4IG9ubHkpL1ZyZWZJbnQvVGVtcFNlbnNvciAqLworICAgIC8qIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzIGVuYWJsZTogSWYgaW50ZXJuYWwgY2hhbm5lbCBzZWxlY3RlZCwgZW5hYmxlICAqLworICAgIC8qIGRlZGljYXRlZCBpbnRlcm5hbCBidWZmZXJzIGFuZCBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgICNpZiBkZWZpbmVkKEFEQ19DQ1JfVFNFTikKKyAgICAvKiBJZiBUZW1wZXJhdHVyZSBzZW5zb3IgY2hhbm5lbCBpcyBzZWxlY3RlZCwgdGhlbiBlbmFibGUgdGhlIGludGVybmFsICAgICAgKi8KKyAgICAvKiBidWZmZXJzIGFuZCBwYXRoICAqLworICAgIGlmICgoKHNDb25maWctPkNoYW5uZWwgJiBBRENfQ0hBTk5FTF9NQVNLKSAmIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IgKSA9PSAoQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAmIEFEQ19DSEFOTkVMX01BU0spKQorICAgIHsKKyAgICAgIEFEQy0+Q0NSIHw9IEFEQ19DQ1JfVFNFTjsgICAKKyAgICAgIAorICAgICAgLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKyAgICAgIEFEQ19EZWxheU1pY3JvU2Vjb25kKEFEQ19URU1QU0VOU09SX0RFTEFZX1VTKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgCisgICAgLyogSWYgVlJlZkludCBjaGFubmVsIGlzIHNlbGVjdGVkLCB0aGVuIGVuYWJsZSB0aGUgaW50ZXJuYWwgYnVmZmVycyBhbmQgcGF0aCAgICovCisgICAgaWYgKCgoc0NvbmZpZy0+Q2hhbm5lbCAmIEFEQ19DSEFOTkVMX01BU0spICYgQURDX0NIQU5ORUxfVlJFRklOVCkgPT0gKEFEQ19DSEFOTkVMX1ZSRUZJTlQgJiBBRENfQ0hBTk5FTF9NQVNLKSkKKyAgICB7CisgICAgICBBREMtPkNDUiB8PSBBRENfQ0NSX1ZSRUZFTjsgICAKKyAgICB9CisgICAgCisjaWYgZGVmaW5lZCAoU1RNMzJMMDUzeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpCisgICAgLyogSWYgVmxjZCBjaGFubmVsIGlzIHNlbGVjdGVkLCB0aGVuIGVuYWJsZSB0aGUgaW50ZXJuYWwgYnVmZmVycyBhbmQgcGF0aCAgICovCisgICAgaWYgKCgoc0NvbmZpZy0+Q2hhbm5lbCAmIEFEQ19DSEFOTkVMX01BU0spICYgQURDX0NIQU5ORUxfVkxDRCkgPT0gKEFEQ19DSEFOTkVMX1ZMQ0QgJiBBRENfQ0hBTk5FTF9NQVNLKSkKKyAgICB7CisgICAgICBBREMtPkNDUiB8PSBBRENfQ0NSX1ZMQ0RFTjsgICAKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZWd1bGFyIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAvKiBSZXNldCB0aGUgY2hhbm5lbCBzZWxlY3Rpb24gcmVnaXN0ZXIgZnJvbSB0aGUgc2VsZWN0ZWQgY2hhbm5lbCAqLworICAgIGhhZGMtPkluc3RhbmNlLT5DSFNFTFIgJj0gfigodWludDMyX3QpKHNDb25maWctPkNoYW5uZWwgJiBBRENfQ0hBTk5FTF9NQVNLKSk7CisgICAgCisgICAgLyogTWFuYWdlbWVudCBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczogVnJlZkludC9UZW1wU2Vuc29yL1ZiYXQgKi8KKyAgICAvKiBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRocyBkaXNhYmxlOiBJZiBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkLCAgICAqLworICAgIC8qIGRpc2FibGUgZGVkaWNhdGVkIGludGVybmFsIGJ1ZmZlcnMgYW5kIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgI2lmIGRlZmluZWQoQURDX0NDUl9UU0VOKQorICAgIGlmICgoKHNDb25maWctPkNoYW5uZWwgJiBBRENfQ0hBTk5FTF9NQVNLKSAmIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IgKSA9PSAoQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAmIEFEQ19DSEFOTkVMX01BU0spKQorICAgIHsKKyAgICAgIEFEQy0+Q0NSICY9IH5BRENfQ0NSX1RTRU47ICAgCisgICAgfQorICAgICNlbmRpZgorICAgIAorICAgIC8qIElmIFZSZWZJbnQgY2hhbm5lbCBpcyBzZWxlY3RlZCwgdGhlbiBlbmFibGUgdGhlIGludGVybmFsIGJ1ZmZlcnMgYW5kIHBhdGggICAqLworICAgIGlmICgoKHNDb25maWctPkNoYW5uZWwgJiBBRENfQ0hBTk5FTF9NQVNLKSAmIEFEQ19DSEFOTkVMX1ZSRUZJTlQpID09IChBRENfQ0hBTk5FTF9WUkVGSU5UICYgQURDX0NIQU5ORUxfTUFTSykpCisgICAgeworICAgICAgQURDLT5DQ1IgJj0gfkFEQ19DQ1JfVlJFRkVOOyAgIAorICAgIH0KKyAgICAKKyNpZiBkZWZpbmVkIChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYzeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKyAgICAvKiBJZiBWbGNkIGNoYW5uZWwgaXMgc2VsZWN0ZWQsIHRoZW4gZW5hYmxlIHRoZSBpbnRlcm5hbCBidWZmZXJzIGFuZCBwYXRoICAgKi8KKyAgICBpZiAoKChzQ29uZmlnLT5DaGFubmVsICYgQURDX0NIQU5ORUxfTUFTSykgJiBBRENfQ0hBTk5FTF9WTENEKSA9PSAoQURDX0NIQU5ORUxfVkxDRCAmIEFEQ19DSEFOTkVMX01BU0spKQorICAgIHsKKyAgICAgIEFEQy0+Q0NSICY9IH5BRENfQ0NSX1ZMQ0RFTjsgICAKKyAgICB9CisjZW5kaWYKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBhbmFsb2cgd2F0Y2hkb2cuCisgICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5OgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc2VsZWN0ZWQgYW5hbG9nIHdhdGNoZG9nLCBzdWNjZXNzaXZlICAKKyAgKiAgICAgICAgIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgc29tZSBwYXJhbWV0ZXJzIAorICAqICAgICAgICAgb2Ygc3RydWN0dXJlICJBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYiIG9uIHRoZSBmbHksIHdpdGhvdXQgcmVzZXR0aW5nIAorICAqICAgICAgICAgdGhlIEFEQy4KKyAgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgCisgICogICAgICAgICAiQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmIi4KKyAgKiBAbm90ZSAgIEFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGNhbiBiZSBtb2RpZmllZCB3aGlsZSBBREMgY29udmVyc2lvbgorICAqICAgICAgICAgaXMgb24gZ29pbmcuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIHNvbWUgY29uc3RyYWludHMgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQ6CisgICogICAgICAgICB0aGUgcHJvZ3JhbW1lZCB0aHJlc2hvbGQgdmFsdWVzIGFyZSBlZmZlY3RpdmUgZnJvbSB0aGUgbmV4dAorICAqICAgICAgICAgQURDIEVPQyAoZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbikuCisgICogICAgICAgICBDb25zaWRlcmluZyB0aGF0IHJlZ2lzdGVycyB3cml0ZSBkZWxheSBtYXkgaGFwcGVuIGR1ZSB0bworICAqICAgICAgICAgYnVzIGFjdGl2aXR5LCB0aGlzIG1pZ2h0IGNhdXNlIGFuIHVuY2VydGFpbnR5IG9uIHRoZQorICAqICAgICAgICAgZWZmZWN0aXZlIHRpbWluZyBvZiB0aGUgbmV3IHByb2dyYW1tZWQgdGhyZXNob2xkIHZhbHVlcy4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEBwYXJhbSAgQW5hbG9nV0RHQ29uZmlnIFN0cnVjdHVyZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYqIEFuYWxvZ1dER0NvbmZpZykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIAorICB1aW50MzJfdCB0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZDsKKyAgdWludDMyX3QgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZDsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfQU5BTE9HX1dBVENIRE9HX01PREUoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUpKTsKKyAgCisgIGlmKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dNb2RlID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkpOworICB9CisKKyAgLyogVmVyaWZ5IGlmIHRocmVzaG9sZCBpcyB3aXRoaW4gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uICovCisgIGFzc2VydF9wYXJhbShJU19BRENfUkFOR0UoQURDX0dFVF9SRVNPTFVUSU9OKGhhZGMpLCBBbmFsb2dXREdDb25maWctPkhpZ2hUaHJlc2hvbGQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SQU5HRShBRENfR0VUX1JFU09MVVRJT04oaGFkYyksIEFuYWxvZ1dER0NvbmZpZy0+TG93VGhyZXNob2xkKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8KKyAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIEFuYWxvZyB3YXRjaGRvZyBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBBbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUihoYWRjKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIENvbmZpZ3VyZSBBREMgQW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCAqLworICAgIGlmKEFuYWxvZ1dER0NvbmZpZy0+SVRNb2RlID09IEVOQUJMRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIEFEQyBBbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9BV0QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgQURDIEFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9BV0QpOworICAgIH0KKyAgICAKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIGFuYWxvZyB3YXRjaGRvZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBTZXQgdGhlIGFuYWxvZyB3YXRjaGRvZyBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBTZXQgdGhlIEFuYWxvZyB3YXRjaGRvZyBjaGFubmVsIChpcyBub3QgdXNlZCBpZiB3YXRjaGRvZyAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICBtb2RlICJhbGwgY2hhbm5lbHMiOiBBRENfQ0ZHUjFfQVdEMVNHTD0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEgJj0gfiggQURDX0NGR1IxX0FXRFNHTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FXREVOICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FXRENIKTsKKyAgICAKKyAgICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEgfD0gKCBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5hbG9nV0RHQ29uZmlnLT5DaGFubmVsICYgQURDX0NIQU5ORUxfQVdEX01BU0spKTsKKyAgICAKKyAgICAKKyAgICAvKiBTaGlmdCB0aGUgb2Zmc2V0IGluIGZ1bmN0aW9uIG9mIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbjogVGhyZXNob2xkcyAgKi8KKyAgICAvKiBoYXZlIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQgdG8gMCAgICAgKi8KKyAgICB0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZCA9IEFEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oaGFkYywgQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkKTsKKyAgICB0bXBBV0RMb3dUaHJlc2hvbGRTaGlmdGVkICA9IEFEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oaGFkYywgQW5hbG9nV0RHQ29uZmlnLT5Mb3dUaHJlc2hvbGQpOworICAgIAorICAgIC8qIENsZWFyIEhpZ2ggJiBMb3cgaGlnaCB0aHJlc2hvbGRzICovCisgICAgaGFkYy0+SW5zdGFuY2UtPlRSICY9ICh1aW50MzJfdCkgfiAoQURDX1RSX0hUIHwgQURDX1RSX0xUKTsKKyAgICAKKyAgICAvKiBTZXQgdGhlIGhpZ2ggdGhyZXNob2xkICovCisgICAgaGFkYy0+SW5zdGFuY2UtPlRSID0gQURDX1RSWF9ISUdIVEhSRVNIT0xEICh0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZCk7CisgICAgLyogU2V0IHRoZSBsb3cgdGhyZXNob2xkICovCisgICAgaGFkYy0+SW5zdGFuY2UtPlRSIHw9IHRtcEFXRExvd1RocmVzaG9sZFNoaWZ0ZWQ7CisgIH0KKyAgLyogSWYgYSBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXAsIG5vIHVwZGF0ZSBjb3VsZCBiZSBkb25lICAgICovCisgIC8qIG9uIG5laXRoZXIgb2YgdGhlIEFXRCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAqLworICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgICBBREMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIHN0YXRlIGFuZCBlcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSAgCisgICAgcGVyaXBoZXJhbC4KKyAgICAgICgrKSBDaGVjayB0aGUgQURDIHN0YXRlCisgICAgICAoKykgQ2hlY2sgdGhlIEFEQyBlcnJvciBjb2RlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBBREMgaGFuZGxlIHN0YXRlLgorICAqIEBub3RlICAgQURDIHN0YXRlIG1hY2hpbmUgaXMgbWFuYWdlZCBieSBiaXRmaWVsZHMsIEFEQyBzdGF0dXMgbXVzdCBiZSAKKyAgKiAgICAgICAgIGNvbXBhcmVkIHdpdGggc3RhdGVzIGJpdHMuCisgICogICAgICAgICBGb3IgZXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKiAgICAgICAgICAgIiBpZiAoSEFMX0lTX0JJVF9TRVQoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSksIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpKSAiCisgICogICAgICAgICAgICIgaWYgKEhBTF9JU19CSVRfU0VUKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpLCBIQUxfQURDX1NUQVRFX0FXRDEpICAgICkgIgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBBREMgaGFuZGxlIHN0YXRlIChiaXRmaWVsZCBvbiAzMiBiaXRzKQorICAqLwordWludDMyX3QgSEFMX0FEQ19HZXRTdGF0ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFJldHVybiBBREMgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoYWRjLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIEFEQyBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBBREMgZXJyb3IgY29kZSAoYml0ZmllbGQgb24gMzIgYml0cykKKyAgKi8KK3VpbnQzMl90IEhBTF9BRENfR2V0RXJyb3IoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICByZXR1cm4gaGFkYy0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0Z1bmN0aW9ucyBBREMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDLgorICAqIEBub3RlICAgUHJlcmVxdWlzaXRlIGNvbmRpdGlvbiB0byB1c2UgdGhpcyBmdW5jdGlvbjogQURDIG11c3QgYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgIGFuZCB2b2x0YWdlIHJlZ3VsYXRvciBtdXN0IGJlIGVuYWJsZWQgKGRvbmUgaW50byBIQUxfQURDX0luaXQoKSkuCisgICogQG5vdGUgICBJZiBsb3cgcG93ZXIgbW9kZSBBdXRvUG93ZXJPZmYgaXMgZW5hYmxlZCwgcG93ZXItb24vb2ZmIHBoYXNlcyBhcmUKKyAgKiAgICAgICAgIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IGJ5IGhhcmR3YXJlLgorICAqICAgICAgICAgSW4gdGhpcyBtb2RlLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWxlc3MgYW5kIG11c3Qgbm90IGJlIGNhbGxlZCBiZWNhdXNlIAorICAqICAgICAgICAgZmxhZyBBRENfRkxBR19SRFkgaXMgbm90IHVzYWJsZS4KKyAgKiAgICAgICAgIFRoZXJlZm9yZSwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB1bmRlciBjb25kaXRpb24gb2YKKyAgKiAgICAgICAgICJpZiAoaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9Qb3dlck9mZiAhPSBFTkFCTEUpIi4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBBRENfRW5hYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBBREMgZW5hYmxlIGFuZCB3YWl0IGZvciBBREMgcmVhZHkgKGluIGNhc2Ugb2YgQURDIGlzIGRpc2FibGVkIG9yICAgICAgICAgKi8KKyAgLyogZW5hYmxpbmcgcGhhc2Ugbm90IHlldCBjb21wbGV0ZWQ6IGZsYWcgQURDIHJlYWR5IG5vdCB5ZXQgc2V0KS4gICAgICAgICAgICovCisgIC8qIFRpbWVvdXQgaW1wbGVtZW50ZWQgdG8gbm90IGJlIHN0dWNrIGlmIEFEQyBjYW5ub3QgYmUgZW5hYmxlZCAocG9zc2libGUgICAqLworICAvKiBjYXVzZXM6IEFEQyBjbG9jayBub3QgcnVubmluZywgLi4uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKEFEQ19JU19FTkFCTEUoaGFkYykgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBpZiBjb25kaXRpb25zIHRvIGVuYWJsZSB0aGUgQURDIGFyZSBmdWxmaWxsZWQgKi8KKyAgICBpZiAoQURDX0VOQUJMSU5HX0NPTkRJVElPTlMoaGFkYykgPT0gUkVTRVQpCisgICAgeworICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgIAorICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIAorICAgIC8qIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9BRENfRU5BQkxFKGhhZGMpOworICAgIAorICAgIC8qIERlbGF5IGZvciBBREMgc3RhYmlsaXphdGlvbiB0aW1lLiAqLworICAgIEFEQ19EZWxheU1pY3JvU2Vjb25kKEFEQ19TVEFCX0RFTEFZX1VTKTsKKworICAgIC8qIEdldCB0aWNrIGNvdW50ICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAKKyAgICAvKiBXYWl0IGZvciBBREMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgIHdoaWxlKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19SRFkpID09IFJFU0VUKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19FTkFCTEVfVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgICAKKyAgLyogUmV0dXJuIEhBTCBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMuCisgICogQG5vdGUgICBQcmVyZXF1aXNpdGUgY29uZGl0aW9uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uOiBBREMgY29udmVyc2lvbnMgbXVzdCBiZQorICAqICAgICAgICAgc3RvcHBlZC4KKyAgKiBAcGFyYW0gIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBBRENfRGlzYWJsZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisgIAorICAvKiBWZXJpZmljYXRpb24gaWYgQURDIGlzIG5vdCBhbHJlYWR5IGRpc2FibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTm90ZTogZm9yYmlkZGVuIHRvIGRpc2FibGUgQURDIChzZXQgYml0IEFEQ19DUl9BRERJUykgaWYgQURDIGlzIGFscmVhZHkgICovCisgIC8qICAgICAgIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoQURDX0lTX0VOQUJMRShoYWRjKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbnMgdG8gZGlzYWJsZSB0aGUgQURDIGFyZSBmdWxmaWxsZWQgKi8KKyAgICBpZiAoQURDX0RJU0FCTElOR19DT05ESVRJT05TKGhhZGMpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9BRENfRElTQUJMRShoYWRjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICAgCisgICAgLyogV2FpdCBmb3IgQURDIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgLyogR2V0IHRpY2sgY291bnQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIAorICAgIHdoaWxlKEhBTF9JU19CSVRfU0VUKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FERU4pKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19ESVNBQkxFX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogUmV0dXJuIEhBTCBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBQcmVyZXF1aXNpdGUgY29uZGl0aW9uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uOiBBREMgY29udmVyc2lvbnMgbXVzdCBiZQorICAqICAgICAgICAgc3RvcHBlZCB0byBkaXNhYmxlIHRoZSBBREMuCisgICogQHBhcmFtICBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQURDX0NvbnZlcnNpb25TdG9wKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAgIAorICAvKiBWZXJpZmljYXRpb24gaWYgQURDIGlzIG5vdCBhbHJlYWR5IHN0b3BwZWQgb24gcmVndWxhciBncm91cCB0byBieXBhc3MgICAgKi8KKyAgLyogdGhpcyBmdW5jdGlvbiBpZiBub3QgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykpCisgIHsKKyAgICAKKyAgICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXAgKi8KKyAgICAvKiBTb2Z0d2FyZSBpcyBhbGxvd2VkIHRvIHNldCBBRFNUUCBvbmx5IHdoZW4gQURTVEFSVD0xIGFuZCBBRERJUz0wICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhhZGMtPkluc3RhbmNlLT5DUiwgQURDX0NSX0FEU1RBUlQpICYmIAorICAgICAgICBIQUxfSVNfQklUX0NMUihoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9BRERJUykgICAgICAgICAgICAgICAgICApCisgICAgeworICAgICAgLyogU3RvcCBjb252ZXJzaW9ucyBvbiByZWd1bGFyIGdyb3VwICovCisgICAgICBoYWRjLT5JbnN0YW5jZS0+Q1IgfD0gQURDX0NSX0FEU1RQOworICAgIH0KKyAgICAKKyAgICAvKiBXYWl0IGZvciBjb252ZXJzaW9uIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgICAvKiBHZXQgdGljayBjb3VudCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgICAKKyAgICB3aGlsZSgoaGFkYy0+SW5zdGFuY2UtPkNSICYgQURDX0NSX0FEU1RBUlQpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19TVE9QX0NPTlZFUlNJT05fVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorICAgCisgIC8qIFJldHVybiBIQUwgc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBBRENfRE1BQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIC8qIFJldHJpZXZlIEFEQyBoYW5kbGUgY29ycmVzcG9uZGluZyB0byBjdXJyZW50IERNQSBoYW5kbGUgKi8KKyAgQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMgPSAoIEFEQ19IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIAorICAvKiBVcGRhdGUgc3RhdGUgbWFjaGluZSBvbiBjb252ZXJzaW9uIHN0YXR1cyBpZiBub3QgaW4gZXJyb3Igc3RhdGUgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMIHwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpKQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPQyk7CisgICAgCisgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCByZWd1bGFyICAgICAqLworICAgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIsIGNvbnRpbnVvdXMgbW9kZSBvciBzY2FuIHNlcXVlbmNlIG9uIGdvaW5nLiAgICAgICAgKi8KKyAgICBpZihBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUihoYWRjKSAgICAgICAgJiYgCisgICAgICAgKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlID09IERJU0FCTEUpICAgKQorICAgIHsKKyAgICAgIC8qIElmIEVuZCBvZiBTZXF1ZW5jZSBpcyByZWFjaGVkLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIGlmKCBfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKSApCisgICAgICB7CisgICAgICAgIC8qIEFsbG93ZWQgdG8gbW9kaWZ5IGJpdHMgQURDX0lUX0VPQy9BRENfSVRfRU9TIG9ubHkgaWYgYml0ICAgICAgICAgICAqLworICAgICAgICAvKiBBRFNUQVJUPT0wIChubyBjb252ZXJzaW9uIG9uIGdvaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUihoYWRjKSA9PSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBzaW5nbGUgY29udmVyc2lvbiBpbnRlcnJ1cHQgb24gZ3JvdXAgcmVndWxhciAqLworICAgICAgICAgIC8qIE5vdGU6IE92ZXJydW4gaW50ZXJydXB0IHdhcyBlbmFibGVkIHdpdGggRU9DIGludGVycnVwdCBpbiAgICAgICAgKi8KKyAgICAgICAgICAvKiBIQUxfU3RhcnRfSVQoKSwgYnV0IGlzIG5vdCBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgY2FuIGJlIHVzZWQgICAgICovCisgICAgICAgICAgLyogYnkgb3ZlcnJ1biBJUlEgcHJvY2VzcyBiZWxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9FT0MgfCBBRENfSVRfRU9TKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDaGFuZ2UgQURDIHN0YXRlIHRvIGVycm9yIHN0YXRlICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICAgIAorICAgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENhbGwgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgaGFkYy0+RE1BX0hhbmRsZS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjay4gCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEFEQ19ETUFIYWxmQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIC8qIFJldHJpZXZlIEFEQyBoYW5kbGUgY29ycmVzcG9uZGluZyB0byBjdXJyZW50IERNQSBoYW5kbGUgKi8KKyAgQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMgPSAoIEFEQ19IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIAorICAvKiBIYWxmIGNvbnZlcnNpb24gY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2soaGFkYyk7CisjZWxzZQorICBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKGhhZGMpOyAKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEFEQ19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgLyogUmV0cmlldmUgQURDIGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbnQgRE1BIGhhbmRsZSAqLworICBBRENfSGFuZGxlVHlwZURlZiogaGFkYyA9ICggQURDX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpOworICAKKyAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIERNQSBlcnJvciAqLworICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9ETUEpOworICAKKyAgLyogRXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhhZGMtPkVycm9yQ2FsbGJhY2soaGFkYyk7CisjZWxzZQorICBIQUxfQURDX0Vycm9yQ2FsbGJhY2soaGFkYyk7IAorI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlbGF5IG1pY3JvIHNlY29uZHMgCisgICogQHBhcmFtICBtaWNyb1NlY29uZCAgZGVsYXkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEFEQ19EZWxheU1pY3JvU2Vjb25kKHVpbnQzMl90IG1pY3JvU2Vjb25kKQoreworICAvKiBDb21wdXRlIG51bWJlciBvZiBDUFUgY3ljbGVzIHRvIHdhaXQgZm9yICovCisgIF9fSU8gdWludDMyX3Qgd2FpdExvb3BJbmRleCA9IChtaWNyb1NlY29uZCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAxMDAwMDAwVSkpOworCisgIHdoaWxlKHdhaXRMb29wSW5kZXggIT0gMFUpCisgIHsKKyAgICB3YWl0TG9vcEluZGV4LS07CisgIH0gCit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfQURDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfYWRjX2V4LmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9hZGNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjI1YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfYWRjX2V4LmMKQEAgLTAsMCArMSwzNDggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2FkY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQW5hbG9nIHRvIERpZ2l0YWwgQ29udmVydG9yIChBREMpCisgICogICAgICAgICAgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBPcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICAgKysgQ2FsaWJyYXRpb24KKyAgKiAgICAgICAgICAgICAgICsrKyBBREMgYXV0b21hdGljIHNlbGYtY2FsaWJyYXRpb24KKyAgKiAgICAgICAgICAgICAgICsrKyBDYWxpYnJhdGlvbiBmYWN0b3JzIGdldCBvciBzZXQKKyAgKiAgICAgICAgICBPdGhlciBmdW5jdGlvbnMgKGdlbmVyaWMgZnVuY3Rpb25zKSBhcmUgYXZhaWxhYmxlIGluIGZpbGUgCisgICogICAgICAgICAgInN0bTMybDB4eF9oYWxfYWRjLmMiLgorICAqCisgIEB2ZXJiYXRpbQorICBbLi5dIAorICAoQCkgU2VjdGlvbnMgIkFEQyBwZXJpcGhlcmFsIGZlYXR1cmVzIiBhbmQgIkhvdyB0byB1c2UgdGhpcyBkcml2ZXIiIGFyZQorICAgICAgYXZhaWxhYmxlIGluIGZpbGUgb2YgZ2VuZXJpYyBmdW5jdGlvbnMgInN0bTMybDB4eF9oYWxfYWRjLmMiLgorICBbLi5dCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXggQURDRXgKKyAgKiBAYnJpZWYgQURDIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfUHJpdmF0ZV9Db25zdGFudHMgQURDIEV4dGVuZGVkIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworICAvKiBGaXhlZCB0aW1lb3V0IHZhbHVlcyBmb3IgQURDIGNhbGlicmF0aW9uLCBlbmFibGUgc2V0dGxpbmcgdGltZSwgZGlzYWJsZSAgKi8KKyAgLyogc2V0dGxpbmcgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFZhbHVlcyBkZWZpbmVkIHRvIGJlIGhpZ2hlciB0aGFuIHdvcnN0IGNhc2VzOiBsb3cgY2xvY2sgZnJlcXVlbmN5LCAgICAgICAqLworICAvKiBtYXhpbXVtIHByZXNjYWxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVW5pdDogbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICNkZWZpbmUgQURDX0NBTElCUkFUSU9OX1RJTUVPVVQgICAgICAxMFUgICAgICAKKworLyogRGVsYXkgZm9yIFZSRUZJTlQgc3RhYmlsaXphdGlvbiB0aW1lLiAqLworLyogSW50ZXJuYWwgcmVmZXJlbmNlIHN0YXJ0dXAgdGltZSBtYXggdmFsdWUgaXMgM21zICAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIFRWUkVGSU5UKS4gKi8KKy8qIFVuaXQ6IG1zICovCisjZGVmaW5lIFNZU0NGR19CVUZfVlJFRklOVF9FTkFCTEVfVElNRU9VVCAgICAgICAoKHVpbnQzMl90KSAzVSkKKworLyogRGVsYXkgZm9yIFRFTVBTRU5TT1Igc3RhYmlsaXphdGlvbiB0aW1lLiAqLworLyogVGVtcGVyYXR1cmUgc2Vuc29yIHN0YXJ0dXAgdGltZSBtYXggdmFsdWUgaXMgMTB1cyAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciB0U1RBUlQpLiAqLworLyogVW5pdDogbXMgKi8KKyNkZWZpbmUgU1lTQ0ZHX0JVRl9URU1QU0VOU09SX0VOQUJMRV9USU1FT1VUICAgICgodWludDMyX3QpIDFVKQorCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBBREMgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgUGVyZm9ybSB0aGUgQURDIGNhbGlicmF0aW9uLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGFuIEFEQyBhdXRvbWF0aWMgc2VsZi1jYWxpYnJhdGlvbgorICAqICAgICAgICAgQ2FsaWJyYXRpb24gcHJlcmVxdWlzaXRlOiBBREMgbXVzdCBiZSBkaXNhYmxlZCAoZXhlY3V0ZSB0aGlzCisgICogICAgICAgICBmdW5jdGlvbiBiZWZvcmUgSEFMX0FEQ19TdGFydCgpIG9yIGFmdGVyIEhBTF9BRENfU3RvcCgpICkuCisgICogQG5vdGUgICBDYWxpYnJhdGlvbiBmYWN0b3IgY2FuIGJlIHJlYWQgYWZ0ZXIgY2FsaWJyYXRpb24sIHVzaW5nIGZ1bmN0aW9uCisgICogICAgICAgICBIQUxfQURDX0dldFZhbHVlKCkgKHZhbHVlIG9uIDcgYml0czogZnJvbSBEUls2OzBdKS4KKyAgKiBAcGFyYW0gIGhhZGMgICAgICAgQURDIGhhbmRsZQorICAqIEBwYXJhbSAgU2luZ2xlRGlmZiBTZWxlY3Rpb24gb2Ygc2luZ2xlLWVuZGVkIG9yIGRpZmZlcmVudGlhbCBpbnB1dAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmx5IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBBRENfU0lOR0xFX0VOREVEOiBDaGFubmVsIGluIG1vZGUgaW5wdXQgc2luZ2xlIGVuZGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfQ2FsaWJyYXRpb25fU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFNpbmdsZURpZmYpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgdWludDMyX3QgYmFja3VwX3NldHRpbmdfYWRjX2RtYV90cmFuc2ZlciA9IDBVOyAvKiBOb3RlOiBWYXJpYWJsZSBub3QgZGVjbGFyZWQgYXMgdm9sYXRpbGUgYmVjYXVzZSByZWdpc3RlciByZWFkIGlzIGFscmVhZHkgZGVjbGFyZWQgYXMgdm9sYXRpbGUgKi8KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIENhbGlicmF0aW9uIHByZXJlcXVpc2l0ZTogQURDIG11c3QgYmUgZGlzYWJsZWQuICovCisgIGlmIChBRENfSVNfRU5BQkxFKGhhZGMpID09IFJFU0VUKQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisgICAgCisgICAgLyogRGlzYWJsZSBBREMgRE1BIHRyYW5zZmVyIHJlcXVlc3QgZHVyaW5nIGNhbGlicmF0aW9uICovCisgICAgLyogTm90ZTogU3BlY2lmaWNpdHkgb2YgdGhpcyBTVE0zMiBzZXJpZTogQ2FsaWJyYXRpb24gZmFjdG9yIGlzICAgICAgICAgICAqLworICAgIC8qICAgICAgIGF2YWlsYWJsZSBpbiBkYXRhIHJlZ2lzdGVyIGFuZCBhbHNvIHRyYW5zZmVyZWQgYnkgRE1BLiAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBUbyBub3QgaW5zZXJ0IEFEQyBjYWxpYnJhdGlvbiBmYWN0b3IgYW1vbmcgQURDIGNvbnZlcnNpb24gZGF0YSAgICovCisgICAgLyogICAgICAgaW4gYXJyYXkgdmFyaWFibGUsIERNQSB0cmFuc2ZlciBtdXN0IGJlIGRpc2FibGVkIGR1cmluZyAgICAgICAgICAqLworICAgIC8qICAgICAgIGNhbGlicmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBiYWNrdXBfc2V0dGluZ19hZGNfZG1hX3RyYW5zZmVyID0gUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IxLCBBRENfQ0ZHUjFfRE1BRU4gfCBBRENfQ0ZHUjFfRE1BQ0ZHKTsKKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IxLCBBRENfQ0ZHUjFfRE1BRU4gfCBBRENfQ0ZHUjFfRE1BQ0ZHKTsKKyAgICAKKyAgICAvKiBTdGFydCBBREMgY2FsaWJyYXRpb24gKi8KKyAgICBoYWRjLT5JbnN0YW5jZS0+Q1IgfD0gQURDX0NSX0FEQ0FMOworICAgIAorICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7ICAKKyAgICAKKyAgICAvKiBXYWl0IGZvciBjYWxpYnJhdGlvbiBjb21wbGV0aW9uICovCisgICAgd2hpbGUoSEFMX0lTX0JJVF9TRVQoaGFkYy0+SW5zdGFuY2UtPkNSLCBBRENfQ1JfQURDQUwpKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19DQUxJQlJBVElPTl9USU1FT1VUKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIFJlc3RvcmUgQURDIERNQSB0cmFuc2ZlciByZXF1ZXN0IGFmdGVyIGNhbGlicmF0aW9uICovCisgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEsIGJhY2t1cF9zZXR0aW5nX2FkY19kbWFfdHJhbnNmZXIpOworICAgIAorICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgIAorICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY2FsaWJyYXRpb24gZmFjdG9yLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlLgorICAqIEBwYXJhbSAgU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25seToKKyAgKiAgICAgICAgICAgQGFyZyBBRENfU0lOR0xFX0VOREVEOiBDaGFubmVsIGluIG1vZGUgaW5wdXQgc2luZ2xlIGVuZGVkLgorICAqIEByZXR2YWwgQ2FsaWJyYXRpb24gdmFsdWUuCisgICovCit1aW50MzJfdCBIQUxfQURDRXhfQ2FsaWJyYXRpb25fR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFNpbmdsZURpZmYpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChTaW5nbGVEaWZmKSk7IAorICAKKyAgLyogUmV0dXJuIHRoZSBBREMgY2FsaWJyYXRpb24gdmFsdWUgKi8gCisgIHJldHVybiAoKGhhZGMtPkluc3RhbmNlLT5DQUxGQUNUKSAmIDB4MDAwMDAwN0ZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNhbGlicmF0aW9uIGZhY3RvciB0byBvdmVyd3JpdGUgYXV0b21hdGljIGNvbnZlcnNpb24gcmVzdWx0LgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCBhbmQgbm8gY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtICBTaW5nbGVEaWZmIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmx5OgorICAqICAgICAgICAgICBAYXJnIEFEQ19TSU5HTEVfRU5ERUQ6IENoYW5uZWwgaW4gbW9kZSBpbnB1dCBzaW5nbGUgZW5kZWQuCisgICogQHBhcmFtICBDYWxpYnJhdGlvbkZhY3RvciBDYWxpYnJhdGlvbiBmYWN0b3IgKGNvZGVkIG9uIDcgYml0cyBtYXhpbXVtKQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfQ2FsaWJyYXRpb25fU2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFNpbmdsZURpZmYsIHVpbnQzMl90IENhbGlicmF0aW9uRmFjdG9yKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChTaW5nbGVEaWZmKSk7IAorICBhc3NlcnRfcGFyYW0oSVNfQURDX0NBTEZBQ1QoQ2FsaWJyYXRpb25GYWN0b3IpKTsgCisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogVmVyaWZpY2F0aW9uIG9mIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGNhbGlicmF0aW9uICAgICovCisgIC8qIGZhY3RvcnMgcmVnaXN0ZXI6IEFEQyBtdXN0IGJlIGVuYWJsZWQsIG5vIGNvbnZlcnNpb24gb24gZ29pbmcuICAgICAgICAgICAqLworICBpZiAoIChBRENfSVNfRU5BQkxFKGhhZGMpICE9IFJFU0VUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgIChBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIoaGFkYykgPT0gUkVTRVQpICApCisgIHsKKyAgICAvKiBTZXQgdGhlIHNlbGVjdGVkIEFEQyBjYWxpYnJhdGlvbiB2YWx1ZSAqLyAKKyAgICBoYWRjLT5JbnN0YW5jZS0+Q0FMRkFDVCAmPSB+QURDX0NBTEZBQ1RfQ0FMRkFDVDsKKyAgICBoYWRjLT5JbnN0YW5jZS0+Q0FMRkFDVCB8PSBDYWxpYnJhdGlvbkZhY3RvcjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgCisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyB0aGUgYnVmZmVyIG9mIFZyZWZpbnQgZm9yIHRoZSBBREMsIHJlcXVpcmVkIHdoZW4gZGV2aWNlIGlzIGluIG1vZGUgbG93LXBvd2VyIChsb3ctcG93ZXIgcnVuLCBsb3ctcG93ZXIgc2xlZXAgb3Igc3RvcCBtb2RlKQorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZnVuY3Rpb24gSEFMX0FEQ19Jbml0KCkgCisgICogICAgICAgICAoaW4gY2FzZSBvZiBwcmV2aW91cyBBREMgb3BlcmF0aW9uczogZnVuY3Rpb24gSEFMX0FEQ19EZUluaXQoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCkKKyAgKiAgICAgICAgIEZvciBtb3JlIGRldGFpbHMgb24gcHJvY2VkdXJlIGFuZCBidWZmZXIgY3VycmVudCBjb25zdW1wdGlvbiwgcmVmZXIgdG8gZGV2aWNlIHJlZmVyZW5jZSBtYW51YWwuCisgICogQG5vdGUgICBUaGlzIGlzIGZ1bmN0aW9uYWwgb25seSBpZiB0aGUgTE9DSyBpcyBub3Qgc2V0LgorICAqIEByZXR2YWwgTm9uZQorKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9FbmFibGVWUkVGSU5UKHZvaWQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDBVOworICAKKyAgLyogRW5hYmxlIHRoZSBCdWZmZXIgZm9yIHRoZSBBREMgYnkgc2V0dGluZyBFTkJVRl9TRU5TT1JfQURDIGJpdCBpbiB0aGUgQ0ZHUjMgcmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTWVNDRkctPkNGR1IzLCBTWVNDRkdfQ0ZHUjNfRU5CVUZfVlJFRklOVF9BREMpOworICAKKyAgLyogV2FpdCBmb3IgVnJlZmludCBidWZmZXIgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAvKiBHZXQgdGljayBjb3VudCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAKKyAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoU1lTQ0ZHLT5DRkdSMywgU1lTQ0ZHX0NGR1IzX1ZSRUZJTlRfUkRZRikpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBTWVNDRkdfQlVGX1ZSRUZJTlRfRU5BQkxFX1RJTUVPVVQpCisgICAgeyAKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZXMgdGhlIEJ1ZmZlciBWcmVmaW50IGZvciB0aGUgQURDLgorICAqIEBub3RlIFRoaXMgaXMgZnVuY3Rpb25hbCBvbmx5IGlmIHRoZSBMT0NLIGlzIG5vdCBzZXQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9BRENFeF9EaXNhYmxlVlJFRklOVCh2b2lkKQoreworICAvKiBEaXNhYmxlIHRoZSBWcmVmaW50IGJ5IHJlc2V0dGluZyBFTkJVRl9TRU5TT1JfQURDIGJpdCBpbiB0aGUgQ0ZHUjMgcmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTkJVRl9WUkVGSU5UX0FEQyk7Cit9CisKKy8qKgorKiBAYnJpZWYgIEVuYWJsZXMgdGhlIGJ1ZmZlciBvZiB0ZW1wZXJhdHVyZSBzZW5zb3IgZm9yIHRoZSBBREMsIHJlcXVpcmVkIHdoZW4gZGV2aWNlIGlzIGluIG1vZGUgbG93LXBvd2VyIChsb3ctcG93ZXIgcnVuLCBsb3ctcG93ZXIgc2xlZXAgb3Igc3RvcCBtb2RlKQorKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpCisqICAgICAgICAgKGluIGNhc2Ugb2YgcHJldmlvdXMgQURDIG9wZXJhdGlvbnM6IGZ1bmN0aW9uIEhBTF9BRENfRGVJbml0KCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QpCisqICAgICAgICAgRm9yIG1vcmUgZGV0YWlscyBvbiBwcm9jZWR1cmUgYW5kIGJ1ZmZlciBjdXJyZW50IGNvbnN1bXB0aW9uLCByZWZlciB0byBkZXZpY2UgcmVmZXJlbmNlIG1hbnVhbC4KKyogQG5vdGUgICBUaGlzIGlzIGZ1bmN0aW9uYWwgb25seSBpZiB0aGUgTE9DSyBpcyBub3Qgc2V0LgorKiBAcmV0dmFsIE5vbmUKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfRW5hYmxlVlJFRklOVFRlbXBTZW5zb3Iodm9pZCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMFU7CisgIAorICAvKiBFbmFibGUgdGhlIEJ1ZmZlciBmb3IgdGhlIEFEQyBieSBzZXR0aW5nIEVOQlVGX1NFTlNPUl9BREMgYml0IGluIHRoZSBDRkdSMyByZWdpc3RlciAqLworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTkJVRl9TRU5TT1JfQURDKTsKKyAgCisgIC8qIFdhaXQgZm9yIFZyZWZpbnQgYnVmZmVyIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgLyogR2V0IHRpY2sgY291bnQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgCisgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19WUkVGSU5UX1JEWUYpKQorICB7CisgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gU1lTQ0ZHX0JVRl9URU1QU0VOU09SX0VOQUJMRV9USU1FT1VUKQorICAgIHsgCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGVzIHRoZSBWUkVGSU5UIGFuZCBTZW5zb3IgZm9yIHRoZSBBREMuCisgICogQG5vdGUgVGhpcyBpcyBmdW5jdGlvbmFsIG9ubHkgaWYgdGhlIExPQ0sgaXMgbm90IHNldC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0FEQ0V4X0Rpc2FibGVWUkVGSU5UVGVtcFNlbnNvcih2b2lkKQoreworICAvKiBEaXNhYmxlIHRoZSBWcmVmaW50IGJ5IHJlc2V0dGluZyBFTkJVRl9TRU5TT1JfQURDIGJpdCBpbiB0aGUgQ0ZHUjMgcmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTkJVRl9TRU5TT1JfQURDKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBIQUxfQURDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfY29tcC5jIGIvU3JjL3N0bTMybDB4eF9oYWxfY29tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjU2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9jb21wLmMKQEAgLTAsMCArMSwxMDY4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9jb21wLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENPTVAgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENPTVAgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgU3RhcnQvU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zIGluIHBvbGxpbmcgbW9kZQorICAqICAgICAgICAgICArIFN0YXJ0L1N0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucyBpbiBpbnRlcnJ1cHQgbW9kZSAodGhyb3VnaCBFWFRJIGludGVycnVwdCkKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIGNvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBzdGF0ZSBmdW5jdGlvbnMKKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgIyMjIyMgQ09NUCBQZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAKKyAgWy4uXSAgICAgICAKKyAgICAgIFRoZSBTVE0zMkwweHggZGV2aWNlIGZhbWlseSBpbnRlZ3JhdGVzIHR3byBhbmFsb2cgY29tcGFyYXRvcnMgaW5zdGFuY2VzCisgICAgICBDT01QMSBhbmQgQ09NUDI6CisgICAgICAoIykgVGhlIENPTVAgaW5wdXQgbWludXMgKGludmVydGluZyBpbnB1dCkgYW5kIGlucHV0IHBsdXMgKG5vbiBpbnZlcnRpbmcgaW5wdXQpCisgICAgICAgICAgY2FuIGJlIHNldCB0byBpbnRlcm5hbCByZWZlcmVuY2VzIG9yIHRvIEdQSU8gcGlucworICAgICAgICAgIChyZWZlciB0byBHUElPIGxpc3QgaW4gcmVmZXJlbmNlIG1hbnVhbCkuCisgIAorICAgICAgKCMpIFRoZSBDT01QIG91dHB1dCBsZXZlbCBpcyBhdmFpbGFibGUgdXNpbmcgSEFMX0NPTVBfR2V0T3V0cHV0TGV2ZWwoKQorICAgICAgICAgIGFuZCBjYW4gYmUgcmVkaXJlY3RlZCB0byBvdGhlciBwZXJpcGhlcmFsczogR1BJTyBwaW5zIChpbiBtb2RlCisgICAgICAgICAgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBmb3IgY29tcGFyYXRvciksIHRpbWVycy4KKyAgICAgICAgICAocmVmZXIgdG8gR1BJTyBsaXN0IGluIHJlZmVyZW5jZSBtYW51YWwpLgorICAKKyAgICAgICgjKSBQYWlycyBvZiBjb21wYXJhdG9ycyBpbnN0YW5jZXMgY2FuIGJlIGNvbWJpbmVkIGluIHdpbmRvdyBtb2RlCisgICAgICAgICAgKDIgY29uc2VjdXRpdmUgaW5zdGFuY2VzIG9kZCBhbmQgZXZlbiBDT01QPHg+IGFuZCBDT01QPHgrMT4pLgorICAKKyAgICAgICgjKSBUaGUgY29tcGFyYXRvcnMgaGF2ZSBpbnRlcnJ1cHQgY2FwYWJpbGl0eSB0aHJvdWdoIHRoZSBFWFRJIGNvbnRyb2xsZXIKKyAgICAgICAgICB3aXRoIHdha2UtdXAgZnJvbSBzbGVlcCBhbmQgc3RvcCBtb2RlczoKKyAgICAgICAgICAoKyspIENPTVAxIGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIEVYVEkgTGluZSAyMQorICAgICAgICAgICgrKykgQ09NUDIgaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gRVhUSSBMaW5lIDIyCisKKyAgICAgICAgICBGcm9tIHRoZSBjb3JyZXNwb25kaW5nIElSUSBoYW5kbGVyLCB0aGUgcmlnaHQgaW50ZXJydXB0IHNvdXJjZSBjYW4gYmUgcmV0cmlldmVkCisgICAgICAgICAgdXNpbmcgbWFjcm8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0dFVF9GTEFHKCkgYW5kIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkxBRygpLgorCisgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgICBUaGlzIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgdG8gY29uZmlndXJlIGFuZCBwcm9ncmFtIHRoZSBjb21wYXJhdG9yIGluc3RhbmNlcworICAgICAgb2YgU1RNMzJMMHh4IGRldmljZXMuCisKKyAgICAgIFRvIHVzZSB0aGUgY29tcGFyYXRvciwgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAgCisgICAgICAoIykgIEluaXRpYWxpemUgdGhlIENPTVAgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9DT01QX01zcEluaXQoKToKKyAgICAgICgrKykgQ29uZmlndXJlIHRoZSBHUElPIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIGlucHV0cyBwbHVzIGFuZCBtaW51cyBpbiBhbmFsb2cgbW9kZQorICAgICAgICAgICB1c2luZyBIQUxfR1BJT19Jbml0KCkuCisgICAgICAoKyspIElmIG5lZWRlZCwgY29uZmlndXJlIHRoZSBHUElPIGNvbm5lY3RlZCB0byBjb21wYXJhdG9yIG91dHB1dCBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZQorICAgICAgICAgICB1c2luZyBIQUxfR1BJT19Jbml0KCkuCisgICAgICAoKyspIElmIHJlcXVpcmVkIGVuYWJsZSB0aGUgQ09NUCBpbnRlcnJ1cHQgYnkgY29uZmlndXJpbmcgYW5kIGVuYWJsaW5nIEVYVEkgbGluZSBpbiBJbnRlcnJ1cHQgbW9kZSBhbmQgCisgICAgICAgICAgIHNlbGVjdGluZyB0aGUgZGVzaXJlZCBzZW5zaXRpdml0eSBsZXZlbCB1c2luZyBIQUxfR1BJT19Jbml0KCkgZnVuY3Rpb24uIEFmdGVyIHRoYXQgZW5hYmxlIHRoZSBjb21wYXJhdG9yCisgICAgICAgICAgIGludGVycnVwdCB2ZWN0b3IgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkgZnVuY3Rpb24uCisgICAgICAKKyAgICAgICgjKSBDb25maWd1cmUgdGhlIGNvbXBhcmF0b3IgdXNpbmcgSEFMX0NPTVBfSW5pdCgpIGZ1bmN0aW9uOgorICAgICAgKCsrKSBTZWxlY3QgdGhlIGlucHV0IG1pbnVzIChpbnZlcnRpbmcgaW5wdXQpCisgICAgICAoKyspIFNlbGVjdCB0aGUgaW5wdXQgcGx1cyAobm9uLWludmVydGluZyBpbnB1dCkKKyAgICAgICgrKykgU2VsZWN0IHRoZSBvdXRwdXQgcG9sYXJpdHkgIAorICAgICAgKCsrKSBTZWxlY3QgdGhlIHBvd2VyIG1vZGUKKyAgICAgICgrKykgU2VsZWN0IHRoZSB3aW5kb3cgbW9kZQorICAgICAgCisgICAgICAtQEAtIEhBTF9DT01QX0luaXQoKSBjYWxscyBpbnRlcm5hbGx5IF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpCisgICAgICAgICAgdG8gZW5hYmxlIGludGVybmFsIGNvbnRyb2wgY2xvY2sgb2YgdGhlIGNvbXBhcmF0b3JzLgorICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgYSBsZWdhY3kgc3RyYXRlZ3kuIEluIGZ1dHVyZSBTVE0zMiBmYW1pbGllcywKKyAgICAgICAgICBDT01QIGNsb2NrIGVuYWJsZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHVzZXIgaW4gIkhBTF9DT01QX01zcEluaXQoKSIuCisgICAgICAgICAgVGhlcmVmb3JlLCBmb3IgY29tcGF0aWJpbGl0eSBhbnRpY2lwYXRpb24sIGl0IGlzIHJlY29tbWVuZGVkIHRvIAorICAgICAgICAgIGltcGxlbWVudCBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKSBpbiAiSEFMX0NPTVBfTXNwSW5pdCgpIi4KKyAgICAgIAorICAgICAgKCMpIFJlY29uZmlndXJhdGlvbiBvbi10aGUtZmx5IG9mIGNvbXBhcmF0b3IgY2FuIGJlIGRvbmUgYnkgY2FsbGluZyBhZ2FpbgorICAgICAgICAgIGZ1bmN0aW9uIEhBTF9DT01QX0luaXQoKSB3aXRoIG5ldyBpbnB1dCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMuCisgICAgICAKKyAgICAgICgjKSBFbmFibGUgdGhlIGNvbXBhcmF0b3IgdXNpbmcgSEFMX0NPTVBfU3RhcnQoKSBmdW5jdGlvbi4KKyAgICAgIAorICAgICAgKCMpIFVzZSBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2soKSBvciBIQUxfQ09NUF9HZXRPdXRwdXRMZXZlbCgpIGZ1bmN0aW9ucworICAgICAgICAgIHRvIG1hbmFnZSBjb21wYXJhdG9yIG91dHB1dHMgKGV2ZW50cyBhbmQgb3V0cHV0IGxldmVsKS4KKyAgICAgIAorICAgICAgKCMpIERpc2FibGUgdGhlIGNvbXBhcmF0b3IgdXNpbmcgSEFMX0NPTVBfU3RvcCgpIGZ1bmN0aW9uLgorICAgICAgCisgICAgICAoIykgRGUtaW5pdGlhbGl6ZSB0aGUgY29tcGFyYXRvciB1c2luZyBIQUxfQ09NUF9EZUluaXQoKSBmdW5jdGlvbi4KKyAgICAgIAorICAgICAgKCMpIEZvciBzYWZldHkgcHVycG9zZSwgY29tcGFyYXRvciBjb25maWd1cmF0aW9uIGNhbiBiZSBsb2NrZWQgdXNpbmcgSEFMX0NPTVBfTG9jaygpIGZ1bmN0aW9uLgorICAgICAgICAgIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuCisgIAorICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorCisgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MsIHdoZW4gc2V0IHRvIDEsCisgICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisgICAgIFVzZSBGdW5jdGlvbnMgQHJlZiBIQUxfQ09NUF9SZWdpc3RlckNhbGxiYWNrKCkKKyAgICAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorICAgIFsuLl0KKworICAgICBGdW5jdGlvbiBAcmVmIEhBTF9DT01QX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgVHJpZ2dlckNhbGxiYWNrICAgICAgIDogY2FsbGJhY2sgZm9yIENPTVAgdHJpZ2dlci4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBjYWxsYmFjayBmb3IgTXNwIERlSW5pdC4KKyAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFsuLl0KKworICAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfQ09NUF9VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgICB3ZWFrIGZ1bmN0aW9uLgorICAgIFsuLl0KKworICAgICBAcmVmIEhBTF9DT01QX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgKCspIFRyaWdnZXJDYWxsYmFjayAgICAgICA6IGNhbGxiYWNrIGZvciBDT01QIHRyaWdnZXIuCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICA6IGNhbGxiYWNrIGZvciBNc3AgSW5pdC4KKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBEZUluaXQuCisgICAgIFsuLl0KKworICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfQ09NUF9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEByZWYgSEFMX0NPTVBfU1RBVEVfUkVTRVQKKyAgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICAgICBleGFtcGxlIEByZWYgSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrKCkuCisgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX0NPTVBfSW5pdCgpLyBAcmVmIEhBTF9DT01QX0RlSW5pdCgpIG9ubHkgd2hlbgorICAgICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgIFsuLl0KKworICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9DT01QX0luaXQoKS8gQHJlZiBIQUxfQ09NUF9EZUluaXQoKQorICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4KKyAgICAgWy4uXQorCisgICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gQHJlZiBIQUxfQ09NUF9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICAgaW4gQHJlZiBIQUxfQ09NUF9TVEFURV9SRUFEWSBvciBAcmVmIEhBTF9DT01QX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgIFsuLl0KKworICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgIHVzaW5nIEByZWYgSEFMX0NPTVBfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX0NPTVBfRGVJbml0KCkKKyAgICAgb3IgQHJlZiBIQUxfQ09NUF9Jbml0KCkgZnVuY3Rpb24uCisgICAgIFsuLl0KKworICAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwgY2FsbGJhY2tzCisgICAgIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCisgIAorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgVGFibGUgMS4gQ09NUCBpbnB1dHMgYW5kIG91dHB1dCBmb3IgU1RNMzJMMHh4IGRldmljZXMKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICBDT01QMSAgIHwgICBDT01QMiAgIHwKKyAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwKKyAgfCAgICAgICAgICAgICAgICB8IElPMSAgICAgICAgICAgIHwgICAgUEExICAgIHwgICAgUEEzICAgIHwKKyAgfCBJbnB1dCBwbHVzICAgICB8IElPMiAgICAgICAgICAgIHwgICAgLS0tICAgIHwgICAgUEE0ICAgIHwKKyAgfCAgICAgICAgICAgICAgICB8IElPMyAgICAgICAgICAgIHwgICAgLS0tICAgIHwgICAgUEI1ICAgIHwKKyAgfCAgICAgICAgICAgICAgICB8IElPNCAgICAgICAgICAgIHwgICAgLS0tICAgIHwgICAgUEI2ICAgIHwKKyAgfCAgICAgICAgICAgICAgICB8IElPNSAgICAgICAgICAgIHwgICAgLS0tICAgIHwgICAgUEI3ICAgIHwKKyAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgfCAgICAgICAgICAgICAgICB8IDEvNCBWcmVmSW50ICAgIHwgICAgLS0tICAgIHwgQXZhaWxhYmxlIHwKKyAgfCAgICAgICAgICAgICAgICB8IDEvMiBWcmVmSW50ICAgIHwgICAgLS0tICAgIHwgQXZhaWxhYmxlIHwKKyAgfCAgICAgICAgICAgICAgICB8IDMvNCBWcmVmSW50ICAgIHwgICAgLS0tICAgIHwgQXZhaWxhYmxlIHwKKyAgfCBJbnB1dCBtaW51cyAgICB8IFZyZWZJbnQgICAgICAgIHwgQXZhaWxhYmxlIHwgQXZhaWxhYmxlIHwKKyAgfCAgICAgICAgICAgICAgICB8IERBQzEgY2hhbm5lbCAxIHwgQXZhaWxhYmxlIHwgQXZhaWxhYmxlIHwKKyAgfCAgICAgICAgICAgICAgICB8IERBQzEgY2hhbm5lbCAyIHwgQXZhaWxhYmxlIHwgQXZhaWxhYmxlIHwKKyAgfCAgICAgICAgICAgICAgICB8IElPMSAgICAgICAgICAgIHwgICAgUEEwICAgIHwgICAgUEEyICAgIHwKKyAgfCAgICAgICAgICAgICAgICB8IElPMiAgICAgICAgICAgIHwgICAgUEE1ICAgIHwgICAgUEE1ICAgIHwKKyAgfCAgICAgICAgICAgICAgICB8IElPMyAgICAgICAgICAgIHwgICAgLS0tICAgIHwgICAgUEIzICAgIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBPdXRwdXQgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgIFBBMCAgKDEpIHwgIFBBMiAgKDEpIHwKKyAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgIFBBNiAgKDEpIHwgIFBBNyAgKDEpIHwKKyAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgIFBBMTEgKDEpIHwgIFBBMTIgKDEpIHwKKyAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgIExQVElNICAgIHwgIExQVElNICAgIHwKKyAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgIFRJTSAgKDIpIHwgIFRJTSAgKDIpIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAoMSkgR1BJTyBtdXN0IGJlIHNldCB0byBhbHRlcm5hdGUgZnVuY3Rpb24gZm9yIGNvbXBhcmF0b3IKKyAgKDIpIENvbXBhcmF0b3JzIG91dHB1dCB0byB0aW1lcnMgaXMgc2V0IGluIHRpbWVycyBpbnN0YW5jZXMuCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4QikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVAgQ09NUAorICAqIEBicmllZiBDT01QIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9DT01QX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENPTVBfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBEZWxheSBmb3IgQ09NUCBzdGFydHVwIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm90ZTogRGVsYXkgcmVxdWlyZWQgdG8gcmVhY2ggcHJvcGFnYXRpb24gZGVsYXkgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgKi8KKy8qIExpdGVyYWwgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRTVEFSVCIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09NUF9ERUxBWV9TVEFSVFVQX1VTICAgICAgICAgICAgICgodWludDMyX3QpIDI1VSkgIC8qITwgRGVsYXkgZm9yIENPTVAgc3RhcnR1cCB0aW1lICovCisKKy8qIERlbGF5IGZvciBDT01QIHZvbHRhZ2Ugc2NhbGVyIHN0YWJpbGl6YXRpb24gdGltZSAodm9sdGFnZSBmcm9tIFZyZWZJbnQsICAgICovCisvKiBkZWxheSBiYXNlZCBvbiBWcmVmSW50IHN0YXJ0dXAgdGltZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAiVFZSRUZJTlQiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01QX0RFTEFZX1ZPTFRBR0VfU0NBTEVSX1NUQUJfVVMgKCh1aW50MzJfdCkzMDAwVSkgIC8qITwgRGVsYXkgZm9yIENPTVAgdm9sdGFnZSBzY2FsZXIgc3RhYmlsaXphdGlvbiB0aW1lICovCisKKyNkZWZpbmUgQ09NUF9PVVRQVVRfTEVWRUxfQklUT0ZGU0VUX1BPUyAgKCh1aW50MzJfdCkgIDMwVSkKKworI2RlZmluZSBDX1JFVl9JRF9BICAgICAgICAgICAgICAweDEwMDBVIC8qIEN1dDEuMCAqLworI2RlZmluZSBDX1JFVl9JRF9aICAgICAgICAgICAgICAweDEwMDhVIC8qIEN1dDEuMSAqLworI2RlZmluZSBDX1JFVl9JRF9ZICAgICAgICAgICAgICAweDEwMDNVIC8qIEN1dDEuMiAqLworCisjZGVmaW5lIENfREVWX0lEX0wwNzMgICAgICAgICAgIDB4NDQ3VQorI2RlZmluZSBDX0RFVl9JRF9MMDUzICAgICAgICAgICAweDQxN1UKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9ucyBDT01QIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4gCisgKgorQHZlcmJhdGltICAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIGRlLWluaXRpYWxpemUgY29tcGFyYXRvcnMgCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQ09NUCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgQ09NUF9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQG5vdGUgICBJZiB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciBpcyBsb2NrZWQsIGluaXRpYWxpemF0aW9uIGNhbid0IGJlIHBlcmZvcm1lZC4KKyAgKiAgICAgICAgIFRvIHVubG9jayB0aGUgY29uZmlndXJhdGlvbiwgcGVyZm9ybSBhIHN5c3RlbSByZXNldC4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIExQVElNIGNvbm5lY3Rpb24gaXMgZW5hYmxlZCwgdGhlIGZvbGxvd2luZyBwaW5zIExQVElNX0lOMShQQjUsIFBDMCkKKyAgICAgICAgICAgIGFuZCBMUFRJTV9JTjIoUEI3LCBQQzIpIHNob3VsZCBub3QgYmUgY29uZmlndXJlZCBpbiBhbHRlcm5hdGUgZnVuY3Rpb24uCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX0luaXQoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgdWludDMyX3QgdG1wX2NzciA9IDBVOworICB1aW50MzJfdCBleHRpX2xpbmUgPSAwVTsKKyAgdWludDMyX3QgY29tcF92b2x0YWdlX3NjYWxlcl9ub3RfaW5pdGlhbGl6ZWQgPSAwVTsKKyAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwVTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIENPTVAgaGFuZGxlIGFsbG9jYXRpb24gYW5kIGxvY2sgc3RhdHVzICovCisgIGlmKChoY29tcCA9PSBOVUxMKSB8fCAoX19IQUxfQ09NUF9JU19MT0NLRUQoaGNvbXApKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9JTlBVVF9QTFVTKGhjb21wLT5JbnN0YW5jZSwgaGNvbXAtPkluaXQuTm9uSW52ZXJ0aW5nSW5wdXQpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9JTlBVVF9NSU5VUyhoY29tcC0+SW5zdGFuY2UsIGhjb21wLT5Jbml0LkludmVydGluZ0lucHV0KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfT1VUUFVUUE9MKGhjb21wLT5Jbml0Lk91dHB1dFBvbCkpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX1BPV0VSTU9ERShoY29tcC0+SW5pdC5Nb2RlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfVFJJR0dFUk1PREUoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9XSU5ET1dNT0RFKGhjb21wLT5Jbml0LldpbmRvd01vZGUpKTsKKyAgICAKKyAgICBpZihoY29tcC0+U3RhdGUgPT0gSEFMX0NPTVBfU1RBVEVfUkVTRVQpCisgICAgeworICAgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgICAgaGNvbXAtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisgICAgICAKKyAgICAgIC8qIEluaXQgU1lTQ0ZHIGFuZCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIHRvIGFjY2VzcyBjb21wYXJhdG9ycyAqLworICAgICAgLyogTm90ZTogSEFMX0NPTVBfSW5pdCgpIGNhbGxzIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIHRvIGVuYWJsZSBpbnRlcm5hbCBjb250cm9sIGNsb2NrIG9mIHRoZSBjb21wYXJhdG9ycy4gICAgICAgICAgICovCisgICAgICAvKiAgICAgICBIb3dldmVyLCB0aGlzIGlzIGEgbGVnYWN5IHN0cmF0ZWd5LiBJbiBmdXR1cmUgU1RNMzIgZmFtaWxpZXMsICAqLworICAgICAgLyogICAgICAgQ09NUCBjbG9jayBlbmFibGUgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB1c2VyICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGluICJIQUxfQ09NUF9Nc3BJbml0KCkiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICBUaGVyZWZvcmUsIGZvciBjb21wYXRpYmlsaXR5IGFudGljaXBhdGlvbiwgaXQgaXMgcmVjb21tZW5kZWQgICAqLworICAgICAgLyogICAgICAgdG8gaW1wbGVtZW50IF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGluICJIQUxfQ09NUF9Nc3BJbml0KCkiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKTsKKyAgICAgIAorI2lmIChVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBJbml0IHRoZSBDT01QIENhbGxiYWNrIHNldHRpbmdzICovCisgICAgICBoY29tcC0+VHJpZ2dlckNhbGxiYWNrID0gSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworCisgICAgICBpZiAoaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgICAgeworICAgICAgICBoY29tcC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NPTVBfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgICBoY29tcC0+TXNwSW5pdENhbGxiYWNrKGhjb21wKTsKKyNlbHNlCisgICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICAgIEhBTF9DT01QX01zcEluaXQoaGNvbXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgCisgICAgLyogU2V0IENPTVAgcGFyYW1ldGVycyAqLworICAgIHRtcF9jc3IgPSAoaGNvbXAtPkluaXQuSW52ZXJ0aW5nSW5wdXQgICB8CisgICAgICAgICAgICAgICBoY29tcC0+SW5pdC5PdXRwdXRQb2wgICAgICAgICApOworICAgIAorICAgIC8qIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gY29tcGFyYXRvciBpbnN0YW5jZTogQ09NUDIgKi8KKyAgICBpZiAoKGhjb21wLT5JbnN0YW5jZSkgPT0gQ09NUDIpCisgICAgeworICAgICAgLyogQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlIG9uIENPTVAyIG9ubHkgKi8KKyAgICAgIC8qIENvbXBhcmF0b3IgcG93ZXIgbW9kZSBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSBvbiBDT01QMiBvbmx5ICovCisgICAgICB0bXBfY3NyIHw9IChoY29tcC0+SW5pdC5Ob25JbnZlcnRpbmdJbnB1dCB8CisgICAgICAgICAgICAgICAgICBoY29tcC0+SW5pdC5Nb2RlICAgICAgICAgICAgICAgKTsKKyAgICAgIAorICAgICAgLyogQ09NUDIgc3BlY2lmaWNpdHk6IHdoZW4gdXNpbmcgVnJlZkludCBvciBzdWJkaXZpc2lvbiBvZiBWcmVmSW50LCAgICAgKi8KKyAgICAgIC8qIHNwZWNpZmljIHBhdGggbXVzdCBiZSBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZigoaGNvbXAtPkluaXQuSW52ZXJ0aW5nSW5wdXQgPT0gQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UKSAgICB8fAorICAgICAgICAgKGhjb21wLT5Jbml0LkludmVydGluZ0lucHV0ID09IENPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVCkgfHwKKyAgICAgICAgIChoY29tcC0+SW5pdC5JbnZlcnRpbmdJbnB1dCA9PSBDT01QX0lOUFVUX01JTlVTXzFfMlZSRUZJTlQpIHx8CisgICAgICAgICAoaGNvbXAtPkluaXQuSW52ZXJ0aW5nSW5wdXQgPT0gQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UKSAgICkKKyAgICAgIHsKKyAgICAgICAgLyogTWVtb3JpemUgdm9sdGFnZSBzY2FsZXIgc3RhdGUgYmVmb3JlIGluaXRpYWxpemF0aW9uICovCisgICAgICAgIGNvbXBfdm9sdGFnZV9zY2FsZXJfbm90X2luaXRpYWxpemVkID0gKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTkJVRkxQX1ZSRUZJTlRfQ09NUCkgPT0gMFUpOworICAgICAgICAKKyAgICAgICAgU0VUX0JJVChTWVNDRkctPkNGR1IzLCBTWVNDRkdfQ0ZHUjNfRU5fVlJFRklOVCAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSM19FTkJVRkxQX1ZSRUZJTlRfQ09NUCAgKTsKKyAgICAgICAgCisgICAgICAgIC8qIERlbGF5IGZvciBDT01QIHNjYWxlciBicmlkZ2Ugdm9sdGFnZSBzdGFiaWxpemF0aW9uICovCisgICAgICAgIC8qIEFwcGx5IHRoZSBkZWxheSBpZiB2b2x0YWdlIHNjYWxlciBicmlkZ2UgaXMgZW5hYmxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKyAgICAgICAgaWYgKGNvbXBfdm9sdGFnZV9zY2FsZXJfbm90X2luaXRpYWxpemVkICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8KKyAgICAgICAgICAvKiBOb3RlOiBWYXJpYWJsZSBkaXZpZGVkIGJ5IDIgdG8gY29tcGVuc2F0ZSBwYXJ0aWFsbHkgICAgICAgICAgICAgICovCisgICAgICAgICAgLyogICAgICAgQ1BVIHByb2Nlc3NpbmcgY3ljbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIHdhaXRfbG9vcF9pbmRleCA9IChDT01QX0RFTEFZX1ZPTFRBR0VfU0NBTEVSX1NUQUJfVVMgKiAoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDAwMDBVICogMlUpKSk7CisgICAgICAgICAgd2hpbGUod2FpdF9sb29wX2luZGV4ICE9IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBTZXQgY29tcGFyYXRvciBvdXRwdXQgY29ubmVjdGlvbiB0byBMUFRJTSAqLworICAgIGlmIChoY29tcC0+SW5pdC5MUFRJTUNvbm5lY3Rpb24gIT0gQ09NUF9MUFRJTUNPTk5FQ1RJT05fRElTQUJMRUQpCisgICAgeworICAgICAgLyogTFBUSU0gY29ubmV4aW9uIHJlcXVlc3RlZCBvbiBDT01QMSAqLworICAgICAgaWYgKChoY29tcC0+SW5zdGFuY2UpID09IENPTVAxKQorICAgICAgeworICAgICAgICAvKiBOb3RlIDogQ09NUDEgY2FuIGJlIGNvbm5lY3RlZCB0byB0aGUgaW5wdXQgMSBvZiBMUFRJTSBpZiByZXF1ZXN0ZWQgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVAxX0xQVElNQ09OTkVDVElPTihoY29tcC0+SW5pdC5MUFRJTUNvbm5lY3Rpb24pKTsKKyAgICAgICAgCisgICAgICAgIC8qIE5vdGU6IENvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyBkcml2ZXIgdmVyc2lvbiB1c2luZyAgICAgICAgICAgICAqLworICAgICAgICAvKiBnZW5lcmljIGxpdGVyYWwgQ09NUF9MUFRJTUNPTk5FQ1RJT05fRU5BQkxFRCBjb3JyZXNwb25kaW5nICAgICAgICAgKi8KKyAgICAgICAgLyogdG8gTFBUSU0gaW5wdXQgMSBmb3IgQ09NUDEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgdG1wX2NzciB8PSAoQ09NUF9DU1JfQ09NUDFMUFRJTTFJTjEpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdGUgOiBDT01QMiBjYW4gYmUgY29ubmVjdGVkIHRvIGlucHV0IDEgb3IgaW5wdXQgMiBvZiBMUFRJTSBpZiByZXF1ZXN0ZWQgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVAyX0xQVElNQ09OTkVDVElPTihoY29tcC0+SW5pdC5MUFRJTUNvbm5lY3Rpb24pKTsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAoaGNvbXAtPkluaXQuTFBUSU1Db25uZWN0aW9uKQorICAgICAgICB7CisgICAgICAgIGNhc2UgIENPTVBfTFBUSU1DT05ORUNUSU9OX0lOMV9FTkFCTEVEIDoKKyAgICAgICAgICB0bXBfY3NyIHw9IChDT01QX0NTUl9DT01QMkxQVElNMUlOMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIENPTVBfTFBUSU1DT05ORUNUSU9OX0lOMl9FTkFCTEVEIDoKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgLyogTm90ZTogRGVmYXVsdCBjYXNlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgZHJpdmVyIHZlcnNpb24qLworICAgICAgICAgIC8qIHVzaW5nIGdlbmVyaWMgbGl0ZXJhbCBDT01QX0xQVElNQ09OTkVDVElPTl9FTkFCTEVEIGNvcnJlc3BvbmRpbmcgKi8KKyAgICAgICAgICAvKiB0byBMUFRJTSBpbnB1dCAyIGZvciBDT01QMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgCisgICAgICAgICAgLyogQ2hlY2sgdGhlIE1DVV9JRCBpbiBvcmRlciB0byBhbGxvdyBvciBub3QgdGhlIENPTVAyIGNvbm5lY3Rpb24gdG8gTFBUSU0gaW5wdXQgMiAqLworICAgICAgICAgIGlmICgoKEhBTF9HZXRERVZJRCgpID09IENfREVWX0lEX0wwNzMpICYmIChIQUxfR2V0UkVWSUQoKSA9PSBDX1JFVl9JRF9BKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAoKEhBTF9HZXRERVZJRCgpID09IENfREVWX0lEX0wwNTMpICYmIChIQUxfR2V0UkVWSUQoKSA9PSBDX1JFVl9JRF9BKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAoKEhBTF9HZXRERVZJRCgpID09IENfREVWX0lEX0wwNTMpICYmIChIQUxfR2V0UkVWSUQoKSA9PSBDX1JFVl9JRF9aKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVAyX0xQVElNQ09OTkVDVElPTl9SRVNUUklDVEVEKGhjb21wLT5Jbml0LkxQVElNQ29ubmVjdGlvbikpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBFcnJvcjogT24gdGhlIHNlbGVjdGVkIGRldmljZSwgQ09NUDIgY2Fubm90IGJlIGNvbm5lY3RlZCB0byBMUFRJTSBpbnB1dCAyICovCisgICAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICB0bXBfY3NyIHw9IChDT01QX0NTUl9DT01QMkxQVElNMUlOMik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIFVwZGF0ZSBjb21wYXJhdG9yIHJlZ2lzdGVyICovCisgICAgaWYgKChoY29tcC0+SW5zdGFuY2UpID09IENPTVAxKQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoaGNvbXAtPkluc3RhbmNlLT5DU1IsCisgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAxSU5OU0VMICAgICB8IENPTVBfQ1NSX0NPTVAxV00gICAgICAgfAorICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMUxQVElNMUlOMSAgfCBDT01QX0NTUl9DT01QMVBPTEFSSVRZICAsCisgICAgICAgICAgICAgICAgIHRtcF9jc3IKKyAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICBlbHNlIC8qIEluc3RhbmNlID09IENPTVAyICovCisgICAgeworICAgICAgTU9ESUZZX1JFRyhoY29tcC0+SW5zdGFuY2UtPkNTUiwKKyAgICAgICAgICAgICAgICAgQ09NUF9DU1JfQ09NUDJTUEVFRCAgICAgfCBDT01QX0NTUl9DT01QMklOTlNFTCAgICB8CisgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAySU5QU0VMICAgIHwgQ09NUF9DU1JfQ09NUDJQT0xBUklUWSAgfAorICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QMkxQVElNMUlOMiB8IENPTVBfQ1NSX0NPTVAyTFBUSU0xSU4xICAsCisgICAgICAgICAgICAgICAgIHRtcF9jc3IKKyAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICAKKyAgICAvKiBTZXQgd2luZG93IG1vZGUgKi8KKyAgICAvKiBOb3RlOiBXaW5kb3cgbW9kZSBiaXQgaXMgbG9jYXRlZCBpbnRvIDEgb3V0IG9mIHRoZSAyIHBhaXJzIG9mIENPTVAgICAgICovCisgICAgLyogICAgICAgaW5zdGFuY2VzLiBUaGVyZWZvcmUsIHRoaXMgZnVuY3Rpb24gY2FuIHVwZGF0ZSBhbm90aGVyIENPTVAgICAgICAqLworICAgIC8qICAgICAgIGluc3RhbmNlIHRoYXQgdGhlIG9uZSBjdXJyZW50bHkgc2VsZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihoY29tcC0+SW5pdC5XaW5kb3dNb2RlID09IENPTVBfV0lORE9XTU9ERV9DT01QMV9JTlBVVF9QTFVTX0NPTU1PTikKKyAgICB7CisgICAgICBTRVRfQklUKENPTVAxMl9DT01NT04tPkNTUiwgQ09NUF9DU1JfV0lOTU9ERSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBDTEVBUl9CSVQoQ09NUDEyX0NPTU1PTi0+Q1NSLCBDT01QX0NTUl9XSU5NT0RFKTsKKyAgICB9CisgICAgCisgICAgLyogR2V0IHRoZSBFWFRJIGxpbmUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgQ09NUCBpbnN0YW5jZSAqLworICAgIGV4dGlfbGluZSA9IENPTVBfR0VUX0VYVElfTElORShoY29tcC0+SW5zdGFuY2UpOworICAgIAorICAgIC8qIE1hbmFnZSBFWFRJIHNldHRpbmdzICovCisgICAgaWYoKGhjb21wLT5Jbml0LlRyaWdnZXJNb2RlICYgKENPTVBfRVhUSV9JVCB8IENPTVBfRVhUSV9FVkVOVCkpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyZSBFWFRJIHJpc2luZyBlZGdlICovCisgICAgICBpZigoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUgJiBDT01QX0VYVElfUklTSU5HKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChFWFRJLT5SVFNSLCBleHRpX2xpbmUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBDTEVBUl9CSVQoRVhUSS0+UlRTUiwgZXh0aV9saW5lKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIEVYVEkgZmFsbGluZyBlZGdlICovCisgICAgICBpZigoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUgJiBDT01QX0VYVElfRkFMTElORykgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoRVhUSS0+RlRTUiwgZXh0aV9saW5lKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgQ0xFQVJfQklUKEVYVEktPkZUU1IsIGV4dGlfbGluZSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIENsZWFyIENPTVAgRVhUSSBwZW5kaW5nIGJpdCAoaWYgYW55KSAqLworICAgICAgV1JJVEVfUkVHKEVYVEktPlBSLCBleHRpX2xpbmUpOworICAgICAgCisgICAgICAvKiBDb25maWd1cmUgRVhUSSBldmVudCBtb2RlICovCisgICAgICBpZigoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUgJiBDT01QX0VYVElfRVZFTlQpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICBTRVRfQklUKEVYVEktPkVNUiwgZXh0aV9saW5lKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgQ0xFQVJfQklUKEVYVEktPkVNUiwgZXh0aV9saW5lKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIEVYVEkgaW50ZXJydXB0IG1vZGUgKi8KKyAgICAgIGlmKChoY29tcC0+SW5pdC5UcmlnZ2VyTW9kZSAmIENPTVBfRVhUSV9JVCkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoRVhUSS0+SU1SLCBleHRpX2xpbmUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBDTEVBUl9CSVQoRVhUSS0+SU1SLCBleHRpX2xpbmUpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRGlzYWJsZSBFWFRJIGV2ZW50IG1vZGUgKi8KKyAgICAgIENMRUFSX0JJVChFWFRJLT5FTVIsIGV4dGlfbGluZSk7CisgICAgICAKKyAgICAgIC8qIERpc2FibGUgRVhUSSBpbnRlcnJ1cHQgbW9kZSAqLworICAgICAgQ0xFQVJfQklUKEVYVEktPklNUiwgZXh0aV9saW5lKTsKKyAgICB9CisgICAgCisgICAgLyogU2V0IEhBTCBDT01QIGhhbmRsZSBzdGF0ZSAqLworICAgIC8qIE5vdGU6IFRyYW5zaXRpb24gZnJvbSBzdGF0ZSByZXNldCB0byBzdGF0ZSByZWFkeSwgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBvdGhlcndpc2UgKGNvbWluZyBmcm9tIHN0YXRlIHJlYWR5IG9yIGJ1c3kpIG5vIHN0YXRlIHVwZGF0ZS4gICAgICovCisgICAgaWYgKGhjb21wLT5TdGF0ZSA9PSBIQUxfQ09NUF9TVEFURV9SRVNFVCkKKyAgICB7CisgICAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRUFEWTsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBDT01QIHBlcmlwaGVyYWwuCisgICogQG5vdGUgICBEZWluaXRpYWxpemF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgaWYgdGhlIENPTVAgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQuCisgICogICAgICAgICBUbyB1bmxvY2sgdGhlIGNvbmZpZ3VyYXRpb24sIHBlcmZvcm0gYSBzeXN0ZW0gcmVzZXQuCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX0RlSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYoKGhjb21wID09IE5VTEwpIHx8IChfX0hBTF9DT01QX0lTX0xPQ0tFRChoY29tcCkpKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisgICAgCisgICAgLyogU2V0IENPTVBfQ1NSIHJlZ2lzdGVyIHRvIHJlc2V0IHZhbHVlICovCisgICAgV1JJVEVfUkVHKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCAweDAwMDAwMDAwVSk7CisgICAgCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBpZiAoaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0NPTVBfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgICAgfQorICAgIAorICAgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayhoY29tcCk7CisjZWxzZQorICAgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIEhBTF9DT01QX01zcERlSW5pdChoY29tcCk7CisjZW5kaWYgLyogVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIAorICAgIC8qIFNldCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRVNFVDsKKyAgICAKKyAgICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNvbXApOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIENPTVAgTVNQLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ09NUF9Nc3BJbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjb21wKTsKKyAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ09NUF9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBDT01QIE1TUC4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NPTVBfTXNwRGVJbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjb21wKTsKKyAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ09NUF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBDT01QIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGNvbXAgUG9pbnRlciB0byBhIENPTVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENPTVAuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ09NUF9UUklHR0VSX0NCX0lEIFRyaWdnZXIgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NPTVBfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DT01QX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfUmVnaXN0ZXJDYWxsYmFjayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wLCBIQUxfQ09NUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwQ09NUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICBpZiAoSEFMX0NPTVBfU1RBVEVfUkVBRFkgPT0gaGNvbXAtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0NPTVBfVFJJR0dFUl9DQl9JRCA6CisgICAgICAgIGhjb21wLT5UcmlnZ2VyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9DT01QX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoY29tcC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQ09NUF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoY29tcC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjb21wLT5FcnJvckNvZGUgfD0gSEFMX0NPTVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX0NPTVBfU1RBVEVfUkVTRVQgPT0gaGNvbXAtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0NPTVBfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhjb21wLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9DT01QX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGNvbXAtPkVycm9yQ29kZSB8PSBIQUxfQ09NUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhIENPTVAgQ2FsbGJhY2sKKyAgKiAgICAgICAgIENPTVAgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoY29tcCBQb2ludGVyIHRvIGEgQ09NUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ09NUC4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NPTVBfVFJJR0dFUl9DQl9JRCBUcmlnZ2VyIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DT01QX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ09NUF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCwgSEFMX0NPTVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChIQUxfQ09NUF9TVEFURV9SRUFEWSA9PSBoY29tcC0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ09NUF9UUklHR0VSX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPlRyaWdnZXJDYWxsYmFjayA9IEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcEluaXQ7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DT01QX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcERlSW5pdDsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjb21wLT5FcnJvckNvZGUgfD0gSEFMX0NPTVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfQ09NUF9TVEFURV9SRVNFVCA9PSBoY29tcC0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcEluaXQ7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DT01QX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcERlSW5pdDsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjb21wLT5FcnJvckNvZGUgfD0gSEFMX0NPTVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFN0YXJ0LVN0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICBTdGFydC1TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMuIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTdGFydCBhIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICAgICAoKykgU3RvcCBhIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIGNvbXBhcmF0b3IuCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX1N0YXJ0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBDT01QIGhhbmRsZSBhbGxvY2F0aW9uIGFuZCBsb2NrIHN0YXR1cyAqLworICBpZigoaGNvbXAgPT0gTlVMTCkgfHwgKF9fSEFMX0NPTVBfSVNfTE9DS0VEKGhjb21wKSkpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UpKTsKKworICAgIGlmKGhjb21wLT5TdGF0ZSA9PSBIQUxfQ09NUF9TVEFURV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIGNvbXBhcmF0b3IgKi8KKyAgICAgIFNFVF9CSVQoaGNvbXAtPkluc3RhbmNlLT5DU1IsIENPTVBfQ1NSX0NPTVB4RU4pOworICAgICAgCisgICAgICAvKiBTZXQgSEFMIENPTVAgaGFuZGxlIHN0YXRlICovCisgICAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9CVVNZOworICAgICAgCisgICAgICAvKiBEZWxheSBmb3IgQ09NUCBzdGFydHVwIHRpbWUgKi8KKyAgICAgIC8qIFdhaXQgbG9vcCBpbml0aWFsaXphdGlvbiBhbmQgZXhlY3V0aW9uICovCisgICAgICAvKiBOb3RlOiBWYXJpYWJsZSBkaXZpZGVkIGJ5IDIgdG8gY29tcGVuc2F0ZSBwYXJ0aWFsbHkgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgQ1BVIHByb2Nlc3NpbmcgY3ljbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIHdhaXRfbG9vcF9pbmRleCA9IChDT01QX0RFTEFZX1NUQVJUVVBfVVMgKiAoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDAwMDBVICogMlUpKSk7CisgICAgICB3aGlsZSh3YWl0X2xvb3BfaW5kZXggIT0gMFUpCisgICAgICB7CisgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgY29tcGFyYXRvci4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfU3RvcChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYoKGhjb21wID09IE5VTEwpIHx8IChfX0hBTF9DT01QX0lTX0xPQ0tFRChoY29tcCkpKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisgICAgCisgICAgaWYoKGhjb21wLT5TdGF0ZSA9PSBIQUxfQ09NUF9TVEFURV9CVVNZKSAgfHwKKyAgICAgICAoaGNvbXAtPlN0YXRlID09IEhBTF9DT01QX1NUQVRFX1JFQURZKSAgICkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBjb21wYXJhdG9yICovCisgICAgICBDTEVBUl9CSVQoaGNvbXAtPkluc3RhbmNlLT5DU1IsIENPTVBfQ1NSX0NPTVB4RU4pOworCisgICAgICAvKiBTZXQgSEFMIENPTVAgaGFuZGxlIHN0YXRlICovCisgICAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRUFEWTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29tcGFyYXRvciBJUlEgaGFuZGxlci4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfQ09NUF9JUlFIYW5kbGVyKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIEdldCB0aGUgRVhUSSBsaW5lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIENPTVAgaW5zdGFuY2UgKi8KKyAgdWludDMyX3QgZXh0aV9saW5lID0gQ09NUF9HRVRfRVhUSV9MSU5FKGhjb21wLT5JbnN0YW5jZSk7CisgIAorICAvKiBDaGVjayBDT01QIEVYVEkgZmxhZyAqLworICBpZihSRUFEX0JJVChFWFRJLT5QUiwgZXh0aV9saW5lKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIHdoZXRoZXIgY29tcGFyYXRvciBpcyBpbiBpbmRlcGVuZGVudCBvciB3aW5kb3cgbW9kZSAqLworICAgIGlmKFJFQURfQklUKENPTVAxMl9DT01NT04tPkNTUiwgQ09NUF9DU1JfV0lOTU9ERSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBDbGVhciBDT01QIEVYVEkgbGluZSBwZW5kaW5nIGJpdCBvZiB0aGUgcGFpciBvZiBjb21wYXJhdG9ycyAgICAgICAgICAqLworICAgICAgLyogaW4gd2luZG93IG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIE5vdGU6IFBhaXIgb2YgY29tcGFyYXRvcnMgaW4gd2luZG93IG1vZGUgY2FuIGJvdGggdHJpZyBJUlEgd2hlbiAgICAgICovCisgICAgICAvKiAgICAgICBpbnB1dCB2b2x0YWdlIGlzIGNoYW5naW5nIGZyb20gIm91dCBvZiB3aW5kb3ciIGFyZWEgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgKGxvdyBvciBoaWdoICkgdG8gdGhlIG90aGVyICJvdXQgb2Ygd2luZG93IiBhcmVhIChoaWdoIG9yIGxvdykuKi8KKyAgICAgIC8qICAgICAgIEJvdGggZmxhZ3MgbXVzdCBiZSBjbGVhcmVkIHRvIGNhbGwgY29tcGFyYXRvciB0cmlnZ2VyICAgICAgICAgICovCisgICAgICAvKiAgICAgICBjYWxsYmFjayBpcyBjYWxsZWQgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgV1JJVEVfUkVHKEVYVEktPlBSLCAoQ09NUF9FWFRJX0xJTkVfQ09NUDEgfCBDT01QX0VYVElfTElORV9DT01QMikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2xlYXIgQ09NUCBFWFRJIGxpbmUgcGVuZGluZyBiaXQgKi8KKyAgICAgIFdSSVRFX1JFRyhFWFRJLT5QUiwgZXh0aV9saW5lKTsKKyAgICB9CisgICAgCisgICAgLyogQ09NUCB0cmlnZ2VyIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoY29tcC0+VHJpZ2dlckNhbGxiYWNrKGhjb21wKTsKKyNlbHNlCisgICAgSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrKGhjb21wKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICBNYW5hZ2VtZW50IGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIGNvbXBhcmF0b3JzLiAKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBMb2NrIHRoZSBzZWxlY3RlZCBjb21wYXJhdG9yIGNvbmZpZ3VyYXRpb24uCisgICogQG5vdGUgICBBIHN5c3RlbSByZXNldCBpcyByZXF1aXJlZCB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIExvY2tpbmcgdGhlIGNvbXBhcmF0b3IgZnJvbSByZXNldCBzdGF0ZSBpcyBwb3NzaWJsZQorICAqICAgICAgICAgaWYgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCkgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfTG9jayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYoKGhjb21wID09IE5VTEwpIHx8IChfX0hBTF9DT01QX0lTX0xPQ0tFRChoY29tcCkpKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisgICAgCisgICAgLyogU2V0IEhBTCBDT01QIGhhbmRsZSBzdGF0ZSAqLworICAgIGhjb21wLT5TdGF0ZSA9ICgoSEFMX0NPTVBfU3RhdGVUeXBlRGVmKShoY29tcC0+U3RhdGUgfCBDT01QX1NUQVRFX0JJVEZJRUxEX0xPQ0spKTsKKyAgfQorICAKKyAgaWYoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIFNldCB0aGUgbG9jayBiaXQgY29ycmVzcG9uZGluZyB0byBzZWxlY3RlZCBjb21wYXJhdG9yICovCisgICAgX19IQUxfQ09NUF9MT0NLKGhjb21wKTsKKyAgfQorICAKKyAgcmV0dXJuIHN0YXR1czsgCit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBvdXRwdXQgbGV2ZWwgKGhpZ2ggb3IgbG93KSBvZiB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvci4gCisgICogICAgICAgICBUaGUgb3V0cHV0IGxldmVsIGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkIHBvbGFyaXR5LgorICAqICAgICAgICAgSWYgdGhlIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZDoKKyAgKiAgICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGxvd2VyCisgICogICAgICAgICAgICAgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cworICAqICAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGhpZ2hlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgIElmIHRoZSBwb2xhcml0eSBpcyBpbnZlcnRlZDoKKyAgKiAgICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIGlucHV0IHBsdXMgaXMgYXQgYSBsb3dlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGhpZ2hlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgUmV0dXJucyB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciBvdXRwdXQgbGV2ZWw6IAorICAqICAgICAgICAgQGFyZyBAcmVmIENPTVBfT1VUUFVUX0xFVkVMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIENPTVBfT1VUUFVUX0xFVkVMX0hJR0gKKyAgKiAgICAgICAKKyAgKi8KK3VpbnQzMl90IEhBTF9DT01QX0dldE91dHB1dExldmVsKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworICAKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoaGNvbXAtPkluc3RhbmNlLT5DU1IsIENPTVBfQ1NSX0NPTVB4T1VUVkFMVUUpCisgICAgICAgICAgICAgICAgICAgID4+IENPTVBfT1VUUFVUX0xFVkVMX0JJVE9GRlNFVF9QT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbXBhcmF0b3IgdHJpZ2dlciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjb21wKTsKKyAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMuIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0IHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgQ09NUCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX0NPTVBfU3RhdGVUeXBlRGVmIEhBTF9DT01QX0dldFN0YXRlKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIENoZWNrIHRoZSBDT01QIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhjb21wID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0NPTVBfU1RBVEVfUkVTRVQ7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UpKTsKKworICAvKiBSZXR1cm4gSEFMIENPTVAgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoY29tcC0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBDT01QIGVycm9yIGNvZGUuCisgICogQHBhcmFtIGhjb21wIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBDT01QIGVycm9yIGNvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9DT01QX0dldEVycm9yKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShoY29tcC0+SW5zdGFuY2UpKTsKKyAgCisgIHJldHVybiBoY29tcC0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiAhZGVmaW5lZCAoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICovCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfY29tcF9leC5jIGIvU3JjL3N0bTMybDB4eF9oYWxfY29tcF9leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYTRlNzYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9jb21wX2V4LmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2NvbXBfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgQ09NUCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB2b2x0YWdlIHJlZmVyZW5jZQorICAqICAgICAgICAgIFZyZWZJbnQgdGhhdCBtdXN0IGJlIHNwZWNpZmljYWxseSBjb250cm9sZWQgZm9yIGNvbXBhcmF0b3IKKyAgKiAgICAgICAgICBpbnN0YW5jZSBDT01QMi4KKyAgQHZlcmJhdGltIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICMjIyMjIENPTVAgcGVyaXBoZXJhbCBFeHRlbmRlZCBmZWF0dXJlcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXSBDb21wYXJpbmcgdG8gb3RoZXIgcHJldmlvdXMgZGV2aWNlcywgdGhlIENPTVAgaW50ZXJmYWNlIGZvciBTVE0zMkwwWFgKKyAgICAgICBkZXZpY2VzIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBmZWF0dXJlcworCisgICAgICAgKCspIFBvc3NpYmlsaXR5IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBWUkVGSU5UIHdoaWNoIGlzIHVzZWQgYXMgaW5wdXQKKyAgICAgICAgICAgdG8gdGhlIGNvbXBhcmF0b3IuCisKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KQorLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfQ09NUF9NT0RVTEVfRU5BQkxFRAorCisvKiogQGFkZHRvZ3JvdXAgQ09NUEV4CisgICogQGJyaWVmIEV4dGVuZGVkIENPTVAgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENPTVBfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBEZWxheSBmb3IgQ09NUCB2b2x0YWdlIHNjYWxlciBzdGFiaWxpemF0aW9uIHRpbWUgKHZvbHRhZ2UgZnJvbSBWcmVmSW50LCAgICAqLworLyogZGVsYXkgYmFzZWQgb24gVnJlZkludCBzdGFydHVwIHRpbWUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIExpdGVyYWwgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgIlRWUkVGSU5UIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09NUF9ERUxBWV9WT0xUQUdFX1NDQUxFUl9TVEFCX1VTICgodWludDMyX3QpMzAwMFUpICAvKiE8IERlbGF5IGZvciBDT01QIHZvbHRhZ2Ugc2NhbGVyIHN0YWJpbGl6YXRpb24gdGltZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENPTVBFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ09NUEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAYnJpZWYgIEV4dGVuZGVkIGZ1bmN0aW9ucyB0byBtYW5hZ2UgVlJFRklOVCBmb3IgdGhlIGNvbXBhcmF0b3IKKyAgKgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFZyZWZpbnQgYW5kIHBhdGggdG8gY29tcGFyYXRvciwgdXNlZCBieSBjb21wYXJhdG9yCisgICogICAgICAgICBpbnN0YW5jZSBDT01QMiBpbnB1dCBiYXNlZCBvbiBWcmVmSW50IG9yIHN1YmRpdmlzaW9uIG9mIFZyZWZJbnQuCisgICogQG5vdGUgICBUaGUgZXF1aXZhbGVudCBvZiB0aGlzIGZ1bmN0aW9uIGlzIG1hbmFnZWQgYXV0b21hdGljYWxseSB3aGVuCisgICogICAgICAgICB1c2luZyBmdW5jdGlvbiAiSEFMX0NPTVBfSW5pdCgpIi4KKyAgKiBAbm90ZSAgIFZyZWZJbnQgcmVxdWlyZXMgYSBzdGFydHVwIHRpbWUKKyAgKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgIlRWUkVGSU5UIikuCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciB0aGUgc3RhcnR1cCB0aW1lCisgICogICAgICAgICAoYWx0ZXJuYXRpdmUgc29sdXRpb246IHBvbGwgZm9yIGJpdCBTWVNDRkdfQ0ZHUjNfVlJFRklOVF9SRFlGIHNldCkuCisgICogQG5vdGUgICBWcmVmSW50IG11c3QgYmUgZGlzYWJsZWQgYmVmb3JlIGVudGVyaW5nIGluIGxvdy1wb3dlciBtb2RlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgYml0IEVOX1ZSRUZJTlQgaW4gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0NPTVBFeF9FbmFibGVWUkVGSU5UKHZvaWQpCit7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFU7CisgIAorICAvKiBFbmFibGUgVnJlZkludCB2b2x0YWdlIHJlZmVyZW5jZSBhbmQgYnVmZmVyICovCisgIFNZU0NGRy0+Q0ZHUjMgfD0gKFNZU0NGR19DRkdSM19FTkJVRkxQX1ZSRUZJTlRfQ09NUCB8IFNZU0NGR19DRkdSM19FTl9WUkVGSU5UKTsKKyAgCisgIC8qIFdhaXQgbG9vcCBpbml0aWFsaXphdGlvbiBhbmQgZXhlY3V0aW9uICovCisgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgQ1BVIHByb2Nlc3NpbmcgY3ljbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB3YWl0X2xvb3BfaW5kZXggPSAoQ09NUF9ERUxBWV9WT0xUQUdFX1NDQUxFUl9TVEFCX1VTICogKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDAwVSAqIDJVKSkpOworICB3aGlsZSh3YWl0X2xvb3BfaW5kZXggIT0gMFUpCisgIHsKKyAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVnJlZmludCBhbmQgcGF0aCB0byBjb21wYXJhdG9yLCB1c2VkIGJ5IGNvbXBhcmF0b3IKKyAgKiAgICAgICAgIGluc3RhbmNlIENPTVAyIGlucHV0IGJhc2VkIG9uIFZyZWZJbnQgb3Igc3ViZGl2aXNpb24gb2YgVnJlZkludC4KKyAgKiBAbm90ZSAgIFZyZWZJbnQgbXVzdCBiZSBkaXNhYmxlZCBiZWZvcmUgZW50ZXJpbmcgaW4gbG93LXBvd2VyIG1vZGUuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBiaXQgRU5fVlJFRklOVCBpbiByZWZlcmVuY2UgbWFudWFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfQ09NUEV4X0Rpc2FibGVWUkVGSU5UKHZvaWQpCit7CisgIC8qIERpc2FibGUgVnJlZkludCB2b2x0YWdlIHJlZmVyZW5jZSBhbmQgYnVmZmVyICovCisgIFNZU0NGRy0+Q0ZHUjMgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KShTWVNDRkdfQ0ZHUjNfRU5CVUZMUF9WUkVGSU5UX0NPTVAgfCBTWVNDRkdfQ0ZHUjNfRU5fVlJFRklOVCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworI2VuZGlmIC8qIEhBTF9DT01QX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovIAorI2VuZGlmIC8qICNpZiAhZGVmaW5lZCAoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICovCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfY29ydGV4LmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9jb3J0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDBkNzJiCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfY29ydGV4LmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2NvcnRleC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDT1JURVggSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENPUlRFWDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICAqCisgIEB2ZXJiYXRpbSAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICAKKyAgICAqKiogSG93IHRvIGNvbmZpZ3VyZSBJbnRlcnJ1cHRzIHVzaW5nIENPUlRFWCBIQUwgZHJpdmVyICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgICAgCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgdGhlIE5WSUMgaW50ZXJydXB0cyAoSVJRKS4KKyAgICBUaGUgQ29ydGV4IE0wKyBleGNlcHRpb25zIGFyZSBtYW5hZ2VkIGJ5IENNU0lTIGZ1bmN0aW9ucy4KKyAgICAgICgjKSBFbmFibGUgYW5kIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgb2YgdGhlIHNlbGVjdGVkIElSUSBDaGFubmVscy4gCisgICAgICAgICAgICAgVGhlIHByaW9yaXR5IGNhbiBiZSAwLi4zLiAKKworICAgICAgICAtQC0gTG93ZXIgcHJpb3JpdHkgdmFsdWVzIGdpdmVzIGhpZ2hlciBwcmlvcml0eS4KKyAgICAgICAgLUAtIFByaW9yaXR5IE9yZGVyOgorICAgICAgICAgICAgKCNAKSBMb3dlc3QgcHJpb3JpdHkuCisgICAgICAgICAgICAoI0ApIExvd2VzdCBoYXJkd2FyZSBwcmlvcml0eSAoSVJRbiBwb3NpdGlvbikuICAKKyAgICAKKyAgICAgKCMpICBDb25maWd1cmUgdGhlIHByaW9yaXR5IG9mIHRoZSBzZWxlY3RlZCBJUlEgQ2hhbm5lbHMgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKSAKKworICAgICAoIykgIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSVJRIENoYW5uZWxzIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpIAorICAgICAgCisgICAgWy4uXSAgCisgICAgKioqIEhvdyB0byBjb25maWd1cmUgU3lzdGljayB1c2luZyBDT1JURVggSEFMIGRyaXZlciAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBTZXR1cCBTeXNUaWNrIFRpbWVyIGZvciB0aW1lIGJhc2UuCisgICAgICAgICAgIAorICAgKCspIFRoZSBIQUxfU1lTVElDS19Db25maWcoKWZ1bmN0aW9uIGNhbGxzIHRoZSBTeXNUaWNrX0NvbmZpZygpIGZ1bmN0aW9uIHdoaWNoCisgICAgICAgaXMgYSBDTVNJUyBmdW5jdGlvbiB0aGF0OgorICAgICAgICAoKyspIENvbmZpZ3VyZXMgdGhlIFN5c1RpY2sgUmVsb2FkIHJlZ2lzdGVyIHdpdGggdmFsdWUgcGFzc2VkIGFzIGZ1bmN0aW9uIHBhcmFtZXRlci4KKyAgICAgICAgKCsrKSBDb25maWd1cmVzIHRoZSBTeXNUaWNrIElSUSBwcmlvcml0eSB0byB0aGUgbG93ZXN0IHZhbHVlICgweDAzKS4KKyAgICAgICAgKCsrKSBSZXNldHMgdGhlIFN5c1RpY2sgQ291bnRlciByZWdpc3Rlci4KKyAgICAgICAgKCsrKSBDb25maWd1cmVzIHRoZSBTeXNUaWNrIENvdW50ZXIgY2xvY2sgc291cmNlIHRvIGJlIENvcmUgQ2xvY2sgU291cmNlIChIQ0xLKS4KKyAgICAgICAgKCsrKSBFbmFibGVzIHRoZSBTeXNUaWNrIEludGVycnVwdC4KKyAgICAgICAgKCsrKSBTdGFydHMgdGhlIFN5c1RpY2sgQ291bnRlci4KKwkKKyAgICgrKSBZb3UgY2FuIGNoYW5nZSB0aGUgU3lzVGljayBDbG9jayBzb3VyY2UgdG8gYmUgSENMS19EaXY4IGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uCisgICAgICAgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnKFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOCkganVzdCBhZnRlciB0aGUKKyAgICAgICBIQUxfU1lTVElDS19Db25maWcoKSBmdW5jdGlvbiBjYWxsLiBUaGUgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnKCkgZnVuY3Rpb24gaXMgZGVmaW5lZAorICAgICAgIGluc2lkZSB0aGUgc3RtMzJsMHh4X2hhbF9jb3J0ZXguYyBmaWxlLgorCisgICAoKykgWW91IGNhbiBjaGFuZ2UgdGhlIFN5c1RpY2sgSVJRIHByaW9yaXR5IGJ5IGNhbGxpbmcgdGhlCisgICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoU3lzVGlja19JUlFuLC4uLikgZnVuY3Rpb24ganVzdCBhZnRlciB0aGUgSEFMX1NZU1RJQ0tfQ29uZmlnKCkgZnVuY3Rpb24gCisgICAgICAgY2FsbC4gVGhlIEhBTF9OVklDX1NldFByaW9yaXR5KCkgY2FsbCB0aGUgTlZJQ19TZXRQcmlvcml0eSgpIGZ1bmN0aW9uIHdoaWNoIGlzIGEgQ01TSVMgZnVuY3Rpb24uCisKKyAgICgrKSBUbyBhZGp1c3QgdGhlIFN5c1RpY2sgdGltZSBiYXNlLCB1c2UgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIFJlbG9hZCBWYWx1ZSA9IFN5c1RpY2sgQ291bnRlciBDbG9jayAoSHopIHggIERlc2lyZWQgVGltZSBiYXNlIChzKQorICAgICAgICgrKykgUmVsb2FkIFZhbHVlIGlzIHRoZSBwYXJhbWV0ZXIgdG8gYmUgcGFzc2VkIGZvciBIQUxfU1lTVElDS19Db25maWcoKSBmdW5jdGlvbgorICAgICAgICgrKykgUmVsb2FkIFZhbHVlIHNob3VsZCBub3QgZXhjZWVkIDB4RkZGRkZGCisgICAKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0NPUlRFWF9NT0RVTEVfRU5BQkxFRAorCisvKiogQGFkZHRvZ3JvdXAgQ09SVEVYCisgICogQGJyaWVmIENPUlRFWCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisKKy8qKiBAYWRkdG9ncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyB0aGUgQ09SVEVYIEhBTCBkcml2ZXIgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBJbnRlcnJ1cHRzCisgICAgICBTeXN0aWNrIGZ1bmN0aW9uYWxpdGllcyAKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXRzIHRoZSBwcmlvcml0eSBvZiBhbiBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIgLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHN0bTMybDB4eC5oIGZpbGUpCisgICogQHBhcmFtICBQcmVlbXB0UHJpb3JpdHkgVGhlIHByZS1lbXB0aW9uIHByaW9yaXR5IGZvciB0aGUgSVJRbiBjaGFubmVsLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAzLgorICAqICAgICAgICAgQSBsb3dlciBwcmlvcml0eSB2YWx1ZSBpbmRpY2F0ZXMgYSBoaWdoZXIgcHJpb3JpdHkgCisgICogQHBhcmFtICBTdWJQcmlvcml0eSB0aGUgc3VicHJpb3JpdHkgbGV2ZWwgZm9yIHRoZSBJUlEgY2hhbm5lbC4KKyAgKiAgICAgICAgIHdpdGggc3RtMzJsMHh4IGRldmljZXMsIHRoaXMgcGFyYW1ldGVyIGlzIGEgZHVtbXkgdmFsdWUgYW5kIGl0IGlzIGlnbm9yZWQsIGJlY2F1c2UgCisgICogICAgICAgICBubyBzdWJwcmlvcml0eSBzdXBwb3J0ZWQgaW4gQ29ydGV4IE0wKyBiYXNlZCBwcm9kdWN0cy4gICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfU2V0UHJpb3JpdHkoSVJRbl9UeXBlIElSUW4sIHVpbnQzMl90IFByZWVtcHRQcmlvcml0eSwgdWludDMyX3QgU3ViUHJpb3JpdHkpCit7IAorICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX1BSRUVNUFRJT05fUFJJT1JJVFkoUHJlZW1wdFByaW9yaXR5KSk7CisgIE5WSUNfU2V0UHJpb3JpdHkoSVJRbixQcmVlbXB0UHJpb3JpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhIGRldmljZSBzcGVjaWZpYyBpbnRlcnJ1cHQgaW4gdGhlIE5WSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIuCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgaW50ZXJydXB0cyBwcmlvcml0eSBjb3JyZWN0bHksIHRoZSBOVklDX1ByaW9yaXR5R3JvdXBDb25maWcoKQorICAqICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuIAorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyIC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mICBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byBzdG0zMmwweHguaCBmaWxlKSAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9OVklDX0VuYWJsZUlSUShJUlFuX1R5cGUgSVJRbikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX05WSUNfREVWSUNFX0lSUShJUlFuKSk7CisgIAorICAvKiBFbmFibGUgaW50ZXJydXB0ICovCisgIE5WSUNfRW5hYmxlSVJRKElSUW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYSBkZXZpY2Ugc3BlY2lmaWMgaW50ZXJydXB0IGluIHRoZSBOVklDIGludGVycnVwdCBjb250cm9sbGVyLgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyIC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHN0bTMybDB4eC5oIGZpbGUpICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfRGlzYWJsZUlSUShJUlFuX1R5cGUgSVJRbikKK3sKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsKKyAgCisgIC8qIERpc2FibGUgaW50ZXJydXB0ICovCisgIE5WSUNfRGlzYWJsZUlSUShJUlFuKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWF0ZSBhIHN5c3RlbSByZXNldCByZXF1ZXN0IHRvIHJlc2V0IHRoZSBNQ1UuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9OVklDX1N5c3RlbVJlc2V0KHZvaWQpCit7CisgIC8qIFN5c3RlbSBSZXNldCAqLworICBOVklDX1N5c3RlbVJlc2V0KCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU3lzdGVtIFRpbWVyIHdpdGggaW50ZXJydXB0IGVuYWJsZWQgYW5kIHN0YXJ0IHRoZSBTeXN0ZW0gVGljayBUaW1lciAoU3lzVGljaykKKyAgKiAgICAgICAgIENvdW50ZXIgaXMgaW4gZnJlZSBydW5uaW5nIG1vZGUgdG8gZ2VuZXJhdGUgcGVyaW9kaWMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIFRpY2tzTnVtYiBTcGVjaWZpZXMgdGhlIHRpY2tzIE51bWJlciBvZiB0aWNrcyBiZXR3ZWVuIHR3byBpbnRlcnJ1cHRzLgorICAqIEByZXR2YWwgc3RhdHVzOiAgLSAwICBGdW5jdGlvbiBzdWNjZWVkZWQuCisgICogICAgICAgICAgICAgICAgICAtIDEgIEZ1bmN0aW9uIGZhaWxlZC4KKyAgKi8KK3VpbnQzMl90IEhBTF9TWVNUSUNLX0NvbmZpZyh1aW50MzJfdCBUaWNrc051bWIpCit7CisgICByZXR1cm4gU3lzVGlja19Db25maWcoVGlja3NOdW1iKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICogIEBicmllZiAgIENvcnRleCBjb250cm9sIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgQ09SVEVYCisgICAgICAoTlZJQywgU1lTVElDSykgZnVuY3Rpb25hbGl0aWVzLiAKKyAKKyAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgIEdldHMgdGhlIHByaW9yaXR5IG9mIGFuIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIElSUW4gRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJsMHh4eHguaCkpCisgICogQHJldHZhbCBOb25lCisgICovCit1aW50MzJfdCBIQUxfTlZJQ19HZXRQcmlvcml0eShJUlFuX1R5cGUgSVJRbikKK3sKKyAgLyogR2V0IHByaW9yaXR5IGZvciBDb3J0ZXgtTSBzeXN0ZW0gb3IgZGV2aWNlIHNwZWNpZmljIGludGVycnVwdHMgKi8KKyAgcmV0dXJuIE5WSUNfR2V0UHJpb3JpdHkoSVJRbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0cyBQZW5kaW5nIGJpdCBvZiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHN0bTMybDB4eC5oIGZpbGUpICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfU2V0UGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbikKK3sgCisgIC8qIFNldCBpbnRlcnJ1cHQgcGVuZGluZyAqLworICBOVklDX1NldFBlbmRpbmdJUlEoSVJRbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBlbmRpbmcgSW50ZXJydXB0IChyZWFkIHRoZSBwZW5kaW5nIHJlZ2lzdGVyIGluIHRoZSBOVklDIAorICAqICAgICAgICAgYW5kIHJldHVybiB0aGUgcGVuZGluZyBiaXQgZm9yIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0KS4KKyAgKiBAcGFyYW0gIElSUW4gRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlciAuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byBzdG0zMmwweHguaCBmaWxlKSAgCisgICogQHJldHZhbCBzdGF0dXM6IC0gMCAgSW50ZXJydXB0IHN0YXR1cyBpcyBub3QgcGVuZGluZy4KKyAgKiAgICAgICAgICAgICAgICAgLSAxICBJbnRlcnJ1cHQgc3RhdHVzIGlzIHBlbmRpbmcuCisgICovCit1aW50MzJfdCBIQUxfTlZJQ19HZXRQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKQoreyAKKyAgLyogUmV0dXJuIDEgaWYgcGVuZGluZyBlbHNlIDAgKi8KKyAgcmV0dXJuIE5WSUNfR2V0UGVuZGluZ0lSUShJUlFuKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgcGVuZGluZyBiaXQgb2YgYW4gZXh0ZXJuYWwgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyIC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHN0bTMybDB4eC5oIGZpbGUpICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfQ2xlYXJQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKQoreyAKKyAgLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKyAgTlZJQ19DbGVhclBlbmRpbmdJUlEoSVJRbik7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFN5c1RpY2sgY2xvY2sgc291cmNlLgorICAqIEBwYXJhbSAgQ0xLU291cmNlIHNwZWNpZmllcyB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWODogQUhCIGNsb2NrIGRpdmlkZWQgYnkgOCBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICAgICBAYXJnIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEs6IEFIQiBjbG9jayBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnKHVpbnQzMl90IENMS1NvdXJjZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NZU1RJQ0tfQ0xLX1NPVVJDRShDTEtTb3VyY2UpKTsKKyAgaWYgKENMS1NvdXJjZSA9PSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKQorICB7CisgICAgU3lzVGljay0+Q1RSTCB8PSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLOworICB9CisgIGVsc2UKKyAgeworICAgIFN5c1RpY2stPkNUUkwgJj0gflNZU1RJQ0tfQ0xLU09VUkNFX0hDTEs7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU1lTVElDSyBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU1RJQ0tfSVJRSGFuZGxlcih2b2lkKQoreworICBIQUxfU1lTVElDS19DYWxsYmFjaygpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNZU1RJQ0sgY2FsbGJhY2suCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1lTVElDS19DYWxsYmFjayh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NZU1RJQ0tfQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChfX01QVV9QUkVTRU5UID09IDFVKQorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBNUFUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9NUFVfRGlzYWJsZSh2b2lkKQoreworCisgIC8qRGF0YSBNZW1vcnkgQmFycmllciBzZXR1cCAqLworICBfX0RNQigpOworICAvKiBEaXNhYmxlIHRoZSBNUFUgKi8KKyAgTVBVLT5DVFJMID0gMDsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIE1QVS4KKyAgKiBAcGFyYW0gIE1QVV9Db250cm9sIFNwZWNpZmllcyB0aGUgY29udHJvbCBtb2RlIG9mIHRoZSBNUFUgZHVyaW5nIGhhcmQgZmF1bHQsCisgICogICAgICAgICAgTk1JLCBGQVVMVE1BU0sgYW5kIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSBkZWZhdWx0IG1lbW9yeQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIE1QVV9IRk5NSV9QUklWREVGX05PTkUKKyAgKiAgICAgICAgICAgIEBhcmcgTVBVX0hBUkRGQVVMVF9OTUkKKyAgKiAgICAgICAgICAgIEBhcmcgTVBVX1BSSVZJTEVHRURfREVGQVVMVAorICAqICAgICAgICAgICAgQGFyZyBNUFVfSEZOTUlfUFJJVkRFRgorICAqIEByZXR2YWwgTm9uZQorICAqLworCit2b2lkIEhBTF9NUFVfRW5hYmxlKHVpbnQzMl90IE1QVV9Db250cm9sKQoreworICAvKiBFbmFibGUgdGhlIE1QVSAqLworICAgTVBVLT5DVFJMICAgPSBNUFVfQ29udHJvbCB8IE1QVV9DVFJMX0VOQUJMRV9Nc2s7CisgIC8qIERhdGEgU3luY2hyb25pemF0aW9uIEJhcnJpZXIgc2V0dXAgKi8KKyAgX19EU0IoKTsKKyAgLyogSW5zdHJ1Y3Rpb24gU3luY2hyb25pemF0aW9uIEJhcnJpZXIgc2V0dXAgKi8KKyAgX19JU0IoKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgUmVnaW9uIGFuZCB0aGUgbWVtb3J5IHRvIGJlIHByb3RlY3RlZC4KKyAgKiBAcGFyYW0gIE1QVV9Jbml0IFBvaW50ZXIgdG8gYSBNUFVfUmVnaW9uX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGluaXRpYWxpemF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTVBVX0NvbmZpZ1JlZ2lvbihNUFVfUmVnaW9uX0luaXRUeXBlRGVmICpNUFVfSW5pdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX01QVV9SRUdJT05fTlVNQkVSKE1QVV9Jbml0LT5OdW1iZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX01QVV9SRUdJT05fRU5BQkxFKE1QVV9Jbml0LT5FbmFibGUpKTsKKworICAvKiBTZXQgdGhlIFJlZ2lvbiBudW1iZXIgKi8KKyAgTVBVLT5STlIgPSBNUFVfSW5pdC0+TnVtYmVyOworCisgIGlmICgoTVBVX0luaXQtPkVuYWJsZSkgPT0gTVBVX1JFR0lPTl9FTkFCTEUpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19NUFVfSU5TVFJVQ1RJT05fQUNDRVNTKE1QVV9Jbml0LT5EaXNhYmxlRXhlYykpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX1BFUk1JU1NJT05fQVRUUklCVVRFKE1QVV9Jbml0LT5BY2Nlc3NQZXJtaXNzaW9uKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX01QVV9BQ0NFU1NfU0hBUkVBQkxFKE1QVV9Jbml0LT5Jc1NoYXJlYWJsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfQUNDRVNTX0NBQ0hFQUJMRShNUFVfSW5pdC0+SXNDYWNoZWFibGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX0FDQ0VTU19CVUZGRVJBQkxFKE1QVV9Jbml0LT5Jc0J1ZmZlcmFibGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX1NVQl9SRUdJT05fRElTQUJMRShNUFVfSW5pdC0+U3ViUmVnaW9uRGlzYWJsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX1NJWkUoTVBVX0luaXQtPlNpemUpKTsKKworICAgIC8qIFNldCB0aGUgYmFzZSBhZHNyZXNzIGFuZCBzZXQgdGhlIDQgTFNCIHRvIDAgKi8KKyAgICBNUFUtPlJCQVIgPSAoTVBVX0luaXQtPkJhc2VBZGRyZXNzKSAmIDB4ZmZmZmZmZjBVOworCisgICAgLyogRmlsbCB0aGUgZmllbGQgUkFTUiAqLworICAgIE1QVS0+UkFTUiA9ICgodWludDMyX3QpTVBVX0luaXQtPkRpc2FibGVFeGVjICAgICAgICA8PCBNUFVfUkFTUl9YTl9Qb3MpICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPkFjY2Vzc1Blcm1pc3Npb24gICA8PCBNUFVfUkFTUl9BUF9Qb3MpICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzU2hhcmVhYmxlICAgICAgICA8PCBNUFVfUkFTUl9TX1BvcykgICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzQ2FjaGVhYmxlICAgICAgICA8PCBNUFVfUkFTUl9DX1BvcykgICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzQnVmZmVyYWJsZSAgICAgICA8PCBNUFVfUkFTUl9CX1BvcykgICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPlN1YlJlZ2lvbkRpc2FibGUgICA8PCBNUFVfUkFTUl9TUkRfUG9zKSAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPlNpemUgICAgICAgICAgICAgICA8PCBNUFVfUkFTUl9TSVpFX1BvcykgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPkVuYWJsZSAgICAgICAgICAgICA8PCBNUFVfUkFTUl9FTkFCTEVfUG9zKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBNUFUtPlJCQVIgPSAweDAwVTsKKyAgICBNUFUtPlJBU1IgPSAweDAwVTsKKyAgfQorfQorI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0NPUlRFWF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfY3JjLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9jcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmRmNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfY3JjLmMKQEAgLTAsMCArMSw1MTggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2NyYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDUkMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQ3ljbGljIFJlZHVuZGFuY3kgQ2hlY2sgKENSQykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAgICAoKykgRW5hYmxlIENSQyBBSEIgY2xvY2sgdXNpbmcgX19IQUxfUkNDX0NSQ19DTEtfRU5BQkxFKCk7CisgICAgICAgICAoKykgSW5pdGlhbGl6ZSBDUkMgY2FsY3VsYXRvcgorICAgICAgICAgICAgICgrKykgc3BlY2lmeSBnZW5lcmF0aW5nIHBvbHlub21pYWwgKHBlcmlwaGVyYWwgZGVmYXVsdCBvciBub24tZGVmYXVsdCBvbmUpCisgICAgICAgICAgICAgKCsrKSBzcGVjaWZ5IGluaXRpYWxpemF0aW9uIHZhbHVlIChwZXJpcGhlcmFsIGRlZmF1bHQgb3Igbm9uLWRlZmF1bHQgb25lKQorICAgICAgICAgICAgICgrKykgc3BlY2lmeSBpbnB1dCBkYXRhIGZvcm1hdAorICAgICAgICAgICAgICgrKykgc3BlY2lmeSBpbnB1dCBvciBvdXRwdXQgZGF0YSBpbnZlcnNpb24gbW9kZSBpZiBhbnkKKyAgICAgICAgICgrKSBVc2UgSEFMX0NSQ19BY2N1bXVsYXRlKCkgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgQ1JDIHZhbHVlIG9mIHRoZQorICAgICAgICAgICAgIGlucHV0IGRhdGEgYnVmZmVyIHN0YXJ0aW5nIHdpdGggdGhlIHByZXZpb3VzbHkgY29tcHV0ZWQgQ1JDIGFzCisgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gdmFsdWUKKyAgICAgICAgICgrKSBVc2UgSEFMX0NSQ19DYWxjdWxhdGUoKSBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBDUkMgdmFsdWUgb2YgdGhlCisgICAgICAgICAgICAgaW5wdXQgZGF0YSBidWZmZXIgc3RhcnRpbmcgd2l0aCB0aGUgZGVmaW5lZCBpbml0aWFsaXphdGlvbiB2YWx1ZQorICAgICAgICAgICAgIChkZWZhdWx0IG9yIG5vbi1kZWZhdWx0KSB0byBpbml0aWF0ZSBDUkMgY2FsY3VsYXRpb24KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkMgQ1JDCisgICogQGJyaWVmIENSQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0NSQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX1ByaXZhdGVfRnVuY3Rpb25zIENSQyBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworc3RhdGljIHVpbnQzMl90IENSQ19IYW5kbGVfOChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDhfdCBwQnVmZmVyW10sIHVpbnQzMl90IEJ1ZmZlckxlbmd0aCk7CitzdGF0aWMgdWludDMyX3QgQ1JDX0hhbmRsZV8xNihDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDE2X3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zIENSQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBDUkMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgICAgICAgIGluIHRoZSBDUkNfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUKKyAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIENSQyBwZXJpcGhlcmFsCisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JDIE1TUCAoTUNVIFNwZWNpZmljIFBhY2thZ2UpCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUkMgTVNQCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQ1JDIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUkNfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNfSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYykKK3sKKyAgLyogQ2hlY2sgdGhlIENSQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGNyYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfQUxMX0lOU1RBTkNFKGhjcmMtPkluc3RhbmNlKSk7CisKKyAgaWYgKGhjcmMtPlN0YXRlID09IEhBTF9DUkNfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaGNyYy0+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+RFI7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfY3JjX2V4LmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9jcmNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjljMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfY3JjX2V4LmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2NyY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBDUkMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGV4dGVuZGVkCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBDUkMgcGVyaXBoZXJhbC4KKyAgKgorICBAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgICgrKSBTZXQgdXNlci1kZWZpbmVkIGdlbmVyYXRpbmcgcG9seW5vbWlhbCB0aHJ1IEhBTF9DUkNFeF9Qb2x5bm9taWFsX1NldCgpCisgICAgICAgICAoKykgQ29uZmlndXJlIElucHV0IG9yIE91dHB1dCBkYXRhIGludmVyc2lvbgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSQ0V4IENSQ0V4CisgICogQGJyaWVmIENSQyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDUkNFeF9FeHBvcnRlZF9GdW5jdGlvbnMgQ1JDIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgZ2VuZXJhdGluZyBwb2x5bm9taWFsCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBpbnB1dCBkYXRhIGludmVyc2lvbgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgb3V0cHV0IGRhdGEgaW52ZXJzaW9uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDUkMgcG9seW5vbWlhbCBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0IG9uZS4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgUG9sIENSQyBnZW5lcmF0aW5nIHBvbHlub21pYWwgKDcsIDgsIDE2IG9yIDMyLWJpdCBsb25nKS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHdyaXR0ZW4gaW4gbm9ybWFsIHJlcHJlc2VudGF0aW9uLCBlLmcuCisgICogICAgICAgICBAYXJnIGZvciBhIHBvbHlub21pYWwgb2YgZGVncmVlIDcsIFheNyArIFheNiArIFheNSArIFheMiArIDEgaXMgd3JpdHRlbiAweDY1CisgICogICAgICAgICBAYXJnIGZvciBhIHBvbHlub21pYWwgb2YgZGVncmVlIDE2LCBYXjE2ICsgWF4xMiArIFheNSArIDEgaXMgd3JpdHRlbiAweDEwMjEKKyAgKiBAcGFyYW0gIFBvbHlMZW5ndGggQ1JDIHBvbHlub21pYWwgbGVuZ3RoLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgQ1JDX1BPTFlMRU5HVEhfN0IgIDctYml0IGxvbmcgQ1JDIChnZW5lcmF0aW5nIHBvbHlub21pYWwgb2YgZGVncmVlIDcpCisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19QT0xZTEVOR1RIXzhCICA4LWJpdCBsb25nIENSQyAoZ2VuZXJhdGluZyBwb2x5bm9taWFsIG9mIGRlZ3JlZSA4KQorICAqICAgICAgICAgIEBhcmcgQHJlZiBDUkNfUE9MWUxFTkdUSF8xNkIgMTYtYml0IGxvbmcgQ1JDIChnZW5lcmF0aW5nIHBvbHlub21pYWwgb2YgZGVncmVlIDE2KQorICAqICAgICAgICAgIEBhcmcgQHJlZiBDUkNfUE9MWUxFTkdUSF8zMkIgMzItYml0IGxvbmcgQ1JDIChnZW5lcmF0aW5nIHBvbHlub21pYWwgb2YgZGVncmVlIDMyKQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ0V4X1BvbHlub21pYWxfU2V0KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBQb2wsIHVpbnQzMl90IFBvbHlMZW5ndGgpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgbXNiID0gMzFVOyAvKiBwb2x5bm9taWFsIGRlZ3JlZSBpcyAzMiBhdCBtb3N0LCBzbyBtc2IgaXMgaW5pdGlhbGl6ZWQgdG8gbWF4IHZhbHVlICovCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19QT0xfTEVOR1RIKFBvbHlMZW5ndGgpKTsKKworICAvKiBjaGVjayBwb2x5bm9taWFsIGRlZmluaXRpb24gdnMgcG9seW5vbWlhbCBzaXplOgorICAgKiBwb2x5bm9taWFsIGxlbmd0aCBtdXN0IGJlIGFsaWduZWQgd2l0aCBwb2x5bm9taWFsCisgICAqIGRlZmluaXRpb24uIEhBTF9FUlJPUiBpcyByZXBvcnRlZCBpZiBQb2wgZGVncmVlIGlzCisgICAqIGxhcmdlciB0aGFuIHRoYXQgaW5kaWNhdGVkIGJ5IFBvbHlMZW5ndGguCisgICAqIExvb2sgZm9yIE1TQiBwb3NpdGlvbjogbXNiIHdpbGwgY29udGFpbiB0aGUgZGVncmVlIG9mCisgICAqICB0aGUgc2Vjb25kIHRvIHRoZSBsYXJnZXN0IHBvbHlub21pYWwgbWVtYmVyLiBFLmcuLCBmb3IKKyAgICogIFheNyArIFheNiArIFheNSArIFheMiArIDEsIG1zYiA9IDYuICovCisgIHdoaWxlICgobXNiLS0gPiAwVSkgJiYgKChQb2wgJiAoKHVpbnQzMl90KSgweDFVKSA8PCAobXNiICYgMHgxRlUpKSkgPT0gMFUpKQorICB7CisgIH0KKworICBzd2l0Y2ggKFBvbHlMZW5ndGgpCisgIHsKKyAgICBjYXNlIENSQ19QT0xZTEVOR1RIXzdCOgorICAgICAgaWYgKG1zYiA+PSBIQUxfQ1JDX0xFTkdUSF83QikKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gICBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENSQ19QT0xZTEVOR1RIXzhCOgorICAgICAgaWYgKG1zYiA+PSBIQUxfQ1JDX0xFTkdUSF84QikKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gICBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENSQ19QT0xZTEVOR1RIXzE2QjoKKyAgICAgIGlmIChtc2IgPj0gSEFMX0NSQ19MRU5HVEhfMTZCKQorICAgICAgeworICAgICAgICBzdGF0dXMgPSAgIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDUkNfUE9MWUxFTkdUSF8zMkI6CisgICAgICAvKiBubyBwb2x5bm9taWFsIGRlZmluaXRpb24gdnMuIHBvbHlub21pYWwgbGVuZ3RoIGlzc3VlIHBvc3NpYmxlICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogc2V0IGdlbmVyYXRpbmcgcG9seW5vbWlhbCAqLworICAgIFdSSVRFX1JFRyhoY3JjLT5JbnN0YW5jZS0+UE9MLCBQb2wpOworCisgICAgLyogc2V0IGdlbmVyYXRpbmcgcG9seW5vbWlhbCBzaXplICovCisgICAgTU9ESUZZX1JFRyhoY3JjLT5JbnN0YW5jZS0+Q1IsIENSQ19DUl9QT0xZU0laRSwgUG9seUxlbmd0aCk7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUmV2ZXJzZSBJbnB1dCBkYXRhIG1vZGUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcGFyYW0gIElucHV0UmV2ZXJzZU1vZGUgSW5wdXQgRGF0YSBpbnZlcnNpb24gbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX05PTkUgICAgIG5vIGNoYW5nZSBpbiBiaXQgb3JkZXIgKGRlZmF1bHQgdmFsdWUpCisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0JZVEUgICAgIEJ5dGUtd2lzZSBiaXQgcmV2ZXJzYWwKKyAgKiAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fSEFMRldPUkQgSGFsZldvcmQtd2lzZSBiaXQgcmV2ZXJzYWwKKyAgKiAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fV09SRCAgICAgV29yZC13aXNlIGJpdCByZXZlcnNhbAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ0V4X0lucHV0X0RhdGFfUmV2ZXJzZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgSW5wdXRSZXZlcnNlTW9kZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19JTlBVVERBVEFfSU5WRVJTSU9OX01PREUoSW5wdXRSZXZlcnNlTW9kZSkpOworCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfQlVTWTsKKworICAvKiBzZXQgaW5wdXQgZGF0YSBpbnZlcnNpb24gbW9kZSAqLworICBNT0RJRllfUkVHKGhjcmMtPkluc3RhbmNlLT5DUiwgQ1JDX0NSX1JFVl9JTiwgSW5wdXRSZXZlcnNlTW9kZSk7CisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUmV2ZXJzZSBPdXRwdXQgZGF0YSBtb2RlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHBhcmFtICBPdXRwdXRSZXZlcnNlTW9kZSBPdXRwdXQgRGF0YSBpbnZlcnNpb24gbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFIG5vIENSQyBpbnZlcnNpb24gKGRlZmF1bHQgdmFsdWUpCisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUgIGJpdC1sZXZlbCBpbnZlcnNpb24gKGUuZy4gZm9yIGEgOC1iaXQgQ1JDOiAweEI1IGJlY29tZXMgMHhBRCkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlKENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBPdXRwdXRSZXZlcnNlTW9kZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9NT0RFKE91dHB1dFJldmVyc2VNb2RlKSk7CisKKyAgLyogQ2hhbmdlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9CVVNZOworCisgIC8qIHNldCBvdXRwdXQgZGF0YSBpbnZlcnNpb24gbW9kZSAqLworICBNT0RJRllfUkVHKGhjcmMtPkluc3RhbmNlLT5DUiwgQ1JDX0NSX1JFVl9PVVQsIE91dHB1dFJldmVyc2VNb2RlKTsKKworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisKKyNlbmRpZiAvKiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfY3J5cC5jIGIvU3JjL3N0bTMybDB4eF9oYWxfY3J5cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2M2ZiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9jcnlwLmMKQEAgLTAsMCArMSwyMTYxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9jcnlwLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENyeXB0b2dyYXBoeSAoQ1JZUCkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUHJvY2Vzc2luZyBmdW5jdGlvbnMgYnkgYWxnb3JpdGhtIHVzaW5nIHBvbGxpbmcgbW9kZQorICAqICAgICAgICAgICArIFByb2Nlc3NpbmcgZnVuY3Rpb25zIGJ5IGFsZ29yaXRobSB1c2luZyBpbnRlcnJ1cHQgbW9kZQorICAqICAgICAgICAgICArIFByb2Nlc3NpbmcgZnVuY3Rpb25zIGJ5IGFsZ29yaXRobSB1c2luZyBETUEgbW9kZQorICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogICAgICAgICAKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGUgQ1JZUCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKUluaXRpYWxpemUgdGhlIENSWVAgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9DUllQX01zcEluaXQoKToKKyAgICAgICAgICgjIykgRW5hYmxlIHRoZSBDUllQIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfQUVTX0NMS19FTkFCTEUoKQorICAgICAgICAgKCMjKSBJbiBjYXNlIG9mIHVzaW5nIGludGVycnVwdHMgKGUuZy4gSEFMX0NSWVBfQUVTRUNCX0VuY3J5cHRfSVQoKSkKKyAgICAgICAgICAgICAoKykgQ29uZmlndXJlIHRoZSBDUllQIGludGVycnVwdCBwcmlvcml0eSB1c2luZyBIQUxfTlZJQ19TZXRQcmlvcml0eSgpCisgICAgICAgICAgICAgKCspIEVuYWJsZSB0aGUgQ1JZUCBJUlEgaGFuZGxlciB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKQorICAgICAgICAgICAgICgrKSBJbiBDUllQIElSUSBoYW5kbGVyLCBjYWxsIEhBTF9DUllQX0lSUUhhbmRsZXIoKQorICAgICAgICAgKCMjKSBJbiBjYXNlIG9mIHVzaW5nIERNQSB0byBjb250cm9sIGRhdGEgdHJhbnNmZXIgKGUuZy4gSEFMX0NSWVBfQUVTRUNCX0VuY3J5cHRfRE1BKCkpCisgICAgICAgICAgICAgKCspIEVuYWJsZSB0aGUgRE1BMSBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgCisgICAgICAgICAgICAgICAgICgrKykgX19IQUxfUkNDX0RNQTFfQ0xLX0VOQUJMRSgpCisgICAgICAgICAgICAgKCspIENvbmZpZ3VyZSBhbmQgZW5hYmxlIHR3byBETUEgQ2hhbm5lbHMgb25lIGZvciBtYW5hZ2luZyBkYXRhIHRyYW5zZmVyIGZyb20KKyAgICAgICAgICAgICAgICAgbWVtb3J5IHRvIHBlcmlwaGVyYWwgKGlucHV0IGNoYW5uZWwpIGFuZCBhbm90aGVyIGNoYW5uZWwgZm9yIG1hbmFnaW5nIGRhdGEKKyAgICAgICAgICAgICAgICAgdHJhbnNmZXIgZnJvbSBwZXJpcGhlcmFsIHRvIG1lbW9yeSAob3V0cHV0IGNoYW5uZWwpCisgICAgICAgICAgICAgKCspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgQ1JZUCBETUEgaGFuZGxlCisgICAgICAgICAgICAgICAgIHVzaW5nICBfX0hBTF9MSU5LRE1BKCkKKyAgICAgICAgICAgICAoKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUKKyAgICAgICAgICAgICAgICAgaW50ZXJydXB0IG9uIHRoZSB0d28gRE1BIFN0cmVhbXMuIFRoZSBvdXRwdXQgc3RyZWFtIHNob3VsZCBoYXZlIGhpZ2hlcgorICAgICAgICAgICAgICAgICBwcmlvcml0eSB0aGFuIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICAgICAgICAgICgrKykgSEFMX05WSUNfU2V0UHJpb3JpdHkoKQorICAgICAgICAgICAgICAgICAoKyspIEhBTF9OVklDX0VuYWJsZUlSUSgpCisgICAgCisgICAgICAoIylJbml0aWFsaXplIHRoZSBDUllQIEhBTCB1c2luZyBIQUxfQ1JZUF9Jbml0KCkuIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBtYWlubHk6CisgICAgICAgICAoIyMpIFRoZSBkYXRhIHR5cGU6IDEtYml0LCA4LWJpdCwgMTYtYml0IGFuZCAzMi1iaXQKKyAgICAgICAgICgjIykgVGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBrZXkuCisgICAgICAgICAoIyMpIFRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKGNvdW50ZXIpLiBJdCBpcyBub3QgdXNlZCBFQ0IgbW9kZS4KKyAgICAKKyAgICAgICgjKVRocmVlIHByb2Nlc3NpbmcgKGVuY3J5cHRpb24vZGVjcnlwdGlvbikgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGU6CisgICAgICAgICAoIyMpIFBvbGxpbmcgbW9kZTogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBBUElzIGFyZSBibG9ja2luZyBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgaS5lLiB0aGV5IHByb2Nlc3MgdGhlIGRhdGEgYW5kIHdhaXQgdGlsbCB0aGUgcHJvY2Vzc2luZyBpcyBmaW5pc2hlZAorICAgICAgICAgICAgICBlLmcuIEhBTF9DUllQX0FFU0NCQ19FbmNyeXB0KCkKKyAgICAgICAgICgjIykgSW50ZXJydXB0IG1vZGU6IGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gQVBJcyBhcmUgbm90IGJsb2NraW5nIGZ1bmN0aW9ucworICAgICAgICAgICAgICBpLmUuIHRoZXkgcHJvY2VzcyB0aGUgZGF0YSB1bmRlciBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgZS5nLiBIQUxfQ1JZUF9BRVNDQkNfRW5jcnlwdF9JVCgpCisgICAgICAgICAoIyMpIERNQSBtb2RlOiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIEFQSXMgYXJlIG5vdCBibG9ja2luZyBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgaS5lLiB0aGUgZGF0YSB0cmFuc2ZlciBpcyBlbnN1cmVkIGJ5IERNQQorICAgICAgICAgICAgICBlLmcuIEhBTF9DUllQX0FFU0NCQ19FbmNyeXB0X0RNQSgpCisgICAgCisgICAgICAoIylXaGVuIHRoZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgYWZ0ZXIgSEFMX0NSWVBfSW5pdCgpCisgICAgICAgICB0aGUgQ1JZUCBwZXJpcGhlcmFsIGlzIGluaXRpYWxpemVkIGFuZCBwcm9jZXNzZXMgdGhlIGJ1ZmZlciBpbiBpbnB1dC4KKyAgICAgICAgIEF0IHNlY29uZCBjYWxsLCB0aGUgcHJvY2Vzc2luZyBmdW5jdGlvbiBwZXJmb3JtcyBhbiBhcHBlbmQgb2YgdGhlIGFscmVhZHkKKyAgICAgICAgIHByb2Nlc3NlZCBidWZmZXIuCisgICAgICAgICBXaGVuIGEgbmV3IGRhdGEgYmxvY2sgaXMgdG8gYmUgcHJvY2Vzc2VkLCBjYWxsIEhBTF9DUllQX0luaXQoKSB0aGVuIHRoZQorICAgICAgICAgcHJvY2Vzc2luZyBmdW5jdGlvbi4KKyAgICAgICAgIAorICAgICAgKCMpQ2FsbCBIQUxfQ1JZUF9EZUluaXQoKSB0byBkZWluaXRpYWxpemUgdGhlIENSWVAgcGVyaXBoZXJhbC4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8gCisKKyNpZiBkZWZpbmVkIChTVE0zMkwwMjF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDQxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYzeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworI2lmZGVmIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUAorICAqIEBicmllZiBDUllQIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGUgQ1JZUCBQcml2YXRlCisgICogQHsKKyAgKi8KKworI2RlZmluZSAgQ1JZUF9BTEdPX0NIQUlOX01BU0sgICAgICAgICAoQUVTX0NSX01PREUgfCBBRVNfQ1JfQ0hNT0QpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIENSWVBfUHJpdmF0ZQorICAqIEB7CisgICovCisKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiAgQ1JZUF9FbmNyeXB0RGVjcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgQ1JZUF9TZXRJbml0VmVjdG9yKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKkluaXRWZWN0b3IpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBDUllQX1NldEtleShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpLZXkpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmICBDUllQX1Byb2Nlc3NEYXRhKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QqIElucHV0LCB1aW50MTZfdCBJbGVuZ3RoLCB1aW50OF90KiBPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBDUllQX0RNQUluQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIENSWVBfRE1BT3V0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIENSWVBfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBDUllQX1NldERNQUNvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBpbnB1dGFkZHIsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IG91dHB1dGFkZHIpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLiAKKyAqCitAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIAorICAgICAgICAgIGluIHRoZSBDUllQX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZQorICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgQ1JZUCBwZXJpcGhlcmFsCisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCBNU1AKKyAgICAgICgrKSBEZUluaXRpYWxpemUgQ1JZUCBNU1AgCisgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUllQIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreyAKKyAgLyogQ2hlY2sgdGhlIENSWVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaGNyeXAgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRVNfQUxMX0lOU1RBTkNFKGhjcnlwLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9EQVRBVFlQRShoY3J5cC0+SW5pdC5EYXRhVHlwZSkpOworICAKKyAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhjcnlwLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX0NSWVBfTXNwSW5pdChoY3J5cCk7CisgIH0KKyAgCisgIC8qIENoZWNrIGlmIEFFUyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9FTikpCisgIHsKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOyAgCisKKyAgICAvKiBTZXQgdGhlIGRhdGEgdHlwZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsKKyAgICAKKyAgICAvKiBSZXNldCBDcnlwSW5Db3VudCBhbmQgQ3J5cE91dENvdW50ICovCisgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOworICAgIAorICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgIAorICAgIC8qIFNldCB0aGUgZGVmYXVsdCBDUllQIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gSEFMX0NSWVBfUEhBU0VfUkVBRFk7CisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVGhlIERhdGF0eXBlIHNlbGVjdGlvbiBtdXN0IGJlIGNoYW5nZWQgaWYgdGhlIEFFUyBpcyBkaXNhYmxlZC4gV3JpdGluZyB0aGVzZSBiaXRzIHdoaWxlIHRoZSBBRVMgaXMgKi8KKyAgICAvKiBlbmFibGVkIGlzIGZvcmJpZGRlbiB0byBhdm9pZCB1bnByZWRpY3RhYmxlIEFFUyBiZWhhdmlvci4qLworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIENSWVAgcGVyaXBoZXJhbC4gCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihoY3J5cCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisgIAorICAvKiBTZXQgdGhlIGRlZmF1bHQgQ1JZUCBwaGFzZSAqLworICBoY3J5cC0+UGhhc2UgPSBIQUxfQ1JZUF9QSEFTRV9SRUFEWTsKKyAgCisgIC8qIFJlc2V0IENyeXBJbkNvdW50IGFuZCBDcnlwT3V0Q291bnQgKi8KKyAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CisgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKKyAgCisgIC8qIERpc2FibGUgdGhlIENSWVAgUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworICAKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDLiovCisgIEhBTF9DUllQX01zcERlSW5pdChoY3J5cCk7CisgIAorICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVTRVQ7CisgIAorICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBNU1AuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DUllQX01zcEluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNyeXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQ7IHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwgCisgICAgICAgICAgICB0aGUgSEFMX0NSWVBfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZSAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgQ1JZUCBNU1AuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DUllQX01zcERlSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY3J5cCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLCAKKyAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9Nc3BEZUluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLiAKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBFbmNyeXB0IHBsYWludGV4dCB1c2luZyBBRVMgYWxnb3JpdGhtIGluIGRpZmZlcmVudCBjaGFpbmluZyBtb2RlcworICAgICAgKCspIERlY3J5cHQgY3lwaGVydGV4dCB1c2luZyBBRVMgYWxnb3JpdGhtIGluIGRpZmZlcmVudCBjaGFpbmluZyBtb2RlcworICAgIFsuLl0gIFRocmVlIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGU6CisgICAgICAoKykgUG9sbGluZyBtb2RlCisgICAgICAoKykgSW50ZXJydXB0IG1vZGUKKyAgICAgICgrKSBETUEgbW9kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUllQIHBlcmlwaGVyYWwgaW4gQUVTIEVDQiBlbmNyeXB0aW9uIG1vZGUKKyAgKiAgICAgICAgIHRoZW4gZW5jcnlwdCBwUGxhaW5EYXRhLiBUaGUgY3lwaGVyIGRhdGEgYXJlIGF2YWlsYWJsZSBpbiBwQ3lwaGVyRGF0YQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIgKGFsaWduZWQgb24gdTMyKQorICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KKyAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmeSBUaW1lb3V0IHZhbHVlIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTRUNCX0VuY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGNyeXApOworCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiBhbmQgU2l6ZSBtdWx0aXBsZSBvZiAxNiovCisgIGlmKCgoKHVpbnQzMl90KXBQbGFpbkRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKCh1aW50MzJfdClwQ3lwaGVyRGF0YSAmICh1aW50MzJfdCkweDAwMDAwMDAzVSkgIT0gMFUpIHx8ICgoU2l6ZSAmICh1aW50MTZfdCkweDAwMEZVKSAhPSAwVSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgaWYgSEFMX0NSWVBfSW5pdCBoYXMgYmVlbiBjYWxsZWQgKi8KKyAgaWYoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBSZXNldCB0aGUgQ0hNT0QgJiBNT0RFIGJpdHMgKi8KKyAgICAgIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0FMR09fQ0hBSU5fTUFTSyk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBFQ0IgbW9kZSAqLworICAgICAgX19IQUxfQ1JZUF9TRVRfTU9ERShoY3J5cCwgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfRUNCX0VOQ1JZUFQpOworICAgICAgCisgICAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBIQUxfQ1JZUF9QSEFTRV9QUk9DRVNTOworICAgIH0KKyAgICAKKyAgICAvKiBXcml0ZSBQbGFpbiBEYXRhIGFuZCBHZXQgQ3lwaGVyIERhdGEgKi8KKyAgICBpZihDUllQX1Byb2Nlc3NEYXRhKGhjcnlwLCBwUGxhaW5EYXRhLCBTaXplLCBwQ3lwaGVyRGF0YSwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCQorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgQ0JDIGVuY3J5cHRpb24gbW9kZQorICAqICAgICAgICAgdGhlbiBlbmNyeXB0IHBQbGFpbkRhdGEuIFRoZSBjeXBoZXIgZGF0YSBhcmUgYXZhaWxhYmxlIGluIHBDeXBoZXJEYXRhCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgorICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIgKGFsaWduZWQgb24gdTMyKQorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTQ0JDX0VuY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGNyeXApOworICAKKyAgLyogQ2hlY2sgdGhhdCBkYXRhIGFsaWduZWQgb24gdTMyICovCisgIGlmKCgoKHVpbnQzMl90KXBQbGFpbkRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKCh1aW50MzJfdClwQ3lwaGVyRGF0YSAmICh1aW50MzJfdCkweDAwMDAwMDAzVSkgIT0gMFUpIHx8ICgoU2l6ZSAmICh1aW50MTZfdCkweDAwMEZVKSAhPSAwVSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgaWYgSEFMX0NSWVBfSW5pdCBoYXMgYmVlbiBjYWxsZWQgKi8KKyAgaWYoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBSZXNldCB0aGUgQ0hNT0QgJiBNT0RFIGJpdHMgKi8KKyAgICAgIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0FMR09fQ0hBSU5fTUFTSyk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDQkMgbW9kZSAqLworICAgICAgX19IQUxfQ1JZUF9TRVRfTU9ERShoY3J5cCwgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfQ0JDX0VOQ1JZUFQpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciAqLworICAgICAgQ1JZUF9TZXRJbml0VmVjdG9yKGhjcnlwLCBoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgCisgICAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBIQUxfQ1JZUF9QSEFTRV9QUk9DRVNTOworICAgIH0KKyAgICAKKyAgICAvKiBXcml0ZSBQbGFpbiBEYXRhIGFuZCBHZXQgQ3lwaGVyIERhdGEgKi8KKyAgICBpZihDUllQX1Byb2Nlc3NEYXRhKGhjcnlwLCBwUGxhaW5EYXRhLCBTaXplLCBwQ3lwaGVyRGF0YSwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDVFIgZW5jcnlwdGlvbiBtb2RlCisgICogICAgICAgICB0aGVuIGVuY3J5cHQgcFBsYWluRGF0YS4gVGhlIGN5cGhlciBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcEN5cGhlckRhdGEKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZSAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDVFJfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDMyX3QgVGltZW91dCkKK3sgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhjcnlwKTsKKyAgCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiAqLworICBpZigoKCh1aW50MzJfdClwUGxhaW5EYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKCgodWludDMyX3QpcEN5cGhlckRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKFNpemUgJiAodWludDE2X3QpMHgwMDBGVSkgIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIGlmIEhBTF9DUllQX0luaXQgaGFzIGJlZW4gY2FsbGVkICovCisgIGlmKGhjcnlwLT5TdGF0ZSAhPSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisgICAgCisgICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgKi8KKyAgICBpZihoY3J5cC0+UGhhc2UgPT0gSEFMX0NSWVBfUEhBU0VfUkVBRFkpCisgICAgeworICAgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5wS2V5KTsKKyAgICAgIAorICAgICAgLyogUmVzZXQgdGhlIENITU9EICYgTU9ERSBiaXRzICovCisgICAgICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9BTEdPX0NIQUlOX01BU0spOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgQ1RSIG1vZGUgKi8KKyAgICAgIF9fSEFMX0NSWVBfU0VUX01PREUoaGNyeXAsIENSWVBfQ1JfQUxHT01PREVfQUVTX0NUUl9FTkNSWVBUKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgKi8KKyAgICAgIENSWVBfU2V0SW5pdFZlY3RvcihoY3J5cCwgaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgICAgaGNyeXAtPlBoYXNlID0gSEFMX0NSWVBfUEhBU0VfUFJPQ0VTUzsKKyAgICB9CisgICAgCisgICAgLyogV3JpdGUgUGxhaW4gRGF0YSBhbmQgR2V0IEN5cGhlciBEYXRhICovCisgICAgaWYoQ1JZUF9Qcm9jZXNzRGF0YShoY3J5cCwgcFBsYWluRGF0YSwgU2l6ZSwgcEN5cGhlckRhdGEsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICAgIAorICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgIAorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIAorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlbGVhc2UgTG9jayAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgIAorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgRUNCIGRlY3J5cHRpb24gbW9kZQorICAqICAgICAgICAgdGhlbiBkZWNyeXB0ZWQgcEN5cGhlckRhdGEuIFRoZSBjeXBoZXIgZGF0YSBhcmUgYXZhaWxhYmxlIGluIHBQbGFpbkRhdGEKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIgKGFsaWduZWQgb24gdTMyKQorICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KKyAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZSAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNFQ0JfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoY3J5cCk7CisgIAorICAvKiBDaGVjayB0aGF0IGRhdGEgYWxpZ25lZCBvbiB1MzIgKi8KKyAgaWYoKCgodWludDMyX3QpcFBsYWluRGF0YSAmICh1aW50MzJfdCkweDAwMDAwMDAzVSkgIT0gMFUpIHx8ICgoKHVpbnQzMl90KXBDeXBoZXJEYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKChTaXplICYgKHVpbnQxNl90KTB4MDAwRlUpICE9IDBVKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayBpZiBIQUxfQ1JZUF9Jbml0IGhhcyBiZWVuIGNhbGxlZCAqLworICBpZihoY3J5cC0+U3RhdGUgIT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworICAgIAorICAgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICovCisgICAgaWYoaGNyeXAtPlBoYXNlID09IEhBTF9DUllQX1BIQVNFX1JFQURZKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQucEtleSk7CisgICAgICAKKyAgICAgIC8qIFJlc2V0IHRoZSBDSE1PRCAmIE1PREUgYml0cyAqLworICAgICAgQ0xFQVJfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQUxHT19DSEFJTl9NQVNLKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBDUllQIHBlcmlwaGVyYWwgaW4gQUVTIEVDQiBkZWNyeXB0aW9uIG1vZGUgKHdpdGgga2V5IGRlcml2YXRpb24pICovCisgICAgICBfX0hBTF9DUllQX1NFVF9NT0RFKGhjcnlwLCBDUllQX0NSX0FMR09NT0RFX0FFU19FQ0JfS0VZREVSREVDUllQVCk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBDUllQICovCisgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IEhBTF9DUllQX1BIQVNFX1BST0NFU1M7CisgICAgfQorICAgIAorICAgIC8qIFdyaXRlIEN5cGhlciBEYXRhIGFuZCBHZXQgUGxhaW4gRGF0YSAqLworICAgIGlmKENSWVBfUHJvY2Vzc0RhdGEoaGNyeXAsIHBDeXBoZXJEYXRhLCBTaXplLCBwUGxhaW5EYXRhLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgICAKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgICAKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUllQIHBlcmlwaGVyYWwgaW4gQUVTIEVDQiBkZWNyeXB0aW9uIG1vZGUKKyAgKiAgICAgICAgIHRoZW4gZGVjcnlwdGVkIHBDeXBoZXJEYXRhLiBUaGUgY3lwaGVyIGRhdGEgYXJlIGF2YWlsYWJsZSBpbiBwUGxhaW5EYXRhCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIgKGFsaWduZWQgb24gdTMyKQorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTQ0JDX0RlY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGNyeXApOworICAKKyAgLyogQ2hlY2sgdGhhdCBkYXRhIGFsaWduZWQgb24gdTMyICovCisgIGlmKCgoKHVpbnQzMl90KXBQbGFpbkRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKCh1aW50MzJfdClwQ3lwaGVyRGF0YSAmICh1aW50MzJfdCkweDAwMDAwMDAzVSkgIT0gMFUpIHx8ICgoU2l6ZSAmICh1aW50MTZfdCkweDAwMEZVKSAhPSAwVSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgaWYgSEFMX0NSWVBfSW5pdCBoYXMgYmVlbiBjYWxsZWQgKi8KKyAgaWYoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBSZXNldCB0aGUgQ0hNT0QgJiBNT0RFIGJpdHMgKi8KKyAgICAgIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0FMR09fQ0hBSU5fTUFTSyk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDQkMgZGVjcnlwdGlvbiBtb2RlICh3aXRoIGtleSBkZXJpdmF0aW9uKSAqLworICAgICAgX19IQUxfQ1JZUF9TRVRfTU9ERShoY3J5cCwgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfQ0JDX0tFWURFUkRFQ1JZUFQpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciAqLworICAgICAgQ1JZUF9TZXRJbml0VmVjdG9yKGhjcnlwLCBoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgCisgICAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBIQUxfQ1JZUF9QSEFTRV9QUk9DRVNTOworICAgIH0KKyAgICAKKyAgICAvKiBXcml0ZSBDeXBoZXIgRGF0YSBhbmQgR2V0IFBsYWluIERhdGEgKi8KKyAgICBpZihDUllQX1Byb2Nlc3NEYXRhKGhjcnlwLCBwQ3lwaGVyRGF0YSwgU2l6ZSwgcFBsYWluRGF0YSwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVsZWFzZSBMb2NrICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDVFIgZGVjcnlwdGlvbiBtb2RlCisgICogICAgICAgICB0aGVuIGRlY3J5cHRlZCBwQ3lwaGVyRGF0YS4gVGhlIGN5cGhlciBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcFBsYWluRGF0YQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgorICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmeSBUaW1lb3V0IHZhbHVlICAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDVFJfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDMyX3QgVGltZW91dCkKK3sgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhjcnlwKTsKKyAgCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiAqLworICBpZigoKCh1aW50MzJfdClwUGxhaW5EYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKCgodWludDMyX3QpcEN5cGhlckRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKFNpemUgJiAodWludDE2X3QpMHgwMDBGVSkgIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICovCisgIGlmICgoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKSAmJiAoaGNyeXAtPlBoYXNlID09IEhBTF9DUllQX1BIQVNFX1JFQURZKSkKKyAgeworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisgICAgCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQucEtleSk7CisgICAgCisgICAgLyogUmVzZXQgdGhlIENITU9EICYgTU9ERSBiaXRzICovCisgICAgQ0xFQVJfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQUxHT19DSEFJTl9NQVNLKTsKKyAgICAKKyAgICAvKiBTZXQgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgQ1RSIGRlY3J5cHRpb24gbW9kZSAqLworICAgIF9fSEFMX0NSWVBfU0VUX01PREUoaGNyeXAsIENSWVBfQ1JfQUxHT01PREVfQUVTX0NUUl9ERUNSWVBUKTsKKyAgICAKKyAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciAqLworICAgIENSWVBfU2V0SW5pdFZlY3RvcihoY3J5cCwgaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAKKyAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKyAgICAKKyAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gSEFMX0NSWVBfUEhBU0VfUFJPQ0VTUzsKKyAgfQorICAKKyAgLyogV3JpdGUgQ3lwaGVyIERhdGEgYW5kIEdldCBQbGFpbiBEYXRhICovCisgIGlmKENSWVBfUHJvY2Vzc0RhdGEoaGNyeXAsIHBDeXBoZXJEYXRhLCBTaXplLCBwUGxhaW5EYXRhLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKyAgCisgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBFQ0IgZW5jcnlwdGlvbiBtb2RlIHVzaW5nIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMKKyAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0FFU0VDQl9FbmNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBQbGFpbkRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhKQoreworICB1aW50MzJfdCBpbnB1dGFkZHIgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiAqLworICBpZigoKCh1aW50MzJfdClwUGxhaW5EYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKCgodWludDMyX3QpcEN5cGhlckRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKFNpemUgJiAodWludDE2X3QpMHgwMDBGVSkgIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIGlmICgoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKSAmJiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisgICAgCisgICAgLyogR2V0IHRoZSBidWZmZXIgYWRkcmVzc2VzIGFuZCBzaXplcyAqLworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IFNpemU7CisgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gcFBsYWluRGF0YTsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gcEN5cGhlckRhdGE7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IFNpemU7CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBSZXNldCB0aGUgQ0hNT0QgJiBNT0RFIGJpdHMgKi8KKyAgICAgIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0FMR09fQ0hBSU5fTUFTSyk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBFQ0IgbW9kZSAqLworICAgICAgX19IQUxfQ1JZUF9TRVRfTU9ERShoY3J5cCwgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfRUNCX0VOQ1JZUFQpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBIQUxfQ1JZUF9QSEFTRV9QUk9DRVNTOworICAgIH0KKyAgICAKKyAgICAvKiBFbmFibGUgSW50ZXJydXB0cyAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDKTsKKyAgICAKKyAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKyAgICAKKyAgICAvKiBHZXQgdGhlIGxhc3QgaW5wdXQgZGF0YSBhZHJlc3MgKi8KKyAgICBpbnB1dGFkZHIgPSAodWludDMyX3QpaGNyeXAtPnBDcnlwSW5CdWZmUHRyOworICAgIAorICAgIC8qIFdyaXRlIHRoZSBJbnB1dCBibG9jayBpbiB0aGUgRGF0YSBJbnB1dCByZWdpc3RlciAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOworICAgIGlucHV0YWRkcis9NFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKz0gMTZVOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCAtPSAxNlU7CisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVsZWFzZSBMb2NrICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDQkMgZW5jcnlwdGlvbiBtb2RlIHVzaW5nIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMKKyAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0FFU0NCQ19FbmNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBQbGFpbkRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhKQoreworICB1aW50MzJfdCBpbnB1dGFkZHIgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiAqLworICBpZigoKCh1aW50MzJfdClwUGxhaW5EYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKCgodWludDMyX3QpcEN5cGhlckRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKFNpemUgJiAodWludDE2X3QpMHgwMDBGVSkgIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIGlmICgoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKSAmJiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisgICAgCisgICAgLyogR2V0IHRoZSBidWZmZXIgYWRkcmVzc2VzIGFuZCBzaXplcyAqLworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IFNpemU7CisgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gcFBsYWluRGF0YTsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gcEN5cGhlckRhdGE7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IFNpemU7CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBSZXNldCB0aGUgQ0hNT0QgJiBNT0RFIGJpdHMgKi8KKyAgICAgIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0FMR09fQ0hBSU5fTUFTSyk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDQkMgbW9kZSAqLworICAgICAgX19IQUxfQ1JZUF9TRVRfTU9ERShoY3J5cCwgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfQ0JDX0VOQ1JZUFQpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciAqLworICAgICAgQ1JZUF9TZXRJbml0VmVjdG9yKGhjcnlwLCBoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBIQUxfQ1JZUF9QSEFTRV9QUk9DRVNTOworICAgIH0KKyAgICAKKyAgICAvKiBFbmFibGUgSW50ZXJydXB0cyAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDKTsKKyAgICAKKyAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKyAgICAKKyAgICAvKiBHZXQgdGhlIGxhc3QgaW5wdXQgZGF0YSBhZHJlc3MgKi8KKyAgICBpbnB1dGFkZHIgPSAodWludDMyX3QpaGNyeXAtPnBDcnlwSW5CdWZmUHRyOworICAgIAorICAgIC8qIFdyaXRlIHRoZSBJbnB1dCBibG9jayBpbiB0aGUgRGF0YSBJbnB1dCByZWdpc3RlciAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOworICAgIGlucHV0YWRkcis9NFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKz0gMTZVOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCAtPSAxNlU7CisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVsZWFzZSBMb2NrICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgIAorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgQ1RSIGVuY3J5cHRpb24gbW9kZSB1c2luZyBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzCisgICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDVFJfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSkKK3sKKyAgdWludDMyX3QgaW5wdXRhZGRyID0gMFU7CisgIAorICAvKiBDaGVjayB0aGF0IGRhdGEgYWxpZ25lZCBvbiB1MzIgKi8KKyAgaWYoKCgodWludDMyX3QpcFBsYWluRGF0YSAmICh1aW50MzJfdCkweDAwMDAwMDAzVSkgIT0gMFUpIHx8ICgoKHVpbnQzMl90KXBDeXBoZXJEYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKChTaXplICYgKHVpbnQxNl90KTB4MDAwRlUpICE9IDBVKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICBpZiAoKGhjcnlwLT5TdGF0ZSAhPSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkgJiYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGNyeXApOworICAgIAorICAgIC8qIEdldCB0aGUgYnVmZmVyIGFkZHJlc3NlcyBhbmQgc2l6ZXMgKi8KKyAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSBTaXplOworICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IHBQbGFpbkRhdGE7CisgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IHBDeXBoZXJEYXRhOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSBTaXplOworICAgIAorICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisgICAgCisgICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgKi8KKyAgICBpZihoY3J5cC0+UGhhc2UgPT0gSEFMX0NSWVBfUEhBU0VfUkVBRFkpCisgICAgeworICAgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5wS2V5KTsKKyAgICAgIAorICAgICAgLyogUmVzZXQgdGhlIENITU9EICYgTU9ERSBiaXRzICovCisgICAgICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9BTEdPX0NIQUlOX01BU0spOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgQ1RSIG1vZGUgKi8KKyAgICAgIF9fSEFMX0NSWVBfU0VUX01PREUoaGNyeXAsIENSWVBfQ1JfQUxHT01PREVfQUVTX0NUUl9FTkNSWVBUKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgKi8KKyAgICAgIENSWVBfU2V0SW5pdFZlY3RvcihoY3J5cCwgaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgICAgaGNyeXAtPlBoYXNlID0gSEFMX0NSWVBfUEhBU0VfUFJPQ0VTUzsKKyAgICB9CisgICAgCisgICAgLyogRW5hYmxlIEludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQyk7CisgICAgCisgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisgICAgCisgICAgLyogR2V0IHRoZSBsYXN0IGlucHV0IGRhdGEgYWRyZXNzICovCisgICAgaW5wdXRhZGRyID0gKHVpbnQzMl90KWhjcnlwLT5wQ3J5cEluQnVmZlB0cjsKKyAgICAKKyAgICAvKiBXcml0ZSB0aGUgSW5wdXQgYmxvY2sgaW4gdGhlIERhdGEgSW5wdXQgcmVnaXN0ZXIgKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBpbnB1dGFkZHIrPTRVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOworICAgIGlucHV0YWRkcis9NFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOworICAgIGlucHV0YWRkcis9NFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyICs9IDE2VTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQgLT0gMTZVOworICAgIAorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlbGVhc2UgTG9jayAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgIAorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgRUNCIGRlY3J5cHRpb24gbW9kZSB1c2luZyBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIgKGFsaWduZWQgb24gdTMyKQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTRUNCX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEpCit7CisgIHVpbnQzMl90IGlucHV0YWRkciA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhhdCBkYXRhIGFsaWduZWQgb24gdTMyICovCisgIGlmKCgoKHVpbnQzMl90KXBQbGFpbkRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKCh1aW50MzJfdClwQ3lwaGVyRGF0YSAmICh1aW50MzJfdCkweDAwMDAwMDAzVSkgIT0gMFUpIHx8ICgoU2l6ZSAmICh1aW50MTZfdCkweDAwMEZVKSAhPSAwVSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgaWYgKChoY3J5cC0+U3RhdGUgIT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpICYmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKyAgICAKKyAgICAvKiBHZXQgdGhlIGJ1ZmZlciBhZGRyZXNzZXMgYW5kIHNpemVzICovCisgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gU2l6ZTsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBwQ3lwaGVyRGF0YTsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gcFBsYWluRGF0YTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gU2l6ZTsKKyAgICAKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworICAgIAorICAgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICovCisgICAgaWYoaGNyeXAtPlBoYXNlID09IEhBTF9DUllQX1BIQVNFX1JFQURZKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQucEtleSk7CisgICAgICAKKyAgICAgIC8qIFJlc2V0IHRoZSBDSE1PRCAmIE1PREUgYml0cyAqLworICAgICAgQ0xFQVJfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQUxHT19DSEFJTl9NQVNLKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBDUllQIHBlcmlwaGVyYWwgaW4gQUVTIEVDQiBkZWNyeXB0aW9uIG1vZGUgKHdpdGgga2V5IGRlcml2YXRpb24pICovCisgICAgICBfX0hBTF9DUllQX1NFVF9NT0RFKGhjcnlwLCBDUllQX0NSX0FMR09NT0RFX0FFU19FQ0JfS0VZREVSREVDUllQVCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IEhBTF9DUllQX1BIQVNFX1BST0NFU1M7CisgICAgfQorICAgIAorICAgIC8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0MpOworICAgIAorICAgIC8qIEVuYWJsZSBDUllQICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworICAgIAorICAgIC8qIEdldCB0aGUgbGFzdCBpbnB1dCBkYXRhIGFkcmVzcyAqLworICAgIGlucHV0YWRkciA9ICh1aW50MzJfdCloY3J5cC0+cENyeXBJbkJ1ZmZQdHI7CisgICAgCisgICAgLyogV3JpdGUgdGhlIElucHV0IGJsb2NrIGluIHRoZSBEYXRhIElucHV0IHJlZ2lzdGVyICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBpbnB1dGFkZHIrPTRVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBpbnB1dGFkZHIrPTRVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOworICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArPSAxNlU7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50IC09IDE2VTsgICAgCisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVsZWFzZSBMb2NrICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDQkMgZGVjcnlwdGlvbiBtb2RlIHVzaW5nIElULgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2CisgICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIgKGFsaWduZWQgb24gdTMyKQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTQ0JDX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEpCit7CisgIHVpbnQzMl90IGlucHV0YWRkciA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhhdCBkYXRhIGFsaWduZWQgb24gdTMyICovCisgIGlmKCgoKHVpbnQzMl90KXBQbGFpbkRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKCh1aW50MzJfdClwQ3lwaGVyRGF0YSAmICh1aW50MzJfdCkweDAwMDAwMDAzVSkgIT0gMFUpIHx8ICgoU2l6ZSAmICh1aW50MTZfdCkweDAwMEZVKSAhPSAwVSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgaWYgKChoY3J5cC0+U3RhdGUgIT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpICYmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKyAgICAKKyAgICAvKiBHZXQgdGhlIGJ1ZmZlciBhZGRyZXNzZXMgYW5kIHNpemVzICovCisgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gU2l6ZTsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBwQ3lwaGVyRGF0YTsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gcFBsYWluRGF0YTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gU2l6ZTsKKyAgICAKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworICAgIAorICAgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICovCisgICAgaWYoaGNyeXAtPlBoYXNlID09IEhBTF9DUllQX1BIQVNFX1JFQURZKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQucEtleSk7CisgICAgICAKKyAgICAgIC8qIFJlc2V0IHRoZSBDSE1PRCAmIE1PREUgYml0cyAqLworICAgICAgQ0xFQVJfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQUxHT19DSEFJTl9NQVNLKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBDUllQIHBlcmlwaGVyYWwgaW4gQUVTIENCQyBkZWNyeXB0aW9uIG1vZGUgKHdpdGgga2V5IGRlcml2YXRpb24pICovCisgICAgICBfX0hBTF9DUllQX1NFVF9NT0RFKGhjcnlwLCBDUllQX0NSX0FMR09NT0RFX0FFU19DQkNfS0VZREVSREVDUllQVCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yICovCisgICAgICBDUllQX1NldEluaXRWZWN0b3IoaGNyeXAsIGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IEhBTF9DUllQX1BIQVNFX1BST0NFU1M7CisgICAgfQorICAgIAorICAgIC8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0MpOworICAgIAorICAgIC8qIEVuYWJsZSBDUllQICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworICAgIAorICAgIC8qIEdldCB0aGUgbGFzdCBpbnB1dCBkYXRhIGFkcmVzcyAqLworICAgIGlucHV0YWRkciA9ICh1aW50MzJfdCloY3J5cC0+cENyeXBJbkJ1ZmZQdHI7CisgICAgCisgICAgLyogV3JpdGUgdGhlIElucHV0IGJsb2NrIGluIHRoZSBEYXRhIElucHV0IHJlZ2lzdGVyICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBpbnB1dGFkZHIrPTRVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBpbnB1dGFkZHIrPTRVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOworICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArPSAxNlU7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50IC09IDE2VTsgICAgCisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVsZWFzZSBMb2NrICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDVFIgZGVjcnlwdGlvbiBtb2RlIHVzaW5nIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIgKGFsaWduZWQgb24gdTMyKQorICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNgorICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0FFU0NUUl9EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwUGxhaW5EYXRhKQoreworICB1aW50MzJfdCBpbnB1dGFkZHIgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiAqLworICBpZigoKCh1aW50MzJfdClwUGxhaW5EYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKCgodWludDMyX3QpcEN5cGhlckRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKFNpemUgJiAodWludDE2X3QpMHgwMDBGVSkgIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIGlmICgoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKSAmJiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisgICAgCisgICAgLyogR2V0IHRoZSBidWZmZXIgYWRkcmVzc2VzIGFuZCBzaXplcyAqLworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IFNpemU7CisgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gcEN5cGhlckRhdGE7CisgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IHBQbGFpbkRhdGE7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IFNpemU7CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBSZXNldCB0aGUgQ0hNT0QgJiBNT0RFIGJpdHMgKi8KKyAgICAgIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0FMR09fQ0hBSU5fTUFTSyk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDVFIgZGVjcnlwdGlvbiBtb2RlICovCisgICAgICBfX0hBTF9DUllQX1NFVF9NT0RFKGhjcnlwLCBDUllQX0NSX0FMR09NT0RFX0FFU19DVFJfREVDUllQVCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yICovCisgICAgICBDUllQX1NldEluaXRWZWN0b3IoaGNyeXAsIGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IEhBTF9DUllQX1BIQVNFX1BST0NFU1M7CisgICAgfQorICAgIAorICAgIC8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0MpOworICAgIAorICAgIC8qIEVuYWJsZSBDUllQICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworICAgIAorICAgIC8qIEdldCB0aGUgbGFzdCBpbnB1dCBkYXRhIGFkcmVzcyAqLworICAgIGlucHV0YWRkciA9ICh1aW50MzJfdCloY3J5cC0+cENyeXBJbkJ1ZmZQdHI7CisgICAgCisgICAgLyogV3JpdGUgdGhlIElucHV0IGJsb2NrIGluIHRoZSBEYXRhIElucHV0IHJlZ2lzdGVyICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBpbnB1dGFkZHIrPTRVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBpbnB1dGFkZHIrPTRVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOworICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArPSAxNlU7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50IC09IDE2VTsgICAgCisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVsZWFzZSBMb2NrICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBFQ0IgZW5jcnlwdGlvbiBtb2RlIHVzaW5nIERNQS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMKKyAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0FFU0VDQl9FbmNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSkKK3sKKyAgdWludDMyX3QgaW5wdXRhZGRyID0gMFUsIG91dHB1dGFkZHIgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiAqLworICBpZigoKCh1aW50MzJfdClwUGxhaW5EYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKCgodWludDMyX3QpcEN5cGhlckRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKFNpemUgJiAodWludDE2X3QpMHgwMDBGVSkgIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIGlmIEhBTF9DUllQX0luaXQgaGFzIGJlZW4gY2FsbGVkICovCisgIGlmICgoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKSAmJiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisgICAgCisgICAgaW5wdXRhZGRyICA9ICh1aW50MzJfdClwUGxhaW5EYXRhOworICAgIG91dHB1dGFkZHIgPSAodWludDMyX3QpcEN5cGhlckRhdGE7CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgRUNCIG1vZGUgKi8KKyAgICAgIF9fSEFMX0NSWVBfU0VUX01PREUoaGNyeXAsIENSWVBfQ1JfQUxHT01PREVfQUVTX0VDQl9FTkNSWVBUKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgICAgaGNyeXAtPlBoYXNlID0gSEFMX0NSWVBfUEhBU0VfUFJPQ0VTUzsKKyAgICB9CisgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyICovIAorICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCBpbnB1dGFkZHIsIFNpemUsIG91dHB1dGFkZHIpOworICAgIAorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIAorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeyAgCisgICAgLyogUmVsZWFzZSBMb2NrICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgCisgICAgcmV0dXJuIEhBTF9FUlJPUjsgICAKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUllQIHBlcmlwaGVyYWwgaW4gQUVTIENCQyBlbmNyeXB0aW9uIG1vZGUgdXNpbmcgRE1BLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIgKGFsaWduZWQgb24gdTMyKQorICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KKyAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0FFU0NCQ19FbmNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSkKK3sKKyAgdWludDMyX3QgaW5wdXRhZGRyID0gMFUsIG91dHB1dGFkZHIgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiAqLworICBpZigoKCh1aW50MzJfdClwUGxhaW5EYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKCgodWludDMyX3QpcEN5cGhlckRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKFNpemUgJiAodWludDE2X3QpMHgwMDBGVSkgIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIGlmIEhBTF9DUllQX0luaXQgaGFzIGJlZW4gY2FsbGVkICovCisgIGlmICgoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKSAmJiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisgICAgCisgICAgaW5wdXRhZGRyICA9ICh1aW50MzJfdClwUGxhaW5EYXRhOworICAgIG91dHB1dGFkZHIgPSAodWludDMyX3QpcEN5cGhlckRhdGE7CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgQ0JDIG1vZGUgKi8KKyAgICAgIF9fSEFMX0NSWVBfU0VUX01PREUoaGNyeXAsIENSWVBfQ1JfQUxHT01PREVfQUVTX0NCQ19FTkNSWVBUKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgKi8KKyAgICAgIENSWVBfU2V0SW5pdFZlY3RvcihoY3J5cCwgaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgICAgaGNyeXAtPlBoYXNlID0gSEFMX0NSWVBfUEhBU0VfUFJPQ0VTUzsKKyAgICB9CisgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyICovIAorICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCBpbnB1dGFkZHIsIFNpemUsIG91dHB1dGFkZHIpOworICAgIAorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIAorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlbGVhc2UgTG9jayAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgIAorICAgIHJldHVybiBIQUxfRVJST1I7ICAgCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBDVFIgZW5jcnlwdGlvbiBtb2RlIHVzaW5nIERNQS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDVFJfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcEN5cGhlckRhdGEpCit7CisgIHVpbnQzMl90IGlucHV0YWRkciA9IDBVLCBvdXRwdXRhZGRyID0gMFU7CisgIAorICAvKiBDaGVjayB0aGF0IGRhdGEgYWxpZ25lZCBvbiB1MzIgKi8KKyAgaWYoKCgodWludDMyX3QpcFBsYWluRGF0YSAmICh1aW50MzJfdCkweDAwMDAwMDAzVSkgIT0gMFUpIHx8ICgoKHVpbnQzMl90KXBDeXBoZXJEYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKChTaXplICYgKHVpbnQxNl90KTB4MDAwRlUpICE9IDBVKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayBpZiBIQUxfQ1JZUF9Jbml0IGhhcyBiZWVuIGNhbGxlZCAqLworICBpZiAoKGhjcnlwLT5TdGF0ZSAhPSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkgJiYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGNyeXApOworICAgIAorICAgIGlucHV0YWRkciAgPSAodWludDMyX3QpcFBsYWluRGF0YTsKKyAgICBvdXRwdXRhZGRyID0gKHVpbnQzMl90KXBDeXBoZXJEYXRhOworICAgIAorICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisgICAgCisgICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgKi8KKyAgICBpZihoY3J5cC0+UGhhc2UgPT0gSEFMX0NSWVBfUEhBU0VfUkVBRFkpCisgICAgeworICAgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5wS2V5KTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBDUllQIHBlcmlwaGVyYWwgaW4gQUVTIENUUiBtb2RlICovCisgICAgICBfX0hBTF9DUllQX1NFVF9NT0RFKGhjcnlwLCBDUllQX0NSX0FMR09NT0RFX0FFU19DVFJfRU5DUllQVCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yICovCisgICAgICBDUllQX1NldEluaXRWZWN0b3IoaGNyeXAsIGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IEhBTF9DUllQX1BIQVNFX1BST0NFU1M7CisgICAgfQorICAgIAorICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciAqLyAKKyAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgaW5wdXRhZGRyLCBTaXplLCBvdXRwdXRhZGRyKTsKKyAgICAKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAKKyAgICByZXR1cm4gSEFMX0VSUk9SOyAgIAorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgRUNCIGRlY3J5cHRpb24gbW9kZSB1c2luZyBETUEuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMKKyAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNFQ0JfRGVjcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEpCit7ICAKKyAgdWludDMyX3QgaW5wdXRhZGRyID0gMFUsIG91dHB1dGFkZHIgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiAqLworICBpZigoKCh1aW50MzJfdClwUGxhaW5EYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKCgodWludDMyX3QpcEN5cGhlckRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKFNpemUgJiAodWludDE2X3QpMHgwMDBGVSkgIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIGlmIEhBTF9DUllQX0luaXQgaGFzIGJlZW4gY2FsbGVkICovCisgIGlmICgoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKSAmJiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisgICAgCisgICAgaW5wdXRhZGRyICA9ICh1aW50MzJfdClwQ3lwaGVyRGF0YTsKKyAgICBvdXRwdXRhZGRyID0gKHVpbnQzMl90KXBQbGFpbkRhdGE7CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBSZXNldCB0aGUgQ0hNT0QgJiBNT0RFIGJpdHMgKi8KKyAgICAgIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0FMR09fQ0hBSU5fTUFTSyk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgQ1JZUCBwZXJpcGhlcmFsIGluIEFFUyBFQ0IgZGVjcnlwdGlvbiBtb2RlICh3aXRoIGtleSBkZXJpdmF0aW9uKSAqLworICAgICAgX19IQUxfQ1JZUF9TRVRfTU9ERShoY3J5cCwgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfRUNCX0tFWURFUkRFQ1JZUFQpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBIQUxfQ1JZUF9QSEFTRV9QUk9DRVNTOworICAgIH0KKyAgICAKKyAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8gCisgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsIGlucHV0YWRkciwgU2l6ZSwgb3V0cHV0YWRkcik7CisgICAgCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVsZWFzZSBMb2NrICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgCisgICAgcmV0dXJuIEhBTF9FUlJPUjsgICAKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUllQIHBlcmlwaGVyYWwgaW4gQUVTIENCQyBlbmNyeXB0aW9uIG1vZGUgdXNpbmcgRE1BLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzCisgICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIgKGFsaWduZWQgb24gdTMyKQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTQ0JDX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwUGxhaW5EYXRhKQoreworICB1aW50MzJfdCBpbnB1dGFkZHIgPSAwVSwgb3V0cHV0YWRkciA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhhdCBkYXRhIGFsaWduZWQgb24gdTMyICovCisgIGlmKCgoKHVpbnQzMl90KXBQbGFpbkRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKCh1aW50MzJfdClwQ3lwaGVyRGF0YSAmICh1aW50MzJfdCkweDAwMDAwMDAzVSkgIT0gMFUpIHx8ICgoU2l6ZSAmICh1aW50MTZfdCkweDAwMEZVKSAhPSAwVSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgaWYgSEFMX0NSWVBfSW5pdCBoYXMgYmVlbiBjYWxsZWQgKi8KKyAgaWYgKChoY3J5cC0+U3RhdGUgIT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpICYmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKyAgICAKKyAgICBpbnB1dGFkZHIgID0gKHVpbnQzMl90KXBDeXBoZXJEYXRhOworICAgIG91dHB1dGFkZHIgPSAodWludDMyX3QpcFBsYWluRGF0YTsKKyAgICAKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworICAgIAorICAgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICovCisgICAgaWYoaGNyeXAtPlBoYXNlID09IEhBTF9DUllQX1BIQVNFX1JFQURZKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQucEtleSk7CisgICAgICAKKyAgICAgIC8qIFJlc2V0IHRoZSBDSE1PRCAmIE1PREUgYml0cyAqLworICAgICAgQ0xFQVJfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQUxHT19DSEFJTl9NQVNLKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBDUllQIHBlcmlwaGVyYWwgaW4gQUVTIENCQyBkZWNyeXB0aW9uIG1vZGUgKHdpdGgga2V5IGRlcml2YXRpb24pICovCisgICAgICBfX0hBTF9DUllQX1NFVF9NT0RFKGhjcnlwLCBDUllQX0NSX0FMR09NT0RFX0FFU19DQkNfS0VZREVSREVDUllQVCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yICovCisgICAgICBDUllQX1NldEluaXRWZWN0b3IoaGNyeXAsIGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IEhBTF9DUllQX1BIQVNFX1BST0NFU1M7CisgICAgfQorICAgIAorICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciAqLyAKKyAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgaW5wdXRhZGRyLCBTaXplLCBvdXRwdXRhZGRyKTsKKyAgICAKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAKKyAgICByZXR1cm4gSEFMX0VSUk9SOyAgIAorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgQ1RSIGRlY3J5cHRpb24gbW9kZSB1c2luZyBETUEuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyIChhbGlnbmVkIG9uIHUzMikKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYKKyAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlciAoYWxpZ25lZCBvbiB1MzIpCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDVFJfRGVjcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEpCit7ICAKKyAgdWludDMyX3QgaW5wdXRhZGRyID0gMFUsIG91dHB1dGFkZHIgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoYXQgZGF0YSBhbGlnbmVkIG9uIHUzMiAqLworICBpZigoKCh1aW50MzJfdClwUGxhaW5EYXRhICYgKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAhPSAwVSkgfHwgKCgodWludDMyX3QpcEN5cGhlckRhdGEgJiAodWludDMyX3QpMHgwMDAwMDAwM1UpICE9IDBVKSB8fCAoKFNpemUgJiAodWludDE2X3QpMHgwMDBGVSkgIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIGlmIEhBTF9DUllQX0luaXQgaGFzIGJlZW4gY2FsbGVkICovCisgIGlmICgoaGNyeXAtPlN0YXRlICE9IEhBTF9DUllQX1NUQVRFX1JFU0VUKSAmJiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisgICAgCisgICAgaW5wdXRhZGRyICA9ICh1aW50MzJfdClwQ3lwaGVyRGF0YTsKKyAgICBvdXRwdXRhZGRyID0gKHVpbnQzMl90KXBQbGFpbkRhdGE7CisgICAgCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBIQUxfQ1JZUF9QSEFTRV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGtleSAqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIENSWVAgcGVyaXBoZXJhbCBpbiBBRVMgQ1RSIG1vZGUgKi8KKyAgICAgIF9fSEFMX0NSWVBfU0VUX01PREUoaGNyeXAsIENSWVBfQ1JfQUxHT01PREVfQUVTX0NUUl9ERUNSWVBUKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgKi8KKyAgICAgIENSWVBfU2V0SW5pdFZlY3RvcihoY3J5cCwgaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgICAgaGNyeXAtPlBoYXNlID0gSEFMX0NSWVBfUEhBU0VfUFJPQ0VTUzsKKyAgICB9CisgICAgCisgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyICovIAorICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCBpbnB1dGFkZHIsIFNpemUsIG91dHB1dGFkZHIpOworICAgIAorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIAorICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlbGVhc2UgTG9jayAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgIAorICAgIHJldHVybiBIQUxfRVJST1I7ICAgCisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICogIEBicmllZiAgIERNQSBjYWxsYmFjayBmdW5jdGlvbnMuIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBETUEgY2FsbGJhY2sgZnVuY3Rpb25zICAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBETUEgY2FsbGJhY2sgZnVuY3Rpb25zOgorICAgICAgKCspIERNQSBJbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlCisgICAgICAoKykgRE1BIE91dHB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlCisgICAgICAoKykgRE1BIGVycm9yCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ1JZUCBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworIF9fd2VhayB2b2lkIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNyeXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQ7IHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwgCisgICAgICAgICAgICB0aGUgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgSW5wdXQgdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY3J5cCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLCAKKyAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgT3V0cHV0IHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjcnlwKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsIAorICAgICAgICAgICAgdGhlIEhBTF9DUllQX091dENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAqICBAYnJpZWYgICBDUllQIElSUSBoYW5kbGVyLgorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBDUllQIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKK1suLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBDUllQIElSUSBoYW5kbGVyIGZ1bmN0aW9uLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBDUllQIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9DUllQX0lSUUhhbmRsZXIoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogQ2hlY2sgaWYgZXJyb3Igb2NjdXJyZWQqLworICBpZiAoX19IQUxfQ1JZUF9HRVRfSVRfU09VUkNFKGhjcnlwLCBDUllQX0lUX0VSUikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCxDUllQX0ZMQUdfUkRFUlIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DTEVBUkZMQUdfUkRFUlIpOworICAgIH0KKyAgICAKKyAgICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCxDUllQX0ZMQUdfV1JFUlIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DTEVBUkZMQUdfV1JFUlIpOworICAgIH0KKyAgICAKKyAgICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCxDUllQX0ZMQUdfQ0NGKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsQ1JZUF9DTEVBUkZMQUdfQ0NGKTsKKyAgICB9CisgICAgCisgICAgaGNyeXAtPlN0YXRlPSBIQUxfQ1JZUF9TVEFURV9FUlJPUjsKKyAgICAvKiBEaXNhYmxlIENvbXB1dGF0aW9uIENvbXBsZXRlIEludGVycnVwdCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCxDUllQX0lUX0NDKTsKKyAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsQ1JZUF9JVF9FUlIpOworICAgIAorICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOworICAgIAorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIAorICAgIHJldHVybjsKKyAgfQorICAKKyAgLyogQ2hlY2sgaWYgY29tcHV0YXRpb24gY29tcGxldGUgaW50ZXJydXB0IHdhcyBlbmFibGVkKi8KKyAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUX1NPVVJDRShoY3J5cCwgQ1JZUF9JVF9DQykgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DTEVBUkZMQUdfQ0NGKTsKKyAgCisgICAgQ1JZUF9FbmNyeXB0RGVjcnlwdF9JVChoY3J5cCk7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNQorICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zLiAKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgQ1JZUCBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfQ1JZUF9TVEFURVR5cGVEZWYgSEFMX0NSWVBfR2V0U3RhdGUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgcmV0dXJuIGhjcnlwLT5TdGF0ZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSWVBfUHJpdmF0ZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSVQgZnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBjb250ZXh0IHRvIGNvbnRpbnVlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9FbmNyeXB0RGVjcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICB1aW50MzJfdCBpbnB1dGFkZHIgPSAwVSwgb3V0cHV0YWRkciA9IDBVOworCisgIC8qIEdldCB0aGUgbGFzdCBPdXRwdXQgZGF0YSBhZHJlc3MgKi8KKyAgb3V0cHV0YWRkciA9ICh1aW50MzJfdCloY3J5cC0+cENyeXBPdXRCdWZmUHRyOworICAKKyAgLyogUmVhZCB0aGUgT3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBSZWdpc3RlciAqLworICAqKHVpbnQzMl90Kikob3V0cHV0YWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICBvdXRwdXRhZGRyKz00VTsKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgb3V0cHV0YWRkcis9NFU7CisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgIG91dHB1dGFkZHIrPTRVOworICAqKHVpbnQzMl90Kikob3V0cHV0YWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAKKyAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArPSAxNlU7CisgIGhjcnlwLT5DcnlwT3V0Q291bnQgLT0gMTZVOworICAKKyAgLyogQ2hlY2sgaWYgYWxsIGlucHV0IHRleHQgaXMgZW5jcnlwdGVkIG9yIGRlY3J5cHRlZCAqLworICBpZihoY3J5cC0+Q3J5cE91dENvdW50ID09IDBVKQorICB7CisgICAgLyogRGlzYWJsZSBDb21wdXRhdGlvbiBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsQ1JZUF9JVF9DQyk7CisgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLENSWVBfSVRfRVJSKTsKKyAgICAKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgICAKKyAgICAvKiBDYWxsIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX0NSWVBFeF9Db21wdXRhdGlvbkNwbHRDYWxsYmFjayhoY3J5cCk7CisgIH0KKyAgZWxzZSAvKiBQcm9jZXNzIHRoZSByZXN0IG9mIGlucHV0IHRleHQgKi8KKyAgeworICAgIC8qIEdldCB0aGUgbGFzdCBJbnRwdXQgZGF0YSBhZHJlc3MgKi8KKyAgICBpbnB1dGFkZHIgPSAodWludDMyX3QpaGNyeXAtPnBDcnlwSW5CdWZmUHRyOworICAgIAorICAgIC8qIFdyaXRlIHRoZSBJbnB1dCBibG9jayBpbiB0aGUgRGF0YSBJbnB1dCByZWdpc3RlciAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOworICAgIGlucHV0YWRkcis9NFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKz0gMTZVOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCAtPSAxNlU7ICAgICAgCisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgRE1BIENSWVAgSW5wdXQgRGF0YSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX0RNQUluQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgIAoreworICBDUllQX0hhbmRsZVR5cGVEZWYqIGhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsKKyAgCisgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgaW5wdXQgcmVxdWVzdCAgKi8KKyAgQ0xFQVJfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9ETUFJTkVOKTsKKyAgCisgIC8qIENhbGwgaW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIENSWVAgT3V0cHV0IERhdGEgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9ETUFPdXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBDUllQX0hhbmRsZVR5cGVEZWYqIGhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsKKyAgCisgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3Igb3V0cHV0IHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBETUFPVVRFTiBiaXQKKyAgICAgaW4gdGhlIERNQUNSIHJlZ2lzdGVyICovCisgIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfRE1BT1VURU4pOworCisgIC8qIENsZWFyIENDRiBGbGFnICovCisgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DTEVBUkZMQUdfQ0NGKTsKKworICAvKiBEaXNhYmxlIENSWVAgKi8KKyAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKyAgCisgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSB0byByZWFkeSAqLworICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgCisgIC8qIENhbGwgb3V0cHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgQ1JZUCBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLiAKKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgQ1JZUF9IYW5kbGVUeXBlRGVmKiBoY3J5cCA9IChDUllQX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7CisgIGhjcnlwLT5TdGF0ZT0gSEFMX0NSWVBfU1RBVEVfRVJST1I7CisgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlcyB0aGUgS2V5IGluIEtleSByZWdpc3RlcnMuIAorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBLZXkgUG9pbnRlciB0byBLZXkgYnVmZmVyCisgICogQG5vdGUgS2V5IG11c3QgYmUgd3JpdHRlbiBhcyBsaXR0bGUgZW5kaWFuLgorICAqICAgICAgICAgSWYgS2V5IHBvaW50ZXIgcG9pbnRzIGF0IGFkZHJlc3MgbiwgCisgICogICAgICAgICBuWzE1OjBdIGNvbnRhaW5zIGtleVs5NjoxMjddLCAKKyAgKiAgICAgICAgIChuKzQpWzE1OjBdIGNvbnRhaW5zIGtleVs2NDo5NV0sIAorICAqICAgICAgICAgKG4rOClbMTU6MF0gY29udGFpbnMga2V5WzMyOjYzXSBhbmQgCisgICogICAgICAgICAobisxMilbMTU6MF0gY29udGFpbnMga2V5WzA6MzFdCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX1NldEtleShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpLZXkpCit7ICAKKyAgdWludDMyX3Qga2V5YWRkciA9ICh1aW50MzJfdClLZXk7CisgIAorICBoY3J5cC0+SW5zdGFuY2UtPktFWVIzID0gX19SRVYoKih1aW50MzJfdCopKGtleWFkZHIpKTsKKyAga2V5YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjIgPSBfX1JFVigqKHVpbnQzMl90Kikoa2V5YWRkcikpOworICBrZXlhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9IF9fUkVWKCoodWludDMyX3QqKShrZXlhZGRyKSk7CisgIGtleWFkZHIrPTRVOworICBoY3J5cC0+SW5zdGFuY2UtPktFWVIwID0gX19SRVYoKih1aW50MzJfdCopKGtleWFkZHIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZXMgdGhlIEluaXRWZWN0b3IvSW5pdENvdW50ZXIgaW4gSVYgcmVnaXN0ZXJzLiAKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgSW5pdFZlY3RvciBQb2ludGVyIHRvIEluaXRWZWN0b3IvSW5pdENvdW50ZXIgYnVmZmVyCisgICogQG5vdGUgSW5pdCBWZWN0b3IgbXVzdCBiZSB3cml0dGVuIGFzIGxpdHRsZSBlbmRpYW4uCisgICogICAgICAgICBJZiBJbml0IFZlY3RvciBwb2ludGVyIHBvaW50cyBhdCBhZGRyZXNzIG4sIAorICAqICAgICAgICAgblsxNTowXSBjb250YWlucyBWZWN0b3JbOTY6MTI3XSwgCisgICogICAgICAgICAobis0KVsxNTowXSBjb250YWlucyBWZWN0b3JbNjQ6OTVdLCAKKyAgKiAgICAgICAgIChuKzgpWzE1OjBdIGNvbnRhaW5zIFZlY3RvclszMjo2M10gYW5kIAorICAqICAgICAgICAgKG4rMTIpWzE1OjBdIGNvbnRhaW5zIFZlY3RvclswOjMxXQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9TZXRJbml0VmVjdG9yKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKkluaXRWZWN0b3IpCit7CisgIHVpbnQzMl90IGl2YWRkciA9ICh1aW50MzJfdClJbml0VmVjdG9yOworICAKKyAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gX19SRVYoKih1aW50MzJfdCopKGl2YWRkcikpOworICBpdmFkZHIrPTRVOworICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSBfX1JFVigqKHVpbnQzMl90KikoaXZhZGRyKSk7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IF9fUkVWKCoodWludDMyX3QqKShpdmFkZHIpKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gX19SRVYoKih1aW50MzJfdCopKGl2YWRkcikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2Nlc3MgRGF0YTogV3JpdGVzIElucHV0IGRhdGEgaW4gcG9sbGluZyBtb2RlIGFuZCByZWFkcyB0aGUgb3V0cHV0IGRhdGEKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgSW5wdXQgUG9pbnRlciB0byB0aGUgSW5wdXQgYnVmZmVyCisgICogQHBhcmFtICBJbGVuZ3RoIExlbmd0aCBvZiB0aGUgSW5wdXQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgICogQHBhcmFtICBPdXRwdXQgUG9pbnRlciB0byB0aGUgcmV0dXJuZWQgYnVmZmVyCisgICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZSAgCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9Qcm9jZXNzRGF0YShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90KiBJbnB1dCwgdWludDE2X3QgSWxlbmd0aCwgdWludDhfdCogT3V0cHV0LCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKyAgCisgIHVpbnQzMl90IGluZGV4ID0gMFU7CisgIHVpbnQzMl90IGlucHV0YWRkciAgPSAodWludDMyX3QpSW5wdXQ7CisgIHVpbnQzMl90IG91dHB1dGFkZHIgPSAodWludDMyX3QpT3V0cHV0OworICAKKyAgZm9yKGluZGV4PTBVOyAoaW5kZXggPCBJbGVuZ3RoKTsgaW5kZXggKz0gMTZVKQorICB7CisgICAgLyogV3JpdGUgdGhlIElucHV0IGJsb2NrIGluIHRoZSBEYXRhIElucHV0IHJlZ2lzdGVyICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGlucHV0YWRkcik7CisgICAgaW5wdXRhZGRyKz00VTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBpbnB1dGFkZHIrPTRVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKKyAgICBpbnB1dGFkZHIrPTRVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOworICAgIGlucHV0YWRkcis9NFU7CisgICAgCisgICAgLyogR2V0IHRpbWVvdXQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIAorICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKQorICAgIHsgICAgCisgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpfHwoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovICAgICAgICAgIAorICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NMRUFSRkxBR19DQ0YpOworICAgIAorICAgIC8qIFJlYWQgdGhlIE91dHB1dCBibG9jayBmcm9tIHRoZSBEYXRhIE91dHB1dCBSZWdpc3RlciAqLworICAgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgb3V0cHV0YWRkcis9NFU7CisgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICBvdXRwdXRhZGRyKz00VTsKKyAgICAqKHVpbnQzMl90Kikob3V0cHV0YWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgIG91dHB1dGFkZHIrPTRVOworICAgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgb3V0cHV0YWRkcis9NFU7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgRE1BIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXJ0IHRoZSBETUEgdHJhbnNmZXIKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgaW5wdXRhZGRyIGFkZHJlc3Mgb2YgdGhlIElucHV0IGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBTaXplIG9mIHRoZSBJbnB1dCBidWZmZXIsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KKyAgKiBAcGFyYW0gIG91dHB1dGFkZHIgYWRkcmVzcyBvZiB0aGUgT3V0cHV0IGJ1ZmZlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9TZXRETUFDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgaW5wdXRhZGRyLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBvdXRwdXRhZGRyKQoreworICAvKiBTZXQgdGhlIENSWVAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhjcnlwLT5oZG1haW4tPlhmZXJDcGx0Q2FsbGJhY2sgPSBDUllQX0RNQUluQ3BsdDsKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaGNyeXAtPmhkbWFpbi0+WGZlckVycm9yQ2FsbGJhY2sgPSBDUllQX0RNQUVycm9yOworICAKKyAgLyogU2V0IHRoZSBDUllQIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoY3J5cC0+aGRtYW91dC0+WGZlckNwbHRDYWxsYmFjayA9IENSWVBfRE1BT3V0Q3BsdDsKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaGNyeXAtPmhkbWFvdXQtPlhmZXJFcnJvckNhbGxiYWNrID0gQ1JZUF9ETUFFcnJvcjsKKworICAvKiBFbmFibGUgdGhlIERNQSBJbiBETUEgU3RyZWFtICovCisgIEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFpbiwgaW5wdXRhZGRyLCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RElOUiwgU2l6ZS80KTsKKworICAvKiBFbmFibGUgdGhlIERNQSBPdXQgRE1BIFN0cmVhbSAqLworICBIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1hb3V0LCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RE9VVFIsIG91dHB1dGFkZHIsIFNpemUvNCk7CisKKyAgLyogRW5hYmxlIEluIGFuZCBPdXQgRE1BIHJlcXVlc3RzICovCisgIFNFVF9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgKEFFU19DUl9ETUFJTkVOIHwgQUVTX0NSX0RNQU9VVEVOKSk7CisKKyAgLyogRW5hYmxlIENSWVAgKi8KKyAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0NSWVBfTU9EVUxFX0VOQUJMRUQgKi8KKyNlbmRpZiAvKiBTVE0zMkwwMjF4eCB8fCBTVE0zMkwwNDF4eCB8fCBTVE0zMkwwNjF4eCB8fCBTVE0zMkwwNjJ4eCB8fCBTVE0zMkwwNjN4eCB8fCBTVE0zMkwwODF4eCB8fCBTVE0zMkwwODJ4eCB8fCBTVE0zMkwwODN4eCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfY3J5cF9leC5jIGIvU3JjL3N0bTMybDB4eF9oYWxfY3J5cF9leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZWI3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9jcnlwX2V4LmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2NyeXBfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQ1JZUEV4IEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgIAorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBDcnlwdG9ncmFwaHkgKENSWVApIGV4dGVuc2lvbiBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIENvbXB1dGF0aW9uIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiAgICAgICAgIAorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAqLyAKKworI2lmIGRlZmluZWQgKFNUTTMyTDAyMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA2Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworI2lmZGVmIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECisKKworLyoqIEBhZGR0b2dyb3VwIENSWVBFeAorICAqIEBicmllZiBDUllQIEhBTCBFeHRlbmRlZCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIENSWVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucy4gCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBjYWxsYmFjayBmdW5jdGlvbnM6CisgICAgICAoKykgQ29tcHV0YXRpb24gY29tcGxldGVkLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbXB1dGF0aW9uIGNvbXBsZXRlZCBjYWxsYmFja3MuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DUllQRXhfQ29tcHV0YXRpb25DcGx0Q2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNyeXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9Db21wdXRhdGlvbkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9DUllQX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1RNMzJMMDIxeHggfHwgU1RNMzJMMDQxeHggfHwgU1RNMzJMMDYxeHggfHwgU1RNMzJMMDYyeHggfHwgU1RNMzJMMDYzeHggfHwgU1RNMzJMMDgxeHggfHwgU1RNMzJMMDgyeHggfHwgU1RNMzJMMDgzeHggKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsX2RhYy5jIGIvU3JjL3N0bTMybDB4eF9oYWxfZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3MjY1YQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX2RhYy5jCkBAIC0wLDAgKzEsMTAyMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfZGFjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIERBQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgRGlnaXRhbCB0byBBbmFsb2cgQ29udmVydGVyIChEQUMpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAgICAgIAorICAqICAgICAKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgREFDIFBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgICAgICAgCisgICAgICAqKiogREFDIENoYW5uZWxzICoqKgorICAgICAgPT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICAKKyAgICBTVE0zMkwwIGRldmljZXMgaW50ZWdyYXRlIG9uZSBvciB0d28gMTItYml0IERpZ2l0YWwgQW5hbG9nIENvbnZlcnRlcnMKKyAgICAoaS5lLiBvbmUgb3IgMiBjaGFubmVsKHMpKQorICAgIDEgY2hhbm5lbCA6IFNUTTMyTDA1eCBTVE0zMkwwNnggZGV2aWNlcworICAgIDIgY2hhbm5lbHM6IFNUTTMyTDA3eCBTVE0zMkwwOHggZGV2aWNlcworCisgICAgV2hlbiAyIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUsIHRoZSAyIGNvbnZlcnRlcnMgKGkuZS4gY2hhbm5lbDEgJiBjaGFubmVsMikKKyAgICBjYW4gYmUgdXNlZCBpbmRlcGVuZGVudGx5IG9yIHNpbXVsdGFuZW91c2x5IChkdWFsIG1vZGUpOgorICAgICAgKCMpIERBQyBjaGFubmVsMSB3aXRoIERBQ19PVVQxIChQQTQpIGFzIG91dHB1dAorICAgICAgKCMpIERBQyBjaGFubmVsMiB3aXRoIERBQ19PVVQyIChQQTUpIGFzIG91dHB1dCAoU1RNMzJMMDd4L1NUTTMyTDA4eCBvbmx5KQorICAgICAgKCMpIENoYW5uZWwxICYgY2hhbm5lbDIgY2FuIGJlIHVzZWQgaW5kZXBlbmRlbnRseSBvciBzaW11bHRhbmVvdXNseSBpbiBkdWFsIG1vZGUgKFNUTTMyTDA3eC9TVE0zMkwwOHggb25seSkKKyAgCisgICAgICAqKiogREFDIFRyaWdnZXJzICoqKgorICAgICAgPT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgRGlnaXRhbCB0byBBbmFsb2cgY29udmVyc2lvbiBjYW4gYmUgbm9uLXRyaWdnZXJlZCB1c2luZyBEQUNfVFJJR0dFUl9OT05FCisgICAgYW5kIERBQ19PVVQxL0RBQ19PVVQyIGlzIGF2YWlsYWJsZSBvbmNlIHdyaXRpbmcgdG8gREhSeCByZWdpc3Rlci4KKyAgICBbLi5dCisgICAgRGlnaXRhbCB0byBBbmFsb2cgY29udmVyc2lvbiBjYW4gYmUgdHJpZ2dlcmVkIGJ5OgorICAgICAgKCMpIEV4dGVybmFsIGV2ZW50OiBFWFRJIExpbmUgOSAoYW55IEdQSU94X1BJTl85KSB1c2luZyBEQUNfVFJJR0dFUl9FWFRfSVQ5LgorICAgICAgICAgIFRoZSB1c2VkIHBpbiAoR1BJT3hfUElOXzkpIG11c3QgYmUgY29uZmlndXJlZCBpbiBpbnB1dCBtb2RlLgorCisgICAgICAoIykgVGltZXJzIFRSR086IAorICAgICAgICAgIFNUTTMyTDA1eC9TVE0zMkwwNnggOiBUSU0yLCBUSU02IGFuZCBUSU0yMQorICAgICAgICAgIFNUTTMyTDA3eC9TVE0zMkwwOHggOiBUSU0yLCBUSU0zLCBUSU02LCBUSU03IGFuZCBUSU0yMQorICAgICAgICAgIChEQUNfVFJJR0dFUl9UMl9UUkdPLCBEQUNfVFJJR0dFUl9UNl9UUkdPLi4uKQorCisgICAgICAoIykgU29mdHdhcmUgdXNpbmcgREFDX1RSSUdHRVJfU09GVFdBUkUKKworICAgICAgKioqIERBQyBCdWZmZXIgbW9kZSBmZWF0dXJlICoqKgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgWy4uXSAKKyAgICAgIEVhY2ggREFDIGNoYW5uZWwgaW50ZWdyYXRlcyBhbiBvdXRwdXQgYnVmZmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgIHJlZHVjZSB0aGUgb3V0cHV0IGltcGVkYW5jZSwgYW5kIHRvIGRyaXZlIGV4dGVybmFsIGxvYWRzIGRpcmVjdGx5CisgICAgICB3aXRob3V0IGhhdmluZyB0byBhZGQgYW4gZXh0ZXJuYWwgb3BlcmF0aW9uYWwgYW1wbGlmaWVyLgorICAgICAgVG8gZW5hYmxlLCB0aGUgb3V0cHV0IGJ1ZmZlciB1c2UKKyAgICAgIHNDb25maWcuREFDX091dHB1dEJ1ZmZlciA9IERBQ19PVVRQVVRCVUZGRVJfRU5BQkxFOworICAgICAgWy4uXQorICAgICAgKEApIFJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgb3V0cHV0CisgICAgICAgICAgaW1wZWRhbmNlIHZhbHVlIHdpdGggYW5kIHdpdGhvdXQgb3V0cHV0IGJ1ZmZlci4KKworICAgICAgICoqKiBEQUMgd2F2ZSBnZW5lcmF0aW9uIGZlYXR1cmUgKioqCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICBbLi5dCisgICAgICAgQm90aCBEQUMgY2hhbm5lbHMgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUKKyAgICAgICAgICgjKSBOb2lzZSB3YXZlIHVzaW5nIEhBTF9EQUNFeF9Ob2lzZVdhdmVHZW5lcmF0ZSgpCisgICAgICAgICAoIykgVHJpYW5nbGUgd2F2ZSB1c2luZyBIQUxfREFDRXhfVHJpYW5nbGVXYXZlR2VuZXJhdGUoKQorCisgICAgICAgKioqIERBQyBkYXRhIGZvcm1hdCAqKioKKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgIFsuLl0KKyAgICAgICBUaGUgREFDIGRhdGEgZm9ybWF0IGNhbiBiZToKKyAgICAgICAgICgjKSA4LWJpdCByaWdodCBhbGlnbm1lbnQgdXNpbmcgREFDX0FMSUdOXzhCX1IKKyAgICAgICAgICgjKSAxMi1iaXQgbGVmdCBhbGlnbm1lbnQgdXNpbmcgREFDX0FMSUdOXzEyQl9MCisgICAgICAgICAoIykgMTItYml0IHJpZ2h0IGFsaWdubWVudCB1c2luZyBEQUNfQUxJR05fMTJCX1IKKworICAgICAgICoqKiBEQUMgZGF0YSB2YWx1ZSB0byB2b2x0YWdlIGNvcnJlc3BvbmRlbmNlICoqKgorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgIFsuLl0KKyAgICAgICBUaGUgYW5hbG9nIG91dHB1dCB2b2x0YWdlIG9uIGVhY2ggREFDIGNoYW5uZWwgcGluIGlzIGRldGVybWluZWQKKyAgICAgICBieSB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOiAKKyAgICAgICBbLi5dCisgICAgICAgREFDX09VVHggPSBWUkVGKyAqIERPUiAvIDQwOTUKKyAgICAgICAoKykgd2l0aCAgRE9SIGlzIHRoZSBEYXRhIE91dHB1dCBSZWdpc3RlcgorICAgICAgIFsuLl0KKyAgICAgICAgICBWRUYrIGlzIHRoZSBpbnB1dCB2b2x0YWdlIHJlZmVyZW5jZSAocmVmZXIgdG8gdGhlIGRldmljZSBkYXRhc2hlZXQpCisgICAgICAgWy4uXQorICAgICAgICBlLmcuIFRvIHNldCBEQUNfT1VUMSB0byAwLjdWLCB1c2UKKyAgICAgICAoKykgQXNzdW1pbmcgdGhhdCBWUkVGKyA9IDMuM1YsIERBQ19PVVQxID0gKDMuMyAqIDg2OCkgLyA0MDk1ID0gMC43VgorCisgICAgICAgKioqIERNQSByZXF1ZXN0cyAgKioqCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09CisgICAgICAgWy4uXQorICAgICAgIEEgRE1BMSByZXF1ZXN0IGNhbiBiZSBnZW5lcmF0ZWQgd2hlbiBhbiBleHRlcm5hbCB0cmlnZ2VyIChidXQgbm90IGEgc29mdHdhcmUgdHJpZ2dlcikKKyAgICAgICBvY2N1cnMgaWYgRE1BMSByZXF1ZXN0cyBhcmUgZW5hYmxlZCB1c2luZyBIQUxfREFDX1N0YXJ0X0RNQSgpLgorICAgICAgIERNQTEgcmVxdWVzdHMgYXJlIG1hcHBlZCBhcyBmb2xsb3dpbmc6CisgICAgICAgICAoIykgREFDIGNoYW5uZWwxIDogbWFwcGVkIG9uIERNQTEgUmVxdWVzdDkgY2hhbm5lbDIgd2hpY2ggbXVzdCBiZQorICAgICAgICAgICAgIGFscmVhZHkgY29uZmlndXJlZAorICAgICAgICAgKCMpIERBQyBjaGFubmVsMiA6IG1hcHBlZCBvbiBETUExIFJlcXVlc3QxNSBjaGFubmVsNCB3aGljaCBtdXN0IGJlIAorICAgICAgICAgICAgIGFscmVhZHkgY29uZmlndXJlZCAoU1RNMzJMMDd4L1NUTTMyTDA4eCBvbmx5KQorICAgICAgIAorICAgIC1ALSBGb3IgRHVhbCBtb2RlIChTVE0zMkwwN3gvU1RNMzJMMDh4IG9ubHkpIGFuZCBzcGVjaWZpYyBzaWduYWwgKFRyaWFuZ2xlIGFuZCBub2lzZSkgZ2VuZXJhdGlvbiBwbGVhc2UgCisgICAgICAgIHJlZmVyIHRvIEV4dGVuc2lvbiBGZWF0dXJlcyBEcml2ZXIgZGVzY3JpcHRpb24gICAgICAgIAorCisKKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBEQUMgQVBCIGNsb2NrIG11c3QgYmUgZW5hYmxlZCB0byBnZXQgd3JpdGUgYWNjZXNzIHRvIERBQworICAgICAgICAgIHJlZ2lzdGVycyB1c2luZyBIQUxfREFDX0luaXQoKQorICAgICAgKCspIENvbmZpZ3VyZSBEQUNfT1VUMTogUEE0IGluIGFuYWxvZyBtb2RlLgorICAgICAgKCspIENvbmZpZ3VyZSBEQUNfT1VUMjogUEE1IGluIGFuYWxvZyBtb2RlIChTVE0zMkwwN3gvU1RNMzJMMDh4IG9ubHkpLgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgREFDIGNoYW5uZWwgdXNpbmcgSEFMX0RBQ19Db25maWdDaGFubmVsKCkgZnVuY3Rpb24uCisgICAgICAoKykgRW5hYmxlIHRoZSBEQUMgY2hhbm5lbCB1c2luZyBIQUxfREFDX1N0YXJ0KCkgb3IgSEFMX0RBQ19TdGFydF9ETUEgZnVuY3Rpb25zCisKKyAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dICAgIAorICAgICAgICgrKSBTdGFydCB0aGUgREFDIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0RBQ19TdGFydCgpIAorICAgICAgICgrKSBUbyByZWFkIHRoZSBEQUMgbGFzdCBkYXRhIG91dHB1dCB2YWx1ZSwgdXNlIHRoZSBIQUxfREFDX0dldFZhbHVlKCkgZnVuY3Rpb24uCisgICAgICAgKCspIFN0b3AgdGhlIERBQyBwZXJpcGhlcmFsIHVzaW5nIEhBTF9EQUNfU3RvcCgpCisgICAgICAgCisgICAgICoqKiBETUEgbW9kZSBJTyBvcGVyYXRpb24gKioqICAgIAorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXSAgICAKKyAgICAgICAoKykgU3RhcnQgdGhlIERBQyBwZXJpcGhlcmFsIHVzaW5nIEhBTF9EQUNfU3RhcnRfRE1BKCksIGF0IHRoaXMgc3RhZ2UgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGVuZ3RoIAorICAgICAgICAgICBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGF0IGVhY2ggZW5kIG9mIGNvbnZlcnNpb24KKyAgICAgICAoKykgQXQgdGhlIG1pZGRsZSBvZiBkYXRhIHRyYW5zZmVyIEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDEoKW9yIEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDIoKSAgCisgICAgICAgICAgIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciAKKyAgICAgICAgICAgSEFMX0RBQ19Db252SGFsZkNwbHRDYWxsYmFja0NoMSBvciBIQUxfREFDX0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyCisgICAgICAgKCspIEF0IFRoZSBlbmQgb2YgZGF0YSB0cmFuc2ZlciBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEoKW9yIEhBTF9EQUNfQ29udkNwbHRDYWxsYmFja0NoMigpICAKKyAgICAgICAgICAgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIAorICAgICAgICAgICBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEgb3IgSEFMX0RBQ19Db252Q3BsdENhbGxiYWNrQ2gyCisgICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9EQUNfRXJyb3JDYWxsYmFja0NoMSgpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiAKKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxCisgICAgICAgKCspIEluIGNhc2Ugb2YgRE1BIHVuZGVycnVuLCBEQUMgaW50ZXJydXB0aW9uIHRyaWdnZXJzIGFuZCBleGVjdXRlIGludGVybmFsIGZ1bmN0aW9uIEhBTF9EQUNfSVJRSGFuZGxlci4KKyAgICAgICAgICAgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKClvciBIQUxfREFDX0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIoKSAgCisgICAgICAgICAgIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciAKKyAgICAgICAgICAgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxIG9yIEhBTF9EQUNfRE1BVW5kZXJydW5DYWxsYmFja0NoMgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfREFDX0Vycm9yQ2FsbGJhY2tDaDEKKyAgICAgICAoKykgU3RvcCB0aGUgREFDIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0RBQ19TdG9wX0RNQSgpCisKKyAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorCisgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9EQUNfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjaywKKyAgICAgIGl0IGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgKCspIENvbnZDcGx0Q2FsbGJhY2tDaDEgICAgIDogY2FsbGJhY2sgd2hlbiBhIGhhbGYgdHJhbnNmZXIgaXMgY29tcGxldGVkIG9uIENoMS4gICAgICAgICAgICAgICAgIAorICAgICAgKCspIENvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxIDogY2FsbGJhY2sgd2hlbiBhIHRyYW5zZmVyIGlzIGNvbXBsZXRlZCBvbiBDaDEuCisgICAgICAoKykgRXJyb3JDYWxsYmFja0NoMSAgICAgICAgOiBjYWxsYmFjayB3aGVuIGFuIGVycm9yIG9jY3VycyBvbiBDaDEuCisgICAgICAoKykgRE1BVW5kZXJydW5DYWxsYmFja0NoMSAgOiBjYWxsYmFjayB3aGVuIGFuIHVuZGVycnVuIGVycm9yIG9jY3VycyBvbiBDaDEuCisgICAgICAoKykgQ29udkNwbHRDYWxsYmFja0NoMiAgICAgOiBjYWxsYmFjayB3aGVuIGEgaGFsZiB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb24gQ2gyLiAgIAorICAgICAgKCspIENvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyIDogY2FsbGJhY2sgd2hlbiBhIHRyYW5zZmVyIGlzIGNvbXBsZXRlZCBvbiBDaDIuICAgICAgICAKKyAgICAgICgrKSBFcnJvckNhbGxiYWNrQ2gyICAgICAgICA6IGNhbGxiYWNrIHdoZW4gYW4gZXJyb3Igb2NjdXJzIG9uIENoMi4gICAgICAgICAgICAgICAgCisgICAgICAoKykgRE1BVW5kZXJydW5DYWxsYmFja0NoMiAgOiBjYWxsYmFjayB3aGVuIGFuIHVuZGVycnVuIGVycm9yIG9jY3VycyBvbiBDaDIuCisgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgOiBEQUMgTXNwSW5pdC4gIAorICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgIDogREFDIE1zcGRlSW5pdC4KKyAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfREFDX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLiBJdCBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICgrKSBDb252Q3BsdENhbGxiYWNrQ2gxICAgICA6IGNhbGxiYWNrIHdoZW4gYSBoYWxmIHRyYW5zZmVyIGlzIGNvbXBsZXRlZCBvbiBDaDEuICAgICAgICAgICAgICAgICAKKyAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFja0NoMSA6IGNhbGxiYWNrIHdoZW4gYSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb24gQ2gxLgorICAgICAgKCspIEVycm9yQ2FsbGJhY2tDaDEgICAgICAgIDogY2FsbGJhY2sgd2hlbiBhbiBlcnJvciBvY2N1cnMgb24gQ2gxLgorICAgICAgKCspIERNQVVuZGVycnVuQ2FsbGJhY2tDaDEgIDogY2FsbGJhY2sgd2hlbiBhbiB1bmRlcnJ1biBlcnJvciBvY2N1cnMgb24gQ2gxLgorICAgICAgKCspIENvbnZDcGx0Q2FsbGJhY2tDaDIgICAgIDogY2FsbGJhY2sgd2hlbiBhIGhhbGYgdHJhbnNmZXIgaXMgY29tcGxldGVkIG9uIENoMi4gICAKKyAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFja0NoMiA6IGNhbGxiYWNrIHdoZW4gYSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb24gQ2gyLiAgICAgICAgCisgICAgICAoKykgRXJyb3JDYWxsYmFja0NoMiAgICAgICAgOiBjYWxsYmFjayB3aGVuIGFuIGVycm9yIG9jY3VycyBvbiBDaDIuICAgICAgICAgICAgICAgIAorICAgICAgKCspIERNQVVuZGVycnVuQ2FsbGJhY2tDaDIgIDogY2FsbGJhY2sgd2hlbiBhbiB1bmRlcnJ1biBlcnJvciBvY2N1cnMgb24gQ2gyLgorICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgIDogREFDIE1zcEluaXQuICAKKyAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICA6IERBQyBNc3BkZUluaXQuCisgICAgICAoKykgQWxsIENhbGxiYWNrcworICAgICAgVGhpcyBmdW5jdGlvbikgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisKKyAgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9EQUNfSW5pdCBhbmQgaWYgdGhlIHN0YXRlIGlzIEhBTF9EQUNfU1RBVEVfUkVTRVQKKyAgICAgIGFsbCBjYWxsYmFja3MgYXJlIHJlc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMuCisgICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGFyZSByZXNwZWN0aXZlbHkKKyAgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9EQUNfSW5pdCAKKyAgICAgIGFuZCBAcmVmICBIQUxfREFDX0RlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfREFDX0luaXQgYW5kIEByZWYgSEFMX0RBQ19EZUluaXQKKyAgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkKKworICAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBSRUFEWSBzdGF0ZSBvbmx5LgorICAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgICAgaW4gUkVBRFkgb3IgUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkCisgICAgICBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICAgdXNpbmcgQHJlZiBIQUxfREFDX1JlZ2lzdGVyQ2FsbGJhY2sgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfREFDX0RlSW5pdCAKKyAgICAgIG9yIEByZWYgSEFMX0RBQ19Jbml0IGZ1bmN0aW9uLgorCisgICAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSAKKyAgICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCisKKyAgICAgKioqIERBQyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgICAgIFsuLl0KKyAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIERBQyBIQUwgZHJpdmVyLgorICAgICAgIAorICAgICAgKCspIF9fSEFMX0RBQ19FTkFCTEUgOiBFbmFibGUgdGhlIERBQyBwZXJpcGhlcmFsCisgICAgICAoKykgX19IQUxfREFDX0RJU0FCTEUgOiBEaXNhYmxlIHRoZSBEQUMgcGVyaXBoZXJhbAorICAgICAgKCspIF9fSEFMX0RBQ19DTEVBUl9GTEFHOiBDbGVhciB0aGUgREFDJ3MgcGVuZGluZyBmbGFncworICAgICAgKCspIF9fSEFMX0RBQ19HRVRfRkxBRzogR2V0IHRoZSBzZWxlY3RlZCBEQUMncyBmbGFnIHN0YXR1cworICAgICAgCisgICAgIFsuLl0KKyAgICAgIChAKSBZb3UgY2FuIHJlZmVyIHRvIHRoZSBEQUMgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zICAKKyAgIAorIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKworI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4QikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDIxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwMzF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDA0MXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDUxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwNjF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDA3MXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDgxeHgpCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworI2lmZGVmIEhBTF9EQUNfTU9EVUxFX0VOQUJMRUQKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUMKKyAgKiBAYnJpZWYgREFDIGRyaXZlciBtb2R1bGVzCisgICogQHsKKyAgKi8KKworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIERBQ19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBEQUMuCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgREFDLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIERBQyBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIHRoZSBEQUNfSW5pdFN0cnVjdCBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19Jbml0KERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKQoreworICAvKiBDaGVjayBEQUMgaGFuZGxlICovCisgIGlmKGhkYWMgPT0gTlVMTCkKKyAgeworICAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQUxMX0lOU1RBTkNFKGhkYWMtPkluc3RhbmNlKSk7CisKKyAgaWYoaGRhYy0+U3RhdGUgPT0gSEFMX0RBQ19TVEFURV9SRVNFVCkKKyAgeworI2lmIChVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBJbml0IHRoZSBEQUMgQ2FsbGJhY2sgc2V0dGluZ3MgKi8KKyAgICBoZGFjLT5Db252Q3BsdENhbGxiYWNrQ2gxICAgICAgICAgICA9IEhBTF9EQUNfQ29udkNwbHRDYWxsYmFja0NoMTsKKyAgICBoZGFjLT5Db252SGFsZkNwbHRDYWxsYmFja0NoMSAgICAgICA9IEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDE7CisgICAgaGRhYy0+RXJyb3JDYWxsYmFja0NoMSAgICAgICAgICAgICAgPSBIQUxfREFDX0Vycm9yQ2FsbGJhY2tDaDE7CisgICAgaGRhYy0+RE1BVW5kZXJydW5DYWxsYmFja0NoMSAgICAgICAgPSBIQUxfREFDX0RNQVVuZGVycnVuQ2FsbGJhY2tDaDE7CisKKyAgICBoZGFjLT5Db252Q3BsdENhbGxiYWNrQ2gyICAgICAgICAgICA9IEhBTF9EQUNFeF9Db252Q3BsdENhbGxiYWNrQ2gyOworICAgIGhkYWMtPkNvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyICAgICAgID0gSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyOworICAgIGhkYWMtPkVycm9yQ2FsbGJhY2tDaDIgICAgICAgICAgICAgID0gSEFMX0RBQ0V4X0Vycm9yQ2FsbGJhY2tDaDI7CisgICAgaGRhYy0+RE1BVW5kZXJydW5DYWxsYmFja0NoMiAgICAgICAgPSBIQUxfREFDRXhfRE1BVW5kZXJydW5DYWxsYmFja0NoMjsKKworICAgIGlmKGhkYWMtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhkYWMtPk1zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgID0gSEFMX0RBQ19Nc3BJbml0OworICAgIH0KKyNlbmRpZiAvKiBVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoZGFjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGhkYWMtPk1zcEluaXRDYWxsYmFjayhoZGFjKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX0RBQ19Nc3BJbml0KGhkYWMpOworI2VuZGlmIC8qIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgREFDIHN0YXRlKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgaGRhYy0+RXJyb3JDb2RlID0gSEFMX0RBQ19FUlJPUl9OT05FOworCisgIC8qIEluaXRpYWxpemUgdGhlIERBQyBzdGF0ZSovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVpbml0aWFsaXplIHRoZSBEQUMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19EZUluaXQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIENoZWNrIERBQyBoYW5kbGUgKi8KKyAgaWYoaGRhYyA9PSBOVUxMKQorICB7CisgICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMTF9JTlNUQU5DRShoZGFjLT5JbnN0YW5jZSkpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmKGhkYWMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoZGFjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9EQUNfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGhkYWMtPk1zcERlSW5pdENhbGxiYWNrKGhkYWMpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX0RBQ19Nc3BEZUluaXQoaGRhYyk7CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgaGRhYy0+RXJyb3JDb2RlID0gSEFMX0RBQ19FUlJPUl9OT05FOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFU0VUOworICAKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgREFDIE1TUC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX01zcEluaXQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIERBQyBNU1AuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLiAgCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX01zcERlSW5pdChEQUNfSGFuZGxlVHlwZURlZiogaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9EQUNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbi4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24uCisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIEdldCByZXN1bHQgb2YgY29udmVyc2lvbi4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIGR1YWwgbW9kZSBjb252ZXJzaW9uIChTVE0zMkwwN3h4L1NUTTMyTDA4eHggb25seSkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIERBQyBhbmQgc3RhcnRzIGNvbnZlcnNpb24gb2YgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RhcnQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworICBVTlVTRUQoQ2hhbm5lbCk7CisKKyAgLyogTm90ZSA6IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbnRvIHRoaXMgZmlsZSBmb3IgbGlicmFyeSByZWZlcmVuY2UuICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMybDB4eF9oYWxfZGFjX2V4LmMgICAqLworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIERBQyBhbmQgc3RvcCBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQgKFNUTTMyTDA3eC9TVE0zMkwwOHggb25seSkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RvcChEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfREFDX0RJU0FCTEUoaGRhYywgQ2hhbm5lbCk7CisgIAorICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIERBQyBhbmQgc3RhcnRzIGNvbnZlcnNpb24gb2YgY2hhbm5lbCB1c2luZyBETUEuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQgKFNUTTMyTDA3eC9TVE0zMkwwOHggb25seSkKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBwZXJpcGhlcmFsIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBEQUMgcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgQWxpZ25tZW50IFNwZWNpZmllcyB0aGUgZGF0YSBhbGlnbm1lbnQgZm9yIERBQyBjaGFubmVsLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl84Ql9SOiA4Yml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl8xMkJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fMTJCX1I6IDEyYml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitfX3dlYWsgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TdGFydF9ETUEoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90KiBwRGF0YSwgdWludDMyX3QgTGVuZ3RoLCB1aW50MzJfdCBBbGlnbm1lbnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworICBVTlVTRUQoQ2hhbm5lbCk7CisgIFVOVVNFRChwRGF0YSk7CisgIFVOVVNFRChMZW5ndGgpOworICBVTlVTRUQoQWxpZ25tZW50KTsKKworICAvKiBOb3RlIDogVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGludG8gdGhpcyBmaWxlIGZvciBsaWJyYXJ5IHJlZmVyZW5jZS4gKi8KKyAgLyogICAgICAgIEZ1bmN0aW9uIGNvbnRlbnQgaXMgbG9jYXRlZCBpbnRvIGZpbGUgc3RtMzJsMHh4X2hhbF9kYWNfZXguYyAgICovCisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIERBQyBhbmQgc3RvcCBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQgKFNUTTMyTDA3eC9TVE0zMkwwOHggb25seSkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayBIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0b3BfRE1BKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZGFjKTsKKyAgVU5VU0VEKENoYW5uZWwpOworCisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlLiAqLworICAvKiAgICAgICAgRnVuY3Rpb24gY29udGVudCBpcyBsb2NhdGVkIGludG8gZmlsZSBzdG0zMmwweHhfaGFsX2RhY19leC5jICAgKi8KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgbGFzdCBkYXRhIG91dHB1dCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQgKFNUTTMyTDA3eC9TVE0zMkwwOHggb25seSkKKyAgKiBAcmV0dmFsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBkYXRhIG91dHB1dCB2YWx1ZS4KKyAgKi8KK19fd2VhayB1aW50MzJfdCBIQUxfREFDX0dldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZGFjKTsKKyAgVU5VU0VEKENoYW5uZWwpOworCisgIC8qIE5vdGUgOiBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW50byB0aGlzIGZpbGUgZm9yIGxpYnJhcnkgcmVmZXJlbmNlLiAqLworICAvKiAgICAgICAgRnVuY3Rpb24gY29udGVudCBpcyBsb2NhdGVkIGludG8gZmlsZSBzdG0zMmwweHhfaGFsX2RhY19leC5jICAgKi8KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiAwVTsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGVzIERBQyBpbnRlcnJ1cHQgcmVxdWVzdAorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9EQUNfSVJRSGFuZGxlcihEQUNfSGFuZGxlVHlwZURlZiogaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTm90ZSA6IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbnRvIHRoaXMgZmlsZSBmb3IgbGlicmFyeSByZWZlcmVuY2UuICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMybDB4eF9oYWxfZGFjX2V4LmMgICAqLworCit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZSBmb3IgQ2hhbm5lbDEKKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJzaW9uIGhhbGYgRE1BIHRyYW5zZmVyIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlIGZvciBDaGFubmVsMQorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRXJyb3IgREFDIGNhbGxiYWNrIGZvciBDaGFubmVsMS4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX0Vycm9yQ2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0Vycm9yQ2FsbGJhY2tDaDEgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgdW5kZXJydW4gREFDIGNhbGxiYWNrIGZvciBjaGFubmVsMS4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX0RNQVVuZGVycnVuQ2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0RNQVVuZGVycnVuQ2FsbGJhY2tDaDEgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIGNoYW5uZWxzLgorICAgICAgKCspIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgREFDIGNoYW5uZWwuCisgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgc0NvbmZpZyBEQUMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZCAoU1RNMzJMMDd4L1NUTTMyTDA4eCBvbmx5KQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19Db25maWdDaGFubmVsKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCBEQUNfQ2hhbm5lbENvbmZUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXByZWcxID0gMFUsIHRtcHJlZzIgPSAwVTsKKworICAvKiBDaGVjayB0aGUgREFDIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19UUklHR0VSKHNDb25maWctPkRBQ19UcmlnZ2VyKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfT1VUUFVUX0JVRkZFUl9TVEFURShzQ29uZmlnLT5EQUNfT3V0cHV0QnVmZmVyKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChDaGFubmVsKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZGFjKTsKKworICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9CVVNZOworCisgIC8qIEdldCB0aGUgREFDIENSIHZhbHVlICovCisgIHRtcHJlZzEgPSBoZGFjLT5JbnN0YW5jZS0+Q1I7CisgIC8qIENsZWFyIEJPRkZ4LCBURU54LCBUU0VMeCwgV0FWRXggYW5kIE1BTVB4IGJpdHMgKi8KKyAgdG1wcmVnMSAmPSB+KCgodWludDMyX3QpKERBQ19DUl9NQU1QMSB8IERBQ19DUl9XQVZFMSB8IERBQ19DUl9UU0VMMSB8IERBQ19DUl9URU4xIHwgREFDX0NSX0JPRkYxKSkgPDwgQ2hhbm5lbCk7CisgIC8qIENvbmZpZ3VyZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOiBidWZmZXIgb3V0cHV0LCB0cmlnZ2VyICovCisgIC8qIFNldCBUU0VMeCBhbmQgVEVOeCBiaXRzIGFjY29yZGluZyB0byBEQUNfVHJpZ2dlciB2YWx1ZSAqLworICAvKiBTZXQgQk9GRnggYml0IGFjY29yZGluZyB0byBEQUNfT3V0cHV0QnVmZmVyIHZhbHVlICovICAgCisgIHRtcHJlZzIgPSAoc0NvbmZpZy0+REFDX1RyaWdnZXIgfCBzQ29uZmlnLT5EQUNfT3V0cHV0QnVmZmVyKTsKKyAgLyogQ2FsY3VsYXRlIENSIHJlZ2lzdGVyIHZhbHVlIGRlcGVuZGluZyBvbiBEQUNfQ2hhbm5lbCAqLworICB0bXByZWcxIHw9IHRtcHJlZzIgPDwgQ2hhbm5lbDsKKyAgLyogV3JpdGUgdG8gREFDIENSICovCisgIGhkYWMtPkluc3RhbmNlLT5DUiA9IHRtcHJlZzE7CisgIC8qIERpc2FibGUgd2F2ZSBnZW5lcmF0aW9uICovCisgIENMRUFSX0JJVChoZGFjLT5JbnN0YW5jZS0+Q1IsIChEQUNfQ1JfV0FWRTEgPDwgQ2hhbm5lbCkpOworICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNAorICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bworICAgICAgKCspIENoZWNrIHRoZSBEQUMgc3RhdGUuCisgICAgICAoKykgQ2hlY2sgdGhlIERBQyBFcnJvcnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgcmV0dXJuIHRoZSBEQUMgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfREFDX1N0YXRlVHlwZURlZiBIQUxfREFDX0dldFN0YXRlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKQoreworICAvKiBSZXR1cm4gREFDIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaGRhYy0+U3RhdGU7Cit9CisKKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIERBQyBlcnJvciBjb2RlCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgREFDIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9EQUNfR2V0RXJyb3IoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIHJldHVybiBoZGFjLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIHZhbHVlIGZvciBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMjogREFDIENoYW5uZWwyIHNlbGVjdGVkIChTVE0zMkwwN3gvU1RNMzJMMDh4IG9ubHkpCisgICogQHBhcmFtICBBbGlnbm1lbnQgU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWdubWVudC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fOEJfUjogOGJpdCByaWdodCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fMTJCX0w6IDEyYml0IGxlZnQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0FMSUdOXzEyQl9SOiAxMmJpdCByaWdodCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqIEBwYXJhbSAgRGF0YSBEYXRhIHRvIGJlIGxvYWRlZCBpbiB0aGUgc2VsZWN0ZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IEFsaWdubWVudCwgdWludDMyX3QgRGF0YSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisgIFVOVVNFRChDaGFubmVsKTsKKyAgVU5VU0VEKEFsaWdubWVudCk7CisgIFVOVVNFRChEYXRhKTsKKyAgLyogTm90ZSA6IFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbnRvIHRoaXMgZmlsZSBmb3IgbGlicmFyeSByZWZlcmVuY2UuICovCisgIC8qICAgICAgICBGdW5jdGlvbiBjb250ZW50IGlzIGxvY2F0ZWQgaW50byBmaWxlIHN0bTMybDB4eF9oYWxfZGFjX2V4LmMgICAqLworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEB9CisgICovCisKKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBEQUMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjayAKKyAgKiBAcGFyYW0gaGRhYyBEQUMgaGFuZGxlCisgICogQHBhcmFtIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAgREFDIEVycm9yIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gxX0NPTVBMRVRFX0NCX0lEICAgICAgIERBQyBDSDEgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDFfSEFMRl9DT01QTEVURV9DQl9JRCAgREFDIENIMSBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gxX0VSUk9SX0lEICAgICAgICAgICAgIERBQyBDSDEgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDFfVU5ERVJSVU5fQ0JfSUQgICAgICAgREFDIENIMSBVbmRlclJ1biBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX0NIMl9DT01QTEVURV9DQl9JRCAgICAgICBEQUMgQ0gyIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgCisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gyX0hBTEZfQ09NUExFVEVfQ0JfSUQgIERBQyBDSDIgSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRCAKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDJfRVJST1JfSUQgICAgICAgICAgICAgREFDIENIMiBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgIAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX0NIMl9VTkRFUlJVTl9DQl9JRCAgICAgICBEQUMgQ0gyIFVuZGVyUnVuIENhbGxiYWNrIElEICAgICAgICAgCisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfTVNQX0lOSVRfQ0JfSUQgICAgICAgICAgIERBQyBNU1AgSW5pdCBDYWxsYmFjayBJRCAgICAgICAgCisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfTVNQX0RFSU5JVF9DQl9JRCAgICAgICAgIERBQyBNU1AgRGVJbml0IENhbGxiYWNrIElEICAgCisgICoKKyAgICAqIEBwYXJhbSBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19SZWdpc3RlckNhbGxiYWNrIChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgSEFMX0RBQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lkLCBwREFDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZihwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhkYWMtPkVycm9yQ29kZSB8PSBIQUxfREFDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRhYyk7CisgIAorICBpZihoZGFjLT5TdGF0ZSA9PSBIQUxfREFDX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lkKQorICAgIHsKKyAgICBjYXNlIEhBTF9EQUNfQ0gxX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDEgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gxX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgaGRhYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2tDaDEgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gxX0VSUk9SX0lEIDoKKyAgICAgIGhkYWMtPkVycm9yQ2FsbGJhY2tDaDEgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gxX1VOREVSUlVOX0NCX0lEIDoKKyAgICAgIGhkYWMtPkRNQVVuZGVycnVuQ2FsbGJhY2tDaDEgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gyX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDIgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gyX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgaGRhYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2tDaDIgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gyX0VSUk9SX0lEIDoKKyAgICAgIGhkYWMtPkVycm9yQ2FsbGJhY2tDaDIgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gyX1VOREVSUlVOX0NCX0lEIDoKKyAgICAgIGhkYWMtPkRNQVVuZGVycnVuQ2FsbGJhY2tDaDIgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfTVNQX0lOSVRfQ0JfSUQgOgorICAgICAgaGRhYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfREFDX01TUF9ERUlOSVRfQ0JfSUQgOgorICAgICAgaGRhYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgaGRhYy0+RXJyb3JDb2RlIHw9IEhBTF9EQUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsgCisgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChoZGFjLT5TdGF0ZSA9PSBIQUxfREFDX1NUQVRFX1JFU0VUKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lkKQorICAgIHsKKyAgICBjYXNlIEhBTF9EQUNfTVNQX0lOSVRfQ0JfSUQgOgorICAgICAgaGRhYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfREFDX01TUF9ERUlOSVRfQ0JfSUQgOgorICAgICAgaGRhYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgaGRhYy0+RXJyb3JDb2RlIHw9IEhBTF9EQUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsgCisgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOyAKKyAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhkYWMpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBVc2VyIERBQyBDYWxsYmFjaworICAqICAgICAgICAgREFDIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sgCisgICogQHBhcmFtIGhkYWMgREFDIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gxX0NPTVBMRVRFX0NCX0lEICAgICAgICAgIERBQyBDSDEgdHJhbmZlciBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgCisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gxX0hBTEZfQ09NUExFVEVfQ0JfSUQgICAgIERBQyBDSDEgSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgCisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gxX0VSUk9SX0lEICAgICAgICAgICAgICAgIERBQyBDSDEgRXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gxX1VOREVSUlVOX0NCX0lEICAgICAgICAgIERBQyBDSDEgVW5kZXJSdW4gQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDJfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgREFDIENIMiBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDJfSEFMRl9DT01QTEVURV9DQl9JRCAgICAgREFDIENIMiBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDJfRVJST1JfSUQgICAgICAgICAgICAgICAgREFDIENIMiBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDJfVU5ERVJSVU5fQ0JfSUQgICAgICAgICAgREFDIENIMiBVbmRlclJ1biBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX01TUF9JTklUX0NCX0lEICAgICAgICAgICAgICBEQUMgTVNQIEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX01TUF9ERUlOSVRfQ0JfSUQgICAgICAgICAgICBEQUMgTVNQIERlSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgIAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX0FMTF9DQl9JRCAgICAgICAgICAgICAgICAgICBEQUMgQWxsIGNhbGxiYWNrcworICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1VuUmVnaXN0ZXJDYWxsYmFjayAoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIEhBTF9EQUNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRhYyk7CisgIAorICBpZihoZGFjLT5TdGF0ZSA9PSBIQUxfREFDX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICBjYXNlIEhBTF9EQUNfQ0gxX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDEgPSBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gxX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgaGRhYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2tDaDEgPSBIQUxfREFDX0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfREFDX0NIMV9FUlJPUl9JRCA6CisgICAgICBoZGFjLT5FcnJvckNhbGxiYWNrQ2gxID0gSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfREFDX0NIMV9VTkRFUlJVTl9DQl9JRCA6CisgICAgICBoZGFjLT5ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxID0gSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfREFDX0NIMl9DT01QTEVURV9DQl9JRCA6CisgICAgICBoZGFjLT5Db252Q3BsdENhbGxiYWNrQ2gyID0gSEFMX0RBQ0V4X0NvbnZDcGx0Q2FsbGJhY2tDaDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gyX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgaGRhYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2tDaDIgPSBIQUxfREFDRXhfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQ0gyX0VSUk9SX0lEIDoKKyAgICAgIGhkYWMtPkVycm9yQ2FsbGJhY2tDaDIgPSBIQUxfREFDRXhfRXJyb3JDYWxsYmFja0NoMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX0RBQ19DSDJfVU5ERVJSVU5fQ0JfSUQgOgorICAgICAgaGRhYy0+RE1BVW5kZXJydW5DYWxsYmFja0NoMiA9IEhBTF9EQUNFeF9ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfREFDX01TUF9JTklUX0NCX0lEIDoKKyAgICAgIGhkYWMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9EQUNfTXNwSW5pdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX0RBQ19NU1BfREVJTklUX0NCX0lEIDoKKyAgICAgIGhkYWMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0RBQ19Nc3BEZUluaXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfQUxMX0NCX0lEIDoKKyAgICAgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDEgPSBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDE7CisgICAgICBoZGFjLT5Db252SGFsZkNwbHRDYWxsYmFja0NoMSA9IEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDE7CisgICAgICBoZGFjLT5FcnJvckNhbGxiYWNrQ2gxID0gSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxOworICAgICAgaGRhYy0+RE1BVW5kZXJydW5DYWxsYmFja0NoMSA9IEhBTF9EQUNfRE1BVW5kZXJydW5DYWxsYmFja0NoMTsKKyAgICAgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDIgPSBIQUxfREFDRXhfQ29udkNwbHRDYWxsYmFja0NoMjsKKyAgICAgIGhkYWMtPkNvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyID0gSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyOworICAgICAgaGRhYy0+RXJyb3JDYWxsYmFja0NoMiA9IEhBTF9EQUNFeF9FcnJvckNhbGxiYWNrQ2gyOworICAgICAgaGRhYy0+RE1BVW5kZXJydW5DYWxsYmFja0NoMiA9IEhBTF9EQUNFeF9ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gyOworICAgICAgaGRhYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0RBQ19Nc3BJbml0OworICAgICAgaGRhYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfREFDX01zcERlSW5pdDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOyAKKyAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhkYWMtPlN0YXRlID09IEhBTF9EQUNfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX0RBQ19NU1BfSU5JVF9DQl9JRCA6CisgICAgICBoZGFjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfREFDX01zcEluaXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9EQUNfTVNQX0RFSU5JVF9DQl9JRCA6CisgICAgICBoZGFjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9EQUNfTXNwRGVJbml0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhkYWMtPkVycm9yQ29kZSB8PSBIQUxfREFDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7IAorICAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGRhYy0+RXJyb3JDb2RlIHw9IEhBTF9EQUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsgCisgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBIQUxfREFDX01PRFVMRV9FTkFCTEVEICovCisjZW5kaWYgLyogIVNUTTMyTDAxMHhCICYmICFTVE0zMkwwMTB4OCAmJiAhU1RNMzJMMDEweDYgJiYgIVNUTTMyTDAxMHg0ICYmICFTVE0zMkwwMTF4eCAmJiAhU1RNMzJMMDIxeHggJiYgIVNUTTMyTDAzMXh4ICYmICFTVE0zMkwwNDF4eCAmJiAhU1RNMzJMMDUxeHggJiYgIVNUTTMyTDA2MXh4JiYgIVNUTTMyTDA3MXh4JiYgIVNUTTMyTDA4MXh4ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsX2RhY19leC5jIGIvU3JjL3N0bTMybDB4eF9oYWxfZGFjX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4ZDM4YgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX2RhY19leC5jCkBAIC0wLDAgKzEsMTA0OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfZGFjX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIERBQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIERBQyBleHRlbnNpb24gcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKiAgICAgCisgICogICAgIAorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICAgICAgICAgIAorICAgICAgKCspIFdoZW4gRHVhbCBtb2RlIGlzIGVuYWJsZWQgKGkuZSBEQUMgQ2hhbm5lbDEgYW5kIENoYW5uZWwyIGFyZSB1c2VkIHNpbXVsdGFuZW91c2x5KSA6CisgICAgICAgICAgVXNlIEhBTF9EQUNFeF9EdWFsR2V0VmFsdWUoKSB0byBnZXQgZGlnaXRhbCBkYXRhIHRvIGJlIGNvbnZlcnRlZCBhbmQgdXNlCisgICAgICAgICAgSEFMX0RBQ0V4X0R1YWxTZXRWYWx1ZSgpIHRvIHNldCBkaWdpdGFsIHZhbHVlIHRvIGNvbnZlcnRlZCBzaW11bHRhbmVvdXNseSBpbiBDaGFubmVsIDEgYW5kIENoYW5uZWwgMi4gIAorICAgICAgKCspIFVzZSBIQUxfREFDRXhfVHJpYW5nbGVXYXZlR2VuZXJhdGUoKSB0byBnZW5lcmF0ZSBUcmlhbmdsZSBzaWduYWwuCisgICAgICAoKykgVXNlIEhBTF9EQUNFeF9Ob2lzZVdhdmVHZW5lcmF0ZSgpIHRvIGdlbmVyYXRlIE5vaXNlIHNpZ25hbC4KKyAgCisgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDExeHgpICYmICFkZWZpbmVkIChTVE0zMkwwMjF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAzMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDQxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwNTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDA2MXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDcxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwODF4eCkKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisjaWZkZWYgSEFMX0RBQ19NT0RVTEVfRU5BQkxFRAorLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERBQ0V4IERBQ0V4CisgICogQGJyaWVmIERBQyBkcml2ZXIgbW9kdWxlcworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNFeF9Qcml2YXRlCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZCAoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpCitzdGF0aWMgdm9pZCBEQUNfRE1BQ29udkNwbHRDaDIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgREFDX0RNQUVycm9yQ2gyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIERBQ19ETUFIYWxmQ29udkNwbHRDaDIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOyAKKyNlbmRpZgorc3RhdGljIHZvaWQgREFDX0RNQUNvbnZDcGx0Q2gxKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIERBQ19ETUFFcnJvckNoMShETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBEQUNfRE1BSGFsZkNvbnZDcGx0Q2gxKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgCisgKgorCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KQorLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBsYXN0IGRhdGEgb3V0cHV0IHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgZGF0YSBvdXRwdXQgdmFsdWUuCisgICovCit1aW50MzJfdCBIQUxfREFDRXhfRHVhbEdldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKQoreworICB1aW50MzJfdCB0bXAgPSAwVTsKKyAgCisgIHRtcCB8PSBoZGFjLT5JbnN0YW5jZS0+RE9SMTsKKyAgCisgIHRtcCB8PSBoZGFjLT5JbnN0YW5jZS0+RE9SMiA8PCAxNlU7CisgIAorICAvKiBSZXR1cm5zIHRoZSBEQUMgY2hhbm5lbCBkYXRhIG91dHB1dCByZWdpc3RlciB2YWx1ZSAqLworICByZXR1cm4gdG1wOworfQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIHdhdmUgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZCAoU1RNMzJMMDd4L1NUTTMyTDA4eCBvbmx5KQorICAqIEBwYXJhbSAgQW1wbGl0dWRlIFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlLiAKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMQorICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMzogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNzogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgNworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTU6IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDE1CisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV8zMTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMzEKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX1RSSUFOR0xFQU1QTElUVURFXzYzOiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA2MworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTI3OiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAxMjcKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX1RSSUFOR0xFQU1QTElUVURFXzI1NTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMjU1CisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV81MTE6IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDUxMQorICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMTAyMzogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMTAyMworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMjA0NzogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMjA0NworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNDA5NTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgNDA5NQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ0V4X1RyaWFuZ2xlV2F2ZUdlbmVyYXRlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBBbXBsaXR1ZGUpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfTEZTUl9VTk1BU0tfVFJJQU5HTEVfQU1QTElUVURFKEFtcGxpdHVkZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRhYyk7CisKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfQlVTWTsKKworICAvKiBFbmFibGUgdGhlIHRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisgIE1PRElGWV9SRUcoaGRhYy0+SW5zdGFuY2UtPkNSLCAoKERBQ19DUl9XQVZFMSl8KERBQ19DUl9NQU1QMSkpPDxDaGFubmVsLCAoREFDX0NSX1dBVkUxXzEgfCBBbXBsaXR1ZGUpIDw8IENoYW5uZWwpOworIAorCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkYWMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgd2F2ZSBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4gCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZCAoU1RNMzJMMDd4L1NUTTMyTDA4eCBvbmx5KQorICAqIEBwYXJhbSAgQW1wbGl0dWRlIFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0MCBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFMxXzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzJfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzI6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTM18wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMzowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFM0XzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs0OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzVfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzU6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTNl8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbNjowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFM3XzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs3OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzhfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0Wzg6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTOV8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbOTowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFMxMF8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMTA6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTMTFfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzExOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9Ob2lzZVdhdmVHZW5lcmF0ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQW1wbGl0dWRlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX0xGU1JfVU5NQVNLX1RSSUFOR0xFX0FNUExJVFVERShBbXBsaXR1ZGUpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKy8qIEVuYWJsZSB0aGUgbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyAgTU9ESUZZX1JFRyhoZGFjLT5JbnN0YW5jZS0+Q1IsICgoREFDX0NSX1dBVkUxKXwoREFDX0NSX01BTVAxKSk8PENoYW5uZWwsIChEQUNfQ1JfV0FWRTFfMCB8IEFtcGxpdHVkZSkgPDwgQ2hhbm5lbCk7CisKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGRhYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisjaWYgZGVmaW5lZCAoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgZHVhbCBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBBbGlnbm1lbnQgU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWdubWVudCBmb3IgZHVhbCBjaGFubmVsIERBQy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgREFDX0FMSUdOXzhCX1I6IDhiaXQgcmlnaHQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIERBQ19BTElHTl8xMkJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgREFDX0FMSUdOXzEyQl9SOiAxMmJpdCByaWdodCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqIEBwYXJhbSAgRGF0YTEgRGF0YSBmb3IgREFDIENoYW5uZWwxIHRvIGJlIGxvYWRlZCBpbiB0aGUgc2VsZWN0ZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgRGF0YTIgRGF0YSBmb3IgREFDIENoYW5uZWwyIHRvIGJlIGxvYWRlZCBpbiB0aGUgc2VsZWN0ZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyLgorICAqIEBub3RlICAgSW4gZHVhbCBtb2RlLCBhIHVuaXF1ZSByZWdpc3RlciBhY2Nlc3MgaXMgcmVxdWlyZWQgdG8gd3JpdGUgaW4gYm90aAorICAqICAgICAgICAgIERBQyBjaGFubmVscyBhdCB0aGUgc2FtZSB0aW1lLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ0V4X0R1YWxTZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQWxpZ25tZW50LCB1aW50MzJfdCBEYXRhMSwgdWludDMyX3QgRGF0YTIpCit7ICAKKyAgdWludDMyX3QgZGF0YSA9IDBVLCB0bXAgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQUxJR04oQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfREFUQShEYXRhMSkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX0RBVEEoRGF0YTIpKTsKKyAgCisgIC8qIENhbGN1bGF0ZSBhbmQgc2V0IGR1YWwgREFDIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSAqLworICBpZiAoQWxpZ25tZW50ID09IERBQ19BTElHTl84Ql9SKQorICB7CisgICAgZGF0YSA9ICgodWludDMyX3QpRGF0YTIgPDwgOFUpIHwgRGF0YTE7IAorICB9CisgIGVsc2UKKyAgeworICAgIGRhdGEgPSAoKHVpbnQzMl90KURhdGEyIDw8IDE2VSkgfCBEYXRhMTsKKyAgfQorICAKKyAgdG1wID0gKHVpbnQzMl90KWhkYWMtPkluc3RhbmNlOworICB0bXAgKz0gREFDX0RIUjEyUkRfQUxJR05NRU5UKEFsaWdubWVudCk7CisKKyAgLyogU2V0IHRoZSBkdWFsIERBQyBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgKi8KKyAgKihfX0lPIHVpbnQzMl90ICopdG1wID0gZGF0YTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlIGZvciBDaGFubmVsMiAKKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDRXhfQ29udkNwbHRDYWxsYmFja0NoMihEQUNfSGFuZGxlVHlwZURlZiogaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9EQUNFeF9Db252Q3BsdENhbGxiYWNrQ2gyIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVyc2lvbiBoYWxmIERNQSB0cmFuc2ZlciBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSBmb3IgQ2hhbm5lbDIgCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZGFjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRXJyb3IgREFDIGNhbGxiYWNrIGZvciBDaGFubmVsMi4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDRXhfRXJyb3JDYWxsYmFja0NoMihEQUNfSGFuZGxlVHlwZURlZiAqaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9EQUNFeF9FcnJvckNhbGxiYWNrQ2gyIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIHVuZGVycnVuIERBQyBjYWxsYmFjayBmb3IgQ2hhbm5lbDIuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ0V4X0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIERBQyBhbmQgc3RhcnRzIGNvbnZlcnNpb24gb2YgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TdGFydChEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wMSA9IDBVLCB0bXAyID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRhYyk7CisKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfQlVTWTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGFyYWwgKi8KKyAgX19IQUxfREFDX0VOQUJMRShoZGFjLCBDaGFubmVsKTsKKworICBpZihDaGFubmVsID09IERBQ19DSEFOTkVMXzEpCisgIHsKKyAgICB0bXAxID0gaGRhYy0+SW5zdGFuY2UtPkNSICYgREFDX0NSX1RFTjE7CisgICAgdG1wMiA9IGhkYWMtPkluc3RhbmNlLT5DUiAmIERBQ19DUl9UU0VMMTsKKyAgICAvKiBDaGVjayBpZiBzb2Z0d2FyZSB0cmlnZ2VyIGVuYWJsZWQgKi8KKyAgICBpZigodG1wMSA9PSAgREFDX0NSX1RFTjEpICYmICh0bXAyID09ICBEQUNfQ1JfVFNFTDEpKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgREFDIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKyAgICAgIFNFVF9CSVQoaGRhYy0+SW5zdGFuY2UtPlNXVFJJR1IsIERBQ19TV1RSSUdSX1NXVFJJRzEpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXAxID0gaGRhYy0+SW5zdGFuY2UtPkNSICYgREFDX0NSX1RFTjI7CisgICAgdG1wMiA9IGhkYWMtPkluc3RhbmNlLT5DUiAmIERBQ19DUl9UU0VMMjsKKyAgICAvKiBDaGVjayBpZiBzb2Z0d2FyZSB0cmlnZ2VyIGVuYWJsZWQgKi8KKyAgICBpZigodG1wMSA9PSBEQUNfQ1JfVEVOMikgJiYgKHRtcDIgPT0gREFDX0NSX1RTRUwyKSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIERBQyBzb2Z0d2FyZSBjb252ZXJzaW9uKi8KKyAgICAgIFNFVF9CSVQoaGRhYy0+SW5zdGFuY2UtPlNXVFJJR1IsIERBQ19TV1RSSUdSX1NXVFJJRzIpOworICAgIH0KKyAgfQorCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkYWMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIERBQyBhbmQgc3RhcnRzIGNvbnZlcnNpb24gb2YgY2hhbm5lbCB1c2luZyBETUEuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBwZXJpcGhlcmFsIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBEQUMgcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgQWxpZ25tZW50IFNwZWNpZmllcyB0aGUgZGF0YSBhbGlnbm1lbnQgZm9yIERBQyBjaGFubmVsLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl84Ql9SOiA4Yml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl8xMkJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fMTJCX1I6IDEyYml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0YXJ0X0RNQShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QqIHBEYXRhLCB1aW50MzJfdCBMZW5ndGgsIHVpbnQzMl90IEFsaWdubWVudCkKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTElHTihBbGlnbm1lbnQpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyAgaWYoQ2hhbm5lbCA9PSBEQUNfQ0hBTk5FTF8xKQorICB7CisgICAgLyogU2V0IHRoZSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgZm9yIGNoYW5uZWwxICovCisgICAgaGRhYy0+RE1BX0hhbmRsZTEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBEQUNfRE1BQ29udkNwbHRDaDE7CisKKyAgICAvKiBTZXQgdGhlIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGZvciBjaGFubmVsMSAqLworICAgIGhkYWMtPkRNQV9IYW5kbGUxLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IERBQ19ETUFIYWxmQ29udkNwbHRDaDE7CisKKyAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayBmb3IgY2hhbm5lbDEgKi8KKyAgICBoZGFjLT5ETUFfSGFuZGxlMS0+WGZlckVycm9yQ2FsbGJhY2sgPSBEQUNfRE1BRXJyb3JDaDE7CisKKyAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsMSBETUEgcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaGRhYy0+SW5zdGFuY2UtPkNSLCBEQUNfQ1JfRE1BRU4xKTsKKyAgICAgICAKKyAgICAvKiBDYXNlIG9mIHVzZSBvZiBjaGFubmVsIDEgKi8KKyAgICBzd2l0Y2goQWxpZ25tZW50KQorICAgIHsKKyAgICAgIGNhc2UgREFDX0FMSUdOXzEyQl9SOgorICAgICAgICAvKiBHZXQgREhSMTJSMSBhZGRyZXNzICovCisgICAgICAgIHRtcHJlZyA9ICh1aW50MzJfdCkmaGRhYy0+SW5zdGFuY2UtPkRIUjEyUjE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQUNfQUxJR05fMTJCX0w6CisgICAgICAgIC8qIEdldCBESFIxMkwxIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSMTJMMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERBQ19BTElHTl84Ql9SOgorICAgICAgICAvKiBHZXQgREhSOFIxIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSOFIxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBVTlVTRUQodG1wcmVnKTsJCS8qIGF2b2lkIHdhcm5pbmcgb24gdG1wcmVnIGFmZmVjdGF0aW9uIHdpdGggc3R1cGlkIGNvbXBpbGVyICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IHRoZSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgZm9yIGNoYW5uZWwyICovCisgICAgaGRhYy0+RE1BX0hhbmRsZTItPlhmZXJDcGx0Q2FsbGJhY2sgPSBEQUNfRE1BQ29udkNwbHRDaDI7CisKKyAgICAvKiBTZXQgdGhlIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGZvciBjaGFubmVsMiAqLworICAgIGhkYWMtPkRNQV9IYW5kbGUyLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IERBQ19ETUFIYWxmQ29udkNwbHRDaDI7CisgICAgCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgZm9yIGNoYW5uZWwyICovCisgICAgaGRhYy0+RE1BX0hhbmRsZTItPlhmZXJFcnJvckNhbGxiYWNrID0gREFDX0RNQUVycm9yQ2gyOworCisgICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDIgRE1BIHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhkYWMtPkluc3RhbmNlLT5DUiwgREFDX0NSX0RNQUVOMik7CisKKyAgICAvKiBDYXNlIG9mIHVzZSBvZiBjaGFubmVsIDIgKi8KKyAgICBzd2l0Y2goQWxpZ25tZW50KQorICAgIHsKKyAgICAgIGNhc2UgREFDX0FMSUdOXzEyQl9SOgorICAgICAgICAvKiBHZXQgREhSMTJSMiBhZGRyZXNzICovCisgICAgICAgIHRtcHJlZyA9ICh1aW50MzJfdCkmaGRhYy0+SW5zdGFuY2UtPkRIUjEyUjI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQUNfQUxJR05fMTJCX0w6CisgICAgICAgIC8qIEdldCBESFIxMkwyIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSMTJMMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERBQ19BTElHTl84Ql9SOgorICAgICAgICAvKiBHZXQgREhSOFIyIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSOFIyOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAKKyAgLyogRW5hYmxlIHRoZSBETUEgU3RyZWFtICovCisgIGlmKENoYW5uZWwgPT0gREFDX0NIQU5ORUxfMSkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgREFDIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9EQUNfRU5BQkxFX0lUKGhkYWMsIERBQ19JVF9ETUFVRFIxKTsKKyAgICAKKyAgICAvKiBFbmFibGUgdGhlIERNQSBTdHJlYW0gKi8KKyAgICBIQUxfRE1BX1N0YXJ0X0lUKGhkYWMtPkRNQV9IYW5kbGUxLCAodWludDMyX3QpcERhdGEsIHRtcHJlZywgTGVuZ3RoKTsKKyAgfSAKKyAgZWxzZQorICB7CisgICAgLyogRW5hYmxlIHRoZSBEQUMgRE1BIHVuZGVycnVuIGludGVycnVwdCAqLworICAgIF9fSEFMX0RBQ19FTkFCTEVfSVQoaGRhYywgREFDX0lUX0RNQVVEUjIpOworICAgIAorICAgIC8qIEVuYWJsZSB0aGUgRE1BIFN0cmVhbSAqLworICAgIEhBTF9ETUFfU3RhcnRfSVQoaGRhYy0+RE1BX0hhbmRsZTIsICh1aW50MzJfdClwRGF0YSwgdG1wcmVnLCBMZW5ndGgpOworICB9CisgIAorICAvKiBFbmFibGUgdGhlIFBlcmlwaGFyYWwgKi8KKyAgX19IQUxfREFDX0VOQUJMRShoZGFjLCBDaGFubmVsKTsKKyAgCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkYWMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIERBQyBhbmQgc3RvcCBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RvcF9ETUEoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIERNQSByZXF1ZXN0ICovCisgIENMRUFSX0JJVChoZGFjLT5JbnN0YW5jZS0+Q1IsIChEQUNfQ1JfRE1BRU4xIDw8IENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhhcmFsICovCisgIF9fSEFMX0RBQ19ESVNBQkxFKGhkYWMsIENoYW5uZWwpOworCisgIC8qIERpc2FibGUgdGhlIERNQSBDaGFubmVsICovCisgIC8qIENoYW5uZWwxIGlzIHVzZWQgKi8KKyAgaWYoQ2hhbm5lbCA9PSBEQUNfQ0hBTk5FTF8xKQorICB7IAorICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaGRhYy0+RE1BX0hhbmRsZTEpOworICB9CisgIGVsc2UgLyogQ2hhbm5lbDIgaXMgdXNlZCBmb3IgKi8KKyAgeyAKKyAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhkYWMtPkRNQV9IYW5kbGUyKTsgCisgIH0KKworICAvKiBDaGVjayBpZiBETUEgQ2hhbm5lbCBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICBpZihzdGF0dXMgIT0gSEFMX09LKQorICB7CisgICAgLyogVXBkYXRlIERBQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVBRFk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgbGFzdCBkYXRhIG91dHB1dCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBkYXRhIG91dHB1dCB2YWx1ZS4KKyAgKi8KK3VpbnQzMl90IEhBTF9EQUNfR2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChDaGFubmVsKSk7CisgIAorICAvKiBSZXR1cm5zIHRoZSBEQUMgY2hhbm5lbCBkYXRhIG91dHB1dCByZWdpc3RlciB2YWx1ZSAqLworICBpZihDaGFubmVsID09IERBQ19DSEFOTkVMXzEpCisgIHsKKyAgICByZXR1cm4gaGRhYy0+SW5zdGFuY2UtPkRPUjE7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIGhkYWMtPkluc3RhbmNlLT5ET1IyOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBEQUMgaW50ZXJydXB0IHJlcXVlc3QKKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9EQUNfSVJRSGFuZGxlcihEQUNfSGFuZGxlVHlwZURlZiogaGRhYykKK3sKKyAgLyogQ2hlY2sgdW5kZXJydW4gZmxhZyBvZiBEQUMgY2hhbm5lbCAxICovCisgIGlmKF9fSEFMX0RBQ19HRVRfRkxBRyhoZGFjLCBEQUNfRkxBR19ETUFVRFIxKSkKKyAgeworICAgIC8qIENoYW5nZSBEQUMgc3RhdGUgdG8gZXJyb3Igc3RhdGUgKi8KKyAgICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfRVJST1I7CisKKyAgICAvKiBTZXQgREFDIGVycm9yIGNvZGUgdG8gY2hhbmVsMSBETUEgdW5kZXJydW4gZXJyb3IgKi8KKyAgICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9ETUFVTkRFUlJVTkNIMTsKKworICAgIC8qIENsZWFyIHRoZSB1bmRlcnJ1biBmbGFnICovCisgICAgX19IQUxfREFDX0NMRUFSX0ZMQUcoaGRhYyxEQUNfRkxBR19ETUFVRFIxKTsKKworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsMSBETUEgcmVxdWVzdCAqLworICAgIENMRUFSX0JJVChoZGFjLT5JbnN0YW5jZS0+Q1IsIERBQ19DUl9ETUFFTjEpOworCisgICAgLyogRXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoZGFjLT5ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKGhkYWMpOworI2Vsc2UKKyAgICBIQUxfREFDX0RNQVVuZGVycnVuQ2FsbGJhY2tDaDEoaGRhYyk7CisjZW5kaWYKKyAgfQorICAKKyAgLyogQ2hlY2sgdW5kZXJydW4gZmxhZyBvZiBEQUMgY2hhbm5lbCAyICovCisgIGlmKF9fSEFMX0RBQ19HRVRfRkxBRyhoZGFjLCBEQUNfRkxBR19ETUFVRFIyKSkKKyAgeworICAgIC8qIENoYW5nZSBEQUMgc3RhdGUgdG8gZXJyb3Igc3RhdGUgKi8KKyAgICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfRVJST1I7CisgICAgCisgICAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIGNoYW5uZWwyIERNQSB1bmRlcnJ1biBlcnJvciAqLworICAgIGhkYWMtPkVycm9yQ29kZSB8PSBIQUxfREFDX0VSUk9SX0RNQVVOREVSUlVOQ0gyOworICAgIAorICAgIC8qIENsZWFyIHRoZSB1bmRlcnJ1biBmbGFnICovCisgICAgX19IQUxfREFDX0NMRUFSX0ZMQUcoaGRhYyxEQUNfRkxBR19ETUFVRFIyKTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDEgRE1BIHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaGRhYy0+SW5zdGFuY2UtPkNSLCBEQUNfQ1JfRE1BRU4yKTsKKyAgICAgIAorICAgIC8qIEVycm9yIGNhbGxiYWNrICovIAorI2lmIChVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhkYWMtPkRNQVVuZGVycnVuQ2FsbGJhY2tDaDIoaGRhYyk7CisjZWxzZQorICAgIEhBTF9EQUNFeF9ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gyKGhkYWMpOworI2VuZGlmCisgIH0KK30KKworCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgREFDIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIEFsaWdubWVudCBTcGVjaWZpZXMgdGhlIGRhdGEgYWxpZ25tZW50LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl84Ql9SOiA4Yml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl8xMkJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fMTJCX1I6IDEyYml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogQHBhcmFtICBEYXRhIERhdGEgdG8gYmUgbG9hZGVkIGluIHRoZSBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1NldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBBbGlnbm1lbnQsIHVpbnQzMl90IERhdGEpCit7CisgIF9fSU8gdWludDMyX3QgdG1wID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTElHTihBbGlnbm1lbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19EQVRBKERhdGEpKTsKKworICB0bXAgPSAodWludDMyX3QpaGRhYy0+SW5zdGFuY2U7IAorICBpZihDaGFubmVsID09IERBQ19DSEFOTkVMXzEpCisgIHsKKyAgICB0bXAgKz0gREFDX0RIUjEyUjFfQUxJR05NRU5UKEFsaWdubWVudCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wICs9IERBQ19ESFIxMlIyX0FMSUdOTUVOVChBbGlnbm1lbnQpOworICB9CisKKyAgLyogU2V0IHRoZSBEQUMgY2hhbm5lbCBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgKi8KKyAgKihfX0lPIHVpbnQzMl90ICopIHRtcCA9IERhdGE7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorI2Vsc2UgLyogQWxsIHByb2R1Y3RzIHdpdGggb25seSBvbmUgY2hhbm5lbCAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgREFDIGFuZCBzdGFydHMgY29udmVyc2lvbiBvZiBjaGFubmVsLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiAKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RhcnQoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcDEgPSAwVSwgdG1wMiA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhhcmFsICovCisgIF9fSEFMX0RBQ19FTkFCTEUoaGRhYywgQ2hhbm5lbCk7CisKKyAgdG1wMSA9IGhkYWMtPkluc3RhbmNlLT5DUiAmIERBQ19DUl9URU4xOworICB0bXAyID0gaGRhYy0+SW5zdGFuY2UtPkNSICYgREFDX0NSX1RTRUwxOworICAvKiBDaGVjayBpZiBzb2Z0d2FyZSB0cmlnZ2VyIGVuYWJsZWQgKi8KKyAgaWYoKHRtcDEgPT0gIERBQ19DUl9URU4xKSAmJiAodG1wMiA9PSAgREFDX0NSX1RTRUwxKSkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgREFDIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKyAgICBTRVRfQklUKGhkYWMtPkluc3RhbmNlLT5TV1RSSUdSLCBEQUNfU1dUUklHUl9TV1RSSUcxKTsKKyAgfQorCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkYWMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIERBQyBhbmQgc3RhcnRzIGNvbnZlcnNpb24gb2YgY2hhbm5lbCB1c2luZyBETUEuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIGRlc3RpbmF0aW9uIHBlcmlwaGVyYWwgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIERBQyBwZXJpcGhlcmFsCisgICogQHBhcmFtICBBbGlnbm1lbnQgU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWdubWVudCBmb3IgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0FMSUdOXzhCX1I6IDhiaXQgcmlnaHQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0FMSUdOXzEyQl9MOiAxMmJpdCBsZWZ0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl8xMkJfUjogMTJiaXQgcmlnaHQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RhcnRfRE1BKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCwgdWludDMyX3QgQWxpZ25tZW50KQoreworICB1aW50MzJfdCB0bXByZWcgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMSUdOKEFsaWdubWVudCkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRhYyk7CisKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfQlVTWTsKKworICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayBmb3IgY2hhbm5lbDEgKi8KKyAgaGRhYy0+RE1BX0hhbmRsZTEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBEQUNfRE1BQ29udkNwbHRDaDE7CisKKyAgLyogU2V0IHRoZSBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayBmb3IgY2hhbm5lbDEgKi8KKyAgaGRhYy0+RE1BX0hhbmRsZTEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gREFDX0RNQUhhbGZDb252Q3BsdENoMTsKKworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayBmb3IgY2hhbm5lbDEgKi8KKyAgaGRhYy0+RE1BX0hhbmRsZTEtPlhmZXJFcnJvckNhbGxiYWNrID0gREFDX0RNQUVycm9yQ2gxOworCisgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwxIERNQSByZXF1ZXN0ICovCisgIFNFVF9CSVQoaGRhYy0+SW5zdGFuY2UtPkNSLCBEQUNfQ1JfRE1BRU4xKTsKKyAgICAgCisgIC8qIENhc2Ugb2YgdXNlIG9mIGNoYW5uZWwgMSAqLworICBzd2l0Y2goQWxpZ25tZW50KQorICB7CisgICAgY2FzZSBEQUNfQUxJR05fMTJCX1I6CisgICAgICAvKiBHZXQgREhSMTJSMSBhZGRyZXNzICovCisgICAgICB0bXByZWcgPSAodWludDMyX3QpJmhkYWMtPkluc3RhbmNlLT5ESFIxMlIxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQUNfQUxJR05fMTJCX0w6CisgICAgICAvKiBHZXQgREhSMTJMMSBhZGRyZXNzICovCisgICAgICB0bXByZWcgPSAodWludDMyX3QpJmhkYWMtPkluc3RhbmNlLT5ESFIxMkwxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQUNfQUxJR05fOEJfUjoKKyAgICAgIC8qIEdldCBESFI4UjEgYWRkcmVzcyAqLworICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSOFIxOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIFVOVVNFRCh0bXByZWcpOwkJLyogYXZvaWQgd2FybmluZyBvbiB0bXByZWcgYWZmZWN0YXRpb24gd2l0aCBzdHVwaWQgY29tcGlsZXIgKi8KKyAgCisgIC8qIEVuYWJsZSB0aGUgRE1BIFN0cmVhbSAqLworICAvKiBFbmFibGUgdGhlIERBQyBETUEgdW5kZXJydW4gaW50ZXJydXB0ICovCisgIF9fSEFMX0RBQ19FTkFCTEVfSVQoaGRhYywgREFDX0lUX0RNQVVEUjEpOworICAKKyAgLyogRW5hYmxlIHRoZSBETUEgU3RyZWFtICovCisgIEhBTF9ETUFfU3RhcnRfSVQoaGRhYy0+RE1BX0hhbmRsZTEsICh1aW50MzJfdClwRGF0YSwgdG1wcmVnLCBMZW5ndGgpOworICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhhcmFsICovCisgIF9fSEFMX0RBQ19FTkFCTEUoaGRhYywgQ2hhbm5lbCk7CisgIAorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyBEQUMgYW5kIHN0b3AgY29udmVyc2lvbiBvZiBjaGFubmVsLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiAKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RvcF9ETUEoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIERNQSByZXF1ZXN0ICovCisgIENMRUFSX0JJVChoZGFjLT5JbnN0YW5jZS0+Q1IsIChEQUNfQ1JfRE1BRU4xIDw8IENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhhcmFsICovCisgIF9fSEFMX0RBQ19ESVNBQkxFKGhkYWMsIENoYW5uZWwpOworCisgIC8qIERpc2FibGUgdGhlIERNQSBDaGFubmVsICovCisgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaGRhYy0+RE1BX0hhbmRsZTEpOworCisgIC8qIENoZWNrIGlmIERNQSBDaGFubmVsIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgIGlmKHN0YXR1cyAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBVcGRhdGUgREFDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICAgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBsYXN0IGRhdGEgb3V0cHV0IHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogQHJldHZhbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgZGF0YSBvdXRwdXQgdmFsdWUuCisgICovCit1aW50MzJfdCBIQUxfREFDX0dldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworICAKKyAgLyogUmV0dXJucyB0aGUgREFDIGNoYW5uZWwgZGF0YSBvdXRwdXQgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgcmV0dXJuIGhkYWMtPkluc3RhbmNlLT5ET1IxOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZXMgREFDIGludGVycnVwdCByZXF1ZXN0CisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREFDX0lSUUhhbmRsZXIoREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMpCit7CisgIC8qIENoZWNrIHVuZGVycnVuIGZsYWcgb2YgREFDIGNoYW5uZWwgMSAqLworICBpZihfX0hBTF9EQUNfR0VUX0ZMQUcoaGRhYywgREFDX0ZMQUdfRE1BVURSMSkpCisgIHsKKyAgICAvKiBDaGFuZ2UgREFDIHN0YXRlIHRvIGVycm9yIHN0YXRlICovCisgICAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0VSUk9SOworCisgICAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIGNoYW5lbDEgRE1BIHVuZGVycnVuIGVycm9yICovCisgICAgaGRhYy0+RXJyb3JDb2RlIHw9IEhBTF9EQUNfRVJST1JfRE1BVU5ERVJSVU5DSDE7CisKKyAgICAvKiBDbGVhciB0aGUgdW5kZXJydW4gZmxhZyAqLworICAgIF9fSEFMX0RBQ19DTEVBUl9GTEFHKGhkYWMsREFDX0ZMQUdfRE1BVURSMSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDEgRE1BIHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaGRhYy0+SW5zdGFuY2UtPkNSLCBEQUNfQ1JfRE1BRU4xKTsKKworICAgIC8qIEVycm9yIGNhbGxiYWNrICovCisgICAgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKGhkYWMpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIHZhbHVlIGZvciBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogQHBhcmFtICBBbGlnbm1lbnQgU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWdubWVudC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fOEJfUjogOGJpdCByaWdodCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fMTJCX0w6IDEyYml0IGxlZnQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0FMSUdOXzEyQl9SOiAxMmJpdCByaWdodCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqIEBwYXJhbSAgRGF0YSBEYXRhIHRvIGJlIGxvYWRlZCBpbiB0aGUgc2VsZWN0ZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiogaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQWxpZ25tZW50LCB1aW50MzJfdCBEYXRhKQoreworICBfX0lPIHVpbnQzMl90IHRtcCA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfQUxJR04oQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfREFUQShEYXRhKSk7CisKKyAgdG1wID0gKHVpbnQzMl90KWhkYWMtPkluc3RhbmNlOyAKKyAgdG1wICs9IERBQ19ESFIxMlIxX0FMSUdOTUVOVChBbGlnbm1lbnQpOworCisgIC8qIFNldCB0aGUgREFDIGNoYW5uZWwgc2VsZWN0ZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyICovCisgICooX19JTyB1aW50MzJfdCAqKSB0bXAgPSBEYXRhOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworI2VuZGlmICAvKiAjaWYgZGVmaW5lZCAoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgzeHgpICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNFeF9Qcml2YXRlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkKKy8qKgorICAqIEBicmllZiAgRE1BIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgREFDX0RNQUNvbnZDcGx0Q2gyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIAoreworICBEQUNfSGFuZGxlVHlwZURlZiogaGRhYyA9ICggREFDX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIEhBTF9EQUNFeF9Db252Q3BsdENhbGxiYWNrQ2gyKGhkYWMpOyAKKyAgCisgIGhkYWMtPlN0YXRlPSBIQUxfREFDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLiAKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIERBQ19ETUFIYWxmQ29udkNwbHRDaDIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCit7CisgICAgREFDX0hhbmRsZVR5cGVEZWYqIGhkYWMgPSAoIERBQ19IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgICAgLyogQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9EQUNFeF9Db252SGFsZkNwbHRDYWxsYmFja0NoMihoZGFjKTsgCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIGVycm9yIGNhbGxiYWNrIAorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgREFDX0RNQUVycm9yQ2gyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIAoreworICBEQUNfSGFuZGxlVHlwZURlZiogaGRhYyA9ICggREFDX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgICAKKyAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIERNQSBlcnJvciAqLworICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9ETUE7CisgICAgCisgIEhBTF9EQUNFeF9FcnJvckNhbGxiYWNrQ2gyKGhkYWMpOyAKKyAgICAKKyAgaGRhYy0+U3RhdGU9IEhBTF9EQUNfU1RBVEVfUkVBRFk7Cit9CisjZW5kaWYgLyogU1RNMzJMMDcyeHggfHwgU1RNMzJMMDczeHggfHwgU1RNMzJMMDgyeHggfHwgU1RNMzJMMDgzeHggKi8KKworLyoqCisgICogQGJyaWVmICBETUEgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjay4gCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBEQUNfRE1BQ29udkNwbHRDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCit7CisgIERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjID0gKCBEQUNfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDEoaGRhYyk7CisjZWxzZQorICBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEoaGRhYyk7IAorI2VuZGlmCisgIAorICBoZGFjLT5TdGF0ZT0gSEFMX0RBQ19TVEFURV9SRUFEWTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIERBQ19ETUFIYWxmQ29udkNwbHRDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjID0gKCBEQUNfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworCisgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhkYWMtPkNvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxKGhkYWMpOworI2Vsc2UKKyAgSEFMX0RBQ19Db252SGFsZkNwbHRDYWxsYmFja0NoMShoZGFjKTsKKyNlbmRpZiAgCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIGVycm9yIGNhbGxiYWNrCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBEQUNfRE1BRXJyb3JDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIERBQ19IYW5kbGVUeXBlRGVmKiBoZGFjID0gKCBEQUNfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworCisgIC8qIFNldCBEQUMgZXJyb3IgY29kZSB0byBETUEgZXJyb3IgKi8KKyAgaGRhYy0+RXJyb3JDb2RlIHw9IEhBTF9EQUNfRVJST1JfRE1BOworCisgIEhBTF9EQUNfRXJyb3JDYWxsYmFja0NoMShoZGFjKTsKKworICBoZGFjLT5TdGF0ZT0gSEFMX0RBQ19TVEFURV9SRUFEWTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBIQUxfREFDX01PRFVMRV9FTkFCTEVEICovCisjZW5kaWYgLyogI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4QikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDIxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwMzF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDA0MXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDUxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwNjF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDA3MXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDgxeHgpICovCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9kbWEuYyBiL1NyYy9zdG0zMmwweHhfaGFsX2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTViMmIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9kbWEuYwpAQCAtMCwwICsxLDg4NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfZG1hLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIERNQSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgRGlyZWN0IE1lbW9yeSBBY2Nlc3MgKERNQSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIGVycm9ycyBmdW5jdGlvbnMKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgKCMpIEVuYWJsZSBhbmQgY29uZmlndXJlIHRoZSBwZXJpcGhlcmFsIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgRE1BIENoYW5uZWwKKyAgICAgICAoZXhjZXB0IGZvciBpbnRlcm5hbCBTUkFNIC8gRkxBU0ggbWVtb3JpZXM6IG5vIGluaXRpYWxpemF0aW9uIGlzCisgICAgICAgbmVjZXNzYXJ5KS4KKworICAgKCMpIEZvciBhIGdpdmVuIENoYW5uZWwsIHByb2dyYW0gdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisgICAgICAgQ2hhbm5lbCByZXF1ZXN0LCBUcmFuc2ZlciBEaXJlY3Rpb24sIFNvdXJjZSBhbmQgRGVzdGluYXRpb24gZGF0YSBmb3JtYXRzLAorICAgICAgIENpcmN1bGFyIG9yIE5vcm1hbCBtb2RlLCBDaGFubmVsIFByaW9yaXR5IGxldmVsLCBTb3VyY2UgYW5kIERlc3RpbmF0aW9uIEluY3JlbWVudCBtb2RlCisgICAgICAgdXNpbmcgSEFMX0RNQV9Jbml0KCkgZnVuY3Rpb24uCisKKyAgICgjKSBVc2UgSEFMX0RNQV9HZXRTdGF0ZSgpIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgRE1BIHN0YXRlIGFuZCBIQUxfRE1BX0dldEVycm9yKCkgaW4gY2FzZSBvZiBlcnJvcgorICAgICAgIGRldGVjdGlvbi4KKworICAgKCMpIFVzZSBIQUxfRE1BX0Fib3J0KCkgZnVuY3Rpb24gdG8gYWJvcnQgdGhlIGN1cnJlbnQgdHJhbnNmZXIKKworICAgICAtQC0gICBJbiBNZW1vcnktdG8tTWVtb3J5IHRyYW5zZmVyIG1vZGUsIENpcmN1bGFyIG1vZGUgaXMgbm90IGFsbG93ZWQuCisKKyAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgICAoKykgVXNlIEhBTF9ETUFfU3RhcnQoKSB0byBzdGFydCBETUEgdHJhbnNmZXIgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gb2YgU291cmNlCisgICAgICAgICAgICAgIGFkZHJlc3MgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBMZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAorICAgICAgICAgICgrKSBVc2UgSEFMX0RNQV9Qb2xsRm9yVHJhbnNmZXIoKSB0byBwb2xsIGZvciB0aGUgZW5kIG9mIGN1cnJlbnQgdHJhbnNmZXIsIGluIHRoaXMKKyAgICAgICAgICAgICAgY2FzZSBhIGZpeGVkIFRpbWVvdXQgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgVXNlciBkZXBlbmRpbmcgZnJvbSBoaXMgYXBwbGljYXRpb24uCisKKyAgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAgICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BIGludGVycnVwdCBwcmlvcml0eSB1c2luZyBIQUxfTlZJQ19TZXRQcmlvcml0eSgpCisgICAgICAgICAgKCspIEVuYWJsZSB0aGUgRE1BIElSUSBoYW5kbGVyIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpCisgICAgICAgICAgKCspIFVzZSBIQUxfRE1BX1N0YXJ0X0lUKCkgdG8gc3RhcnQgRE1BIHRyYW5zZmVyIGFmdGVyIHRoZSBjb25maWd1cmF0aW9uIG9mCisgICAgICAgICAgICAgIFNvdXJjZSBhZGRyZXNzIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgTGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQuCisgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgRE1BIGludGVycnVwdCBpcyBjb25maWd1cmVkCisgICAgICAgICAgKCspIFVzZSBIQUxfRE1BX0lSUUhhbmRsZXIoKSBjYWxsZWQgdW5kZXIgRE1BX0lSUUhhbmRsZXIoKSBJbnRlcnJ1cHQgc3Vicm91dGluZQorICAgICAgICAgICgrKSBBdCB0aGUgZW5kIG9mIGRhdGEgdHJhbnNmZXIgSEFMX0RNQV9JUlFIYW5kbGVyKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICAgIGFkZCBoaXMgb3duIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyB3aXRoIEhBTF9ETUFfUmVnaXN0ZXJDYWxsYmFjaygpLgorCisgICAgICoqKiBETUEgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbWFjcm9zIGluIERNQSBIQUwgZHJpdmVyLgorCisgICAgICAgKCspIF9fSEFMX0RNQV9FTkFCTEU6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAgICAgICgrKSBfX0hBTF9ETUFfRElTQUJMRTogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAgICAgICgrKSBfX0hBTF9ETUFfR0VUX0ZMQUc6IEdldCB0aGUgRE1BIENoYW5uZWwgcGVuZGluZyBmbGFncy4KKyAgICAgICAoKykgX19IQUxfRE1BX0NMRUFSX0ZMQUc6IENsZWFyIHRoZSBETUEgQ2hhbm5lbCBwZW5kaW5nIGZsYWdzLgorICAgICAgICgrKSBfX0hBTF9ETUFfRU5BQkxFX0lUOiBFbmFibGUgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbCBpbnRlcnJ1cHRzLgorICAgICAgICgrKSBfX0hBTF9ETUFfRElTQUJMRV9JVDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuCisgICAgICAgKCspIF9fSEFMX0RNQV9HRVRfSVRfU09VUkNFOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisKKyAgICAgWy4uXQorICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIERNQSBIQUwgZHJpdmVyIGhlYWRlciBmaWxlIGZvciBtb3JlIHVzZWZ1bCBtYWNyb3MKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQSBETUEKKyAgKiBAYnJpZWYgRE1BIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfRnVuY3Rpb25zIERNQSBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKK3N0YXRpYyB2b2lkIERNQV9TZXRDb25maWcoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9ucyBETUEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBETUEgQ2hhbm5lbCBzb3VyY2UKKyAgICBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLCBpbmNyZW1lbnRhdGlvbiBhbmQgZGF0YSBzaXplcywgdHJhbnNmZXIgZGlyZWN0aW9uLAorICAgIGNpcmN1bGFyL25vcm1hbCBtb2RlIHNlbGVjdGlvbiwgbWVtb3J5LXRvLW1lbW9yeSBtb2RlIHNlbGVjdGlvbiBhbmQgQ2hhbm5lbCBwcmlvcml0eSB2YWx1ZS4KKyAgICBbLi5dCisgICAgVGhlIEhBTF9ETUFfSW5pdCgpIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIERNQSBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMgYXMgZGVzY3JpYmVkIGluCisgICAgcmVmZXJlbmNlIG1hbnVhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBETUEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIERNQV9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0luaXQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIHVpbnQzMl90IHRtcDsKKworICAvKiBDaGVjayB0aGUgRE1BIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhkbWEgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9SRVFVRVNUKGhkbWEtPkluaXQuUmVxdWVzdCkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0RJUkVDVElPTihoZG1hLT5Jbml0LkRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BFUklQSEVSQUxfSU5DX1NUQVRFKGhkbWEtPkluaXQuUGVyaXBoSW5jKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfTUVNT1JZX0lOQ19TVEFURShoZG1hLT5Jbml0Lk1lbUluYykpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BFUklQSEVSQUxfREFUQV9TSVpFKGhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX01FTU9SWV9EQVRBX1NJWkUoaGRtYS0+SW5pdC5NZW1EYXRhQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfTU9ERShoZG1hLT5Jbml0Lk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9QUklPUklUWShoZG1hLT5Jbml0LlByaW9yaXR5KSk7CisKKyAgLyogQ29tcHV0ZSB0aGUgY2hhbm5lbCBpbmRleCAqLworICAvKiBPbmx5IG9uZSBETUE6IERNQTEgKi8KKyAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkgLyAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkpIDw8IDI7CisgIGhkbWEtPkRtYUJhc2VBZGRyZXNzID0gRE1BMTsKKworICAvKiBDaGFuZ2UgRE1BIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX0JVU1k7CisKKyAgLyogR2V0IHRoZSBDUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXAgPSBoZG1hLT5JbnN0YW5jZS0+Q0NSOworCisgIC8qIENsZWFyIFBMLCBNU0laRSwgUFNJWkUsIE1JTkMsIFBJTkMsIENJUkMsIERJUiBhbmQgTUVNMk1FTSBiaXRzICovCisgIHRtcCAmPSAoKHVpbnQzMl90KX4oRE1BX0NDUl9QTCAgICB8IERNQV9DQ1JfTVNJWkUgIHwgRE1BX0NDUl9QU0laRSAgfAorICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfTUlOQyAgfCBETUFfQ0NSX1BJTkMgICB8IERNQV9DQ1JfQ0lSQyAgIHwKKyAgICAgICAgICAgICAgICAgICAgICBETUFfQ0NSX0RJUiAgIHwgRE1BX0NDUl9NRU0yTUVNKSk7CisKKyAgLyogUHJlcGFyZSB0aGUgRE1BIENoYW5uZWwgY29uZmlndXJhdGlvbiAqLworICB0bXAgfD0gIGhkbWEtPkluaXQuRGlyZWN0aW9uICAgICAgICB8CisgICAgICAgICAgaGRtYS0+SW5pdC5QZXJpcGhJbmMgICAgICAgICAgIHwgaGRtYS0+SW5pdC5NZW1JbmMgICAgICAgICAgIHwKKyAgICAgICAgICBoZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQgfCBoZG1hLT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgfAorICAgICAgICAgIGhkbWEtPkluaXQuTW9kZSAgICAgICAgICAgICAgICB8IGhkbWEtPkluaXQuUHJpb3JpdHk7CisKKyAgLyogV3JpdGUgdG8gRE1BIENoYW5uZWwgQ1IgcmVnaXN0ZXIgKi8KKyAgaGRtYS0+SW5zdGFuY2UtPkNDUiA9IHRtcDsKKworICAvKiBTZXQgcmVxdWVzdCBzZWxlY3Rpb24gKi8KKyAgaWYoaGRtYS0+SW5pdC5EaXJlY3Rpb24gIT0gRE1BX01FTU9SWV9UT19NRU1PUlkpCisgIHsKKyAgICAvKiBXcml0ZSB0byBETUEgY2hhbm5lbCBzZWxlY3Rpb24gcmVnaXN0ZXIgKi8KKyAgICAvKiBSZXNldCByZXF1ZXN0IHNlbGVjdGlvbiBmb3IgRE1BMSBDaGFubmVseCAqLworICAgIERNQTFfQ1NFTFItPkNTRUxSICY9IH4oRE1BX0NTRUxSX0MxUyA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKTsKKworICAgIC8qIENvbmZpZ3VyZSByZXF1ZXN0IHNlbGVjdGlvbiBmb3IgRE1BMSBDaGFubmVseCAqLworICAgIERNQTFfQ1NFTFItPkNTRUxSIHw9ICh1aW50MzJfdCkgKGhkbWEtPkluaXQuUmVxdWVzdCA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKTsKKyAgfQorCisgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIGNvZGUgKi8KKyAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOworCisgIC8qIEluaXRpYWxpemUgdGhlIERNQSBzdGF0ZSovCisgIGhkbWEtPlN0YXRlICA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICBoZG1hLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBETUEgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfRGVJbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworCisgIC8qIENoZWNrIHRoZSBETUEgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKE5VTEwgPT0gaGRtYSApCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfSU5TVEFOQ0UoaGRtYS0+SW5zdGFuY2UpKTsKKworICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUEgQ2hhbm5lbHggKi8KKyAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7CisKKyAgLyogQ29tcHV0ZSB0aGUgY2hhbm5lbCBpbmRleCAqLworICAvKiBETUExICovCisgIGhkbWEtPkNoYW5uZWxJbmRleCA9ICgoKHVpbnQzMl90KWhkbWEtPkluc3RhbmNlIC0gKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpIC8gKCh1aW50MzJfdClETUExX0NoYW5uZWwyIC0gKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKSA8PCAyOworICBoZG1hLT5EbWFCYXNlQWRkcmVzcyA9IERNQTE7CisKKyAgLyogUmVzZXQgRE1BIENoYW5uZWwgY29udHJvbCByZWdpc3RlciAqLworICBoZG1hLT5JbnN0YW5jZS0+Q0NSICA9IDBVOworCisgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSk7CisKKyAgLyogUmVzZXQgRE1BIGNoYW5uZWwgc2VsZWN0aW9uIHJlZ2lzdGVyICovCisgIC8qIERNQTEgKi8KKyAgRE1BMV9DU0VMUi0+Q1NFTFIgJj0gfihETUFfQ1NFTFJfQzFTIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpOworCisgIC8qIENsZWFuIGNhbGxiYWNrcyAqLworICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7CisgIGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciBjb2RlICovCisgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKKworICAvKiBJbml0aWFsaXplIHRoZSBETUEgc3RhdGUgKi8KKyAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIGRhdGEgbGVuZ3RoIGFuZCBTdGFydCBETUEgdHJhbnNmZXIKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIHNvdXJjZSwgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgZGF0YSBsZW5ndGggYW5kCisgICAgICAgICAgU3RhcnQgRE1BIHRyYW5zZmVyIHdpdGggaW50ZXJydXB0CisgICAgICAoKykgQWJvcnQgRE1BIHRyYW5zZmVyCisgICAgICAoKykgUG9sbCBmb3IgdHJhbnNmZXIgY29tcGxldGUKKyAgICAgICgrKSBIYW5kbGUgRE1BIGludGVycnVwdCByZXF1ZXN0CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gIFNyY0FkZHJlc3MgVGhlIHNvdXJjZSBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAgKiBAcGFyYW0gIERzdEFkZHJlc3MgVGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBCdWZmZXIgYWRkcmVzcworICAqIEBwYXJhbSAgRGF0YUxlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfU3RhcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0JVRkZFUl9TSVpFKERhdGFMZW5ndGgpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkbWEpOworCisgIGlmKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICAvKiBDaGFuZ2UgRE1BIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfQlVTWTsKKyAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIHNvdXJjZSwgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgdGhlIGRhdGEgbGVuZ3RoICYgY2xlYXIgZmxhZ3MqLworICAgIERNQV9TZXRDb25maWcoaGRtYSwgU3JjQWRkcmVzcywgRHN0QWRkcmVzcywgRGF0YUxlbmd0aCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9ETUFfRU5BQkxFKGhkbWEpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisgICAgc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgRE1BIFRyYW5zZmVyIHdpdGggaW50ZXJydXB0IGVuYWJsZWQuCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHBhcmFtICBTcmNBZGRyZXNzIFRoZSBzb3VyY2UgbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgICogQHBhcmFtICBEc3RBZGRyZXNzIFRoZSBkZXN0aW5hdGlvbiBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAgKiBAcGFyYW0gIERhdGFMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1N0YXJ0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9CVUZGRVJfU0laRShEYXRhTGVuZ3RoKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKworICBpZihIQUxfRE1BX1NUQVRFX1JFQURZID09IGhkbWEtPlN0YXRlKQorICB7CisgICAgLyogQ2hhbmdlIERNQSBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX0JVU1k7CisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOworCisgICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhkbWEpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBkYXRhIGxlbmd0aCAmIGNsZWFyIGZsYWdzKi8KKyAgICBETUFfU2V0Q29uZmlnKGhkbWEsIFNyY0FkZHJlc3MsIERzdEFkZHJlc3MsIERhdGFMZW5ndGgpOworCisgICAgLyogRW5hYmxlIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgICAvKiBFbmFibGUgdGhlIHRyYW5zZmVyIEVycm9yIGludGVycnVwdCAqLworICAgIGlmKE5VTEwgIT0gaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgYXMgd2VsbCAqLworICAgICAgX19IQUxfRE1BX0VOQUJMRV9JVChoZG1hLCAoRE1BX0lUX1RDIHwgRE1BX0lUX0hUIHwgRE1BX0lUX1RFKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBfX0hBTF9ETUFfRElTQUJMRV9JVChoZG1hLCBETUFfSVRfSFQpOworICAgICAgX19IQUxfRE1BX0VOQUJMRV9JVChoZG1hLCAoRE1BX0lUX1RDIHwgRE1BX0lUX1RFKSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgX19IQUxfRE1BX0VOQUJMRShoZG1hKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgLyogUmVtYWluIEJVU1kgKi8KKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfQWJvcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgRE1BIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaWYoaGRtYS0+U3RhdGUgIT0gSEFMX0RNQV9TVEFURV9CVVNZKQorICB7CisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT19YRkVSOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGlzYWJsZSBETUEgSVQgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRV9JVChoZG1hLCAoRE1BX0lUX1RDIHwgRE1BX0lUX0hUIHwgRE1BX0lUX1RFKSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjaGFubmVsICovCisgICAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7CisKKyAgICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnRzIHRoZSBETUEgVHJhbnNmZXIgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfQWJvcnRfSVQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZihIQUxfRE1BX1NUQVRFX0JVU1kgIT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICAvKiBubyB0cmFuc2ZlciBvbmdvaW5nICovCisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT19YRkVSOworCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERpc2FibGUgRE1BIElUICovCisgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgKERNQV9JVF9UQyB8IERNQV9JVF9IVCB8IERNQV9JVF9URSkpOworCisgICAgLyogRGlzYWJsZSB0aGUgY2hhbm5lbCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhkbWEpOworCisgICAgLyogQ2xlYXIgYWxsIGZsYWdzICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSAoRE1BX0lTUl9HSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpOworCisgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgLyogQ2FsbCBVc2VyIEFib3J0IGNhbGxiYWNrICovCisgICAgaWYoaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayhoZG1hKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBQb2xsaW5nIGZvciB0cmFuc2ZlciBjb21wbGV0ZS4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gIENvbXBsZXRlTGV2ZWwgU3BlY2lmaWVzIHRoZSBETUEgbGV2ZWwgY29tcGxldGUuCisgICogQHBhcmFtICBUaW1lb3V0ICAgICAgIFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9MZXZlbENvbXBsZXRlVHlwZURlZiBDb21wbGV0ZUxldmVsLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0ZW1wOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYoSEFMX0RNQV9TVEFURV9CVVNZICE9IGhkbWEtPlN0YXRlKQorICB7CisgICAgLyogbm8gdHJhbnNmZXIgb25nb2luZyAqLworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9fWEZFUjsKKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFBvbGxpbmcgbW9kZSBub3Qgc3VwcG9ydGVkIGluIGNpcmN1bGFyIG1vZGUgKi8KKyAgaWYgKDBVICE9IChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSkKKyAgeworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogR2V0IHRoZSBsZXZlbCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgIGlmIChIQUxfRE1BX0ZVTExfVFJBTlNGRVIgPT0gQ29tcGxldGVMZXZlbCkKKyAgeworICAgIC8qIFRyYW5zZmVyIENvbXBsZXRlIGZsYWcgKi8KKyAgICB0ZW1wID0gRE1BX0ZMQUdfVEMxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSGFsZiBUcmFuc2ZlciBDb21wbGV0ZSBmbGFnICovCisgICAgdGVtcCA9IERNQV9GTEFHX0hUMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpOworICB9CisKKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICB3aGlsZSgwVSA9PSAoaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklTUiAmIHRlbXApKQorICB7CisgICAgaWYoKDBVICE9IChoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SVNSICYgKERNQV9GTEFHX1RFMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4JiAweDFjVSkpKSkpCisgICAgeworICAgICAgLyogV2hlbiBhIERNQSB0cmFuc2ZlciBlcnJvciBvY2N1cnMgKi8KKyAgICAgIC8qIEEgaGFyZHdhcmUgY2xlYXIgb2YgaXRzIEVOIGJpdHMgaXMgcGVyZm9ybWVkICovCisgICAgICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gKERNQV9JU1JfR0lGMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKTsKKworICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVEU7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgICBoZG1hLT5TdGF0ZT0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8ICAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVElNRU9VVDsKKworICAgICAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgICAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihIQUxfRE1BX0ZVTExfVFJBTlNGRVIgPT0gQ29tcGxldGVMZXZlbCkKKyAgeworICAgIC8qIENsZWFyIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSAoRE1BX0ZMQUdfVEMxIDw8IChoZG1hLT5DaGFubmVsSW5kZXgmIDB4MWNVKSk7CisKKyAgICAvKiBUaGUgc2VsZWN0ZWQgQ2hhbm5lbHggRU4gYml0IGlzIGNsZWFyZWQgKERNQSBpcyBkaXNhYmxlZCBhbmQKKyAgICBhbGwgdHJhbnNmZXJzIGFyZSBjb21wbGV0ZSkgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgdGhlIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gKERNQV9GTEFHX0hUMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIERNQSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0RNQV9JUlFIYW5kbGVyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICB1aW50MzJfdCBmbGFnX2l0ID0gaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklTUjsKKyAgdWludDMyX3Qgc291cmNlX2l0ID0gaGRtYS0+SW5zdGFuY2UtPkNDUjsKKworICAvKiBIYWxmIFRyYW5zZmVyIENvbXBsZXRlIEludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKCgwVSAhPSAoZmxhZ19pdCAmIChETUFfRkxBR19IVDEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSkpKSAmJiAoMFUgIT0gKHNvdXJjZV9pdCAmIERNQV9JVF9IVCkpKQorICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBoYWxmIHRyYW5zZmVyIGludGVycnVwdCBpZiB0aGUgRE1BIG1vZGUgaXMgbm90IENJUkNVTEFSICovCisgICAgICBpZigoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0ICovCisgICAgICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIERNQV9JVF9IVCk7CisgICAgICB9CisgICAgICAvKiBDbGVhciB0aGUgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgICAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IERNQV9JU1JfSFRJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKTsKKworICAgICAgLyogRE1BIHBlcmlwaGVyYWwgc3RhdGUgaXMgbm90IHVwZGF0ZWQgaW4gSGFsZiBUcmFuc2ZlciAqLworICAgICAgLyogYnV0IGluIFRyYW5zZmVyIENvbXBsZXRlIGNhc2UgKi8KKworICAgICBpZihoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayAhPSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBIYWxmIHRyYW5zZmVyIGNhbGxiYWNrICovCisgICAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrKGhkbWEpOworICAgICAgfQorICB9CisKKyAgLyogVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGVsc2UgaWYgKCgwVSAhPSAoZmxhZ19pdCAmIChETUFfRkxBR19UQzEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSkpKSAmJiAoMFUgIT0gKHNvdXJjZV9pdCAmIERNQV9JVF9UQykpKQorICB7CisgICAgaWYoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGFuZCBlcnJvciBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIERNQV9JVF9URSB8IERNQV9JVF9UQyk7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisgICAgfQorICAgIC8qIENsZWFyIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSAoRE1BX0lTUl9UQ0lGMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICBpZihoZG1hLT5YZmVyQ3BsdENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgLyogVHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9CisKKyAgLyogVHJhbnNmZXIgRXJyb3IgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGVsc2UgaWYgKCgwVSAhPSAoZmxhZ19pdCAmIChETUFfRkxBR19URTEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSkpKSAmJiAoMFUgIT0gKHNvdXJjZV9pdCAmIERNQV9JVF9URSkpKQorICB7CisgICAgLyogV2hlbiBhIERNQSB0cmFuc2ZlciBlcnJvciBvY2N1cnMgKi8KKyAgICAvKiBBIGhhcmR3YXJlIGNsZWFyIG9mIGl0cyBFTiBiaXRzIGlzIHBlcmZvcm1lZCAqLworICAgIC8qIERpc2FibGUgQUxMIERNQSBJVCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIChETUFfSVRfVEMgfCBETUFfSVRfSFQgfCBETUFfSVRfVEUpKTsKKworICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gKERNQV9JU1JfR0lGMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKTsKKworICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9URTsKKworICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICAgIGlmIChoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayhoZG1hKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyBUbyBEbyAqLworICB9CisgIHJldHVybjsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBjYWxsYmFja3MKKyAgKiBAcGFyYW0gIGhkbWEgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCAgICAgICAgICAgVXNlciBDYWxsYmFjayBpZGVudGlmZXIKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgRU5VTSBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBwQ2FsbGJhY2sgICAgICAgICAgICBwb2ludGVyIHRvIHByaXZhdGUgY2FsbGJhY3NrIGZ1bmN0aW9uIHdoaWNoIGhhcyBwb2ludGVyIHRvCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgYXMgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9SZWdpc3RlckNhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHZvaWQgKCogcENhbGxiYWNrKSggRE1BX0hhbmRsZVR5cGVEZWYgKiBfaGRtYSkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkbWEpOworCisgIGlmKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICBjYXNlICBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRDoKKyAgICAgICAgICAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0hBTEZDUExUX0NCX0lEOgorICAgICAgICAgICBoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0VSUk9SX0NCX0lEOgorICAgICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0FCT1JUX0NCX0lEOgorICAgICAgICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgY2FsbGJhY2tzCisgICogQHBhcmFtICBoZG1hICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgICAgICAgICAgIFVzZXIgQ2FsbGJhY2sgaWRlbnRpZmVyCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIEVOVU0gYXMgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9VblJlZ2lzdGVyQ2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKworICBpZihIQUxfRE1BX1NUQVRFX1JFQURZID09IGhkbWEtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0NQTFRfQ0JfSUQ6CisgICAgICAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICBicmVhazsKKworICAgICBjYXNlICBIQUxfRE1BX1hGRVJfSEFMRkNQTFRfQ0JfSUQ6CisgICAgICAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0VSUk9SX0NCX0lEOgorICAgICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgIGJyZWFrOworCisgICAgIGNhc2UgIEhBTF9ETUFfWEZFUl9BQk9SVF9DQl9JRDoKKyAgICAgICAgICAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICBicmVhazsKKworICAgIGNhc2UgICBIQUxfRE1BX1hGRVJfQUxMX0NCX0lEOgorICAgICAgICAgICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgICAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgIGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBDaGVjayB0aGUgRE1BIHN0YXRlCisgICAgICAoKykgR2V0IGVycm9yIGNvZGUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIERNQSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9ETUFfU3RhdGVUeXBlRGVmIEhBTF9ETUFfR2V0U3RhdGUoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIC8qIFJldHVybiBETUEgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoZG1hLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIERNQSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaGRtYSA6IHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcmV0dmFsIERNQSBFcnJvciBDb2RlCisgICovCit1aW50MzJfdCBIQUxfRE1BX0dldEVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICByZXR1cm4gaGRtYS0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRE1BX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXRzIHRoZSBETUEgVHJhbnNmZXIgcGFyYW1ldGVyLgorICAqIEBwYXJhbSAgaGRtYSAgICAgICBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEBwYXJhbSAgU3JjQWRkcmVzcyBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcworICAqIEBwYXJhbSAgRHN0QWRkcmVzcyBUaGUgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgICogQHBhcmFtICBEYXRhTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIHZvaWQgRE1BX1NldENvbmZpZyhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGF0YUxlbmd0aCkKK3sKKyAgLyogQ2xlYXIgYWxsIGZsYWdzICovCisgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gKERNQV9JU1JfR0lGMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKTsKKworICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgZGF0YSBsZW5ndGggKi8KKyAgaGRtYS0+SW5zdGFuY2UtPkNORFRSID0gRGF0YUxlbmd0aDsKKworICAvKiBNZW1vcnkgdG8gUGVyaXBoZXJhbCAqLworICBpZigoaGRtYS0+SW5pdC5EaXJlY3Rpb24pID09IERNQV9NRU1PUllfVE9fUEVSSVBIKQorICB7CisgICAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyAgICBoZG1hLT5JbnN0YW5jZS0+Q1BBUiA9IERzdEFkZHJlc3M7CisKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgc291cmNlIGFkZHJlc3MgKi8KKyAgICBoZG1hLT5JbnN0YW5jZS0+Q01BUiA9IFNyY0FkZHJlc3M7CisgIH0KKyAgLyogUGVyaXBoZXJhbCB0byBNZW1vcnkgKi8KKyAgZWxzZQorICB7CisgICAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIHNvdXJjZSBhZGRyZXNzICovCisgICAgaGRtYS0+SW5zdGFuY2UtPkNQQVIgPSBTcmNBZGRyZXNzOworCisgICAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyAgICBoZG1hLT5JbnN0YW5jZS0+Q01BUiA9IERzdEFkZHJlc3M7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9maXJld2FsbC5jIGIvU3JjL3N0bTMybDB4eF9oYWxfZmlyZXdhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTcwZDMwCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfZmlyZXdhbGwuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfZmlyZXdhbGwuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRklSRVdBTEwgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIEZpcmV3YWxsCisgICogICAgICAgICAgUGVyaXBoZXJhbCBpbml0aWFsaXphdGlvbiBhbmQgZW5hYmxpbmcuCisgICoKKyAgKgorICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoZSBGSVJFV0FMTCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgIAorICAgICgjKSBEZWNsYXJlIGEgRklSRVdBTExfSW5pdFR5cGVEZWYgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlLgorICAKKyAgICAoIykgUmVzb3J0IHRvIEhBTF9GSVJFV0FMTF9Db25maWcoKSBBUEkgdG8gaW5pdGlhbGl6ZSB0aGUgRmlyZXdhbGwKKworICAgICgjKSBFbmFibGUgdGhlIEZJUkVXQUxMIGluIGNhbGxpbmcgSEFMX0ZJUkVXQUxMX0VuYWJsZUZpcmV3YWxsKCkgQVBJCisgICAgCisgICAgKCMpIFRvIGVuc3VyZSB0aGF0IGFueSBjb2RlIGV4ZWN1dGVkIG91dHNpZGUgdGhlIHByb3RlY3RlZCBzZWdtZW50IGNsb3NlcyB0aGUKKyAgICAgICAgRklSRVdBTEwsIHRoZSB1c2VyIG11c3Qgc2V0IHRoZSBmbGFnIEZJUkVXQUxMX1BSRV9BUk1fU0VUIGluIGNhbGxpbmcgCisgICAgICAgIF9fSEFMX0ZJUkVXQUxMX1BSRUFSTV9FTkFCTEUoKSBtYWNybyBpZiBjYWxsZWQgd2l0aGluIGEgcHJvdGVjdGVkIGNvZGUgc2VnbWVudAorICAgICAgICBvcgorICAgICAgICBIQUxfRklSRVdBTExfRW5hYmxlUHJlQXJtRmxhZygpIEFQSSBpZiBjYWxsZWQgb3V0c2lkZSBvZiBwcm90ZWN0ZWQgY29kZSBzZWdtZW50CisgICAgICAgIGFmdGVyIEhBTF9GSVJFV0FMTF9Db25maWcoKSBjYWxsLgorCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHhCKSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDgpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4NikgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDExeHgpICYmICFkZWZpbmVkIChTVE0zMkwwMjF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAzMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDQxeHgpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0ZJUkVXQUxMX01PRFVMRV9FTkFCTEVECisKKy8qKiBAYWRkdG9ncm91cCBGSVJFV0FMTAorICAqIEBicmllZiBIQUwgRklSRVdBTEwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyAgICAKKworLyoqIEBhZGR0b2dyb3VwIEZJUkVXQUxMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGSVJFV0FMTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIEZ1bmN0aW9ucyAKKyAgKgorQHZlcmJhdGltICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgdGhlIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBGaXJld2FsbC4KKyAgICBJbml0aWFsaXphdGlvbiBpcyBkb25lIGJ5IEhBTF9GSVJFV0FMTF9Db25maWcoKTogCisKKyAgICAgICgrKSBFbmFibGUgdGhlIEZpcmV3YWxsIGNsb2NrIHRocnUgX19IQUxfUkNDX0ZJUkVXQUxMX0NMS19FTkFCTEUoKSBtYWNyby4KKyAgICAgICAgICAgCisgICAgICAoKykgU2V0IHRoZSBwcm90ZWN0ZWQgY29kZSBzZWdtZW50IGFkZHJlc3Mgc3RhcnQgYW5kIGxlbmd0aC4KKyAgICAgICAgICAKKyAgICAgICgrKSBTZXQgdGhlIHByb3RlY3RlZCBub24tdm9sYXRpbGUgYW5kL29yIHZvbGF0aWxlIGRhdGEgc2VnbWVudHMgCisgICAgICAgICAgYWRkcmVzcyBzdGFydHMgYW5kIGxlbmd0aHMgaWYgYXBwbGljYWJsZS4gICAgICAgICAgCisgICAgICAgICAgCisgICAgICAoKykgU2V0IHRoZSB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgZXhlY3V0aW9uIGFuZCBzaGFyaW5nIHN0YXR1cy4KKyAgICAgIAorICAgICAgKCspIExlbmd0aCBtdXN0IGJlIHNldCB0byAwIGZvciBhbiB1bnByb3RlY3RlZCBzZWdtZW50LiAgICAgIAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgRmlyZXdhbGwgYWNjb3JkaW5nIHRvIHRoZSBGSVJFV0FMTF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgcGFyYW1ldGVycy4KKyAgKiBAcGFyYW0gZndfaW5pdDogRmlyZXdhbGwgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlCisgICogQG5vdGUgIFRoZSBBUEkgcmV0dXJucyBIQUxfRVJST1IgaWYgdGhlIEZpcmV3YWxsIGlzIGFscmVhZHkgZW5hYmxlZC4gICAgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZJUkVXQUxMX0NvbmZpZyhGSVJFV0FMTF9Jbml0VHlwZURlZiAqIGZ3X2luaXQpCit7CisgIC8qIENoZWNrIHRoZSBGaXJld2FsbCBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUgYWxsb2NhdGlvbiAqLworICBpZihmd19pbml0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBFbmFibGUgRmlyZXdhbGwgY2xvY2sgKi8KKyAgX19IQUxfUkNDX0ZJUkVXQUxMX0NMS19FTkFCTEUoKTsKKworICAvKiBNYWtlIHN1cmUgdGhhdCBGaXJld2FsbCBpcyBub3QgZW5hYmxlZCBhbHJlYWR5ICovCisgIGlmIChfX0hBTF9GSVJFV0FMTF9JU19FTkFCTEVEKCkgIT0gUkVTRVQpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayBGaXJld2FsbCBjb25maWd1cmF0aW9uIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyB3aGVuIHNlZ21lbnQgaXMgcHJvdGVjdGVkICovCisgIC8qIENvZGUgc2VnbWVudCAqLworICBpZiAoZndfaW5pdC0+Q29kZVNlZ21lbnRMZW5ndGggIT0gMFUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRklSRVdBTExfQ09ERV9TRUdNRU5UX0FERFJFU1MoZndfaW5pdC0+Q29kZVNlZ21lbnRTdGFydEFkZHJlc3MpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRklSRVdBTExfQ09ERV9TRUdNRU5UX0xFTkdUSChmd19pbml0LT5Db2RlU2VnbWVudFN0YXJ0QWRkcmVzcywgZndfaW5pdC0+Q29kZVNlZ21lbnRMZW5ndGgpKTsgIAorICAgIC8qIE1ha2Ugc3VyZSB0aGF0IE5vblZEYXRhU2VnbWVudExlbmd0aCBpcyBwcm9wZXJseSBzZXQgdG8gcHJldmVudCBjb2RlIHNlZ21lbnQgYWNjZXNzICovCisgICAgaWYgKGZ3X2luaXQtPk5vblZEYXRhU2VnbWVudExlbmd0aCA8IDB4MTAwKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIC8qIE5vbiB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgKi8KKyAgaWYgKGZ3X2luaXQtPk5vblZEYXRhU2VnbWVudExlbmd0aCAhPSAwVSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19GSVJFV0FMTF9OT05WT0xBVElMRURBVEFfU0VHTUVOVF9BRERSRVNTKGZ3X2luaXQtPk5vblZEYXRhU2VnbWVudFN0YXJ0QWRkcmVzcykpOworICAgIGFzc2VydF9wYXJhbShJU19GSVJFV0FMTF9OT05WT0xBVElMRURBVEFfU0VHTUVOVF9MRU5HVEgoZndfaW5pdC0+Tm9uVkRhdGFTZWdtZW50U3RhcnRBZGRyZXNzLCBmd19pbml0LT5Ob25WRGF0YVNlZ21lbnRMZW5ndGgpKTsgIAorICB9CisgIC8qIFZvbGF0aWxlIGRhdGEgc2VnbWVudCAqLworICBpZiAoZndfaW5pdC0+VkRhdGFTZWdtZW50TGVuZ3RoICE9IDBVKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZJUkVXQUxMX1ZPTEFUSUxFREFUQV9TRUdNRU5UX0FERFJFU1MoZndfaW5pdC0+VkRhdGFTZWdtZW50U3RhcnRBZGRyZXNzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZJUkVXQUxMX1ZPTEFUSUxFREFUQV9TRUdNRU5UX0xFTkdUSChmd19pbml0LT5WRGF0YVNlZ21lbnRTdGFydEFkZHJlc3MsIGZ3X2luaXQtPlZEYXRhU2VnbWVudExlbmd0aCkpOyAgCisgIH0KKyAgCisgIC8qIENoZWNrIEZpcmV3YWxsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRklSRVdBTExfVk9MQVRJTEVEQVRBX0VYRUNVVEUoZndfaW5pdC0+Vm9sYXRpbGVEYXRhRXhlY3V0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19GSVJFV0FMTF9WT0xBVElMRURBVEFfU0hBUkUoZndfaW5pdC0+Vm9sYXRpbGVEYXRhU2hhcmVkKSk7CisgIAorICAKKyAgIC8qIENvbmZpZ3VyYXRpb24gKi8KKyAgCisgIC8qIFByb3RlY3RlZCBjb2RlIHNlZ21lbnQgc3RhcnQgYWRkcmVzcyBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhGSVJFV0FMTC0+Q1NTQSwgKEZXX0NTU0FfQUREICYgZndfaW5pdC0+Q29kZVNlZ21lbnRTdGFydEFkZHJlc3MpKTsKKwkvKiBQcm90ZWN0ZWQgY29kZSBzZWdtZW50IGxlbmd0aCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhGSVJFV0FMTC0+Q1NMLCAoRldfQ1NMX0xFTkcgJiBmd19pbml0LT5Db2RlU2VnbWVudExlbmd0aCkpOworICAKKyAgLyogUHJvdGVjdGVkIG5vbiB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgc3RhcnQgYWRkcmVzcyBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhGSVJFV0FMTC0+TlZEU1NBLCAoRldfTlZEU1NBX0FERCAmIGZ3X2luaXQtPk5vblZEYXRhU2VnbWVudFN0YXJ0QWRkcmVzcykpOworCS8qIFByb3RlY3RlZCBub24gdm9sYXRpbGUgZGF0YSBzZWdtZW50IGxlbmd0aCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhGSVJFV0FMTC0+TlZEU0wsIChGV19OVkRTTF9MRU5HICYgZndfaW5pdC0+Tm9uVkRhdGFTZWdtZW50TGVuZ3RoKSk7CisgIAorICAvKiBQcm90ZWN0ZWQgdm9sYXRpbGUgZGF0YSBzZWdtZW50IHN0YXJ0IGFkZHJlc3MgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoRklSRVdBTEwtPlZEU1NBLCAoRldfVkRTU0FfQUREICYgZndfaW5pdC0+VkRhdGFTZWdtZW50U3RhcnRBZGRyZXNzKSk7CisJLyogUHJvdGVjdGVkIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBsZW5ndGggY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoRklSRVdBTEwtPlZEU0wsIChGV19WRFNMX0xFTkcgJiBmd19pbml0LT5WRGF0YVNlZ21lbnRMZW5ndGgpKTsgIAorICAKKyAgLyogU2V0IEZpcmV3YWxsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgVkRFIGFuZCBWRFMgYml0cworICAgICAodm9sYXRpbGUgZGF0YSBleGVjdXRpb24gYW5kIHNoYXJlZCBjb25maWd1cmF0aW9uKSAqLyAgCisgIE1PRElGWV9SRUcoRklSRVdBTEwtPkNSLCBGV19DUl9WRFN8RldfQ1JfVkRFLCBmd19pbml0LT5Wb2xhdGlsZURhdGFFeGVjdXRpb258ZndfaW5pdC0+Vm9sYXRpbGVEYXRhU2hhcmVkKTsKKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXRyaWV2ZSB0aGUgRmlyZXdhbGwgY29uZmlndXJhdGlvbi4KKyAgKiBAcGFyYW0gZndfY29uZmlnOiBGaXJld2FsbCBjb25maWd1cmF0aW9uLCB0eXBlIGlzIHNhbWUgYXMgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlCisgICogQG5vdGUgVGhpcyBBUEkgY2FuJ3QgYmUgZXhlY3V0ZWQgaW5zaWRlIGEgY29kZSBhcmVhIHByb3RlY3RlZCBieSB0aGUgRmlyZXdhbGwKKyAgKiAgICAgICB3aGVuIHRoZSBGaXJld2FsbCBpcyBlbmFibGVkCisgICogQG5vdGUgSWYgTlZEU0wgcmVnaXN0ZXIgaXMgZGlmZmVyZW50IGZyb20gMCwgdGhhdCBpcywgaWYgdGhlIG5vbiB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgCisgICogICAgICAgaXMgZGVmaW5lZCwgdGhpcyBBUEkgY2FuJ3QgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmlyZXdhbGwgaXMgZW5hYmxlZC4gICAgICAKKyAgKiBAbm90ZSBVc2VyIHNob3VsZCByZXNvcnQgdG8gX19IQUxfRklSRVdBTExfR0VUX1BSRUFSTSgpIG1hY3JvIHRvIHJldHJpZXZlIEZQQSBiaXQgc3RhdHVzICAgICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GSVJFV0FMTF9HZXRDb25maWcoRklSRVdBTExfSW5pdFR5cGVEZWYgKiBmd19jb25maWcpCit7CisKKyAgLyogRW5hYmxlIEZpcmV3YWxsIGNsb2NrLCBpbiBjYXNlIG5vIEZpcmV3YWxsIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY2FycmllZCAKKyAgICAgb3V0IHVwIHRvIHRoaXMgcG9pbnQgKi8KKyAgX19IQUxfUkNDX0ZJUkVXQUxMX0NMS19FTkFCTEUoKTsKKworICAvKiBSZXRyaWV2ZSBjb2RlIHNlZ21lbnQgcHJvdGVjdGlvbiBzZXR0aW5nICovCisgIGZ3X2NvbmZpZy0+Q29kZVNlZ21lbnRTdGFydEFkZHJlc3MgPSAoUkVBRF9SRUcoRklSRVdBTEwtPkNTU0EpICYgRldfQ1NTQV9BREQpOworICBmd19jb25maWctPkNvZGVTZWdtZW50TGVuZ3RoID0gKFJFQURfUkVHKEZJUkVXQUxMLT5DU0wpICYgRldfQ1NMX0xFTkcpOworICAKKyAgLyogUmV0cmlldmUgbm9uIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBwcm90ZWN0aW9uIHNldHRpbmcgKi8KKyAgZndfY29uZmlnLT5Ob25WRGF0YVNlZ21lbnRTdGFydEFkZHJlc3MgPSAoUkVBRF9SRUcoRklSRVdBTEwtPk5WRFNTQSkgJiBGV19OVkRTU0FfQUREKTsKKyAgZndfY29uZmlnLT5Ob25WRGF0YVNlZ21lbnRMZW5ndGggPSAoUkVBRF9SRUcoRklSRVdBTEwtPk5WRFNMKSAmIEZXX05WRFNMX0xFTkcpOworICAKKyAgLyogUmV0cmlldmUgdm9sYXRpbGUgZGF0YSBzZWdtZW50IHByb3RlY3Rpb24gc2V0dGluZyAqLworICBmd19jb25maWctPlZEYXRhU2VnbWVudFN0YXJ0QWRkcmVzcyA9IChSRUFEX1JFRyhGSVJFV0FMTC0+VkRTU0EpICYgRldfVkRTU0FfQUREKTsKKyAgZndfY29uZmlnLT5WRGF0YVNlZ21lbnRMZW5ndGggPSAoUkVBRF9SRUcoRklSRVdBTEwtPlZEU0wpICYgRldfVkRTTF9MRU5HKTsgICAgIAorICAKKyAgLyogUmV0cmlldmUgdm9sYXRpbGUgZGF0YSBleGVjdXRpb24gc2V0dGluZyAqLworICBmd19jb25maWctPlZvbGF0aWxlRGF0YUV4ZWN1dGlvbiA9IChSRUFEX1JFRyhGSVJFV0FMTC0+Q1IpICYgRldfQ1JfVkRFKTsKKyAgCisgIC8qIFJldHJpZXZlIHZvbGF0aWxlIGRhdGEgc2hhcmVkIHNldHRpbmcgKi8KKyAgZndfY29uZmlnLT5Wb2xhdGlsZURhdGFTaGFyZWQgPSAoUkVBRF9SRUcoRklSRVdBTEwtPkNSKSAmIEZXX0NSX1ZEUyk7CisgIAorICByZXR1cm47Cit9CisKKworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIEZJUkVXQUxMLiAKKyAgKiBAbm90ZSBGaXJld2FsbCBpcyBlbmFibGVkIGluIGNsZWFyaW5nIEZXRElTIGJpdCBvZiBTWVNDRkcgQ0ZHUjEgcmVnaXN0ZXIuCisgICogICAgICAgT25jZSBlbmFibGVkLCB0aGUgRmlyZXdhbGwgY2Fubm90IGJlIGRpc2FibGVkIGJ5IHNvZnR3YXJlLiBPbmx5IGEgCisgICogICAgICAgc3lzdGVtIHJlc2V0IGNhbiBzZXQgYWdhaW4gRldESVMgYml0LiAgICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GSVJFV0FMTF9FbmFibGVGaXJld2FsbCh2b2lkKQoreworICAvKiBDbGVhcnMgRldESVMgYml0IG9mIFNZU0NGRyBDRkdSMSByZWdpc3RlciAqLworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX0ZXRElTRU4pOworICAKK30KKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBGSVJFV0FMTCBwcmUgYXJtLiAKKyAgKiBAbm90ZSBXaGVuIEZQQSBiaXQgaXMgc2V0LCBhbnkgY29kZSBleGVjdXRlZCBvdXRzaWRlIHRoZSBwcm90ZWN0ZWQgc2VnbWVudCAKKyAgKiAgICAgICB3aWxsIGNsb3NlIHRoZSBGaXJld2FsbC4gCisgICogQG5vdGUgVGhpcyBBUEkgcHJvdmlkZXMgdGhlIHNhbWUgc2VydmljZSBhcyBfX0hBTF9GSVJFV0FMTF9QUkVBUk1fRU5BQkxFKCkgbWFjcm8KKyAgKiAgICAgICBidXQgY2FuJ3QgYmUgZXhlY3V0ZWQgaW5zaWRlIGEgY29kZSBhcmVhIHByb3RlY3RlZCBieSB0aGUgRmlyZXdhbGwuIAorICAqIEBub3RlIFdoZW4gdGhlIEZpcmV3YWxsIGlzIGRpc2FibGVkLCB1c2VyIGNhbiByZXNvcnQgdG8gSEFMX0ZJUkVXQUxMX0VuYWJsZVByZUFybUZsYWcoKSBBUEkgYW55IHRpbWUuICAgCisgICogQG5vdGUgV2hlbiB0aGUgRmlyZXdhbGwgaXMgZW5hYmxlZCBhbmQgTlZEU0wgcmVnaXN0ZXIgaXMgZXF1YWwgdG8gMCAodGhhdCBpcywgCisgICogICAgICAgICAgd2hlbiB0aGUgbm9uIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBpcyBub3QgZGVmaW5lZCksCisgICogICAgICAgICAgKiogIHRoaXMgQVBJIGNhbiBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaXJld2FsbCBpcyBjbG9zZWQKKyAgKiAgICAgICAgICAqKiAgd2hlbiB0aGUgRmlyZXdhbGwgaXMgb3BlbmVkLCB1c2VyIHNob3VsZCByZXNvcnQgdG8gCisgICogICAgICAgICAgICAgIF9fSEFMX0ZJUkVXQUxMX1BSRUFSTV9FTkFCTEUoKSBtYWNybyBpbnN0ZWFkCisgICogQG5vdGUgV2hlbiB0aGUgRmlyZXdhbGwgaXMgZW5hYmxlZCBhbmQgIE5WRFNMIHJlZ2lzdGVyIGlzIGRpZmZlcmVudCBmcm9tIDAKKyAgKiAgICAgICAgICAodGhhdCBpcywgd2hlbiB0aGUgbm9uIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBpcyBkZWZpbmVkKQorICAqICAgICAgICAgICoqICBGV19DUiByZWdpc3RlciBjYW4gYmUgYWNjZXNzZWQgb25seSB3aGVuIHRoZSBGaXJld2FsbCBpcyBvcGVuZWQ6IAorICAqICAgICAgICAgICAgICB1c2VyIHNob3VsZCByZXNvcnQgdG8gIF9fSEFMX0ZJUkVXQUxMX1BSRUFSTV9FTkFCTEUoKSBtYWNybyBpbnN0ZWFkLiAgICAgICAgICAgICAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRklSRVdBTExfRW5hYmxlUHJlQXJtRmxhZyh2b2lkKQoreworICAvKiBTZXQgRlBBIGJpdCAqLworICBTRVRfQklUKEZJUkVXQUxMLT5DUiwgRldfQ1JfRlBBKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBGSVJFV0FMTCBwcmUgYXJtLgorICAqIEBub3RlIFdoZW4gRlBBIGJpdCBpcyByZXNldCwgYW55IGNvZGUgZXhlY3V0ZWQgb3V0c2lkZSB0aGUgcHJvdGVjdGVkIHNlZ21lbnQgCisgICogICAgICAgd2hlbiB0aGUgRmlyZXdhbGwgaXMgb3BlbmVkIHdpbGwgZ2VuZXJhdGUgYSBzeXN0ZW0gcmVzZXQuCisgICogQG5vdGUgVGhpcyBBUEkgcHJvdmlkZXMgdGhlIHNhbWUgc2VydmljZSBhcyBfX0hBTF9GSVJFV0FMTF9QUkVBUk1fRElTQUJMRSgpIG1hY3JvCisgICogICAgICAgYnV0IGNhbid0IGJlIGV4ZWN1dGVkIGluc2lkZSBhIGNvZGUgYXJlYSBwcm90ZWN0ZWQgYnkgdGhlIEZpcmV3YWxsLgorICAqIEBub3RlIFdoZW4gdGhlIEZpcmV3YWxsIGlzIGRpc2FibGVkLCB1c2VyIGNhbiByZXNvcnQgdG8gSEFMX0ZJUkVXQUxMX0VuYWJsZVByZUFybUZsYWcoKSBBUEkgYW55IHRpbWUuICAgCisgICogQG5vdGUgV2hlbiB0aGUgRmlyZXdhbGwgaXMgZW5hYmxlZCBhbmQgTlZEU0wgcmVnaXN0ZXIgaXMgZXF1YWwgdG8gMCAodGhhdCBpcywgCisgICogICAgICAgICAgd2hlbiB0aGUgbm9uIHZvbGF0aWxlIGRhdGEgc2VnbWVudCBpcyBub3QgZGVmaW5lZCksCisgICogICAgICAgICAgKiogIHRoaXMgQVBJIGNhbiBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaXJld2FsbCBpcyBjbG9zZWQKKyAgKiAgICAgICAgICAqKiAgd2hlbiB0aGUgRmlyZXdhbGwgaXMgb3BlbmVkLCB1c2VyIHNob3VsZCByZXNvcnQgdG8gCisgICogICAgICAgICAgICAgIF9fSEFMX0ZJUkVXQUxMX1BSRUFSTV9ESVNBQkxFKCkgbWFjcm8gaW5zdGVhZAorICAqIEBub3RlIFdoZW4gdGhlIEZpcmV3YWxsIGlzIGVuYWJsZWQgYW5kICBOVkRTTCByZWdpc3RlciBpcyBkaWZmZXJlbnQgZnJvbSAwCisgICogICAgICAgICAgKHRoYXQgaXMsIHdoZW4gdGhlIG5vbiB2b2xhdGlsZSBkYXRhIHNlZ21lbnQgaXMgZGVmaW5lZCkKKyAgKiAgICAgICAgICAqKiAgRldfQ1IgcmVnaXN0ZXIgY2FuIGJlIGFjY2Vzc2VkIG9ubHkgd2hlbiB0aGUgRmlyZXdhbGwgaXMgb3BlbmVkOiAKKyAgKiAgICAgICAgICAgICAgdXNlciBzaG91bGQgcmVzb3J0IHRvICBfX0hBTF9GSVJFV0FMTF9QUkVBUk1fRElTQUJMRSgpIG1hY3JvIGluc3RlYWQuICAgICAgICAgICAgICAgCisgICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GSVJFV0FMTF9EaXNhYmxlUHJlQXJtRmxhZyh2b2lkKQoreworICAvKiBDbGVhciBGUEEgYml0ICovCisgIENMRUFSX0JJVChGSVJFV0FMTC0+Q1IsIEZXX0NSX0ZQQSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfRklSRVdBTExfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZCAoU1RNMzJMMDEweEIpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDQpICYmICFkZWZpbmVkIChTVE0zMkwwMTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDAyMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDMxeHgpICYmICFkZWZpbmVkIChTVE0zMkwwNDF4eCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsX2ZsYXNoLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Njk5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9mbGFzaC5jCkBAIC0wLDAgKzEsNzY5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9mbGFzaC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBGTEFTSCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgaW50ZXJuYWwgRkxBU0ggbWVtb3J5OgorICAqICAgICAgICAgICArIFByb2dyYW0gb3BlcmF0aW9ucyBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBNZW1vcnkgQ29udHJvbCBmdW5jdGlvbnMgCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBGTEFTSCBwZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIFRoZSBGbGFzaCBtZW1vcnkgaW50ZXJmYWNlIG1hbmFnZXMgQ1BVIEFIQiBJLUNvZGUgYW5kIEQtQ29kZSBhY2Nlc3NlcyAKKyAgICAgICB0byB0aGUgRmxhc2ggbWVtb3J5LiBJdCBpbXBsZW1lbnRzIHRoZSBlcmFzZSBhbmQgcHJvZ3JhbSBGbGFzaCBtZW1vcnkgb3BlcmF0aW9ucyAKKyAgICAgICBhbmQgdGhlIHJlYWQgYW5kIHdyaXRlIHByb3RlY3Rpb24gbWVjaGFuaXNtcy4KKworICBbLi5dIFRoZSBGbGFzaCBtZW1vcnkgaW50ZXJmYWNlIGFjY2VsZXJhdGVzIGNvZGUgZXhlY3V0aW9uIHdpdGggYSBzeXN0ZW0gb2YgaW5zdHJ1Y3Rpb24KKyAgICAgIHByZWZldGNoLiAKKworICBbLi5dIFRoZSBGTEFTSCBtYWluIGZlYXR1cmVzIGFyZToKKyAgICAgICgrKSBGbGFzaCBtZW1vcnkgcmVhZCBvcGVyYXRpb25zCisgICAgICAoKykgRmxhc2ggbWVtb3J5IHByb2dyYW0vZXJhc2Ugb3BlcmF0aW9ucworICAgICAgKCspIFJlYWQgLyB3cml0ZSBwcm90ZWN0aW9ucworICAgICAgKCspIFByZWZldGNoIG9uIEktQ29kZQorICAgICAgKCspIE9wdGlvbiBCeXRlcyBwcm9ncmFtbWluZworCisKKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdG8gY29uZmlndXJlIGFuZCBwcm9ncmFtIHRoZSBGTEFTSCAKKyAgICAgIG1lbW9yeSBvZiBhbGwgU1RNMzJMMHh4IGRldmljZXMuCisgICAgCisgICAgICAoIykgRkxBU0ggTWVtb3J5IEkvTyBQcm9ncmFtbWluZyBmdW5jdGlvbnM6IHRoaXMgZ3JvdXAgaW5jbHVkZXMgYWxsIG5lZWRlZAorICAgICAgICAgIGZ1bmN0aW9ucyB0byBlcmFzZSBhbmQgcHJvZ3JhbSB0aGUgbWFpbiBtZW1vcnk6CisgICAgICAgICgrKykgTG9jayBhbmQgVW5sb2NrIHRoZSBGTEFTSCBpbnRlcmZhY2UKKyAgICAgICAgKCsrKSBFcmFzZSBmdW5jdGlvbjogRXJhc2UgcGFnZQorICAgICAgICAoKyspIFByb2dyYW0gZnVuY3Rpb25zOiBGYXN0IFdvcmQgYW5kIEhhbGYgUGFnZShzaG91bGQgYmUgCisgICAgICAgIGV4ZWN1dGVkIGZyb20gaW50ZXJuYWwgU1JBTSkuCisgIAorICAgICAgKCMpIERBVEEgRUVQUk9NIFByb2dyYW1taW5nIGZ1bmN0aW9uczogdGhpcyBncm91cCBpbmNsdWRlcyBhbGwgCisgICAgICAgICAgbmVlZGVkIGZ1bmN0aW9ucyB0byBlcmFzZSBhbmQgcHJvZ3JhbSB0aGUgREFUQSBFRVBST00gbWVtb3J5OgorICAgICAgICAoKyspIExvY2sgYW5kIFVubG9jayB0aGUgREFUQSBFRVBST00gaW50ZXJmYWNlLgorICAgICAgICAoKyspIEVyYXNlIGZ1bmN0aW9uOiBFcmFzZSBCeXRlLCBlcmFzZSBIYWxmV29yZCwgZXJhc2UgV29yZCwgZXJhc2UgCisgICAgICAgICAgICAgRG91YmxlIFdvcmQgKHNob3VsZCBiZSBleGVjdXRlZCBmcm9tIGludGVybmFsIFNSQU0pLgorICAgICAgICAoKyspIFByb2dyYW0gZnVuY3Rpb25zOiBGYXN0IFByb2dyYW0gQnl0ZSwgRmFzdCBQcm9ncmFtIEhhbGYtV29yZCwgCisgICAgICAgICAgICAgRmFzdFByb2dyYW1Xb3JkLCBQcm9ncmFtIEJ5dGUsIFByb2dyYW0gSGFsZi1Xb3JkLCAKKyAgICAgICAgICAgICBQcm9ncmFtIFdvcmQgYW5kIFByb2dyYW0gRG91YmxlLVdvcmQgKHNob3VsZCBiZSBleGVjdXRlZCAKKyAgICAgICAgICAgICBmcm9tIGludGVybmFsIFNSQU0pLgorCisgICAgICAoIykgRkxBU0ggT3B0aW9uIEJ5dGVzIFByb2dyYW1taW5nIGZ1bmN0aW9uczogdGhpcyBncm91cCBpbmNsdWRlcyBhbGwgbmVlZGVkCisgICAgICAgICAgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgT3B0aW9uIEJ5dGVzOgorICAgICAgICAoKyspIExvY2sgYW5kIFVubG9jayB0aGUgT3B0aW9uIEJ5dGVzCisgICAgICAgICgrKykgU2V0L1Jlc2V0IHRoZSB3cml0ZSBwcm90ZWN0aW9uCisgICAgICAgICgrKykgU2V0IHRoZSBSZWFkIHByb3RlY3Rpb24gTGV2ZWwKKyAgICAgICAgKCsrKSBQcm9ncmFtIHRoZSB1c2VyIE9wdGlvbiBCeXRlcworICAgICAgICAoKyspIExhdW5jaCB0aGUgT3B0aW9uIEJ5dGVzIGxvYWRlcgorICAgICAgICAoKyspIFNldC9HZXQgdGhlIFJlYWQgcHJvdGVjdGlvbiBMZXZlbC4KKyAgICAgICAgKCsrKSBTZXQvR2V0IHRoZSBCT1IgbGV2ZWwuCisgICAgICAgICgrKykgR2V0IHRoZSBXcml0ZSBwcm90ZWN0aW9uLgorICAgICAgICAoKyspIEdldCB0aGUgdXNlciBvcHRpb24gYnl0ZXMuCisgICAgCisgICAgICAoIykgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudCBmdW5jdGlvbnMgOiB0aGlzIGdyb3VwIAorICAgICAgICAgIGluY2x1ZGVzIGFsbCBuZWVkZWQgZnVuY3Rpb25zIHRvOgorICAgICAgICAoKyspIEhhbmRsZSBGTEFTSCBpbnRlcnJ1cHRzCisgICAgICAgICgrKykgV2FpdCBmb3IgbGFzdCBGTEFTSCBvcGVyYXRpb24gYWNjb3JkaW5nIHRvIGl0cyBzdGF0dXMKKyAgICAgICAgKCsrKSBHZXQgZXJyb3IgZmxhZyBzdGF0dXMKKworICAgICgjKSBGTEFTSCBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBmdW5jdGlvbnM6IHRoaXMgZ3JvdXAgaW5jbHVkZXMgCisgICAgICB0aGUgbWFuYWdlbWVudCBvZiBmb2xsb3dpbmcgZmVhdHVyZXM6CisgICAgICAoKyspIEVuYWJsZS9EaXNhYmxlIHRoZSBSVU4gUG93ZXJEb3duIG1vZGUuCisgICAgICAoKyspIEVuYWJsZS9EaXNhYmxlIHRoZSBTTEVFUCBQb3dlckRvd24gbW9kZS4gIAorICAKKyAgICAoIykgRkxBU0ggUGVyaXBoZXJhbCBTdGF0ZSBtZXRob2RzOiB0aGlzIGdyb3VwIGluY2x1ZGVzIAorICAgICAgdGhlIG1hbmFnZW1lbnQgb2YgZm9sbG93aW5nIGZlYXR1cmVzOgorICAgICAgKCsrKSBXYWl0IGZvciB0aGUgRkxBU0ggb3BlcmF0aW9uCisgICAgICAoKyspICBHZXQgdGhlIHNwZWNpZmljIEZMQVNIIGVycm9yIGZsYWcKKyAgICAKKyAgWy4uXSBJbiBhZGRpdGlvbiB0byB0aGVzZSBmdW5jdGlvbiwgdGhpcyBkcml2ZXIgaW5jbHVkZXMgYSBzZXQgb2YgbWFjcm9zIGFsbG93aW5nCisgICAgICAgdG8gaGFuZGxlIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uczoKKyAgICAgIAorICAgICAgKCspIFNldC9HZXQgdGhlIGxhdGVuY3kKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgcHJlZmV0Y2ggYnVmZmVyCisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIHByZXJlYWQgYnVmZmVyCisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEZsYXNoIHBvd2VyLWRvd24KKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgRkxBU0ggaW50ZXJydXB0cworICAgICAgKCspIE1vbml0b3IgdGhlIEZMQVNIIGZsYWdzIHN0YXR1cworICAgICAgICAgIAorICAgICAgICAgICAgICAgICAjIyMjIyBQcm9ncmFtbWluZyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgICBbLi5dCisgICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBGTEFTSCAKKyAgICAgcHJvZ3JhbSBvcGVyYXRpb25zLgorICAKKyAgICBbLi5dIFRoZSBGTEFTSCBNZW1vcnkgUHJvZ3JhbW1pbmcgZnVuY3Rpb25zLCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgICAgKCspIEhBTF9GTEFTSF9VbmxvY2sodm9pZCk7CisgICAgICgrKSBIQUxfRkxBU0hfTG9jayh2b2lkKTsKKyAgICAgKCspIEhBTF9GTEFTSF9Qcm9ncmFtKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLCB1aW50MzJfdCBEYXRhKQorICAgICAoKykgSEFMX0ZMQVNIX1Byb2dyYW1fSVQodWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IERhdGEpCisgICAgCisgICAgIFsuLl0gQW55IG9wZXJhdGlvbiBvZiBlcmFzZSBvciBwcm9ncmFtIHNob3VsZCBmb2xsb3cgdGhlc2Ugc3RlcHM6CisgICAgICgjKSBDYWxsIHRoZSBIQUxfRkxBU0hfVW5sb2NrKCkgZnVuY3Rpb24gdG8gZW5hYmxlIHRoZSBmbGFzaCBjb250cm9sIHJlZ2lzdGVyIGFuZCAKKyAgICAgICAgIHByb2dyYW0gbWVtb3J5IGFjY2Vzcy4KKyAgICAgKCMpIENhbGwgdGhlIGRlc2lyZWQgZnVuY3Rpb24gdG8gZXJhc2UgcGFnZSBvciBwcm9ncmFtIGRhdGEuCisgICAgICgjKSBDYWxsIHRoZSBIQUxfRkxBU0hfTG9jaygpIHRvIGRpc2FibGUgdGhlIGZsYXNoIHByb2dyYW0gbWVtb3J5IGFjY2VzcyAKKyAgICAgICAgKHJlY29tbWVuZGVkIHRvIHByb3RlY3QgdGhlIEZMQVNIIG1lbW9yeSBhZ2FpbnN0IHBvc3NpYmxlIHVud2FudGVkIG9wZXJhdGlvbikuCisgIAorICAgICAgICAgICAgICAgIyMjIyMgT3B0aW9uIEJ5dGVzIFByb2dyYW1taW5nIGZ1bmN0aW9ucyAjIyMjIyAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgIAorICAgICBbLi5dIFRoZSBGTEFTSF9PcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmdfZnVuY3Rpb25zLCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgICAgKCspIEhBTF9GTEFTSF9PQl9VbmxvY2sodm9pZCk7CisgICAgICgrKSBIQUxfRkxBU0hfT0JfTG9jayh2b2lkKTsKKyAgICAgKCspIEhBTF9GTEFTSF9PQl9MYXVuY2godm9pZCk7CisgICAgICgrKSBIQUxfRkxBU0hFeF9PQlByb2dyYW0oRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpOworICAgICAoKykgSEFMX0ZMQVNIRXhfT0JHZXRDb25maWcoRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpOworICAgIAorICAgICBbLi5dIEFueSBvcGVyYXRpb24gb2YgZXJhc2Ugb3IgcHJvZ3JhbSBzaG91bGQgZm9sbG93IHRoZXNlIHN0ZXBzOgorICAgICAoIykgQ2FsbCB0aGUgSEFMX0ZMQVNIX09CX1VubG9jaygpIGZ1bmN0aW9uIHRvIGVuYWJsZSB0aGUgRmxhc2ggb3B0aW9uIGNvbnRyb2wgCisgICAgICAgICByZWdpc3RlciBhY2Nlc3MuCisgICAgICgjKSBDYWxsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIHByb2dyYW0gdGhlIGRlc2lyZWQgb3B0aW9uIGJ5dGVzLgorICAgICAgICAgKCsrKSBIQUxfRkxBU0hFeF9PQlByb2dyYW0oRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpOyAgICAgIAorICAgICAoIykgT25jZSBhbGwgbmVlZGVkIG9wdGlvbiBieXRlcyB0byBiZSBwcm9ncmFtbWVkIGFyZSBjb3JyZWN0bHkgd3JpdHRlbiwgY2FsbCB0aGUKKyAgICAgICAgIEhBTF9GTEFTSF9PQl9MYXVuY2godm9pZCkgZnVuY3Rpb24gdG8gbGF1bmNoIHRoZSBPcHRpb24gQnl0ZXMgcHJvZ3JhbW1pbmcgcHJvY2Vzcy4KKyAgICAgKCMpIENhbGwgdGhlIEhBTF9GTEFTSF9PQl9Mb2NrKCkgdG8gZGlzYWJsZSB0aGUgRmxhc2ggb3B0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgYWNjZXNzIChyZWNvbW1lbmRlZAorICAgICAgICAgdG8gcHJvdGVjdCB0aGUgb3B0aW9uIEJ5dGVzIGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgb3BlcmF0aW9ucykuCisgIAorICAgIFsuLl0gUHJvcHJpZXRhcnkgY29kZSBSZWFkIE91dCBQcm90ZWN0aW9uIChQY1JPUCk6ICAgIAorICAgICgjKSBUaGUgUGNST1Agc2VjdG9yIGlzIHNlbGVjdGVkIGJ5IHVzaW5nIHRoZSBzYW1lIG9wdGlvbiBieXRlcyBhcyB0aGUgV3JpdGUKKyAgICAgICAgcHJvdGVjdGlvbi4gQXMgYSByZXN1bHQsIHRoZXNlIDIgb3B0aW9ucyBhcmUgZXhjbHVzaXZlIGVhY2ggb3RoZXIuCisgICAgKCMpIFRvIGFjdGl2YXRlIFBDUk9QIG1vZGUgZm9yIEZsYXNoIHNlY3RvcnMocyksIHlvdSBuZWVkIHRvIGZvbGxvdyB0aGUgc2VxdWVuY2UgYmVsb3c6CisgICAgICAgICgrKykgVXNlIHRoaXMgZnVuY3Rpb24gSEFMX0ZMQVNIRXhfQWR2T0JQcm9ncmFtIHdpdGggUENST1BTdGF0ZSA9IE9CX1BDUk9QX1NUQVRFX0VOQUJMRS4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQKKworLyoqIEBkZWZncm91cCBGTEFTSCBGTEFTSAorICAqIEBicmllZiBGTEFTSCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX0NvbnN0YW50cyBGTEFTSCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9NYWNyb3MgRkxBU0ggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworIAorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9WYXJpYWJsZXMgRkxBU0ggUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworLyogVmFyaWFibGVzIHVzZWQgZm9yIEVyYXNlIHBhZ2VzIHVuZGVyIGludGVycnVwdGlvbiovCitGTEFTSF9Qcm9jZXNzVHlwZURlZiBwRmxhc2g7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX0Z1bmN0aW9ucyBGTEFTSCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgIHZvaWQgICBGTEFTSF9TZXRFcnJvckNvZGUodm9pZCk7CitleHRlcm4gdm9pZCAgICBGTEFTSF9QYWdlRXJhc2UodWludDMyX3QgUGFnZUFkZHJlc3MpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9ucyBGTEFTSCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworICAKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQcm9ncmFtbWluZyBvcGVyYXRpb24gZnVuY3Rpb25zIAorICAqICBAYnJpZWYgICBQcm9ncmFtbWluZyBvcGVyYXRpb24gZnVuY3Rpb25zIAorICAqCitAdmVyYmF0aW0gICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSB3b3JkIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MKKyAgKiBAbm90ZSAgIFRvIGNvcnJlY3RseSBydW4gdGhpcyBmdW5jdGlvbiwgdGhlIEhBTF9GTEFTSF9VbmxvY2soKSBmdW5jdGlvbgorICAqICAgICAgICAgbXVzdCBiZSBjYWxsZWQgYmVmb3JlLgorICAqICAgICAgICAgQ2FsbCB0aGUgSEFMX0ZMQVNIX0xvY2soKSB0byBkaXNhYmxlIHRoZSBmbGFzaCBtZW1vcnkgYWNjZXNzCisgICogICAgICAgICAocmVjb21tZW5kZWQgdG8gcHJvdGVjdCB0aGUgRkxBU0ggbWVtb3J5IGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgb3BlcmF0aW9uKS4KKyAgKgorICAqIEBwYXJhbSAgVHlwZVByb2dyYW0gICBJbmRpY2F0ZSB0aGUgd2F5IHRvIHByb2dyYW0gYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSF9UeXBlX1Byb2dyYW0KKyAgKiBAcGFyYW0gIEFkZHJlc3MgICAgICAgU3BlY2lmaWUgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIERhdGEgICAgICAgICAgU3BlY2lmaWUgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZAorICAqIAorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW0odWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IERhdGEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soJnBGbGFzaCk7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1RZUEVQUk9HUkFNKFR5cGVQcm9ncmFtKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBDbGVhbiB0aGUgZXJyb3IgY29udGV4dCAqLworICAgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAgIC8qUHJvZ3JhbSB3b3JkICgzMi1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuKi8KKyAgICAqKF9fSU8gdWludDMyX3QgKilBZGRyZXNzID0gRGF0YTsKKworICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICAgUHJvZ3JhbSB3b3JkIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MgIHdpdGggaW50ZXJydXB0IGVuYWJsZWQuCisgICoKKyAgKiBAcGFyYW0gIFR5cGVQcm9ncmFtICBJbmRpY2F0ZSB0aGUgd2F5IHRvIHByb2dyYW0gYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIX1R5cGVfUHJvZ3JhbQorICAqIEBwYXJhbSAgQWRkcmVzcyAgICAgIFNwZWNpZmllIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBEYXRhICAgICAgICAgU3BlY2lmaWUgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZAorICAqIAorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW1fSVQodWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IERhdGEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soJnBGbGFzaCk7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1RZUEVQUk9HUkFNKFR5cGVQcm9ncmFtKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgIC8qIEVuYWJsZSBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIGFuZCBFcnJvciBzb3VyY2UgaW50ZXJydXB0cyAqLworICBfX0hBTF9GTEFTSF9FTkFCTEVfSVQoRkxBU0hfSVRfRU9QIHwgRkxBU0hfSVRfRVJSKTsKKyAgCisgIHBGbGFzaC5BZGRyZXNzID0gQWRkcmVzczsKKyAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX1BST0dSQU07CisgIC8qIENsZWFuIHRoZSBlcnJvciBjb250ZXh0ICovCisgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICBpZihUeXBlUHJvZ3JhbSA9PSBGTEFTSF9UWVBFUFJPR1JBTV9XT1JEKQorICB7CisgICAgLyogUHJvZ3JhbSB3b3JkICgzMi1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuICovCisgICAgKihfX0lPIHVpbnQzMl90ICopQWRkcmVzcyA9IERhdGE7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBGTEFTSCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0ZMQVNIX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgdWludDMyX3QgYWRkcmVzc3RtcCA9IDA7CisgIAorICAvKiBDaGVjayBGTEFTSCBvcGVyYXRpb24gZXJyb3IgZmxhZ3MgKi8KKworICAvKiBXQVJOSU5HIDogT24gdGhlIGZpcnN0IGN1dCBvZiBTVE0zMkwwMzF4eCBhbmQgU1RNMzJMMDQxeHggZGV2aWNlcywKKyAgICogICAgICAgICAgIChSZWZJRCA9IDB4MTAwMCkgdGhlIEZMQVNIX0ZMQUdfT1BUVkVSUiBiaXQgd2FzIG5vdCBiZWhhdmluZworICAgKiAgICAgICAgICAgYXMgZXhwZWN0ZWQuIElmIHRoZSB1c2VyIHJ1biBhbiBhcHBsaWNhdGlvbiB1c2luZyB0aGUgZmlyc3QKKyAgICogICAgICAgICAgIGN1dCBvZiB0aGUgU1RNMzJMMDMxeHggZGV2aWNlIG9yIHRoZSBmaXJzdCBjdXQgb2YgdGhlIFNUTTMyTDA0MXh4CisgICAqICAgICAgICAgICBkZXZpY2UsIHRoZSBjaGVjayBvbiB0aGUgRkxBU0hfRkxBR19PUFRWRVJSIGJpdCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICoKKyAgICogICAgICAgICAgIE5vdGUgOlRoZSByZXZJZCBvZiB0aGUgZGV2aWNlIGNhbiBiZSByZXRyaWV2ZWQgdmlhIHRoZSBIQUxfR2V0UkVWSUQoKQorICAgKiAgICAgICAgICAgZnVuY3Rpb24uCisgICAqCisgICAqLworCisgIGlmKCBfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1dSUEVSUikgICAgIHx8IAorICAgICAgX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19QR0FFUlIpICAgICB8fCAKKyAgICAgIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfU0laRVJSKSAgICAgfHwgCisgICAgICBfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX09QVFZFUlIpICAgIHx8IAorICAgICAgX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19SREVSUikgICAgICB8fCAKKyAgICAgIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfRldXRVJSKSAgICAgfHwgCisgICAgICBfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX05PVFpFUk9FUlIpICkKKyAgeworICAgIGlmKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID09IEZMQVNIX1BST0NfUEFHRUVSQVNFKQorICAgIHsKKyAgICAgIC8qIFJldHVybiB0aGUgZmF1bHR5IHNlY3RvciAqLworICAgICAgYWRkcmVzc3RtcCA9IHBGbGFzaC5QYWdlOworICAgICAgcEZsYXNoLlBhZ2UgPSAweEZGRkZGRkZGVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJldHVybiB0aGUgZmF1bHR5IGFkZHJlc3MgKi8KKyAgICAgIGFkZHJlc3N0bXAgPSBwRmxhc2guQWRkcmVzczsKKyAgICB9CisgICAgLyogU2F2ZSB0aGUgRXJyb3IgY29kZSAqLworICAgIEZMQVNIX1NldEVycm9yQ29kZSgpOworICAgIAorICAgIC8qIEZMQVNIIGVycm9yIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX0ZMQVNIX09wZXJhdGlvbkVycm9yQ2FsbGJhY2soYWRkcmVzc3RtcCk7CisKKyAgICAvKiBTdG9wIHRoZSBwcm9jZWR1cmUgb25nb2luZyAqLworICAgIHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfUFJPQ19OT05FOworICB9CisKKyAgLyogQ2hlY2sgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICAqLworICBpZihfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX0VPUCkpCisgIHsKKyAgICAvKiBDbGVhciBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIHBlbmRpbmcgYml0ICovCisgICAgX19IQUxfRkxBU0hfQ0xFQVJfRkxBRyhGTEFTSF9GTEFHX0VPUCk7CisgICAgCisgICAgLyogUHJvY2VzcyBjYW4gY29udGludWUgb25seSBpZiBubyBlcnJvciBkZXRlY3RlZCAqLworICAgIGlmKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nICE9IEZMQVNIX1BST0NfTk9ORSkKKyAgICB7CisgICAgICBpZihwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9PSBGTEFTSF9QUk9DX1BBR0VFUkFTRSkKKyAgICAgIHsKKyAgICAgICAgLyogTmIgb2YgcGFnZXMgdG8gZXJhc2VkIGNhbiBiZSBkZWNyZWFzZWQgKi8KKyAgICAgICAgcEZsYXNoLk5iUGFnZXNUb0VyYXNlLS07CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlcmUgYXJlIHN0aWxsIHBhZ2VzIHRvIGVyYXNlICovCisgICAgICAgIGlmKHBGbGFzaC5OYlBhZ2VzVG9FcmFzZSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGFkZHJlc3N0bXAgPSBwRmxhc2guUGFnZTsKKyAgICAgICAgICAvKkluZGljYXRlIHVzZXIgd2hpY2ggc2VjdG9yIGhhcyBiZWVuIGVyYXNlZCAqLworICAgICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKGFkZHJlc3N0bXApOworCisgICAgICAgICAgLypJbmNyZW1lbnQgc2VjdG9yIG51bWJlciovCisgICAgICAgICAgYWRkcmVzc3RtcCA9IHBGbGFzaC5QYWdlICsgRkxBU0hfUEFHRV9TSVpFOworICAgICAgICAgIHBGbGFzaC5QYWdlID0gYWRkcmVzc3RtcDsKKworICAgICAgICAgIC8qIElmIHRoZSBlcmFzZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBFUkFTRSBCaXQgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfRVJBU0UpOworCisgICAgICAgICAgRkxBU0hfUGFnZUVyYXNlKGFkZHJlc3N0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vIG1vcmUgcGFnZXMgdG8gRXJhc2UsIHVzZXIgY2FsbGJhY2sgY2FuIGJlIGNhbGxlZC4gKi8KKyAgICAgICAgICAvKiBSZXNldCBTZWN0b3IgYW5kIHN0b3AgRXJhc2UgcGFnZXMgcHJvY2VkdXJlICovCisgICAgICAgICAgcEZsYXNoLlBhZ2UgPSBhZGRyZXNzdG1wID0gMHhGRkZGRkZGRlU7CisgICAgICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkU7CisgICAgICAgICAgLyogRkxBU0ggRU9QIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2soYWRkcmVzc3RtcCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICAvKiBJZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBQUk9HIEJpdCAqLworICAgICAgICAgIENMRUFSX0JJVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9QUk9HKTsKKworICAgICAgICAgIC8qIFByb2dyYW0gZW5kZWQuIFJldHVybiB0aGUgc2VsZWN0ZWQgYWRkcmVzcyAqLworICAgICAgICAgIC8qIEZMQVNIIEVPUCBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHBGbGFzaC5BZGRyZXNzKTsKKyAgICAgICAgCisgICAgICAgICAgLyogUmVzZXQgQWRkcmVzcyBhbmQgc3RvcCBQcm9ncmFtIHByb2NlZHVyZSAqLworICAgICAgICAgIHBGbGFzaC5BZGRyZXNzID0gMHhGRkZGRkZGRlU7CisgICAgICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9QUk9DX05PTkU7CisgICAgICB9CisgICAgfQorICB9CisgIAorCisgIGlmKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID09IEZMQVNIX1BST0NfTk9ORSkKKyAgeworICAgIC8qIE9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIFBST0cgYW5kIEVSQVNFICovCisgICAgQ0xFQVJfQklUKEZMQVNILT5QRUNSLCAoRkxBU0hfUEVDUl9FUkFTRSB8IEZMQVNIX1BFQ1JfUFJPRykpOworCisgICAgLyogRGlzYWJsZSBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIGFuZCBFcnJvciBzb3VyY2UgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX0ZMQVNIX0RJU0FCTEVfSVQoRkxBU0hfSVRfRU9QIHwgRkxBU0hfSVRfRVJSKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBGTEFTSCBlbmQgb2Ygb3BlcmF0aW9uIGludGVycnVwdCBjYWxsYmFjaworICAqIEBwYXJhbSAgUmV0dXJuVmFsdWUgVGhlIHZhbHVlIHNhdmVkIGluIHRoaXMgcGFyYW1ldGVyIGRlcGVuZHMgb24gdGhlIG9uZ29pbmcgcHJvY2VkdXJlCisgICogICAgICAgICAgICAgICAgIC0gUGFnZXMgRXJhc2U6IEFkZHJlc3Mgb2YgdGhlIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gZXJhc2VkIAorICAqICAgICAgICAgICAgICAgICAgICAoaWYgMHhGRkZGRkZGRiwgaXQgbWVhbnMgdGhhdCBhbGwgdGhlIHNlbGVjdGVkIHBhZ2VzIGhhdmUgYmVlbiBlcmFzZWQpCisgICogICAgICAgICAgICAgICAgIC0gUHJvZ3JhbTogQWRkcmVzcyB3aGljaCB3YXMgc2VsZWN0ZWQgZm9yIGRhdGEgcHJvZ3JhbQorICAqIEByZXR2YWwgbm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2sodWludDMyX3QgUmV0dXJuVmFsdWUpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKFJldHVyblZhbHVlKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEBicmllZiAgRkxBU0ggb3BlcmF0aW9uIGVycm9yIGludGVycnVwdCBjYWxsYmFjaworICAqIEBwYXJhbSAgUmV0dXJuVmFsdWUgVGhlIHZhbHVlIHNhdmVkIGluIHRoaXMgcGFyYW1ldGVyIGRlcGVuZHMgb24gdGhlIG9uZ29pbmcgcHJvY2VkdXJlCisgICogICAgICAgICAgICAgICAgIC0gUGFnZXMgRXJhc2U6IEFkZHJlc3Mgb2YgdGhlIHBhZ2Ugd2hpY2ggcmV0dXJuZWQgYW4gZXJyb3IKKyAgKiAgICAgICAgICAgICAgICAgLSBQcm9ncmFtOiBBZGRyZXNzIHdoaWNoIHdhcyBzZWxlY3RlZCBmb3IgZGF0YSBwcm9ncmFtCisgICogQHJldHZhbCBub25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayh1aW50MzJfdCBSZXR1cm5WYWx1ZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoUmV0dXJuVmFsdWUpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBGTEFTSCAKKyAgICBtZW1vcnkgb3BlcmF0aW9ucy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBVbmxvY2sgdGhlIEZMQVNIIGNvbnRyb2wgcmVnaXN0ZXIgYWNjZXNzCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfVW5sb2NrKHZvaWQpCit7CisgIHVpbnQzMl90IHByaW1hc2tfYml0OworCisgIC8qIFVubG9ja2luZyBGTEFTSF9QRUNSIHJlZ2lzdGVyIGFjY2VzcyovCisgIGlmKEhBTF9JU19CSVRfU0VUKEZMQVNILT5QRUNSLCBGTEFTSF9QRUNSX1BFTE9DSykpCisgIHsKKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgdG8gYXZvaWQgYW55IGludGVycnVwdGlvbiBkdXJpbmcgdW5sb2NrIHNlcXVlbmNlICovCisgICAgcHJpbWFza19iaXQgPSBfX2dldF9QUklNQVNLKCk7CisgICAgX19kaXNhYmxlX2lycSgpOworCisgICAgV1JJVEVfUkVHKEZMQVNILT5QRUtFWVIsIEZMQVNIX1BFS0VZMSk7CisgICAgV1JJVEVfUkVHKEZMQVNILT5QRUtFWVIsIEZMQVNIX1BFS0VZMik7CisKKyAgICAvKiBSZS1lbmFibGUgdGhlIGludGVycnVwdHM6IHJlc3RvcmUgcHJldmlvdXMgcHJpb3JpdHkgbWFzayAqLworICAgIF9fc2V0X1BSSU1BU0socHJpbWFza19iaXQpOworCisgICAgaWYoSEFMX0lTX0JJVF9TRVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUEVMT0NLKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIGlmIChIQUxfSVNfQklUX1NFVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9QUkdMT0NLKSkKKyAgeworICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyB0byBhdm9pZCBhbnkgaW50ZXJydXB0aW9uIGR1cmluZyB1bmxvY2sgc2VxdWVuY2UgKi8KKyAgICBwcmltYXNrX2JpdCA9IF9fZ2V0X1BSSU1BU0soKTsKKyAgICBfX2Rpc2FibGVfaXJxKCk7CisKKyAgICAvKiBVbmxvY2tpbmcgdGhlIHByb2dyYW0gbWVtb3J5IGFjY2VzcyAqLworICAgIFdSSVRFX1JFRyhGTEFTSC0+UFJHS0VZUiwgRkxBU0hfUFJHS0VZMSk7CisgICAgV1JJVEVfUkVHKEZMQVNILT5QUkdLRVlSLCBGTEFTSF9QUkdLRVkyKTsgIAorCisgICAgLyogUmUtZW5hYmxlIHRoZSBpbnRlcnJ1cHRzOiByZXN0b3JlIHByZXZpb3VzIHByaW9yaXR5IG1hc2sgKi8KKyAgICBfX3NldF9QUklNQVNLKHByaW1hc2tfYml0KTsKKworICAgIGlmIChIQUxfSVNfQklUX1NFVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9QUkdMT0NLKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7IAorfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2tzIHRoZSBGTEFTSCBjb250cm9sIHJlZ2lzdGVyIGFjY2VzcworICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX0xvY2sodm9pZCkKK3sKKyAgLyogU2V0IHRoZSBQUkdMT0NLIEJpdCB0byBsb2NrIHRoZSBGTEFTSCBSZWdpc3RlcnMgYWNjZXNzICovCisgIFNFVF9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUFJHTE9DSyk7CisgIAorICAvKiBTZXQgdGhlIFBFTE9DSyBCaXQgdG8gbG9jayB0aGUgUEVDUiBSZWdpc3RlciBhY2Nlc3MgKi8KKyAgU0VUX0JJVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9QRUxPQ0spOworCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBVbmxvY2sgdGhlIEZMQVNIIE9wdGlvbiBDb250cm9sIFJlZ2lzdGVycyBhY2Nlc3MuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfVW5sb2NrKHZvaWQpCit7CisgIHVpbnQzMl90IHByaW1hc2tfYml0OworCisgIGlmKEhBTF9JU19CSVRfU0VUKEZMQVNILT5QRUNSLCBGTEFTSF9QRUNSX09QVExPQ0spKQorICB7CisgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHRvIGF2b2lkIGFueSBpbnRlcnJ1cHRpb24gZHVyaW5nIHVubG9jayBzZXF1ZW5jZSAqLworICAgIHByaW1hc2tfYml0ID0gX19nZXRfUFJJTUFTSygpOworICAgIF9fZGlzYWJsZV9pcnEoKTsKKworICAgIC8qIFVubG9ja2luZyBGTEFTSF9QRUNSIHJlZ2lzdGVyIGFjY2VzcyovCisgICAgaWYoSEFMX0lTX0JJVF9TRVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUEVMT0NLKSkKKyAgICB7ICAKKyAgICAgIC8qIFVubG9ja2luZyBGTEFTSF9QRUNSIHJlZ2lzdGVyIGFjY2VzcyovCisgICAgICBXUklURV9SRUcoRkxBU0gtPlBFS0VZUiwgRkxBU0hfUEVLRVkxKTsKKyAgICAgIFdSSVRFX1JFRyhGTEFTSC0+UEVLRVlSLCBGTEFTSF9QRUtFWTIpOworICAgIH0KKworICAgIC8qIFVubG9ja2luZyB0aGUgb3B0aW9uIGJ5dGVzIGJsb2NrIGFjY2VzcyAqLworICAgIFdSSVRFX1JFRyhGTEFTSC0+T1BUS0VZUiwgRkxBU0hfT1BUS0VZMSk7CisgICAgV1JJVEVfUkVHKEZMQVNILT5PUFRLRVlSLCBGTEFTSF9PUFRLRVkyKTsKKworICAgIC8qIFJlLWVuYWJsZSB0aGUgaW50ZXJydXB0czogcmVzdG9yZSBwcmV2aW91cyBwcmlvcml0eSBtYXNrICovCisgICAgX19zZXRfUFJJTUFTSyhwcmltYXNrX2JpdCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfSAgCisgIAorICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgRkxBU0ggT3B0aW9uIENvbnRyb2wgUmVnaXN0ZXJzIGFjY2Vzcy4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMgCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfTG9jayh2b2lkKQoreworICAvKiBTZXQgdGhlIE9QVExPQ0sgQml0IHRvIGxvY2sgdGhlIG9wdGlvbiBieXRlcyBibG9jayBhY2Nlc3MgKi8KKyAgU0VUX0JJVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9PUFRMT0NLKTsKKyAgCisgIHJldHVybiBIQUxfT0s7ICAKK30KKyAgCisvKioKKyAgKiBAYnJpZWYgIExhdW5jaCB0aGUgb3B0aW9uIGJ5dGUgbG9hZGluZy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCBhdXRvbWF0aWNhbGx5IHRoZSBNQ1UuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfTGF1bmNoKHZvaWQpCit7CisgIC8qIFNldCB0aGUgT0JMX0xhdW5jaCBiaXQgdG8gbGF1bmNoIHRoZSBvcHRpb24gYnl0ZSBsb2FkaW5nICovCisgIFNFVF9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfT0JMX0xBVU5DSCk7CisgIAorICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgcmV0dXJuKEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8gIAorCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBlcnJvcnMgZnVuY3Rpb25zIAorICogIEBicmllZiAgICBQZXJpcGhlcmFsIGVycm9ycyBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0IHRvIGdldCBpbiBydW4tdGltZSBlcnJvcnMgb2YgIHRoZSBGTEFTSCBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWMgRkxBU0ggZXJyb3IgZmxhZy4KKyAgKiBAcmV0dmFsIEZMQVNIX0Vycm9yQ29kZSBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOgorICAqICAgICAgICAgICAgQHJlZiBGTEFTSF9FcnJvcl9Db2RlcworICAqLwordWludDMyX3QgSEFMX0ZMQVNIX0dldEVycm9yKHZvaWQpCit7CisgICByZXR1cm4gcEZsYXNoLkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgV2FpdCBmb3IgYSBGTEFTSCBvcGVyYXRpb24gdG8gY29tcGxldGUuCisgICogQHBhcmFtICBUaW1lb3V0ICBtYXhpbXVtIGZsYXNoIG9wZXJhdGlvbiB0aW1lb3V0CisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBXYWl0IGZvciB0aGUgRkxBU0ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGJ5IHBvbGxpbmcgb24gQlVTWSBmbGFnIHRvIGJlIHJlc2V0LgorICAgICBFdmVuIGlmIHRoZSBGTEFTSCBvcGVyYXRpb24gZmFpbHMsIHRoZSBCVVNZIGZsYWcgd2lsbCBiZSByZXNldCBhbmQgYW4gZXJyb3IKKyAgICAgZmxhZyB3aWxsIGJlIHNldCAqLworICAgICAKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgCisgIHdoaWxlKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfQlNZKSkgCisgIHsgCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoVGltZW91dCA9PSAwVSkgfHwgKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBUaW1lb3V0KSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogQ2hlY2sgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICAqLworICBpZiAoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19FT1ApKQorICB7CisgICAgLyogQ2xlYXIgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBU0hfRkxBR19FT1ApOworICB9CisgIAorICBpZiggX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19XUlBFUlIpICAgICB8fCAKKyAgICAgIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfUEdBRVJSKSAgICAgfHwgCisgICAgICBfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1NJWkVSUikgICAgIHx8IAorICAgICAgX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19PUFRWRVJSKSAgICB8fCAKKyAgICAgIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfUkRFUlIpICAgICAgfHwgCisgICAgICBfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX0ZXV0VSUikgICAgIHx8IAorICAgICAgX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19OT1RaRVJPRVJSKSApCisgIHsKKyAgICAvKlNhdmUgdGhlIGVycm9yIGNvZGUqLworCisgICAgLyogV0FSTklORyA6IE9uIHRoZSBmaXJzdCBjdXQgb2YgU1RNMzJMMDMxeHggYW5kIFNUTTMyTDA0MXh4IGRldmljZXMsCisgICAgICogICAgICAgICAgIChSZWZJRCA9IDB4MTAwMCkgdGhlIEZMQVNIX0ZMQUdfT1BUVkVSUiBiaXQgd2FzIG5vdCBiZWhhdmluZworICAgICAqICAgICAgICAgICBhcyBleHBlY3RlZC4gSWYgdGhlIHVzZXIgcnVuIGFuIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBmaXJzdAorICAgICAqICAgICAgICAgICBjdXQgb2YgdGhlIFNUTTMyTDAzMXh4IGRldmljZSBvciB0aGUgZmlyc3QgY3V0IG9mIHRoZSBTVE0zMkwwNDF4eAorICAgICAqICAgICAgICAgICBkZXZpY2UsIHRoaXMgZXJyb3Igc2hvdWxkIGJlIGlnbm9yZWQuIFRoZSByZXZJZCBvZiB0aGUgZGV2aWNlCisgICAgICogICAgICAgICAgIGNhbiBiZSByZXRyaWV2ZWQgdmlhIHRoZSBIQUxfR2V0UkVWSUQoKSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqLworICAgIEZMQVNIX1NldEVycm9yQ29kZSgpOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBUaGVyZSBpcyBubyBlcnJvciBmbGFnIHNldCAqLworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpYyBGTEFTSCBlcnJvciBmbGFnLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfU2V0RXJyb3JDb2RlKHZvaWQpCit7CisgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgCisgIGlmKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfV1JQRVJSKSkKKyAgeworICAgIHBGbGFzaC5FcnJvckNvZGUgfD0gSEFMX0ZMQVNIX0VSUk9SX1dSUDsKKyAgICBmbGFncyB8PSBGTEFTSF9GTEFHX1dSUEVSUjsKKyAgfQorICBpZihfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1BHQUVSUikpCisgIHsKKyAgICBwRmxhc2guRXJyb3JDb2RlIHw9IEhBTF9GTEFTSF9FUlJPUl9QR0E7CisgICAgZmxhZ3MgfD0gRkxBU0hfRkxBR19QR0FFUlI7CisgIH0KKyAgaWYoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19TSVpFUlIpKQorICB7IAorICAgIHBGbGFzaC5FcnJvckNvZGUgfD0gSEFMX0ZMQVNIX0VSUk9SX1NJWkU7CisgICAgZmxhZ3MgfD0gRkxBU0hfRkxBR19TSVpFUlI7CisgIH0KKyAgaWYoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19PUFRWRVJSKSkKKyAgeworICAgIC8qIFdBUk5JTkcgOiBPbiB0aGUgZmlyc3QgY3V0IG9mIFNUTTMyTDAzMXh4IGFuZCBTVE0zMkwwNDF4eCBkZXZpY2VzLAorICAgICAqICAgICAgICAgICAoUmVmSUQgPSAweDEwMDApIHRoZSBGTEFTSF9GTEFHX09QVFZFUlIgYml0IHdhcyBub3QgYmVoYXZpbmcKKyAgICAgKiAgICAgICAgICAgYXMgZXhwZWN0ZWQuIElmIHRoZSB1c2VyIHJ1biBhbiBhcHBsaWNhdGlvbiB1c2luZyB0aGUgZmlyc3QKKyAgICAgKiAgICAgICAgICAgY3V0IG9mIHRoZSBTVE0zMkwwMzF4eCBkZXZpY2Ugb3IgdGhlIGZpcnN0IGN1dCBvZiB0aGUgU1RNMzJMMDQxeHgKKyAgICAgKiAgICAgICAgICAgZGV2aWNlLCB0aGlzIGVycm9yIHNob3VsZCBiZSBpZ25vcmVkLiBUaGUgcmV2SWQgb2YgdGhlIGRldmljZQorICAgICAqICAgICAgICAgICBjYW4gYmUgcmV0cmlldmVkIHZpYSB0aGUgSEFMX0dldFJFVklEKCkgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKi8KKyAgICBwRmxhc2guRXJyb3JDb2RlIHw9IEhBTF9GTEFTSF9FUlJPUl9PUFRWOworICAgIGZsYWdzIHw9IEZMQVNIX0ZMQUdfT1BUVkVSUjsKKyAgfQorCisgIGlmKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfUkRFUlIpKQorICB7CisgICAgcEZsYXNoLkVycm9yQ29kZSB8PSBIQUxfRkxBU0hfRVJST1JfUkQ7CisgICAgZmxhZ3MgfD0gRkxBU0hfRkxBR19SREVSUjsKKyAgfQorICBpZihfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX0ZXV0VSUikpCisgIHsgCisgICAgcEZsYXNoLkVycm9yQ29kZSB8PSBIQUxfRkxBU0hfRVJST1JfRldXRVJSOworICAgIGZsYWdzIHw9IEhBTF9GTEFTSF9FUlJPUl9GV1dFUlI7CisgIH0KKyAgaWYoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19OT1RaRVJPRVJSKSkKKyAgeyAKKyAgICBwRmxhc2guRXJyb3JDb2RlIHw9IEhBTF9GTEFTSF9FUlJPUl9OT1RaRVJPOworICAgIGZsYWdzIHw9IEZMQVNIX0ZMQUdfTk9UWkVST0VSUjsKKyAgfQorCisgIC8qIENsZWFyIEZMQVNIIGVycm9yIHBlbmRpbmcgYml0cyAqLworICBfX0hBTF9GTEFTSF9DTEVBUl9GTEFHKGZsYWdzKTsKK30gIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfZmxhc2hfZXguYyBiL1NyYy9zdG0zMmwweHhfaGFsX2ZsYXNoX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1OGU2MQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX2ZsYXNoX2V4LmMKQEAgLTAsMCArMSwxMjc0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9mbGFzaF9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBGTEFTSCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgaW50ZXJuYWwgRkxBU0ggbWVtb3J5OgorICAqICAgICAgICAgICAgKyBGTEFTSCBJbnRlcmZhY2UgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICAgKyBGTEFTSCBNZW1vcnkgRXJhc2luZworICAqICAgICAgICAgICAgKyBEQVRBIEVFUFJPTSBQcm9ncmFtbWluZy9FcmFzaW5nCisgICogICAgICAgICAgICArIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZworICAqICAgICAgICAgICAgKyBJbnRlcnJ1cHRzIG1hbmFnZW1lbnQKKyAgKiAgICAKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgIyMjIyMgRmxhc2ggcGVyaXBoZXJhbCBFeHRlbmRlZCBmZWF0dXJlcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgIAorICBbLi5dIENvbXBhcmluZyB0byBvdGhlciBwcm9kdWN0cywgdGhlIEZMQVNIIGludGVyZmFjZSBmb3IgU1RNMzJMMHh4CisgICAgICAgZGV2aWNlcyBjb250YWlucyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmVhdHVyZXMgICAgICAgIAorICAgICAgICgrKSBFcmFzZSBmdW5jdGlvbnMKKyAgICAgICAoKykgREFUQV9FRVBST00gbWVtb3J5IG1hbmFnZW1lbnQKKyAgICAgICAoKykgQk9PVCBvcHRpb24gYml0IGNvbmZpZ3VyYXRpb24gICAgICAgCisgICAgICAgKCspIFBDUk9QIHByb3RlY3Rpb24gZm9yIGFsbCBzZWN0b3JzCisgICAKKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgYW5kIHByb2dyYW0gdGhlIEZMQVNIIG1lbW9yeSAKKyAgICAgICBvZiBhbGwgU1RNMzJMMHh4LiBJdCBpbmNsdWRlczoKKyAgICAgICAoKykgRnVsbCBEQVRBX0VFUFJPTSBlcmFzZSBhbmQgcHJvZ3JhbSBtYW5hZ2VtZW50CisgICAgICAgKCspIEJvb3QgYWN0aXZhdGlvbgorICAgICAgICgrKSBQQ1JPUCBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGNvbnRyb2wgZm9yIGFsbCBwYWdlcworICAKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICovIAorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKyNpZmRlZiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQKKworLyoqIEBhZGR0b2dyb3VwIEZMQVNICisgICogQHsKKyAgKi8KKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9Qcml2YXRlX1ZhcmlhYmxlcworICogQHsKKyAqLworLyogVmFyaWFibGVzIHVzZWQgZm9yIEVyYXNlIHBhZ2VzIHVuZGVyIGludGVycnVwdGlvbiovCitleHRlcm4gRkxBU0hfUHJvY2Vzc1R5cGVEZWYgcEZsYXNoOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEZMQVNIRXggRkxBU0hFeAorICAqIEBicmllZiBGTEFTSCBIQUwgRXh0ZW5zaW9uIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9Qcml2YXRlX0NvbnN0YW50cyBGTEFTSEV4IFByaXZhdGUgQ29uc3RhbnRzCisgKiBAeworICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSEV4X1ByaXZhdGVfTWFjcm9zIEZMQVNIRXggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSEV4X1ByaXZhdGVfRnVuY3Rpb25zIEZMQVNIRXggUHJpdmF0ZSBGdW5jdGlvbnMKKyAqIEB7CisgKi8KK3ZvaWQgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfUGFnZUVyYXNlKHVpbnQzMl90IFBhZ2VBZGRyZXNzKTsKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfQkZCMikKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiAgRkxBU0hfT0JfQm9vdENvbmZpZyh1aW50OF90IE9CX0JPT1QpOworI2VuZGlmIC8qIEZMQVNIX09QVFJfQkZCMiAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmICBGTEFTSF9PQl9SRFBDb25maWcodWludDhfdCBPQl9SRFApOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmICBGTEFTSF9PQl9Vc2VyQ29uZmlnKHVpbnQ4X3QgT0JfSVdERywgdWludDhfdCBPQl9TVE9QLCB1aW50OF90IE9CX1NUREJZKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiAgRkxBU0hfT0JfQk9SQ29uZmlnKHVpbnQ4X3QgT0JfQk9SKTsKK3N0YXRpYyB1aW50OF90ICAgICAgICAgICAgRkxBU0hfT0JfR2V0UkRQKHZvaWQpOworc3RhdGljIHVpbnQ4X3QgICAgICAgICAgICBGTEFTSF9PQl9HZXRVc2VyKHZvaWQpOworc3RhdGljIHVpbnQ4X3QgICAgICAgICAgICBGTEFTSF9PQl9HZXRCT1Iodm9pZCk7CitzdGF0aWMgdWludDhfdCAgICAgICAgICAgIEZMQVNIX09CX0dldEJPT1RCaXQxKHZvaWQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmICBGTEFTSF9PQl9CT09UQml0MUNvbmZpZyh1aW50OF90IE9CX0Jvb3RCaXQxKTsKKyNpZiBkZWZpbmVkKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KSAgCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgIEZMQVNIX09CX1Byb3RlY3RlZFNlY3RvcnNDb25maWcodWludDMyX3QgU2VjdG9yLCB1aW50MzJfdCBTZWN0b3IyLCB1aW50MzJfdCBOZXdTdGF0ZSk7CisjZWxzZQorc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmICBGTEFTSF9PQl9Qcm90ZWN0ZWRTZWN0b3JzQ29uZmlnKHVpbnQzMl90IFNlY3RvciwgdWludDMyX3QgTmV3U3RhdGUpOworI2VuZGlmCitzdGF0aWMgdWludDMyX3QgICAgICAgICAgIEZMQVNIX09CX0dldFdSUCh2b2lkKTsKKyNpZiBkZWZpbmVkKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KSAgCitzdGF0aWMgdWludDMyX3QgICAgICAgICAgIEZMQVNIX09CX0dldFdSUDIodm9pZCk7CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIEZMQVNIRXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRkxBU0hFeCBNZW1vcnkgRXJhc2luZyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBGTEFTSCBNZW1vcnkgRXJhc2luZyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0gICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgRkxBU0ggRXJhc2luZyBQcm9ncmFtbWluZyBmdW5jdGlvbnMgIyMjIyMgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgWy4uXSBUaGUgRkxBU0ggTWVtb3J5IEVyYXNpbmcgZnVuY3Rpb25zLCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgICAoKykgQHJlZiBIQUxfRkxBU0hFeF9FcmFzZTogcmV0dXJuIG9ubHkgd2hlbiBlcmFzZSBoYXMgYmVlbiBkb25lCisgICAgKCspIEByZWYgSEFMX0ZMQVNIRXhfRXJhc2VfSVQ6IGVuZCBvZiBlcmFzZSBpcyBkb25lIHdoZW4gQHJlZiBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayAKKyAgICAgICAgaXMgY2FsbGVkIHdpdGggcGFyYW1ldGVyIDB4RkZGRkZGRkYKKworICAgIFsuLl0gQW55IG9wZXJhdGlvbiBvZiBlcmFzZSBzaG91bGQgZm9sbG93IHRoZXNlIHN0ZXBzOgorICAgICgjKSBDYWxsIHRoZSBAcmVmIEhBTF9GTEFTSF9VbmxvY2soKSBmdW5jdGlvbiB0byBlbmFibGUgdGhlIGZsYXNoIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIAorICAgICAgICBwcm9ncmFtIG1lbW9yeSBhY2Nlc3MuCisgICAgKCMpIENhbGwgdGhlIGRlc2lyZWQgZnVuY3Rpb24gdG8gZXJhc2UgcGFnZS4KKyAgICAoIykgQ2FsbCB0aGUgQHJlZiBIQUxfRkxBU0hfTG9jaygpIHRvIGRpc2FibGUgdGhlIGZsYXNoIHByb2dyYW0gbWVtb3J5IGFjY2VzcyAKKyAgICAgICAocmVjb21tZW5kZWQgdG8gcHJvdGVjdCB0aGUgRkxBU0ggbWVtb3J5IGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgb3BlcmF0aW9uKS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAYnJpZWYgIEVyYXNlIHRoZSBzcGVjaWZpZWQgRkxBU0ggbWVtb3J5IFBhZ2VzIAorICAqIEBub3RlICAgVG8gY29ycmVjdGx5IHJ1biB0aGlzIGZ1bmN0aW9uLCB0aGUgQHJlZiBIQUxfRkxBU0hfVW5sb2NrKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIG11c3QgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiAgICAgICAgIENhbGwgdGhlIEByZWYgSEFMX0ZMQVNIX0xvY2soKSB0byBkaXNhYmxlIHRoZSBmbGFzaCBtZW1vcnkgYWNjZXNzIAorICAqICAgICAgICAgKHJlY29tbWVuZGVkIHRvIHByb3RlY3QgdGhlIEZMQVNIIG1lbW9yeSBhZ2FpbnN0IHBvc3NpYmxlIHVud2FudGVkIG9wZXJhdGlvbikKKyAgKiBAcGFyYW1baW5dICBwRXJhc2VJbml0IHBvaW50ZXIgdG8gYW4gRkxBU0hfRXJhc2VJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBlcmFzaW5nLgorICAqIAorICAqIEBwYXJhbVtvdXRdICBQYWdlRXJyb3IgcG9pbnRlciB0byB2YXJpYWJsZSAgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gb24gZmF1bHR5IHBhZ2UgaW4gY2FzZSBvZiBlcnJvcgorICAqICAgICAgICAgKDB4RkZGRkZGRkYgbWVhbnMgdGhhdCBhbGwgdGhlIHBhZ2VzIGhhdmUgYmVlbiBjb3JyZWN0bHkgZXJhc2VkKQorICAqIAorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRXJhc2UoRkxBU0hfRXJhc2VJbml0VHlwZURlZiAqcEVyYXNlSW5pdCwgdWludDMyX3QgKlBhZ2VFcnJvcikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworICB1aW50MzJfdCBhZGRyZXNzID0gMFU7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKCZwRmxhc2gpOworCisgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKworICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qSW5pdGlhbGl6YXRpb24gb2YgUGFnZUVycm9yIHZhcmlhYmxlKi8KKyAgICAqUGFnZUVycm9yID0gMHhGRkZGRkZGRlU7CisKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19OQlBBR0VTKHBFcmFzZUluaXQtPk5iUGFnZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRUVSQVNFKHBFcmFzZUluaXQtPlR5cGVFcmFzZSkpOworICAgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MocEVyYXNlSW5pdC0+UGFnZUFkZHJlc3MpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUFJPR1JBTV9BRERSRVNTKChwRXJhc2VJbml0LT5QYWdlQWRkcmVzcyAmIH4oRkxBU0hfUEFHRV9TSVpFIC0gMVUpKSArIHBFcmFzZUluaXQtPk5iUGFnZXMgKiBGTEFTSF9QQUdFX1NJWkUgLSAxVSkpOworCisgICAgLyogRXJhc2UgcGFnZSBieSBwYWdlIHRvIGJlIGRvbmUqLworICAgIGZvcihhZGRyZXNzID0gcEVyYXNlSW5pdC0+UGFnZUFkZHJlc3M7IAorICAgICAgICBhZGRyZXNzIDwgKChwRXJhc2VJbml0LT5OYlBhZ2VzICogRkxBU0hfUEFHRV9TSVpFKSArIHBFcmFzZUluaXQtPlBhZ2VBZGRyZXNzKTsKKyAgICAgICAgYWRkcmVzcyArPSBGTEFTSF9QQUdFX1NJWkUpCisgICAgeworICAgICAgRkxBU0hfUGFnZUVyYXNlKGFkZHJlc3MpOworCisgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgICAgICAvKiBJZiB0aGUgZXJhc2Ugb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgRVJBU0UgQml0ICovCisgICAgICBDTEVBUl9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUFJPRyk7CisgICAgICBDTEVBUl9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfRVJBU0UpOworCisgICAgICBpZiAoc3RhdHVzICE9IEhBTF9PSykgCisgICAgICB7CisgICAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3IsIHN0b3AgZXJhc2UgcHJvY2VkdXJlIGFuZCByZXR1cm4gdGhlIGZhdWx0eSBhZGRyZXNzICovCisgICAgICAgICpQYWdlRXJyb3IgPSBhZGRyZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYSBwYWdlIGVyYXNlIG9mIHRoZSBzcGVjaWZpZWQgRkxBU0ggbWVtb3J5IHBhZ2VzICB3aXRoIGludGVycnVwdCBlbmFibGVkCisgICogQG5vdGUgICBUbyBjb3JyZWN0bHkgcnVuIHRoaXMgZnVuY3Rpb24sIHRoZSBAcmVmIEhBTF9GTEFTSF9VbmxvY2soKSBmdW5jdGlvbgorICAqICAgICAgICAgbXVzdCBiZSBjYWxsZWQgYmVmb3JlLgorICAqICAgICAgICAgQ2FsbCB0aGUgQHJlZiBIQUxfRkxBU0hfTG9jaygpIHRvIGRpc2FibGUgdGhlIGZsYXNoIG1lbW9yeSBhY2Nlc3MgCisgICogICAgICAgICAocmVjb21tZW5kZWQgdG8gcHJvdGVjdCB0aGUgRkxBU0ggbWVtb3J5IGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgb3BlcmF0aW9uKQorICAqICAgICAgICAgIEVuZCBvZiBlcmFzZSBpcyBkb25lIHdoZW4gQHJlZiBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayBpcyBjYWxsZWQgd2l0aCBwYXJhbWV0ZXIKKyAgKiAgICAgICAgICAweEZGRkZGRkZGCisgICogQHBhcmFtICBwRXJhc2VJbml0IHBvaW50ZXIgdG8gYW4gRkxBU0hfRXJhc2VJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBlcmFzaW5nLgorICAqIAorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRXJhc2VfSVQoRkxBU0hfRXJhc2VJbml0VHlwZURlZiAqcEVyYXNlSW5pdCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworCisgIC8qIElmIHByb2NlZHVyZSBhbHJlYWR5IG9uZ29pbmcsIHJlamVjdCB0aGUgbmV4dCBvbmUgKi8KKyAgaWYgKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nICE9IEZMQVNIX1BST0NfTk9ORSkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTkJQQUdFUyhwRXJhc2VJbml0LT5OYlBhZ2VzKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9UWVBFRVJBU0UocEVyYXNlSW5pdC0+VHlwZUVyYXNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MocEVyYXNlSW5pdC0+UGFnZUFkZHJlc3MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BST0dSQU1fQUREUkVTUygocEVyYXNlSW5pdC0+UGFnZUFkZHJlc3MgJiB+KEZMQVNIX1BBR0VfU0laRSAtIDEpKSArIHBFcmFzZUluaXQtPk5iUGFnZXMgKiBGTEFTSF9QQUdFX1NJWkUgLSAxKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSygmcEZsYXNoKTsKKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgIAorICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIEVuYWJsZSBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIGFuZCBFcnJvciBzb3VyY2UgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX0ZMQVNIX0VOQUJMRV9JVChGTEFTSF9JVF9FT1AgfCBGTEFTSF9JVF9FUlIpOworICAgIAorICAgIHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfUFJPQ19QQUdFRVJBU0U7CisgICAgcEZsYXNoLk5iUGFnZXNUb0VyYXNlID0gcEVyYXNlSW5pdC0+TmJQYWdlczsKKyAgICBwRmxhc2guUGFnZSA9IHBFcmFzZUluaXQtPlBhZ2VBZGRyZXNzOworCisgICAgLypFcmFzZSAxc3QgcGFnZSBhbmQgd2FpdCBmb3IgSVQqLworICAgIEZMQVNIX1BhZ2VFcmFzZShwRXJhc2VJbml0LT5QYWdlQWRkcmVzcyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBmdW5jdGlvbnMgIyMjIyMgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisKKyAgICBbLi5dIEFueSBvcGVyYXRpb24gb2YgZXJhc2Ugb3IgcHJvZ3JhbSBzaG91bGQgZm9sbG93IHRoZXNlIHN0ZXBzOgorICAgICgjKSBDYWxsIHRoZSBAcmVmIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbiB0byBlbmFibGUgdGhlIEZsYXNoIG9wdGlvbiBjb250cm9sIAorICAgICAgICByZWdpc3RlciBhY2Nlc3MuCisgICAgKCMpIENhbGwgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIHByb2dyYW0gdGhlIGRlc2lyZWQgb3B0aW9uIGJ5dGVzLgorICAgICAgICAoKyspIEByZWYgSEFMX0ZMQVNIRXhfT0JQcm9ncmFtOgorICAgICAgICAgLSBUbyBFbmFibGUvRGlzYWJsZSB0aGUgZGVzaXJlZCBzZWN0b3Igd3JpdGUgcHJvdGVjdGlvbi4KKyAgICAgICAgIC0gVG8gc2V0IHRoZSBkZXNpcmVkIHJlYWQgUHJvdGVjdGlvbiBMZXZlbC4KKyAgICAgICAgIC0gVG8gY29uZmlndXJlIHRoZSB1c2VyIG9wdGlvbiBCeXRlczogSVdERywgU1RPUCBhbmQgdGhlIFN0YW5kYnkuCisgICAgICAgICAtIFRvIFNldCB0aGUgQk9SIGxldmVsLgorICAgICgjKSBPbmNlIGFsbCBuZWVkZWQgb3B0aW9uIGJ5dGVzIHRvIGJlIHByb2dyYW1tZWQgYXJlIGNvcnJlY3RseSB3cml0dGVuLCBjYWxsIHRoZQorICAgICAgICBAcmVmIEhBTF9GTEFTSF9PQl9MYXVuY2godm9pZCkgZnVuY3Rpb24gdG8gbGF1bmNoIHRoZSBPcHRpb24gQnl0ZXMgcHJvZ3JhbW1pbmcgcHJvY2Vzcy4KKyAgICAoIykgQ2FsbCB0aGUgQHJlZiBIQUxfRkxBU0hfT0JfTG9jaygpIHRvIGRpc2FibGUgdGhlIEZsYXNoIG9wdGlvbiBjb250cm9sIHJlZ2lzdGVyIGFjY2VzcyAocmVjb21tZW5kZWQKKyAgICAgICAgdG8gcHJvdGVjdCB0aGUgb3B0aW9uIEJ5dGVzIGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgb3BlcmF0aW9ucykuCisKKyAgICBbLi5dIFByb3ByaWV0YXJ5IGNvZGUgUmVhZCBPdXQgUHJvdGVjdGlvbiAoUGNST1ApOgorICAgICgjKSBUaGUgUGNST1Agc2VjdG9yIGlzIHNlbGVjdGVkIGJ5IHVzaW5nIHRoZSBzYW1lIG9wdGlvbiBieXRlcyBhcyB0aGUgV3JpdGUKKyAgICAgICAgcHJvdGVjdGlvbiAobldSUGkgYml0cykuIEFzIGEgcmVzdWx0LCB0aGVzZSAyIG9wdGlvbnMgYXJlIGV4Y2x1c2l2ZSBlYWNoIG90aGVyLgorICAgICgjKSBJbiBvcmRlciB0byBhY3RpdmF0ZSB0aGUgUGNST1AgKGNoYW5nZSB0aGUgZnVuY3Rpb24gb2YgdGhlIG5XUlBpIG9wdGlvbiBiaXRzKSwgCisgICAgICAgIHRoZSBXUFJNT0Qgb3B0aW9uIGJpdCBtdXN0IGJlIGFjdGl2YXRlZC4KKyAgICAoIykgVGhlIGFjdGl2ZSB2YWx1ZSBvZiBuV1JQaSBiaXRzIGlzIGludmVydGVkIHdoZW4gUENST1AgbW9kZSBpcyBhY3RpdmUsIHRoaXMKKyAgICAgICAgbWVhbnM6IGlmIFdQUk1PRCA9IDEgYW5kIG5XUlBpID0gMSAoZGVmYXVsdCB2YWx1ZSksIHRoZW4gdGhlIHVzZXIgc2VjdG9yICJpIgorICAgICAgICBpcyByZWFkL3dyaXRlIHByb3RlY3RlZC4KKyAgICAoIykgVG8gYWN0aXZhdGUgUENST1AgbW9kZSBmb3IgRmxhc2ggc2VjdG9yKHMpLCB5b3UgbmVlZCB0byBjYWxsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAgICgrKykgQHJlZiBIQUxfRkxBU0hFeF9BZHZPQlByb2dyYW0gaW4gc2VsZWN0aW5nIHNlY3RvcnMgdG8gYmUgcmVhZC93cml0ZSBwcm90ZWN0ZWQKKyAgICAgICAgKCsrKSBAcmVmIEhBTF9GTEFTSEV4X09CX1NlbGVjdFBDUk9QIHRvIGVuYWJsZSB0aGUgcmVhZC93cml0ZSBwcm90ZWN0aW9uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSBvcHRpb24gYnl0ZXMKKyAgKiBAcGFyYW0gIHBPQkluaXQgcG9pbnRlciB0byBhbiBGTEFTSF9PQkluaXRTdHJ1Y3Qgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgcHJvZ3JhbW1pbmcuCisgICogCisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZiBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9PQlByb2dyYW0oRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soJnBGbGFzaCk7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09QVElPTkJZVEUocE9CSW5pdC0+T3B0aW9uVHlwZSkpOworCisgIC8qV3JpdGUgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uKi8KKyAgaWYoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX1dSUCkgPT0gT1BUSU9OQllURV9XUlApCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfV1JQU1RBVEUocE9CSW5pdC0+V1JQU3RhdGUpKTsKKyNpZiBkZWZpbmVkKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KSAgCisgICAgc3RhdHVzID0gRkxBU0hfT0JfUHJvdGVjdGVkU2VjdG9yc0NvbmZpZyhwT0JJbml0LT5XUlBTZWN0b3IsIHBPQkluaXQtPldSUFNlY3RvcjIsIHBPQkluaXQtPldSUFN0YXRlKTsKKyNlbHNlCisgICAgc3RhdHVzID0gRkxBU0hfT0JfUHJvdGVjdGVkU2VjdG9yc0NvbmZpZyhwT0JJbml0LT5XUlBTZWN0b3IsIHBPQkluaXQtPldSUFN0YXRlKTsKKyNlbmRpZgorICAgIGlmIChzdGF0dXMgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICB9CisgIAorICAvKiBSZWFkIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiovCisgIGlmKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9SRFApID09IE9QVElPTkJZVEVfUkRQKQorICB7CisgICAgc3RhdHVzID0gRkxBU0hfT0JfUkRQQ29uZmlnKHBPQkluaXQtPlJEUExldmVsKTsKKyAgICBpZiAoc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgfQorICAKKyAgLyogVVNFUiAgY29uZmlndXJhdGlvbiovCisgIGlmKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9VU0VSKSA9PSBPUFRJT05CWVRFX1VTRVIpCisgIHsKKyAgICBzdGF0dXMgPSBGTEFTSF9PQl9Vc2VyQ29uZmlnKHBPQkluaXQtPlVTRVJDb25maWcgJiBPQl9JV0RHX1NXLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPQkluaXQtPlVTRVJDb25maWcgJiBPQl9TVE9QX05PUlNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9CSW5pdC0+VVNFUkNvbmZpZyAmIE9CX1NUREJZX05PUlNUKTsKKyAgICBpZiAoc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgfQorCisgIC8qIEJPUiBMZXZlbCAgY29uZmlndXJhdGlvbiovCisgIGlmKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9CT1IpID09IE9QVElPTkJZVEVfQk9SKQorICB7CisgICAgc3RhdHVzID0gRkxBU0hfT0JfQk9SQ29uZmlnKHBPQkluaXQtPkJPUkxldmVsKTsKKyAgICBpZiAoc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgfQorCisgIC8qIFByb2dyYW0gQk9PVCBCaXQxIGNvbmZpZyBvcHRpb24gYnl0ZSAqLworICBpZiAoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX0JPT1RfQklUMSkgPT0gT1BUSU9OQllURV9CT09UX0JJVDEpCisgIHsKKyAgICBzdGF0dXMgPSBGTEFTSF9PQl9CT09UQml0MUNvbmZpZyhwT0JJbml0LT5CT09UQml0MUNvbmZpZyk7CisgIH0KKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICAgR2V0IHRoZSBPcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBwT0JJbml0IHBvaW50ZXIgdG8gYW4gRkxBU0hfT0JJbml0U3RydWN0IHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2dyYW1taW5nLgorICAqIAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRkxBU0hFeF9PQkdldENvbmZpZyhGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZiAqcE9CSW5pdCkKK3sKKyAgcE9CSW5pdC0+T3B0aW9uVHlwZSA9IE9QVElPTkJZVEVfV1JQIHwgT1BUSU9OQllURV9SRFAgfCBPUFRJT05CWVRFX1VTRVIgfCBPUFRJT05CWVRFX0JPUjsKKworICAvKiBHZXQgV1JQIHNlY3RvciAqLworICBwT0JJbml0LT5XUlBTZWN0b3IgPSBGTEFTSF9PQl9HZXRXUlAoKTsKKworI2lmIGRlZmluZWQoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpICAKKyAgcE9CSW5pdC0+V1JQU2VjdG9yMiA9IEZMQVNIX09CX0dldFdSUDIoKTsKKyNlbmRpZgorCisgIC8qR2V0IFJEUCBMZXZlbCovCisgIHBPQkluaXQtPlJEUExldmVsICAgPSBGTEFTSF9PQl9HZXRSRFAoKTsKKworICAvKkdldCBVU0VSKi8KKyAgcE9CSW5pdC0+VVNFUkNvbmZpZyA9IEZMQVNIX09CX0dldFVzZXIoKTsKKworICAvKkdldCBCT1IgTGV2ZWwqLworICBwT0JJbml0LT5CT1JMZXZlbCAgID0gRkxBU0hfT0JfR2V0Qk9SKCk7CisKKyAgLyogR2V0IEJPT1QgYml0IDEgY29uZmlnIE9CICovCisgIHBPQkluaXQtPkJPT1RCaXQxQ29uZmlnID0gRkxBU0hfT0JfR2V0Qk9PVEJpdDEoKTsKK30KKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9XUFJNT0QpIHx8IGRlZmluZWQoRkxBU0hfT1BUUl9CRkIyKQorICAgIAorLyoqCisgICogQGJyaWVmICBQcm9ncmFtIG9wdGlvbiBieXRlcworICAqIEBwYXJhbSAgcEFkdk9CSW5pdCBwb2ludGVyIHRvIGFuIEZMQVNIX0Fkdk9CUHJvZ3JhbUluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2dyYW1taW5nLgorICAqIAorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfQWR2T0JQcm9ncmFtIChGTEFTSF9BZHZPQlByb2dyYW1Jbml0VHlwZURlZiAqcEFkdk9CSW5pdCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CRVgocEFkdk9CSW5pdC0+T3B0aW9uVHlwZSkpOworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX1dQUk1PRCkKKyAgICAKKyAgLyogUHJvZ3JhbSBQQ1JPUCBvcHRpb24gYnl0ZSovCisgIGlmICgocEFkdk9CSW5pdC0+T3B0aW9uVHlwZSAmIE9QVElPTkJZVEVfUENST1ApID09IE9QVElPTkJZVEVfUENST1ApCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19QQ1JPUFNUQVRFKHBBZHZPQkluaXQtPlBDUk9QU3RhdGUpKTsKKyNpZiBkZWZpbmVkKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KSAgCisgICAgc3RhdHVzID0gRkxBU0hfT0JfUHJvdGVjdGVkU2VjdG9yc0NvbmZpZyhwQWR2T0JJbml0LT5QQ1JPUFNlY3RvciwgcEFkdk9CSW5pdC0+UENST1BTZWN0b3IyLCBwQWR2T0JJbml0LT5QQ1JPUFN0YXRlKTsKKyNlbHNlCisgICAgc3RhdHVzID0gRkxBU0hfT0JfUHJvdGVjdGVkU2VjdG9yc0NvbmZpZyhwQWR2T0JJbml0LT5QQ1JPUFNlY3RvciwgcEFkdk9CSW5pdC0+UENST1BTdGF0ZSk7CisjZW5kaWYKKyAgfQorICAKKyNlbmRpZiAvKiBGTEFTSF9PUFRSX1dQUk1PRCAqLworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0JGQjIpCisgICAgCisgIC8qIFByb2dyYW0gQk9PVCBjb25maWcgb3B0aW9uIGJ5dGUgKi8KKyAgaWYgKChwQWR2T0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9CT09UQ09ORklHKSA9PSBPUFRJT05CWVRFX0JPT1RDT05GSUcpCisgIHsKKyAgICBzdGF0dXMgPSBGTEFTSF9PQl9Cb290Q29uZmlnKHBBZHZPQkluaXQtPkJvb3RDb25maWcpOworICB9CisgIAorI2VuZGlmIC8qIEZMQVNIX09QVFJfQkZCMiAqLworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBPQkVYIGJ5dGUgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgcEFkdk9CSW5pdCBwb2ludGVyIHRvIGFuIEZMQVNIX0Fkdk9CUHJvZ3JhbUluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2dyYW1taW5nLgorICAqIAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRkxBU0hFeF9BZHZPQkdldENvbmZpZyhGTEFTSF9BZHZPQlByb2dyYW1Jbml0VHlwZURlZiAqcEFkdk9CSW5pdCkKK3sKKyAgcEFkdk9CSW5pdC0+T3B0aW9uVHlwZSA9IDA7CisgIAorI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9XUFJNT0QpCisgICAgICAKKyAgcEFkdk9CSW5pdC0+T3B0aW9uVHlwZSB8PSBPUFRJT05CWVRFX1BDUk9QOworCisKKyAgLyogR2V0IFBDUk9QIHN0YXRlICovCisgIHBBZHZPQkluaXQtPlBDUk9QU3RhdGUgPSAoRkxBU0gtPk9QVFIgJiBGTEFTSF9PUFRSX1dQUk1PRCkgPj4gRkxBU0hfT1BUUl9XUFJNT0RfUG9zOworICAvKiBHZXQgUENST1AgcHJvdGVjdGVkIHNlY3RvciAqLworICBwQWR2T0JJbml0LT5QQ1JPUFNlY3RvciA9IEZMQVNILT5XUlBSOworCisjaWYgZGVmaW5lZChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZChTVE0zMkwwODF4eCkgfHwgZGVmaW5lZChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwODN4eCkgIAorICAvKiBHZXQgUENST1AgcHJvdGVjdGVkIHNlY3RvciAqLworICBwQWR2T0JJbml0LT5QQ1JPUFNlY3RvcjIgPSBGTEFTSC0+V1JQUjI7CisjZW5kaWYKKyNlbmRpZiAvKiBGTEFTSF9PUFRSX1dQUk1PRCAqLworCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX0JGQjIpCisgICAgICAKKyAgcEFkdk9CSW5pdC0+T3B0aW9uVHlwZSB8PSBPUFRJT05CWVRFX0JPT1RDT05GSUc7CisKKyAgLyogR2V0IEJvb3QgY29uZmlnIE9CICovCisgIHBBZHZPQkluaXQtPkJvb3RDb25maWcgPSAoRkxBU0gtPk9QVFIgJiBGTEFTSF9PUFRSX0JGQjIpID4+IDE2VTsKKworI2VuZGlmIC8qIEZMQVNIX09QVFJfQkZCMiAqLworfQorCisjZW5kaWYgLyogRkxBU0hfT1BUUl9XUFJNT0QgfHwgRkxBU0hfT1BUUl9CRkIyICovCisKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfV1BSTU9EKQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgUHJvdGVjdGlvbiBNb2RlIChXUFJNT0QpLgorICAqIEBub3RlICAgT25jZSBXUFJNT0QgYml0IGlzIGFjdGl2ZSwgdW5wcm90ZWN0aW9uIG9mIGEgcHJvdGVjdGVkIHNlY3RvciBpcyBub3QgcG9zc2libGUgCisgICogQG5vdGUgICBSZWFkIGEgcHJvdGVjdGVkIHNlY3RvciB3aWxsIHNldCBSREVSUiBGbGFnIGFuZCB3cml0ZSBhIHByb3RlY3RlZCBzZWN0b3Igd2lsbCBzZXQgV1JQRVJSIEZsYWcKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X09CX1NlbGVjdFBDUk9QKHZvaWQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDE2X3QgdG1wMSA9IDA7CisgIHVpbnQzMl90IHRtcDIgPSAwOworICB1aW50OF90IG9wdGlvbnRtcCA9IDA7CisgIHVpbnQxNl90IG9wdGlvbnRtcDIgPSAwOworICAKKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgIAorICAvKiBNYXNrIFJEUCBCeXRlICovCisgIG9wdGlvbnRtcCA9ICAodWludDhfdCkoKihfX0lPIHVpbnQ4X3QgKikoT0JfQkFTRSkpOyAKKyAgCisgIC8qIFVwZGF0ZSBPcHRpb24gQnl0ZSAqLworICBvcHRpb250bXAyID0gKHVpbnQxNl90KShPQl9QQ1JPUF9TRUxFQ1RFRCB8IG9wdGlvbnRtcCk7IAorICAKKyAgLyogY2FsY3VsYXRlIHRoZSBvcHRpb24gYnl0ZSB0byB3cml0ZSAqLworICB0bXAxID0gKHVpbnQxNl90KSh+KG9wdGlvbnRtcDIgKSk7CisgIHRtcDIgPSAodWludDMyX3QpKCgodWludDMyX3QpKCh1aW50MzJfdCkodG1wMSkgPDwgMTZVKSkgfCAoKHVpbnQzMl90KW9wdGlvbnRtcDIpKTsKKyAgCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsgICAgICAgICAKKyAgICAvKiBDbGVhbiB0aGUgZXJyb3IgY29udGV4dCAqLworICAgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAgIC8qIHByb2dyYW0gUENSb3AgKi8KKyAgICBPQi0+UkRQID0gdG1wMjsKKyAgICAKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgfQorICAKKyAgLyogUmV0dXJuIHRoZSBSZWFkIHByb3RlY3Rpb24gb3BlcmF0aW9uIFN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERlc2VsZWN0IHRoZSBQcm90ZWN0aW9uIE1vZGUgKFdQUk1PRCkuCisgICogQG5vdGUgICBPbmNlIFdQUk1PRCBiaXQgaXMgYWN0aXZlLCB1bnByb3RlY3Rpb24gb2YgYSBwcm90ZWN0ZWQgc2VjdG9yIGlzIG5vdCBwb3NzaWJsZSAKKyAgKiBAbm90ZSAgIFJlYWQgYSBwcm90ZWN0ZWQgc2VjdG9yIHdpbGwgc2V0IFJERVJSIEZsYWcgYW5kIHdyaXRlIGEgcHJvdGVjdGVkIHNlY3RvciB3aWxsIHNldCBXUlBFUlIgRmxhZworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfT0JfRGVTZWxlY3RQQ1JPUCh2b2lkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQxNl90IHRtcDEgPSAwOworICB1aW50MzJfdCB0bXAyID0gMDsKKyAgdWludDhfdCBvcHRpb250bXAgPSAwOworICB1aW50MTZfdCBvcHRpb250bXAyID0gMDsKKyAgCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAKKyAgLyogTWFzayBSRFAgQnl0ZSAqLworICBvcHRpb250bXAgPSAgKHVpbnQ4X3QpKCooX19JTyB1aW50OF90ICopKE9CX0JBU0UpKTsgCisgIAorICAvKiBVcGRhdGUgT3B0aW9uIEJ5dGUgKi8KKyAgb3B0aW9udG1wMiA9ICh1aW50MTZfdCkoT0JfUENST1BfREVTRUxFQ1RFRCB8IG9wdGlvbnRtcCk7IAorICAKKyAgLyogY2FsY3VsYXRlIHRoZSBvcHRpb24gYnl0ZSB0byB3cml0ZSAqLworICB0bXAxID0gKHVpbnQxNl90KSh+KG9wdGlvbnRtcDIgKSk7CisgIHRtcDIgPSAodWludDMyX3QpKCgodWludDMyX3QpKCh1aW50MzJfdCkodG1wMSkgPDwgMTZVKSkgfCAoKHVpbnQzMl90KW9wdGlvbnRtcDIpKTsKKyAgCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsgICAgICAgICAKKyAgICAvKiBDbGVhbiB0aGUgZXJyb3IgY29udGV4dCAqLworICAgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAgIC8qIHByb2dyYW0gUENSb3AgKi8KKyAgICBPQi0+UkRQID0gdG1wMjsKKyAgICAKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgfQorICAKKyAgLyogUmV0dXJuIHRoZSBSZWFkIHByb3RlY3Rpb24gb3BlcmF0aW9uIFN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgIAorfQorCisjZW5kaWYgLyogRkxBU0hfT1BUUl9XUFJNT0QgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgREFUQSBFRVBST00gUHJvZ3JhbW1pbmcgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgREFUQSBFRVBST00gUHJvZ3JhbW1pbmcgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgREFUQSBFRVBST00gUHJvZ3JhbW1pbmcgZnVuY3Rpb25zICMjIyMjIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorIAorICAgIFsuLl0gQW55IG9wZXJhdGlvbiBvZiBlcmFzZSBvciBwcm9ncmFtIHNob3VsZCBmb2xsb3cgdGhlc2Ugc3RlcHM6CisgICAgKCMpIENhbGwgdGhlIEByZWYgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9VbmxvY2soKSBmdW5jdGlvbiB0byBlbmFibGUgdGhlIGRhdGEgRUVQUk9NIGFjY2VzcworICAgICAgICBhbmQgRmxhc2ggcHJvZ3JhbSBlcmFzZSBjb250cm9sIHJlZ2lzdGVyIGFjY2Vzcy4KKyAgICAoIykgQ2FsbCB0aGUgZGVzaXJlZCBmdW5jdGlvbiB0byBlcmFzZSBvciBwcm9ncmFtIGRhdGEuCisgICAgKCMpIENhbGwgdGhlIEByZWYgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9Mb2NrKCkgdG8gZGlzYWJsZSB0aGUgZGF0YSBFRVBST00gYWNjZXNzCisgICAgICAgIGFuZCBGbGFzaCBwcm9ncmFtIGVyYXNlIGNvbnRyb2wgcmVnaXN0ZXIgYWNjZXNzKHJlY29tbWVuZGVkCisgICAgICAgIHRvIHByb3RlY3QgdGhlIERBVEFfRUVQUk9NIGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgb3BlcmF0aW9uKS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBVbmxvY2tzIHRoZSBkYXRhIG1lbW9yeSBhbmQgRkxBU0hfUEVDUiByZWdpc3RlciBhY2Nlc3MuCisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZiBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX1VubG9jayh2b2lkKQoreworICB1aW50MzJfdCBwcmltYXNrX2JpdDsKKworICBpZigoRkxBU0gtPlBFQ1IgJiBGTEFTSF9QRUNSX1BFTE9DSykgIT0gUkVTRVQpCisgIHsgIAorICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyB0byBhdm9pZCBhbnkgaW50ZXJydXB0aW9uIGR1cmluZyB1bmxvY2sgc2VxdWVuY2UgKi8KKyAgICBwcmltYXNrX2JpdCA9IF9fZ2V0X1BSSU1BU0soKTsKKyAgICBfX2Rpc2FibGVfaXJxKCk7CisKKyAgICAvKiBVbmxvY2tpbmcgdGhlIERhdGEgbWVtb3J5IGFuZCBGTEFTSF9QRUNSIHJlZ2lzdGVyIGFjY2VzcyovCisgICAgRkxBU0gtPlBFS0VZUiA9IEZMQVNIX1BFS0VZMTsKKyAgICBGTEFTSC0+UEVLRVlSID0gRkxBU0hfUEVLRVkyOworCisgICAgLyogUmUtZW5hYmxlIHRoZSBpbnRlcnJ1cHRzOiByZXN0b3JlIHByZXZpb3VzIHByaW9yaXR5IG1hc2sgKi8KKyAgICBfX3NldF9QUklNQVNLKHByaW1hc2tfYml0KTsKKworICAgIGlmKChGTEFTSC0+UEVDUiAmIEZMQVNIX1BFQ1JfUEVMT0NLKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBMb2NrcyB0aGUgRGF0YSBtZW1vcnkgYW5kIEZMQVNIX1BFQ1IgcmVnaXN0ZXIgYWNjZXNzLgorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9Mb2NrKHZvaWQpCit7CisgIC8qIFNldCB0aGUgUEVMT0NLIEJpdCB0byBsb2NrIHRoZSBkYXRhIG1lbW9yeSBhbmQgRkxBU0hfUEVDUiByZWdpc3RlciBhY2Nlc3MgKi8KKyAgU0VUX0JJVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9QRUxPQ0spOworICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFcmFzZSBhIHdvcmQgaW4gZGF0YSBtZW1vcnkuCisgICogQHBhcmFtICBBZGRyZXNzIHNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBlcmFzZWQuCisgICogQG5vdGUgICBUbyBjb3JyZWN0bHkgcnVuIHRoaXMgZnVuY3Rpb24sIHRoZSBAcmVmIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fVW5sb2NrKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIG11c3QgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiAgICAgICAgIENhbGwgdGhlIEByZWYgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9Mb2NrKCkgdG8gdGhlIGRhdGEgRUVQUk9NIGFjY2VzcworICAqICAgICAgICAgYW5kIEZsYXNoIHByb2dyYW0gZXJhc2UgY29udHJvbCByZWdpc3RlciBhY2Nlc3MocmVjb21tZW5kZWQgdG8gcHJvdGVjdCAKKyAgKiAgICAgICAgIHRoZSBEQVRBX0VFUFJPTSBhZ2FpbnN0IHBvc3NpYmxlIHVud2FudGVkIG9wZXJhdGlvbikuCisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZiBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX0VyYXNlKHVpbnQzMl90IEFkZHJlc3MpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9EQVRBX0FERFJFU1MoQWRkcmVzcykpOworICAKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAKKyAgaWYoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIENsZWFuIHRoZSBlcnJvciBjb250ZXh0ICovCisgICAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgICAgICAvKiBXcml0ZSAwMDAwMDAwMGggdG8gdmFsaWQgYWRkcmVzcyBpbiB0aGUgZGF0YSBtZW1vcnkgKi8KKyAgICAgICooX19JTyB1aW50MzJfdCAqKSBBZGRyZXNzID0gMHgwMDAwMDAwMFU7CisKKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgfQorICAgCisgIC8qIFJldHVybiB0aGUgZXJhc2Ugc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9ICAKKworLyoqCisgICogQGJyaWVmICBQcm9ncmFtIHdvcmQgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcworICAqIEBub3RlICAgVG8gY29ycmVjdGx5IHJ1biB0aGlzIGZ1bmN0aW9uLCB0aGUgQHJlZiBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX1VubG9jaygpIGZ1bmN0aW9uCisgICogICAgICAgICBtdXN0IGJlIGNhbGxlZCBiZWZvcmUuCisgICogICAgICAgICBDYWxsIHRoZSBAcmVmIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fVW5sb2NrKCkgdG8gaGUgZGF0YSBFRVBST00gYWNjZXNzCisgICogICAgICAgICBhbmQgRmxhc2ggcHJvZ3JhbSBlcmFzZSBjb250cm9sIHJlZ2lzdGVyIGFjY2VzcyhyZWNvbW1lbmRlZCB0byBwcm90ZWN0IAorICAqICAgICAgICAgdGhlIERBVEFfRUVQUk9NIGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgb3BlcmF0aW9uKS4KKyAgKiBAbm90ZSAgIFRoZSBmdW5jdGlvbiBAcmVmIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fRW5hYmxlRml4ZWRUaW1lUHJvZ3JhbSgpIGNhbiBiZSBjYWxsZWQgYmVmb3JlIAorICAqICAgICAgICAgdGhpcyBmdW5jdGlvbiB0byBjb25maWd1cmUgdGhlIEZpeGVkIFRpbWUgUHJvZ3JhbW1pbmcuCisgICogQHBhcmFtICBUeXBlUHJvZ3JhbSAgSW5kaWNhdGUgdGhlIHdheSB0byBwcm9ncmFtIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIRXhfVHlwZV9Qcm9ncmFtX0RhdGEKKyAgKiBAcGFyYW0gIEFkZHJlc3MgIHNwZWNpZmllIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBEYXRhICAgICBzcGVjaWZpZSB0aGUgZGF0YSB0byBiZSBwcm9ncmFtbWVkCisgICogCisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZiBIQUwgU3RhdHVzCisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmICAgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9Qcm9ncmFtKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLCB1aW50MzJfdCBEYXRhKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfRVJST1I7CisgIAorICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKCZwRmxhc2gpOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UWVBFUFJPR1JBTURBVEEoVHlwZVByb2dyYW0pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0RBVEFfQUREUkVTUyhBZGRyZXNzKSk7CisKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAKKyAgaWYoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIENsZWFuIHRoZSBlcnJvciBjb250ZXh0ICovCisgICAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgICAgaWYoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1EQVRBX1dPUkQpCisgICAgeworICAgICAgLyogUHJvZ3JhbSB3b3JkICgzMi1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuKi8KKyAgICAgICooX19JTyB1aW50MzJfdCAqKUFkZHJlc3MgPSBEYXRhOworICAgIH0KKyAgICBlbHNlIGlmKFR5cGVQcm9ncmFtID09IEZMQVNIX1RZUEVQUk9HUkFNREFUQV9IQUxGV09SRCkKKyAgICB7CisgICAgICAvKiBQcm9ncmFtIGhhbGZ3b3JkICgxNi1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuKi8KKyAgICAgICooX19JTyB1aW50MTZfdCAqKUFkZHJlc3MgPSAodWludDE2X3QpIERhdGE7CisgICAgfQorICAgIGVsc2UgaWYoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1EQVRBX0JZVEUpCisgICAgeworICAgICAgLyogUHJvZ3JhbSBieXRlICg4LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4qLworICAgICAgKihfX0lPIHVpbnQ4X3QgKilBZGRyZXNzID0gKHVpbnQ4X3QpIERhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBEQVRBIEVFUFJPTSBmaXhlZCBUaW1lIHByb2dyYW1taW5nICgyKlRwcm9nKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9FbmFibGVGaXhlZFRpbWVQcm9ncmFtKHZvaWQpCit7CisgIFNFVF9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfRklYKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyBEQVRBIEVFUFJPTSBmaXhlZCBUaW1lIHByb2dyYW1taW5nICgyKlRwcm9nKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9EaXNhYmxlRml4ZWRUaW1lUHJvZ3JhbSh2b2lkKQoreworICBDTEVBUl9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfRklYKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICBPUFRJT05TIEJZVEVTCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHJlYWQgb3V0IHByb3RlY3Rpb24uCisgICogQG5vdGUgICBUbyBjb3JyZWN0bHkgcnVuIHRoaXMgZnVuY3Rpb24sIHRoZSBAcmVmIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbgorICAqICAgICAgICAgbXVzdCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBwYXJhbSAgT0JfUkRQIHNwZWNpZmllcyB0aGUgcmVhZCBwcm90ZWN0aW9uIGxldmVsLiAKKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgQGFyZyBAcmVmIE9CX1JEUF9MRVZFTF8wIE5vIHByb3RlY3Rpb24KKyAgKiAgICAgQGFyZyBAcmVmIE9CX1JEUF9MRVZFTF8xIFJlYWQgcHJvdGVjdGlvbiBvZiB0aGUgbWVtb3J5CisgICogICAgIEBhcmcgQHJlZiBPQl9SRFBfTEVWRUxfMiBDaGlwIHByb3RlY3Rpb24KKyAgKiAKKyAgKiAgISEhV2FybmluZyEhISBXaGVuIGVuYWJsaW5nIE9CX1JEUF9MRVZFTF8yIGl0J3Mgbm8gbW9yZSBwb3NzaWJsZSB0byBnbyBiYWNrIHRvIGxldmVsIDEgb3IgMAorICAqICAgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfUkRQQ29uZmlnKHVpbnQ4X3QgT0JfUkRQKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcDEgPSAwVSwgdG1wMiA9IDBVLCB0bXAzID0gMFU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfT0JfUkRQKE9CX1JEUCkpOworICAKKyAgdG1wMSA9ICh1aW50MzJfdCkoT0ItPlJEUCAmIEZMQVNIX09QVFJfUkRQUk9UKTsKKyAgCisjaWYgZGVmaW5lZChGTEFTSF9PUFRSX1dQUk1PRCkKKyAgICAvKiBNYXNrIFdQUk1PRCBiaXQgKi8KKyAgICB0bXAzID0gKHVpbnQzMl90KShPQi0+UkRQICYgRkxBU0hfT1BUUl9XUFJNT0QpOworI2VuZGlmCisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIG9wdGlvbiBieXRlIHRvIHdyaXRlICovCisgICAgdG1wMSA9ICh+KCh1aW50MzJfdCkoT0JfUkRQIHwgdG1wMykpKTsKKyAgICB0bXAyID0gKHVpbnQzMl90KSgoKHVpbnQzMl90KSgodWludDMyX3QpKHRtcDEpIDw8IDE2VSkpIHwgKCh1aW50MzJfdCkoT0JfUkRQIHwgdG1wMykpKTsKKworICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgICAgaWYoc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDbGVhbiB0aGUgZXJyb3IgY29udGV4dCAqLworICAgICAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgICAgICAvKiBwcm9ncmFtIHJlYWQgcHJvdGVjdGlvbiBsZXZlbCAqLworICAgICAgT0ItPlJEUCA9IHRtcDI7CisKKyAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgICAgfQorCisgIC8qIFJldHVybiB0aGUgUmVhZCBwcm90ZWN0aW9uIG9wZXJhdGlvbiBTdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBQcm9ncmFtcyB0aGUgRkxBU0ggYnJvd25vdXQgcmVzZXQgdGhyZXNob2xkIGxldmVsIE9wdGlvbiBCeXRlLgorICAqIEBwYXJhbSAgT0JfQk9SIFNlbGVjdHMgdGhlIGJyb3dub3V0IHJlc2V0IHRocmVzaG9sZCBsZXZlbC4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBPQl9CT1JfT0ZGIEJPUiBpcyBkaXNhYmxlZCBhdCBwb3dlciBkb3duLCB0aGUgcmVzZXQgaXMgYXNzZXJ0ZWQgd2hlbiB0aGUgVkREIAorICAqICAgICAgICAgICAgICAgICAgICAgIHBvd2VyIHN1cHBseSByZWFjaGVzIHRoZSBQRFIoUG93ZXIgRG93biBSZXNldCkgdGhyZXNob2xkICgxLjVWKQorICAqICAgICBAYXJnIEByZWYgT0JfQk9SX0xFVkVMMSBCT1IgUmVzZXQgdGhyZXNob2xkIGxldmVscyBmb3IgMS43ViAtIDEuOFYgVkREIHBvd2VyIHN1cHBseQorICAqICAgICBAYXJnIEByZWYgT0JfQk9SX0xFVkVMMiBCT1IgUmVzZXQgdGhyZXNob2xkIGxldmVscyBmb3IgMS45ViAtIDIuMFYgVkREIHBvd2VyIHN1cHBseQorICAqICAgICBAYXJnIEByZWYgT0JfQk9SX0xFVkVMMyBCT1IgUmVzZXQgdGhyZXNob2xkIGxldmVscyBmb3IgMi4zViAtIDIuNFYgVkREIHBvd2VyIHN1cHBseQorICAqICAgICBAYXJnIEByZWYgT0JfQk9SX0xFVkVMNCBCT1IgUmVzZXQgdGhyZXNob2xkIGxldmVscyBmb3IgMi41NVYgLSAyLjY1ViBWREQgcG93ZXIgc3VwcGx5CisgICogICAgIEBhcmcgQHJlZiBPQl9CT1JfTEVWRUw1IEJPUiBSZXNldCB0aHJlc2hvbGQgbGV2ZWxzIGZvciAyLjhWIC0gMi45ViBWREQgcG93ZXIgc3VwcGx5CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfQk9SQ29uZmlnKHVpbnQ4X3QgT0JfQk9SKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcCA9IDAsIHRtcDEgPSAwOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19PQl9CT1JfTEVWRUwoT0JfQk9SKSk7CisKKyAgLyogR2V0IHRoZSBVc2VyIE9wdGlvbiBieXRlIHJlZ2lzdGVyICovCisgIHRtcDEgPSBPQi0+VVNFUiAmICgofkZMQVNIX09QVFJfQk9SX0xFVikgPj4gMTZVKTsKKworICAvKiBDYWxjdWxhdGUgdGhlIG9wdGlvbiBieXRlIHRvIHdyaXRlIC0gWzB4RkYgfCBuVVNFUiB8IDB4MDAgfCBVU0VSXSovCisgIHRtcCA9ICh1aW50MzJfdCl+KChPQl9CT1IgfCB0bXAxKSkgPDwgMTZVOworICB0bXAgfD0gKE9CX0JPUiB8IHRtcDEpOworICAgIAorICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgIAorICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7ICAKKyAgICAvKiBDbGVhbiB0aGUgZXJyb3IgY29udGV4dCAqLworICAgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAgIC8qIFdyaXRlIHRoZSBCT1IgT3B0aW9uIEJ5dGUgKi8gICAgICAgICAgICAKKyAgICBPQi0+VVNFUiA9IHRtcDsKKworICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworICB9CisgIAorICAvKiBSZXR1cm4gdGhlIE9wdGlvbiBCeXRlIEJPUiBwcm9ncmFtbWluZyBTdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXRzIG9yIHJlc2V0cyB0aGUgQk9PVCBiaXQxIG9wdGlvbiBiaXQuCisgICogQHBhcmFtICBPQl9Cb290Qml0MSBTZXQgb3IgUmVzZXQgdGhlIEJPT1QgYml0MSBvcHRpb24gYml0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIE9CX0JPT1RfQklUMV9SRVNFVCBCT09UMSBvcHRpb24gYml0IHJlc2V0CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIE9CX0JPT1RfQklUMV9TRVQgQk9PVDEgb3B0aW9uIGJpdCBzZXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiAgRkxBU0hfT0JfQk9PVEJpdDFDb25maWcodWludDhfdCBPQl9Cb290Qml0MSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOyAKKyAgdWludDMyX3QgdG1wID0gMCwgdG1wMSA9IDAsIE9CX0JpdHMgPSAoKHVpbnQzMl90KSBPQl9Cb290Qml0MSkgPDwgMTU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX0JPT1QxKE9CX0Jvb3RCaXQxKSk7CisKKyAgLyogR2V0IHRoZSBVc2VyIE9wdGlvbiBieXRlIHJlZ2lzdGVyICovCisgIHRtcDEgPSBPQi0+VVNFUiAmICgofkZMQVNIX09QVFJfQk9PVDEpID4+IDE2VSk7CisKKyAgLyogQ2FsY3VsYXRlIHRoZSB1c2VyIG9wdGlvbiBieXRlIHRvIHdyaXRlICovIAorICB0bXAgPSAofihPQl9CaXRzIHwgdG1wMSkpIDw8IDE2VTsKKyAgdG1wIHw9IE9CX0JpdHMgfCB0bXAxOworICAgIAorICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgIAorICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7ICAKKyAgICAvKiBDbGVhbiB0aGUgZXJyb3IgY29udGV4dCAqLworICAgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKyAgICAvKiBQcm9ncmFtIE9CICovCisgICAgT0ItPlVTRVIgPSB0bXA7IAorICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBGTEFTSCBVc2VyIE9wdGlvbiBCeXRlcyB2YWx1ZXMuCisgICogQHJldHZhbCBUaGUgRkxBU0ggVXNlciBPcHRpb24gQnl0ZXMuCisgICovCitzdGF0aWMgdWludDhfdCBGTEFTSF9PQl9HZXRVc2VyKHZvaWQpCit7CisgIC8qIFJldHVybiB0aGUgVXNlciBPcHRpb24gQnl0ZSAqLworICByZXR1cm4gKHVpbnQ4X3QpKChGTEFTSC0+T1BUUiAmIEZMQVNIX09QVFJfVVNFUikgPj4gMTZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBGTEFTSCBSZWFkIFByb3RlY3Rpb24gbGV2ZWwuCisgICogQHJldHZhbCBGTEFTSCBSRFAgbGV2ZWwKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfUkRQX0xFVkVMXzAgTm8gcHJvdGVjdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIE9CX1JEUF9MRVZFTF8xIFJlYWQgcHJvdGVjdGlvbiBvZiB0aGUgbWVtb3J5CisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfUkRQX0xFVkVMXzIgRnVsbCBjaGlwIHByb3RlY3Rpb24KKyAgKi8KK3N0YXRpYyB1aW50OF90IEZMQVNIX09CX0dldFJEUCh2b2lkKQoreworICB1aW50OF90IHJkcF9sZXZlbCA9IFJFQURfQklUKEZMQVNILT5PUFRSLCBGTEFTSF9PUFRSX1JEUFJPVCk7CisKKyAgaWYgKChyZHBfbGV2ZWwgIT0gT0JfUkRQX0xFVkVMXzApICYmIChyZHBfbGV2ZWwgIT0gT0JfUkRQX0xFVkVMXzIpKQorICB7CisgICAgcmV0dXJuIChPQl9SRFBfTEVWRUxfMSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIHJkcF9sZXZlbDsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIEJPUiBsZXZlbC4KKyAgKiBAcmV0dmFsIFRoZSBCT1IgbGV2ZWwgT3B0aW9uIEJ5dGVzLgorICAqLworc3RhdGljIHVpbnQ4X3QgRkxBU0hfT0JfR2V0Qk9SKHZvaWQpCit7CisgIC8qIFJldHVybiB0aGUgQk9SIGxldmVsICovCisgIHJldHVybiAodWludDhfdCkoKEZMQVNILT5PUFRSICYgKHVpbnQzMl90KUZMQVNIX09QVFJfQk9SX0xFVikgPj4gMTZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBGTEFTSCBCT09UIGJpdDEgdmFsdWUuCisgICogQHJldHZhbCBUaGUgQk9PVCBiaXQgMSB2YWx1ZSBPcHRpb24gQnl0ZXMuCisgICovCitzdGF0aWMgdWludDhfdCBGTEFTSF9PQl9HZXRCT09UQml0MSh2b2lkKQoreworICAvKiBSZXR1cm4gdGhlIEJPUiBsZXZlbCAqLworICByZXR1cm4gKEZMQVNILT5PUFRSICYgRkxBU0hfT1BUUl9CT09UMSkgPj4gRkxBU0hfT1BUUl9CT09UMV9Qb3M7CisKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBGTEFTSCBXcml0ZSBQcm90ZWN0aW9uIE9wdGlvbiBCeXRlcyB2YWx1ZS4KKyAgKiBAcmV0dmFsIFRoZSBGTEFTSCBXcml0ZSBQcm90ZWN0aW9uIE9wdGlvbiBCeXRlcyB2YWx1ZS4KKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBGTEFTSF9PQl9HZXRXUlAodm9pZCkKK3sKKyAgLyogUmV0dXJuIHRoZSBGTEFTSCB3cml0ZSBwcm90ZWN0aW9uIFJlZ2lzdGVyIHZhbHVlICovCisgIHJldHVybiAodWludDMyX3QpKEZMQVNILT5XUlBSKTsKK30KKworI2lmIGRlZmluZWQoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgzeHgpICAKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgRkxBU0ggV3JpdGUgUHJvdGVjdGlvbiBPcHRpb24gQnl0ZXMgdmFsdWUuCisgICogQHJldHZhbCBUaGUgRkxBU0ggV3JpdGUgUHJvdGVjdGlvbiBPcHRpb24gQnl0ZXMgdmFsdWUuCisgICovCitzdGF0aWMgdWludDMyX3QgRkxBU0hfT0JfR2V0V1JQMih2b2lkKQoreworICAvKiBSZXR1cm4gdGhlIEZMQVNIIHdyaXRlIHByb3RlY3Rpb24gUmVnaXN0ZXIgdmFsdWUgKi8KKyAgcmV0dXJuICh1aW50MzJfdCkoRkxBU0gtPldSUFIyKTsKK30KKyNlbmRpZiAvKiBTVE0zMkwwNzF4eCB8fCBTVE0zMkwwNzJ4eCB8fCBTVE0zMkwwNzN4eCB8fCBTVE0zMkwwODF4eCB8fCBTVE0zMkwwODJ4eCB8fCBTVE0zMkwwODN4eCAqLworCisjaWYgZGVmaW5lZChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZChTVE0zMkwwODF4eCkgfHwgZGVmaW5lZChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwODN4eCkKKy8qKgorICAqIEBicmllZiAgV3JpdGUgT3B0aW9uIEJ5dGUgb2YgdGhlIGRlc2lyZWQgcGFnZXMgb2YgdGhlIEZsYXNoLgorICAqIEBwYXJhbSAgU2VjdG9yIHNwZWNpZmllcyB0aGUgc2VjdG9ycyB0byBiZSB3cml0ZSBwcm90ZWN0ZWQuCisgICogQHBhcmFtICBTZWN0b3IyIHNwZWNpZmllcyB0aGUgc2VjdG9ycyB0byBiZSB3cml0ZSBwcm90ZWN0ZWQgKG9ubHkgc3RtMzJsMDd4eHggYW5kIHN0bTMybDA4eHh4IGRldmljZXMpCisgICogQHBhcmFtICBOZXdTdGF0ZSBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBGTEFTSCBQYWdlcyBXcml0ZSBwcm90ZWN0aW9uLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiAKKyAgKiAgICAgICAgQGFyZyBAcmVmIE9CX1dSUFNUQVRFX0VOQUJMRQorICAqICAgICAgICBAYXJnIEByZWYgT0JfV1JQU1RBVEVfRElTQUJMRQorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9PQl9Qcm90ZWN0ZWRTZWN0b3JzQ29uZmlnKHVpbnQzMl90IFNlY3RvciwgdWludDMyX3QgU2VjdG9yMiwgdWludDMyX3QgTmV3U3RhdGUpCisjZWxzZQorLyoqCisgICogQGJyaWVmICBXcml0ZSBPcHRpb24gQnl0ZSBvZiB0aGUgZGVzaXJlZCBwYWdlcyBvZiB0aGUgRmxhc2guCisgICogQHBhcmFtICBTZWN0b3Igc3BlY2lmaWVzIHRoZSBzZWN0b3JzIHRvIGJlIHdyaXRlIHByb3RlY3RlZC4KKyAgKiBAcGFyYW0gIE5ld1N0YXRlIG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIEZMQVNIIFBhZ2VzIFdyaXRlIHByb3RlY3Rpb24uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IAorICAqICAgICAgICBAYXJnIEByZWYgT0JfV1JQU1RBVEVfRU5BQkxFCisgICogICAgICAgIEBhcmcgQHJlZiBPQl9XUlBTVEFURV9ESVNBQkxFCisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZgorICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1Byb3RlY3RlZFNlY3RvcnNDb25maWcodWludDMyX3QgU2VjdG9yLCB1aW50MzJfdCBOZXdTdGF0ZSkKKyNlbmRpZgoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IFdSUF9EYXRhID0gMDsKKyAgdWludDMyX3QgT0JfV1JQID0gU2VjdG9yOworICAKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworIAorICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogQ2xlYW4gdGhlIGVycm9yIGNvbnRleHQgKi8KKyAgICBwRmxhc2guRXJyb3JDb2RlID0gSEFMX0ZMQVNIX0VSUk9SX05PTkU7CisKKyAgICAvKiBVcGRhdGUgV1JQIG9ubHkgaWYgYXQgbGVhc3QgMSBzZWxlY3RlZCBzZWN0b3IgKi8KKyAgICBpZiAoT0JfV1JQICE9IDB4MDAwMDAwMDBVKQorICAgIHsKKyAgICAgIGlmICgoT0JfV1JQICYgV1JQX01BU0tfTE9XKSAhPSAweDAwMDAwMDAwVSkKKyAgICAgIHsKKyAgICAgICAgaWYgKE5ld1N0YXRlICE9IE9CX1dSUFNUQVRFX0RJU0FCTEUpCisgICAgICAgIHsKKyAgICAgICAgICBXUlBfRGF0YSA9ICh1aW50MTZfdCkoKChPQl9XUlAgJiBXUlBfTUFTS19MT1cpIHwgT0ItPldSUDAxKSk7CisgICAgICAgICAgT0ItPldSUDAxID0gKHVpbnQzMl90KSh+KFdSUF9EYXRhKSA8PCAxNlUpIHwgKFdSUF9EYXRhKTsKKyAgICAgICAgfSAgICAgICAgICAgICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgV1JQX0RhdGEgPSAodWludDE2X3QpKH5PQl9XUlAgJiAoV1JQX01BU0tfTE9XICYgT0ItPldSUDAxKSk7CisgICAgICAgICAgT0ItPldSUDAxID0gICh1aW50MzJfdCkoKH5XUlBfRGF0YSkgPDwgMTZVKSB8IChXUlBfRGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjaWYgZGVmaW5lZChTVE0zMkwwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwNzN4eCkgfHwgZGVmaW5lZChTVE0zMkwwODF4eCkgfHwgZGVmaW5lZChTVE0zMkwwODJ4eCkgfHwgZGVmaW5lZChTVE0zMkwwODN4eCkgIAorICAgIC8qIFVwZGF0ZSBXUlAgb25seSBpZiBhdCBsZWFzdCAxIHNlbGVjdGVkIHNlY3RvciAqLworICAgIGlmIChPQl9XUlAgIT0gMHgwMDAwMDAwMFUpCisgICAgeworICAgICAgaWYgKChPQl9XUlAgJiBXUlBfTUFTS19ISUdIKSAhPSAweDAwMDAwMDAwVSkKKyAgICAgIHsKKyAgICAgICAgaWYgKE5ld1N0YXRlICE9IE9CX1dSUFNUQVRFX0RJU0FCTEUpCisgICAgICAgIHsKKyAgICAgICAgICBXUlBfRGF0YSA9ICh1aW50MTZfdCkoKCgoT0JfV1JQICYgV1JQX01BU0tfSElHSCkgPj4gMTZVIHwgT0ItPldSUDIzKSkpOyAKKyAgICAgICAgICBPQi0+V1JQMjMgPSAodWludDMyX3QpKH4oV1JQX0RhdGEpIDw8IDE2VSkgfCAoV1JQX0RhdGEpOworICAgICAgICB9ICAgICAgICAgICAgIAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBXUlBfRGF0YSA9ICh1aW50MTZfdCkoKCgofk9CX1dSUCAmIFdSUF9NQVNLX0hJR0gpID4+IDE2VSAmIE9CLT5XUlAyMykpKTsgCisgICAgICAgICAgT0ItPldSUDIzID0gKHVpbnQzMl90KSgofldSUF9EYXRhKSA8PCAxNlUpIHwgKFdSUF9EYXRhKTsKKyAgICAgICAgfSAKKyAgICAgIH0KKyAgICB9CisKKyAgICBPQl9XUlAgPSBTZWN0b3IyOworICAgIC8qIFVwZGF0ZSBXUlAgb25seSBpZiBhdCBsZWFzdCAxIHNlbGVjdGVkIHNlY3RvciAqLworICAgIGlmIChPQl9XUlAgIT0gMHgwMDAwMDAwMFUpCisgICAgeworICAgICAgaWYgKChPQl9XUlAgJiBXUlBfTUFTS19MT1cpICE9IDB4MDAwMDAwMDBVKQorICAgICAgeworICAgICAgICBpZiAoTmV3U3RhdGUgIT0gT0JfV1JQU1RBVEVfRElTQUJMRSkKKyAgICAgICAgeworICAgICAgICAgIFdSUF9EYXRhID0gKHVpbnQxNl90KSgoKE9CX1dSUCAmIFdSUF9NQVNLX0xPVykgfCBPQi0+V1JQNDUpKTsKKyAgICAgICAgICBPQi0+V1JQNDUgPSh1aW50MzJfdCkofihXUlBfRGF0YSkgPDwgMTZVKSB8IChXUlBfRGF0YSk7CisgICAgICAgIH0gICAgICAgICAgICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFdSUF9EYXRhID0gKHVpbnQxNl90KSh+T0JfV1JQICYgKFdSUF9NQVNLX0xPVyAmIE9CLT5XUlA0NSkpOworICAgICAgICAgIE9CLT5XUlA0NSA9ICh1aW50MzJfdCkoKH5XUlBfRGF0YSkgPDwgMTZVKSB8IChXUlBfRGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogU1RNMzJMMDcxeHggfHwgU1RNMzJMMDcyeHggfHwgU1RNMzJMMDczeHggfHwgU1RNMzJMMDgxeHggfHwgU1RNMzJMMDgyeHggfHwgU1RNMzJMMDgzeHggKi8KKyAgfQorICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgLyogUmV0dXJuIHRoZSB3cml0ZSBwcm90ZWN0aW9uIG9wZXJhdGlvbiBTdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsgICAgICAKK30KKworLyoqCisgICogQGJyaWVmICBQcm9ncmFtcyB0aGUgRkxBU0ggVXNlciBPcHRpb24gQnl0ZTogSVdER19TVyAvIFJTVF9TVE9QIC8gUlNUX1NUREJZLgorICAqIEBwYXJhbSAgT0JfSVdERyBTZWxlY3RzIHRoZSBXREcgbW9kZS4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBPQl9JV0RHX1NXIFNvZnR3YXJlIFdERyBzZWxlY3RlZAorICAqICAgICBAYXJnIEByZWYgT0JfSVdER19IVyBIYXJkd2FyZSBXREcgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIE9CX1NUT1AgUmVzZXQgZXZlbnQgd2hlbiBlbnRlcmluZyBTVE9QIG1vZGUuCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgT0JfU1RPUF9OT1JTVCBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVE9QCisgICogICAgIEBhcmcgQHJlZiBPQl9TVE9QX1JTVCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVE9QCisgICogQHBhcmFtICBPQl9TVERCWSBSZXNldCBldmVudCB3aGVuIGVudGVyaW5nIFN0YW5kYnkgbW9kZS4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBPQl9TVERCWV9OT1JTVCBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVEFOREJZCisgICogICAgIEBhcmcgQHJlZiBPQl9TVERCWV9SU1QgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgaW4gU1RBTkRCWQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1VzZXJDb25maWcodWludDhfdCBPQl9JV0RHLCB1aW50OF90IE9CX1NUT1AsIHVpbnQ4X3QgT0JfU1REQlkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsgCisgIHVpbnQzMl90IHRtcCA9IDAsIHRtcDEgPSAwOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19PQl9JV0RHX1NPVVJDRShPQl9JV0RHKSk7CisgIGFzc2VydF9wYXJhbShJU19PQl9TVE9QX1NPVVJDRShPQl9TVE9QKSk7CisgIGFzc2VydF9wYXJhbShJU19PQl9TVERCWV9TT1VSQ0UoT0JfU1REQlkpKTsKKworICAvKiBHZXQgdGhlIFVzZXIgT3B0aW9uIGJ5dGUgcmVnaXN0ZXIgKi8KKyAgdG1wMSA9IE9CLT5VU0VSICYgKCh+RkxBU0hfT1BUUl9VU0VSKSA+PiAxNlUpOworCisgIC8qIENhbGN1bGF0ZSB0aGUgdXNlciBvcHRpb24gYnl0ZSB0byB3cml0ZSAqLyAKKyAgdG1wID0gKHVpbnQzMl90KSgoKHVpbnQzMl90KX4oKHVpbnQzMl90KSgodWludDMyX3QpKE9CX0lXREcpIHwgKHVpbnQzMl90KShPQl9TVE9QKSB8ICh1aW50MzJfdCkoT0JfU1REQlkpIHwgdG1wMSkpKSA8PCAxNlUpOworICB0bXAgfD0gKCh1aW50MzJfdCkoT0JfSVdERykgfCAoKHVpbnQzMl90KU9CX1NUT1ApIHwgKHVpbnQzMl90KShPQl9TVERCWSkgfCB0bXAxKTsKKyAgCisgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsgIAorICAgIC8qIENsZWFuIHRoZSBlcnJvciBjb250ZXh0ICovCisgICAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgICAgLyogV3JpdGUgdGhlIFVzZXIgT3B0aW9uIEJ5dGUgKi8KKyAgICBPQi0+VVNFUiA9IHRtcDsKKyAgICAKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgfQorCisgIC8qIFJldHVybiB0aGUgT3B0aW9uIEJ5dGUgcHJvZ3JhbSBTdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9CRkIyKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRvIGJvb3QgZnJvbSBCYW5rMSBvciBCYW5rMi4KKyAgKiBAcGFyYW0gIE9CX0JPT1Qgc2VsZWN0IHRoZSBGTEFTSCBCYW5rIHRvIGJvb3QgZnJvbS4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgT0JfQk9PVF9CQU5LMSBCRkIyIG9wdGlvbiBiaXQgcmVzZXQKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgT0JfQk9PVF9CQU5LMiBCRkIyIG9wdGlvbiBiaXQgc2V0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hfT0JfQm9vdENvbmZpZyh1aW50OF90IE9CX0JPT1QpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsgCisgIHVpbnQzMl90IHRtcCA9IDBVLCB0bXAxID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX0JPT1RfQkFOSyhPQl9CT09UKSk7CisKKyAgLyogR2V0IHRoZSBVc2VyIE9wdGlvbiBieXRlIHJlZ2lzdGVyICBhbmQgQk9SIExldmVsKi8KKyAgdG1wMSA9IE9CLT5VU0VSICYgKCh+RkxBU0hfT1BUUl9CRkIyKSA+PiAxNlUpOworCisgIC8qIENhbGN1bGF0ZSB0aGUgb3B0aW9uIGJ5dGUgdG8gd3JpdGUgKi8KKyAgdG1wID0gKHVpbnQzMl90KX4oT0JfQk9PVCB8IHRtcDEpIDw8IDE2VTsKKyAgdG1wIHw9IChPQl9CT09UIHwgdG1wMSk7CisKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsgIAorICAgIC8qIENsZWFuIHRoZSBlcnJvciBjb250ZXh0ICovCisgICAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgICAgLyogV3JpdGUgdGhlIEJPT1QgT3B0aW9uIEJ5dGUgKi8KKyAgICBPQi0+VVNFUiA9IHRtcDsKKyAgICAKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgfQorCisgIC8qIFJldHVybiB0aGUgT3B0aW9uIEJ5dGUgcHJvZ3JhbSBTdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIEZMQVNIX09QVFJfQkZCMiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0gKKyAgKiBAeworICAqLworCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9Qcml2YXRlX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVyYXNlcyBhIHNwZWNpZmllZCBwYWdlIGluIHByb2dyYW0gbWVtb3J5LgorICAqIEBwYXJhbSAgUGFnZUFkZHJlc3MgVGhlIHBhZ2UgYWRkcmVzcyBpbiBwcm9ncmFtIG1lbW9yeSB0byBiZSBlcmFzZWQuCisgICogQG5vdGUgICBBIFBhZ2UgaXMgZXJhc2VkIGluIHRoZSBQcm9ncmFtIG1lbW9yeSBvbmx5IGlmIHRoZSBhZGRyZXNzIHRvIGxvYWQgCisgICogICAgICAgICBpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiBhIHBhZ2UgKG11bHRpcGxlIG9mIEByZWYgRkxBU0hfUEFHRV9TSVpFIGJ5dGVzKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgRkxBU0hfUGFnZUVyYXNlKHVpbnQzMl90IFBhZ2VBZGRyZXNzKQoreworICAvKiBDbGVhbiB0aGUgZXJyb3IgY29udGV4dCAqLworICBwRmxhc2guRXJyb3JDb2RlID0gSEFMX0ZMQVNIX0VSUk9SX05PTkU7CisKKyAgLyogU2V0IHRoZSBFUkFTRSBiaXQgKi8KKyAgU0VUX0JJVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9FUkFTRSk7CisKKyAgLyogU2V0IFBST0cgYml0ICovCisgIFNFVF9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUFJPRyk7CisKKyAgLyogV3JpdGUgMDAwMDAwMDBoIHRvIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBwcm9ncmFtIHBhZ2UgdG8gZXJhc2UgKi8KKyAgKihfX0lPIHVpbnQzMl90ICopKHVpbnQzMl90KShQYWdlQWRkcmVzcyAmIH4oRkxBU0hfUEFHRV9TSVpFIC0gMSkpID0gMHgwMDAwMDAwMDsKK30KKyAgCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfZmxhc2hfcmFtZnVuYy5jIGIvU3JjL3N0bTMybDB4eF9oYWxfZmxhc2hfcmFtZnVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTFlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9mbGFzaF9yYW1mdW5jLmMKQEAgLTAsMCArMSw1MjEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2ZsYXNoX3JhbWZ1bmMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRkxBU0ggUkFNRlVOQyBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGEgRmxhc2ggZmlybXdhcmUgZnVuY3Rpb25zIHdoaWNoIHNob3VsZCBiZSAKKyAgKiAgICAgICAgICBleGVjdXRlZCBmcm9tIGludGVybmFsIFNSQU0KKyAgKgorICAqICBAdmVyYmF0aW0KKworICAgICoqKiBBUk0gQ29tcGlsZXIgKioqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBbLi5dIFJBTSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgdXNpbmcgdGhlIHRvb2xjaGFpbiBvcHRpb25zLiAKKyAgICAgICAgIEZ1bmN0aW9ucyB0aGF0IGFyZSBiZSBleGVjdXRlZCBpbiBSQU0gc2hvdWxkIHJlc2lkZSBpbiBhIHNlcGFyYXRlCisgICAgICAgICBzb3VyY2UgbW9kdWxlLiBVc2luZyB0aGUgJ09wdGlvbnMgZm9yIEZpbGUnIGRpYWxvZyB5b3UgY2FuIHNpbXBseSBjaGFuZ2UKKyAgICAgICAgIHRoZSAnQ29kZSAvIENvbnN0JyBhcmVhIG9mIGEgbW9kdWxlIHRvIGEgbWVtb3J5IHNwYWNlIGluIHBoeXNpY2FsIFJBTS4KKyAgICAgICAgIEF2YWlsYWJsZSBtZW1vcnkgYXJlYXMgYXJlIGRlY2xhcmVkIGluIHRoZSAnVGFyZ2V0JyB0YWIgb2YgdGhlIAorICAgICAgICAgT3B0aW9ucyBmb3IgVGFyZ2V0JyBkaWFsb2cuCisKKyAgICAqKiogSUNDQVJNIENvbXBpbGVyICoqKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgWy4uXSBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIGEgc3BlY2lmaWMgdG9vbGNoYWluIGtleXdvcmQgIl9fcmFtZnVuYyIuCisKKyAgICAqKiogR05VIENvbXBpbGVyICoqKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgWy4uXSBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIGEgc3BlY2lmaWMgdG9vbGNoYWluIGF0dHJpYnV0ZQorICAgICAgICAgIl9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5SYW1GdW5jIikpKSIuCisKK0BlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQKKworLyoqIEBhZGR0b2dyb3VwIEZMQVNICisgICogQHsKKyAgKi8KKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9Qcml2YXRlX1ZhcmlhYmxlcworICogQHsKKyAqLworZXh0ZXJuIEZMQVNIX1Byb2Nlc3NUeXBlRGVmIHBGbGFzaDsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBGTEFTSF9SQU1GVU5DIEZMQVNIX1JBTUZVTkMKKyAgKiBAYnJpZWYgRkxBU0ggZnVuY3Rpb25zIGV4ZWN1dGVkIGZyb20gUkFNCisgICogQHsKKyAgKi8gCisKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX1JBTUZVTkNfUHJpdmF0ZV9GdW5jdGlvbnMgRkxBU0ggUkFNIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCisKK3N0YXRpYyBfX1JBTV9GVU5DIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIUkFNX1dhaXRGb3JMYXN0T3BlcmF0aW9uKHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIF9fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgRkxBU0hSQU1fU2V0RXJyb3JDb2RlKHZvaWQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIAorLyoqIEBkZWZncm91cCBGTEFTSF9SQU1GVU5DX0V4cG9ydGVkX0Z1bmN0aW9ucyBGTEFTSCBSQU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgKgorQHZlcmJhdGltICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgcmFtZnVuYyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBleGVjdXRlZCBmcm9tIFJBTSAKKyAgICB0cmFuc2ZlcnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovIAorCisvKiogQGRlZmdyb3VwIEZMQVNIX1JBTUZVTkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQZXJpcGhlcmFsIGZlYXR1cmVzIGZ1bmN0aW9ucyAKKyAgKiBAeworICAqLyAgCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlICB0aGUgcG93ZXIgZG93biBtb2RlIGR1cmluZyBSVU4gbW9kZS4KKyAgKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHVzZXIgY29kZSBpcyBydW5uaW5nIGZyb20gSW50ZXJuYWwgU1JBTS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRW5hYmxlUnVuUG93ZXJEb3duKHZvaWQpCit7CisgIC8qIEVuYWJsZSB0aGUgUG93ZXIgRG93biBpbiBSdW4gbW9kZSovCisgIF9fSEFMX0ZMQVNIX1BPV0VSX0RPV05fRU5BQkxFKCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBwb3dlciBkb3duIG1vZGUgZHVyaW5nIFJVTiBtb2RlLgorICAqIEBub3RlICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgdXNlciBjb2RlIGlzIHJ1bm5pbmcgZnJvbSBJbnRlcm5hbCBTUkFNLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX19SQU1fRlVOQyBIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9EaXNhYmxlUnVuUG93ZXJEb3duKHZvaWQpCit7CisgIC8qIERpc2FibGUgdGhlIFBvd2VyIERvd24gaW4gUnVuIG1vZGUqLworICBfX0hBTF9GTEFTSF9QT1dFUl9ET1dOX0RJU0FCTEUoKTsKKworICByZXR1cm4gSEFMX09LOyAgCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUkFNRlVOQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFByb2dyYW1taW5nIGFuZCBlcmFzaW5nIG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKEZMQVNIX1BFQ1JfUEFSQUxMQkFOSykKKy8qKgorICAqIEBicmllZiAgRXJhc2VzIGEgc3BlY2lmaWVkIDIgcGFnZXMgaW4gcHJvZ3JhbSBtZW1vcnkgaW4gcGFyYWxsZWwuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgZm9yIFNUTTMyTDA3eHh4L1NUTTMyTDA4eHh4ICBkZXZpY2VzLgorICAqICAgICAgICAgVG8gY29ycmVjdGx5IHJ1biB0aGlzIGZ1bmN0aW9uLCB0aGUgQHJlZiBIQUxfRkxBU0hfVW5sb2NrKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIG11c3QgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiAgICAgICAgIENhbGwgdGhlIEByZWYgSEFMX0ZMQVNIX0xvY2soKSB0byBkaXNhYmxlIHRoZSBmbGFzaCBtZW1vcnkgYWNjZXNzIAorICAqICAgICAgICAocmVjb21tZW5kZWQgdG8gcHJvdGVjdCB0aGUgRkxBU0ggbWVtb3J5IGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgb3BlcmF0aW9uKS4KKyAgKiBAcGFyYW0gIFBhZ2VfQWRkcmVzczE6IFRoZSBwYWdlIGFkZHJlc3MgaW4gcHJvZ3JhbSBtZW1vcnkgdG8gYmUgZXJhc2VkIGluIAorICAqICAgICAgICAgdGhlIGZpcnN0IEJhbmsgKEJBTksxKS4gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlIGJldHdlZW4gRkxBU0hfQkFTRQorICAqICAgICAgICAgYW5kIEZMQVNIX0JBTksxX0VORC4KKyAgKiBAcGFyYW0gIFBhZ2VfQWRkcmVzczI6IFRoZSBwYWdlIGFkZHJlc3MgaW4gcHJvZ3JhbSBtZW1vcnkgdG8gYmUgZXJhc2VkIGluIAorICAqICAgICAgICAgdGhlIHNlY29uZCBCYW5rIChCQU5LMikuIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZSBiZXR3ZWVuIEZMQVNIX0JBTksyX0JBU0UKKyAgKiAgICAgICAgIGFuZCBGTEFTSF9CQU5LMl9FTkQuCisgICogQG5vdGUgICBBIFBhZ2UgaXMgZXJhc2VkIGluIHRoZSBQcm9ncmFtIG1lbW9yeSBvbmx5IGlmIHRoZSBhZGRyZXNzIHRvIGxvYWQgCisgICogICAgICAgICBpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiBhIHBhZ2UgKG11bHRpcGxlIG9mIEByZWYgRkxBU0hfUEFHRV9TSVpFIGJ5dGVzKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRXJhc2VQYXJhbGxlbFBhZ2UodWludDMyX3QgUGFnZV9BZGRyZXNzMSwgdWludDMyX3QgUGFnZV9BZGRyZXNzMikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICBzdGF0dXMgPSBGTEFTSFJBTV9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBQcm9jZWVkIHRvIGVyYXNlIHRoZSBwYWdlICovCisgICAgU0VUX0JJVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9QQVJBTExCQU5LKTsKKyAgICBTRVRfQklUKEZMQVNILT5QRUNSLCBGTEFTSF9QRUNSX0VSQVNFKTsKKyAgICBTRVRfQklUKEZMQVNILT5QRUNSLCBGTEFTSF9QRUNSX1BST0cpOworICAKKyAgICAvKiBXcml0ZSAwMDAwMDAwMGggdG8gdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGZpcnN0IHByb2dyYW0gcGFnZSB0byBlcmFzZSAqLworICAgICooX19JTyB1aW50MzJfdCAqKVBhZ2VfQWRkcmVzczEgPSAweDAwMDAwMDAwVTsKKyAgICAvKiBXcml0ZSAwMDAwMDAwMGggdG8gdGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNlY29uZCBwcm9ncmFtIHBhZ2UgdG8gZXJhc2UgKi8gICAgCisgICAgKihfX0lPIHVpbnQzMl90ICopUGFnZV9BZGRyZXNzMiA9IDB4MDAwMDAwMDBVOworIAorICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgIHN0YXR1cyA9IEZMQVNIUkFNX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgICAgLyogSWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIEVSQVNFLCBQUk9HIGFuZCBQQVJBTExCQU5LIGJpdHMgKi8KKyAgICBDTEVBUl9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUFJPRyk7CisgICAgQ0xFQVJfQklUKEZMQVNILT5QRUNSLCBGTEFTSF9QRUNSX0VSQVNFKTsKKyAgICBDTEVBUl9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUEFSQUxMQkFOSyk7CisgIH0gICAgIAorICAvKiBSZXR1cm4gdGhlIEVyYXNlIFN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2dyYW0gMiBoYWxmIHBhZ2VzIGluIHByb2dyYW0gbWVtb3J5IGluIHBhcmFsbGVsIChoYWxmIHBhZ2Ugc2l6ZSBpcyAxNiBXb3JkcykuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgZm9yIFNUTTMyTDA3eHh4L1NUTTMyTDA4eHh4ICBkZXZpY2VzLgorICAqIEBwYXJhbSAgQWRkcmVzczE6IHNwZWNpZmllcyB0aGUgZmlyc3QgYWRkcmVzcyB0byBiZSB3cml0dGVuIGluIHRoZSBmaXJzdCBiYW5rIAorICAqICAgICAgICAoQkFOSzEpLiBUaGlzIHBhcmFtZXRlciBzaG91bGQgYmUgYmV0d2VlbiBGTEFTSF9CQVNFIGFuZCAoRkxBU0hfQkFOSzFfRU5EIC0gRkxBU0hfUEFHRV9TSVpFKS4KKyAgKiBAcGFyYW0gIHBCdWZmZXIxOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgIHdyaXR0ZW4gCisgICogICAgICAgICB0byB0aGUgZmlyc3QgaGFsZiBwYWdlIGluIHRoZSBmaXJzdCBiYW5rLgorICAqIEBwYXJhbSAgQWRkcmVzczI6IHNwZWNpZmllcyB0aGUgc2Vjb25kIGFkZHJlc3MgdG8gYmUgd3JpdHRlbiBpbiB0aGUgc2Vjb25kIGJhbmsKKyAgKiAgICAgICAgKEJBTksyKS4gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlIGJldHdlZW4gRkxBU0hfQkFOSzJfQkFTRSBhbmQgKEZMQVNIX0JBTksyX0VORCAtIEZMQVNIX1BBR0VfU0laRSkuCisgICogQHBhcmFtICBwQnVmZmVyMjogcG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgIHdyaXR0ZW4gCisgICogICAgICAgICB0byB0aGUgc2Vjb25kIGhhbGYgcGFnZSBpbiB0aGUgc2Vjb25kIGJhbmsuCisgICogQG5vdGUgICBUbyBjb3JyZWN0bHkgcnVuIHRoaXMgZnVuY3Rpb24sIHRoZSBAcmVmIEhBTF9GTEFTSF9VbmxvY2soKSBmdW5jdGlvbgorICAqICAgICAgICAgbXVzdCBiZSBjYWxsZWQgYmVmb3JlLgorICAqICAgICAgICAgQ2FsbCB0aGUgQHJlZiBIQUxfRkxBU0hfTG9jaygpIHRvIGRpc2FibGUgdGhlIGZsYXNoIG1lbW9yeSBhY2Nlc3MgIAorICAqICAgICAgICAgKHJlY29tbWVuZGVkIHRvIHByb3RlY3QgdGhlIEZMQVNIIG1lbW9yeSBhZ2FpbnN0IHBvc3NpYmxlIHVud2FudGVkIG9wZXJhdGlvbikuCisgICogQG5vdGUgICBIYWxmIHBhZ2Ugd3JpdGUgaXMgcG9zc2libGUgb25seSBmcm9tIFNSQU0uCisgICogQG5vdGUgICBBIGhhbGYgcGFnZSBpcyB3cml0dGVuIHRvIHRoZSBwcm9ncmFtIG1lbW9yeSBvbmx5IGlmIHRoZSBmaXJzdCAKKyAgKiAgICAgICAgIGFkZHJlc3MgdG8gbG9hZCBpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiBhIGhhbGYgcGFnZSAobXVsdGlwbGUgb2YgNjQgCisgICogICAgICAgICBieXRlcykgYW5kIHRoZSAxNSByZW1haW5pbmcgd29yZHMgdG8gbG9hZCBhcmUgaW4gdGhlIHNhbWUgaGFsZiBwYWdlLgorICAqIEBub3RlICAgRHVyaW5nIHRoZSBQcm9ncmFtIG1lbW9yeSBoYWxmIHBhZ2Ugd3JpdGUgYWxsIHJlYWQgb3BlcmF0aW9ucyBhcmUgCisgICogICAgICAgICBmb3JiaWRkZW4gKHRoaXMgaW5jbHVkZXMgRE1BIHJlYWQgb3BlcmF0aW9ucyBhbmQgZGVidWdnZXIgcmVhZCAKKyAgKiAgICAgICAgIG9wZXJhdGlvbnMgc3VjaCBhcyBicmVha3BvaW50cywgcGVyaW9kaWMgdXBkYXRlcywgZXRjLikuCisgICogQG5vdGUgICBJZiBhIFBHQUVSUiBpcyBzZXQgZHVyaW5nIGEgUHJvZ3JhbSBtZW1vcnkgaGFsZiBwYWdlIHdyaXRlLCB0aGUgCisgICogICAgICAgICBjb21wbGV0ZSB3cml0ZSBvcGVyYXRpb24gaXMgYWJvcnRlZC4gU29mdHdhcmUgc2hvdWxkIHRoZW4gcmVzZXQgdGhlIAorICAqICAgICAgICAgRlBSRyBhbmQgUFJPRy9EQVRBIGJpdHMgYW5kIHJlc3RhcnQgdGhlIHdyaXRlIG9wZXJhdGlvbiBmcm9tIHRoZSAKKyAgKiAgICAgICAgIGJlZ2lubmluZy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfUHJvZ3JhbVBhcmFsbGVsSGFsZlBhZ2UodWludDMyX3QgQWRkcmVzczEsIHVpbnQzMl90KiBwQnVmZmVyMSwgdWludDMyX3QgQWRkcmVzczIsIHVpbnQzMl90KiBwQnVmZmVyMikKK3sKKyAgdWludDMyX3QgY291bnQgPSAwVTsgCisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hSQU1fV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgIAorICBpZihzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogUHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgaGFsZiBwYWdlICovCisgICAgU0VUX0JJVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9QQVJBTExCQU5LKTsKKyAgICBTRVRfQklUKEZMQVNILT5QRUNSLCBGTEFTSF9QRUNSX0ZQUkcpOworICAgIFNFVF9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUFJPRyk7CisKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSFJBTV9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgICBpZihzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgYWxsIElSUXMgKi8KKyAgICAgIF9fZGlzYWJsZV9pcnEoKTsKKworICAgICAgLyogV3JpdGUgdGhlIGZpcnN0IGhhbGYgcGFnZSBkaXJlY3RseSB3aXRoIDE2IGRpZmZlcmVudCB3b3JkcyAqLworICAgICAgd2hpbGUoY291bnQgPCAxNlUpCisgICAgICB7CisgICAgICAgIC8qIEFkZHJlc3MxIGRvZXNuJ3QgbmVlZCB0byBiZSBpbmNyZWFzZWQgKi8gCisgICAgICAgICooX19JTyB1aW50MzJfdCopIEFkZHJlc3MxID0gKnBCdWZmZXIxOworICAgICAgICBwQnVmZmVyMSsrOworICAgICAgICBjb3VudCArKzsgIAorICAgICAgfQorCisgICAgICAvKiBXcml0ZSB0aGUgc2Vjb25kIGhhbGYgcGFnZSBkaXJlY3RseSB3aXRoIDE2IGRpZmZlcmVudCB3b3JkcyAqLworICAgICAgY291bnQgPSAwVTsKKyAgICAgIHdoaWxlKGNvdW50IDwgMTZVKQorICAgICAgeworICAgICAgICAvKiBBZGRyZXNzMiBkb2Vzbid0IG5lZWQgdG8gYmUgaW5jcmVhc2VkICovIAorICAgICAgICAqKF9fSU8gdWludDMyX3QqKSBBZGRyZXNzMiA9ICpwQnVmZmVyMjsKKyAgICAgICAgcEJ1ZmZlcjIrKzsKKyAgICAgICAgY291bnQgKys7ICAKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIElSUXMgKi8KKyAgICAgIF9fZW5hYmxlX2lycSgpOworCisgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgIHN0YXR1cyA9IEZMQVNIUkFNX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAgIH0KKworICAgIC8qIGlmIHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBQUk9HLCBGUFJHIGFuZCBQQVJBTExCQU5LIGJpdHMgKi8KKyAgICBDTEVBUl9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUFJPRyk7CisgICAgQ0xFQVJfQklUKEZMQVNILT5QRUNSLCBGTEFTSF9QRUNSX0ZQUkcpOworICAgIENMRUFSX0JJVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9QQVJBTExCQU5LKTsKKyAgfQorCisgIC8qIFJldHVybiB0aGUgV3JpdGUgU3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogRkxBU0hfUEVDUl9QQVJBTExCQU5LICovCisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSBhIGhhbGYgcGFnZSBpbiBwcm9ncmFtIG1lbW9yeS4KKyAgKiBAcGFyYW0gIEFkZHJlc3Mgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHRvIGJlIHdyaXR0ZW4uCisgICogQHBhcmFtICBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSAgd3JpdHRlbiB0byAKKyAgKiAgICAgICAgIHRoZSBoYWxmIHBhZ2UuCisgICogQG5vdGUgICBUbyBjb3JyZWN0bHkgcnVuIHRoaXMgZnVuY3Rpb24sIHRoZSBAcmVmIEhBTF9GTEFTSF9VbmxvY2soKSBmdW5jdGlvbgorICAqICAgICAgICAgbXVzdCBiZSBjYWxsZWQgYmVmb3JlLgorICAqICAgICAgICAgQ2FsbCB0aGUgQHJlZiBIQUxfRkxBU0hfTG9jaygpIHRvIGRpc2FibGUgdGhlIGZsYXNoIG1lbW9yeSBhY2Nlc3MgIAorICAqICAgICAgICAgKHJlY29tbWVuZGVkIHRvIHByb3RlY3QgdGhlIEZMQVNIIG1lbW9yeSBhZ2FpbnN0IHBvc3NpYmxlIHVud2FudGVkIG9wZXJhdGlvbikKKyAgKiBAbm90ZSAgIEhhbGYgcGFnZSB3cml0ZSBpcyBwb3NzaWJsZSBvbmx5IGZyb20gU1JBTS4KKyAgKiBAbm90ZSAgIEEgaGFsZiBwYWdlIGlzIHdyaXR0ZW4gdG8gdGhlIHByb2dyYW0gbWVtb3J5IG9ubHkgaWYgdGhlIGZpcnN0IAorICAqICAgICAgICAgYWRkcmVzcyB0byBsb2FkIGlzIHRoZSBzdGFydCBhZGRyZXNzIG9mIGEgaGFsZiBwYWdlIChtdWx0aXBsZSBvZiA2NCAKKyAgKiAgICAgICAgIGJ5dGVzKSBhbmQgdGhlIDE1IHJlbWFpbmluZyB3b3JkcyB0byBsb2FkIGFyZSBpbiB0aGUgc2FtZSBoYWxmIHBhZ2UuCisgICogQG5vdGUgICBEdXJpbmcgdGhlIFByb2dyYW0gbWVtb3J5IGhhbGYgcGFnZSB3cml0ZSBhbGwgcmVhZCBvcGVyYXRpb25zIGFyZSAKKyAgKiAgICAgICAgIGZvcmJpZGRlbiAodGhpcyBpbmNsdWRlcyBETUEgcmVhZCBvcGVyYXRpb25zIGFuZCBkZWJ1Z2dlciByZWFkIAorICAqICAgICAgICAgb3BlcmF0aW9ucyBzdWNoIGFzIGJyZWFrcG9pbnRzLCBwZXJpb2RpYyB1cGRhdGVzLCBldGMuKS4KKyAgKiBAbm90ZSAgIElmIGEgUEdBRVJSIGlzIHNldCBkdXJpbmcgYSBQcm9ncmFtIG1lbW9yeSBoYWxmIHBhZ2Ugd3JpdGUsIHRoZSAKKyAgKiAgICAgICAgIGNvbXBsZXRlIHdyaXRlIG9wZXJhdGlvbiBpcyBhYm9ydGVkLiBTb2Z0d2FyZSBzaG91bGQgdGhlbiByZXNldCB0aGUgCisgICogICAgICAgICBGUFJHIGFuZCBQUk9HL0RBVEEgYml0cyBhbmQgcmVzdGFydCB0aGUgd3JpdGUgb3BlcmF0aW9uIGZyb20gdGhlIAorICAqICAgICAgICAgYmVnaW5uaW5nLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX19SQU1fRlVOQyBIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9IYWxmUGFnZVByb2dyYW0odWludDMyX3QgQWRkcmVzcywgdWludDMyX3QqIHBCdWZmZXIpCit7CisgIHVpbnQzMl90IGNvdW50ID0gMFU7IAorICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIUkFNX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworICAKKyAgaWYoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIFByb2NlZWQgdG8gcHJvZ3JhbSB0aGUgbmV3IGhhbGYgcGFnZSAqLworICAgIFNFVF9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfRlBSRyk7CisgICAgU0VUX0JJVChGTEFTSC0+UEVDUiwgRkxBU0hfUEVDUl9QUk9HKTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIGFsbCBJUlFzICovCisgICAgX19kaXNhYmxlX2lycSgpOworCisgICAgLyogV3JpdGUgb25lIGhhbGYgcGFnZSBkaXJlY3RseSB3aXRoIDE2IGRpZmZlcmVudCB3b3JkcyAqLworICAgIHdoaWxlKGNvdW50IDwgMTZVKQorICAgIHsKKyAgICAgIC8qIEFkZHJlc3MgZG9lc24ndCBuZWVkIHRvIGJlIGluY3JlYXNlZCAqLyAKKyAgICAgICooX19JTyB1aW50MzJfdCopIEFkZHJlc3MgPSAqcEJ1ZmZlcjsKKyAgICAgIHBCdWZmZXIrKzsKKyAgICAgIGNvdW50ICsrOyAgCisgICAgfQorCisgICAgLyogRW5hYmxlIElSUXMgKi8KKyAgICBfX2VuYWJsZV9pcnEoKTsKKworICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgIHN0YXR1cyA9IEZMQVNIUkFNX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworIAorICAgIC8qIElmIHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBQUk9HIGFuZCBGUFJHIGJpdHMgKi8KKyAgICBDTEVBUl9CSVQoRkxBU0gtPlBFQ1IsIEZMQVNIX1BFQ1JfUFJPRyk7CisgICAgQ0xFQVJfQklUKEZMQVNILT5QRUNSLCBGTEFTSF9QRUNSX0ZQUkcpOworICB9CisKKyAgLyogUmV0dXJuIHRoZSBXcml0ZSBTdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9SQU1GVU5DX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBlcnJvcnMgZnVuY3Rpb25zIAorICogIEBicmllZiAgICBQZXJpcGhlcmFsIGVycm9ycyBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgZXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0IHRvIGdldCBpbiBydW4tdGltZSBlcnJvcnMgb2YgIHRoZSBGTEFTSCBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWMgRkxBU0ggZXJyb3JzIGZsYWcuCisgICogQHBhcmFtICBFcnJvciBwb2ludGVyIGlzIHRoZSBlcnJvciB2YWx1ZS4gSXQgY2FuIGJlIGEgbWl4ZWQgb2Y6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZMQVNIX0VSUk9SX1JEICAgICAgRkxBU0ggUmVhZCBQcm90ZWN0aW9uIGVycm9yIGZsYWcgKFBDUk9QKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9TSVpFICAgIEZMQVNIIFByb2dyYW1taW5nIFBhcmFsbGVsaXNtIGVycm9yIGZsYWcgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9QR0EgICAgIEZMQVNIIFByb2dyYW1taW5nIEFsaWdubWVudCBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZMQVNIX0VSUk9SX1dSUCAgICAgRkxBU0ggV3JpdGUgcHJvdGVjdGVkIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfT1BUViAgICBGTEFTSCBPcHRpb24gdmFsaWQgZXJyb3IgZmxhZyAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfRldXRVJSICBGTEFTSCBXcml0ZSBvciBFcmFzZSBvcGVyYXRpb24gYWJvcnRlZAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9OT1RaRVJPIEZMQVNIIFdyaXRlIG9wZXJhdGlvbiBpcyBkb25lIGluIGEgbm90LWVyYXNlZCByZWdpb24KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK19fUkFNX0ZVTkMgSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfR2V0RXJyb3IodWludDMyX3QgKiBFcnJvcikKK3sgCisgICpFcnJvciA9IHBGbGFzaC5FcnJvckNvZGU7CisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX1JBTUZVTkNfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLyAKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHNwZWNpZmljIEZMQVNIIGVycm9yIGZsYWcuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitzdGF0aWMgX19SQU1fRlVOQyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSFJBTV9TZXRFcnJvckNvZGUodm9pZCkKK3sKKyAgdWludDMyX3QgZmxhZ3MgPSAwOworICAKKyAgaWYoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19XUlBFUlIpKQorICB7CisgICAgcEZsYXNoLkVycm9yQ29kZSB8PSBIQUxfRkxBU0hfRVJST1JfV1JQOworICAgIGZsYWdzIHw9IEZMQVNIX0ZMQUdfV1JQRVJSOworICB9CisgIGlmKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfUEdBRVJSKSkKKyAgeworICAgIHBGbGFzaC5FcnJvckNvZGUgfD0gSEFMX0ZMQVNIX0VSUk9SX1BHQTsKKyAgICBmbGFncyB8PSBGTEFTSF9GTEFHX1BHQUVSUjsKKyAgfQorICBpZihfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1NJWkVSUikpCisgIHsgCisgICAgcEZsYXNoLkVycm9yQ29kZSB8PSBIQUxfRkxBU0hfRVJST1JfU0laRTsKKyAgICBmbGFncyB8PSBGTEFTSF9GTEFHX1NJWkVSUjsKKyAgfQorICBpZihfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX09QVFZFUlIpKQorICB7CisgICAgLyogV0FSTklORyA6IE9uIHRoZSBmaXJzdCBjdXQgb2YgU1RNMzJMMDMxeHggYW5kIFNUTTMyTDA0MXh4IGRldmljZXMsCisgICAgICogICAgICAgICAgIChSZWZJRCA9IDB4MTAwMCkgdGhlIEZMQVNIX0ZMQUdfT1BUVkVSUiBiaXQgd2FzIG5vdCBiZWhhdmluZworICAgICAqICAgICAgICAgICBhcyBleHBlY3RlZC4gSWYgdGhlIHVzZXIgcnVuIGFuIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBmaXJzdAorICAgICAqICAgICAgICAgICBjdXQgb2YgdGhlIFNUTTMyTDAzMXh4IGRldmljZSBvciB0aGUgZmlyc3QgY3V0IG9mIHRoZSBTVE0zMkwwNDF4eAorICAgICAqICAgICAgICAgICBkZXZpY2UsIHRoaXMgZXJyb3Igc2hvdWxkIGJlIGlnbm9yZWQuIFRoZSByZXZJZCBvZiB0aGUgZGV2aWNlCisgICAgICogICAgICAgICAgIGNhbiBiZSByZXRyaWV2ZWQgdmlhIHRoZSBIQUxfR2V0UkVWSUQoKSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqLworICAgIHBGbGFzaC5FcnJvckNvZGUgfD0gSEFMX0ZMQVNIX0VSUk9SX09QVFY7CisgICAgZmxhZ3MgfD0gRkxBU0hfRkxBR19PUFRWRVJSOworICB9CisKKyAgaWYoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19SREVSUikpCisgIHsKKyAgICBwRmxhc2guRXJyb3JDb2RlIHw9IEhBTF9GTEFTSF9FUlJPUl9SRDsKKyAgICBmbGFncyB8PSBGTEFTSF9GTEFHX1JERVJSOworICB9CisgIGlmKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfRldXRVJSKSkKKyAgeyAKKyAgICBwRmxhc2guRXJyb3JDb2RlIHw9IEhBTF9GTEFTSF9FUlJPUl9GV1dFUlI7CisgICAgZmxhZ3MgfD0gSEFMX0ZMQVNIX0VSUk9SX0ZXV0VSUjsKKyAgfQorICBpZihfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX05PVFpFUk9FUlIpKQorICB7IAorICAgIHBGbGFzaC5FcnJvckNvZGUgfD0gSEFMX0ZMQVNIX0VSUk9SX05PVFpFUk87CisgICAgZmxhZ3MgfD0gRkxBU0hfRkxBR19OT1RaRVJPRVJSOworICB9CisKKyAgLyogQ2xlYXIgRkxBU0ggZXJyb3IgcGVuZGluZyBiaXRzICovCisgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoZmxhZ3MpOworCisgIHJldHVybiBIQUxfT0s7Cit9ICAKKworLyoqCisgICogQGJyaWVmICBXYWl0IGZvciBhIEZMQVNIIG9wZXJhdGlvbiB0byBjb21wbGV0ZS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgbWF4aW11bSBmbGFzaCBvcGVyYXRpb250aW1lb3V0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgX19SQU1fRlVOQyBIQUxfU3RhdHVzVHlwZURlZiBGTEFTSFJBTV9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KQoreyAKKyAgICAvKiBXYWl0IGZvciB0aGUgRkxBU0ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGJ5IHBvbGxpbmcgb24gQlVTWSBmbGFnIHRvIGJlIHJlc2V0LgorICAgICAgIEV2ZW4gaWYgdGhlIEZMQVNIIG9wZXJhdGlvbiBmYWlscywgdGhlIEJVU1kgZmxhZyB3aWxsIGJlIHJlc2V0IGFuZCBhbiBlcnJvcgorICAgICAgIGZsYWcgd2lsbCBiZSBzZXQgKi8KKyAgICAgICAKKyAgICB3aGlsZShfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX0JTWSkgJiYgKFRpbWVvdXQgIT0gMHgwMFUpKSAKKyAgICB7IAorICAgICAgVGltZW91dC0tOworICAgIH0KKyAgICAKKyAgICBpZihUaW1lb3V0ID09IDB4MDBVKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgICAgCisgIC8qIENoZWNrIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZyAgKi8KKyAgaWYgKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfRU9QKSkKKyAgeworICAgIC8qIENsZWFyIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9GTEFTSF9DTEVBUl9GTEFHKEZMQVNIX0ZMQUdfRU9QKTsKKyAgfQorICAKKyAgaWYoIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfV1JQRVJSKSAgICAgfHwgCisgICAgICBfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1BHQUVSUikgICAgIHx8IAorICAgICAgX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19TSVpFUlIpICAgICB8fCAKKyAgICAgIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfT1BUVkVSUikgICAgfHwgCisgICAgICBfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX1JERVJSKSAgICAgIHx8IAorICAgICAgX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19GV1dFUlIpICAgICB8fCAKKyAgICAgIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfTk9UWkVST0VSUikgKQorICB7CisgICAgLypTYXZlIHRoZSBlcnJvciBjb2RlKi8KKworICAgIC8qIFdBUk5JTkcgOiBPbiB0aGUgZmlyc3QgY3V0IG9mIFNUTTMyTDAzMXh4IGFuZCBTVE0zMkwwNDF4eCBkZXZpY2VzLAorICAgICAqICAgICAgICAgICAoUmVmSUQgPSAweDEwMDApIHRoZSBGTEFTSF9GTEFHX09QVFZFUlIgYml0IHdhcyBub3QgYmVoYXZpbmcKKyAgICAgKiAgICAgICAgICAgYXMgZXhwZWN0ZWQuIElmIHRoZSB1c2VyIHJ1biBhbiBhcHBsaWNhdGlvbiB1c2luZyB0aGUgZmlyc3QKKyAgICAgKiAgICAgICAgICAgY3V0IG9mIHRoZSBTVE0zMkwwMzF4eCBkZXZpY2Ugb3IgdGhlIGZpcnN0IGN1dCBvZiB0aGUgU1RNMzJMMDQxeHgKKyAgICAgKiAgICAgICAgICAgZGV2aWNlLCB0aGlzIGVycm9yIHNob3VsZCBiZSBpZ25vcmVkLiBUaGUgcmV2SWQgb2YgdGhlIGRldmljZQorICAgICAqICAgICAgICAgICBjYW4gYmUgcmV0cmlldmVkIHZpYSB0aGUgSEFMX0dldFJFVklEKCkgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKi8KKyAgICBGTEFTSFJBTV9TZXRFcnJvckNvZGUoKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogVGhlcmUgaXMgbm8gZXJyb3IgZmxhZyBzZXQgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworICAgICAKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9ncGlvLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiYmJmYQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX2dwaW8uYwpAQCAtMCwwICsxLDUzMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfZ3Bpby5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBHUElPIEhBTCBtb2R1bGUgZHJpdmVyLiAgCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEdlbmVyYWwgUHVycG9zZSBJbnB1dC9PdXRwdXQgKEdQSU8pIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEdQSU8gUGVyaXBoZXJhbCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAKKyAgICAoKykgRWFjaCBwb3J0IGJpdCBvZiB0aGUgZ2VuZXJhbC1wdXJwb3NlIEkvTyAoR1BJTykgcG9ydHMgY2FuIGJlIGluZGl2aWR1YWxseSAKKyAgY29uZmlndXJlZCBieSBzb2Z0d2FyZSBpbiBzZXZlcmFsIG1vZGVzOgorICAgICAgICAoKyspIElucHV0IG1vZGUgCisgICAgICAgICgrKykgQW5hbG9nIG1vZGUKKyAgICAgICAgKCsrKSBPdXRwdXQgbW9kZQorICAgICAgICAoKyspIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlCisgICAgICAgICgrKykgRXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IGxpbmVzCisgCisgICAgKCspIER1cmluZyBhbmQganVzdCBhZnRlciByZXNldCwgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbnMgYW5kIGV4dGVybmFsIGludGVycnVwdCAgCisgIGxpbmVzIGFyZSBub3QgYWN0aXZlIGFuZCB0aGUgSS9PIHBvcnRzIGFyZSBjb25maWd1cmVkIGluIGlucHV0IGZsb2F0aW5nIG1vZGUuCisgIAorICAgICgrKSBBbGwgR1BJTyBwaW5zIGhhdmUgd2VhayBpbnRlcm5hbCBwdWxsLXVwIGFuZCBwdWxsLWRvd24gcmVzaXN0b3JzLCB3aGljaCBjYW4gYmUgCisgIGFjdGl2YXRlZCBvciBub3QuCisKKyAgICAoKykgSW4gT3V0cHV0IG9yIEFsdGVybmF0ZSBtb2RlLCBlYWNoIElPIGNhbiBiZSBjb25maWd1cmVkIG9uIG9wZW4tZHJhaW4gb3IgcHVzaC1wdWxsCisgIHR5cGUgYW5kIHRoZSBJTyBzcGVlZCBjYW4gYmUgc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBWREQgdmFsdWUuCisgIAorICAgICgrKSBUaGUgbWljcm9jb250cm9sbGVyIElPIHBpbnMgYXJlIGNvbm5lY3RlZCB0byBvbmJvYXJkIHBlcmlwaGVyYWxzL21vZHVsZXMgdGhyb3VnaCBhIAorICAgICAgICBtdWx0aXBsZXhlciB0aGF0IGFsbG93cyBvbmx5IG9uZSBwZXJpcGhlcmFsIGFsdGVybmF0ZSBmdW5jdGlvbiAoQUYpIGNvbm5lY3RlZCAKKyAgdG8gYW4gSU8gcGluIGF0IGEgdGltZS4gSW4gdGhpcyB3YXksIHRoZXJlIGNhbiBiZSBubyBjb25mbGljdCBiZXR3ZWVuIHBlcmlwaGVyYWxzIAorICBzaGFyaW5nIHRoZSBzYW1lIElPIHBpbi4gCisKKyAgICAoKykgQWxsIHBvcnRzIGhhdmUgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IGNhcGFiaWxpdHkuIFRvIHVzZSBleHRlcm5hbCBpbnRlcnJ1cHQgCisgIGxpbmVzLCB0aGUgcG9ydCBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgbW9kZS4gQWxsIGF2YWlsYWJsZSBHUElPIHBpbnMgYXJlIAorICBjb25uZWN0ZWQgdG8gdGhlIDE2IGV4dGVybmFsIGludGVycnVwdC9ldmVudCBsaW5lcyBmcm9tIEVYVEkwIHRvIEVYVEkxNS4KKyAgCisgICAgKCspIFRoZSBleHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgY29udHJvbGxlciBjb25zaXN0cyBvZiB1cCB0byAyOCBlZGdlIGRldGVjdG9ycworICAoMTYgbGluZXMgYXJlIGNvbm5lY3RlZCB0byBHUElPKSBmb3IgZ2VuZXJhdGluZyBldmVudC9pbnRlcnJ1cHQgcmVxdWVzdHMgKGVhY2ggCisgIGlucHV0IGxpbmUgY2FuIGJlIGluZGVwZW5kZW50bHkgY29uZmlndXJlZCB0byBzZWxlY3QgdGhlIHR5cGUgKGludGVycnVwdCBvciBldmVudCkgCisgIGFuZCB0aGUgY29ycmVzcG9uZGluZyB0cmlnZ2VyIGV2ZW50IChyaXNpbmcgb3IgZmFsbGluZyBvciBib3RoKS4gRWFjaCBsaW5lIGNhbiAKKyAgYWxzbyBiZSBtYXNrZWQgaW5kZXBlbmRlbnRseS4gCisgIAorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICBbLi5dICAgICAgICAgICAgIAorICAgICgjKSBFbmFibGUgdGhlIEdQSU8gSU9QT1JUIGNsb2NrIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246IF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCkuIAorCisgICAgKCMpIENvbmZpZ3VyZSB0aGUgR1BJTyBwaW4ocykgdXNpbmcgSEFMX0dQSU9fSW5pdCgpLgorICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgSU8gbW9kZSB1c2luZyAiTW9kZSIgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgICAgICAgKCsrKSBBY3RpdmF0ZSBQdWxsLXVwLCBQdWxsLWRvd24gcmVzaXN0b3IgdXNpbmcgIlB1bGwiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYgCisgICAgICAgICAgICAgc3RydWN0dXJlLgorICAgICAgICAoKyspIEluIGNhc2Ugb2YgT3V0cHV0IG9yIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHNlbGVjdGlvbjogdGhlIHNwZWVkIGlzIAorICAgICAgICAgICAgIGNvbmZpZ3VyZWQgdGhyb3VnaCAiU3BlZWQiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAgICAgICAoKyspIEluIGFsdGVybmF0ZSBtb2RlIGlzIHNlbGVjdGlvbiwgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbiBjb25uZWN0ZWQgdG8gdGhlIElPCisgICAgICAgICAgICAgaXMgY29uZmlndXJlZCB0aHJvdWdoICJBbHRlcm5hdGUiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAgICAgICAoKyspIEFuYWxvZyBtb2RlIGlzIHJlcXVpcmVkIHdoZW4gYSBwaW4gaXMgdG8gYmUgdXNlZCBhcyBBREMgY2hhbm5lbCAKKyAgICAgICAgICAgICBvciBEQUMgb3V0cHV0LgorICAgICAgICAoKyspIEluIGNhc2Ugb2YgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IHNlbGVjdGlvbiB0aGUgIk1vZGUiIG1lbWJlciBmcm9tIAorICAgICAgICAgICAgIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHNlbGVjdCB0aGUgdHlwZSAoaW50ZXJydXB0IG9yIGV2ZW50KSBhbmQgCisgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgdHJpZ2dlciBldmVudCAocmlzaW5nIG9yIGZhbGxpbmcgb3IgYm90aCkuCisgICAKKyAgICAoIykgSW4gY2FzZSBvZiBleHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgbW9kZSBzZWxlY3Rpb24sIGNvbmZpZ3VyZSBOVklDIElSUSBwcmlvcml0eSAKKyAgICAgICAgbWFwcGVkIHRvIHRoZSBFWFRJIGxpbmUgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBhbmQgZW5hYmxlIGl0IHVzaW5nCisgICAgICAgIEhBTF9OVklDX0VuYWJsZUlSUSgpLgorICAgICAgICAgCisgICAoIykgSEFMX0dQSU9fRGVJbml0IGFsbG93cyB0byBzZXQgcmVnaXN0ZXIgdmFsdWVzIHRvIHRoZWlyIHJlc2V0IHZhbHVlLiBUaGlzIGZ1bmN0aW9uCisgICAgICAgaXMgYWxzbyB0byBiZSB1c2VkIHdoZW4gdW5jb25maWd1cmluZyBwaW4gd2hpY2ggd2FzIHVzZWQgYXMgYW4gZXh0ZXJuYWwgaW50ZXJydXB0CisgICAgICAgb3IgaW4gZXZlbnQgbW9kZS4gVGhhdCBpcyB0aGUgb25seSB3YXkgdG8gcmVzZXQgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluCisgICAgICAgRVhUSSAmIFNZU0NGRyByZWdpc3RlcnMuCisKKyAgICAoIykgVG8gZ2V0IHRoZSBsZXZlbCBvZiBhIHBpbiBjb25maWd1cmVkIGluIGlucHV0IG1vZGUgdXNlIEhBTF9HUElPX1JlYWRQaW4oKS4KKyAgICAgICAgICAgIAorICAgICgjKSBUbyBzZXQvcmVzZXQgdGhlIGxldmVsIG9mIGEgcGluIGNvbmZpZ3VyZWQgaW4gb3V0cHV0IG1vZGUgdXNlIAorICAgICAgICBIQUxfR1BJT19Xcml0ZVBpbigpL0hBTF9HUElPX1RvZ2dsZVBpbigpLgorCisgICAgKCMpIFRvIGxvY2sgcGluIGNvbmZpZ3VyYXRpb24gdW50aWwgbmV4dCByZXNldCB1c2UgSEFMX0dQSU9fTG9ja1BpbigpLgorCisgICAgKCMpIER1cmluZyBhbmQganVzdCBhZnRlciByZXNldCwgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbnMgYXJlIG5vdCAKKyAgICAgICAgYWN0aXZlIGFuZCB0aGUgR1BJTyBwaW5zIGFyZSBjb25maWd1cmVkIGluIGlucHV0IGZsb2F0aW5nIG1vZGUgKGV4Y2VwdCBKVEFHCisgICAgICAgIHBpbnMpLgorICAKKyAgICAoIykgVGhlIExTRSBvc2NpbGxhdG9yIHBpbnMgT1NDMzJfSU4gYW5kIE9TQzMyX09VVCBjYW4gYmUgdXNlZCBhcyBnZW5lcmFsIHB1cnBvc2UgCisgICAgICAgIChQQzE0IGFuZCBQQzE1LCByZXNwZWN0aXZlbHkpIHdoZW4gdGhlIExTRSBvc2NpbGxhdG9yIGlzIG9mZi4gVGhlIExTRSBoYXMgCisgICAgICAgIHByaW9yaXR5IG92ZXIgdGhlIEdQSU8gZnVuY3Rpb24uCisgIAorICAgICgjKSBUaGUgSFNFIG9zY2lsbGF0b3IgcGlucyBPU0NfSU4vT1NDX09VVCBjYW4gYmUgdXNlZCBhcyAKKyAgICAgICAgZ2VuZXJhbCBwdXJwb3NlIFBIMCBhbmQgUEgxLCByZXNwZWN0aXZlbHksIHdoZW4gdGhlIEhTRSBvc2NpbGxhdG9yIGlzIG9mZi4gCisgICAgICAgIFRoZSBIU0UgaGFzIHByaW9yaXR5IG92ZXIgdGhlIEdQSU8gZnVuY3Rpb24uCisgIAorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8gCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQKKworLyoqIEBhZGR0b2dyb3VwIEdQSU8KKyAgKiBAYnJpZWYgR1BJTyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX1ByaXZhdGUKKyAgKiBAeworICAqLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworIAorI2RlZmluZSBHUElPX01PREUgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkKKyNkZWZpbmUgRVhUSV9NT0RFICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDAwMFUpCisjZGVmaW5lIEdQSU9fTU9ERV9JVCAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDBVKQorI2RlZmluZSBHUElPX01PREVfRVZUICAgICAgICAgKCh1aW50MzJfdCkweDAwMDIwMDAwVSkKKyNkZWZpbmUgUklTSU5HX0VER0UgICAgICAgICAgICgodWludDMyX3QpMHgwMDEwMDAwMFUpIAorI2RlZmluZSBGQUxMSU5HX0VER0UgICAgICAgICAgKCh1aW50MzJfdCkweDAwMjAwMDAwVSkgCisjZGVmaW5lIEdQSU9fT1VUUFVUX1RZUEUgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKQorCisjZGVmaW5lIEdQSU9fTlVNQkVSICAgICAgICAgICAoKHVpbnQzMl90KTE2VSkKKworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAYWRkdG9ncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEdQSU94IHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgR1BJT19Jbml0LgorICAqIEBwYXJhbSAgR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkUgYW5kIEgpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvciBTVE0zMkwwWFggZmFtaWx5IGRldmljZXMuCisgICogICAgICAgICAgICAgICAgTm90ZSB0aGF0IEdQSU9FIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogQHBhcmFtICBHUElPX0luaXQgcG9pbnRlciB0byBhIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgR1BJTyBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAgKkdQSU94LCBHUElPX0luaXRUeXBlRGVmICpHUElPX0luaXQpCit7CisgIHVpbnQzMl90IHBvc2l0aW9uID0gMHgwMFU7CisgIHVpbnQzMl90IGlvY3VycmVudCA9IDB4MDBVOworICB1aW50MzJfdCB0ZW1wID0gMHgwMFU7CisgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX01PREUoR1BJT19Jbml0LT5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX1BVTEwoR1BJT19Jbml0LT5QdWxsKSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTl9BVkFJTEFCTEUoR1BJT3gsKEdQSU9fSW5pdC0+UGluKSkpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgcG9ydCBwaW5zICovCisgIHdoaWxlICgoKEdQSU9fSW5pdC0+UGluKSA+PiBwb3NpdGlvbikgIT0gMCkKKyAgeworICAgIC8qIEdldCB0aGUgSU8gcG9zaXRpb24gKi8KKyAgICBpb2N1cnJlbnQgPSAoR1BJT19Jbml0LT5QaW4pICYgKDFVIDw8IHBvc2l0aW9uKTsKKyAgICAKKyAgICBpZihpb2N1cnJlbnQpCisgICAgeworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gR1BJTyBNb2RlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIC8qIEluIGNhc2Ugb2YgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgc2VsZWN0aW9uICovCisgICAgICBpZigoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9BRl9QUCkgfHwgKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfQUZfT0QpKSAKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIEFsdGVybmF0ZSBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgICAgICAgIGFzc2VydF9wYXJhbShJU19HUElPX0FGX0lOU1RBTkNFKEdQSU94KSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19HUElPX0FGKEdQSU9fSW5pdC0+QWx0ZXJuYXRlKSk7CisKKyAgICAgICAgLyogQ29uZmlndXJlIEFsdGVybmF0ZSBmdW5jdGlvbiBtYXBwZWQgd2l0aCB0aGUgY3VycmVudCBJTyAqLyAKKyAgICAgICAgdGVtcCA9IEdQSU94LT5BRlJbcG9zaXRpb24gPj4gM1VdOworICAgICAgICB0ZW1wICY9IH4oKHVpbnQzMl90KTB4RlUgPDwgKCh1aW50MzJfdCkocG9zaXRpb24gJiAodWludDMyX3QpMHgwN1UpICogNFUpKSA7CisgICAgICAgIHRlbXAgfD0gKCh1aW50MzJfdCkoR1BJT19Jbml0LT5BbHRlcm5hdGUpIDw8ICgoKHVpbnQzMl90KXBvc2l0aW9uICYgKHVpbnQzMl90KTB4MDdVKSAqIDRVKSkgOworICAgICAgICBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDNVXSA9IHRlbXA7CisgICAgICB9IAorCisgICAgICAvKiBJbiBjYXNlIG9mIE91dHB1dCBvciBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBzZWxlY3Rpb24gKi8KKyAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX09VVFBVVF9QUCkgfHwgKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfQUZfUFApIHx8CisgICAgICAgICAoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9PVVRQVVRfT0QpIHx8IChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX0FGX09EKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIFNwZWVkIHBhcmFtZXRlciAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfR1BJT19TUEVFRChHUElPX0luaXQtPlNwZWVkKSk7CisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgSU8gU3BlZWQgKi8KKyAgICAgICAgdGVtcCA9IEdQSU94LT5PU1BFRURSOworICAgICAgICB0ZW1wICY9IH4oR1BJT19PU1BFRURFUl9PU1BFRUQwIDw8IChwb3NpdGlvbiAqIDJVKSk7CisgICAgICAgIHRlbXAgfD0gKEdQSU9fSW5pdC0+U3BlZWQgPDwgKHBvc2l0aW9uICogMlUpKTsKKyAgICAgICAgR1BJT3gtPk9TUEVFRFIgPSB0ZW1wOworCisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgSU8gT3V0cHV0IFR5cGUgKi8KKyAgICAgICAgdGVtcD0gR1BJT3gtPk9UWVBFUjsKKyAgICAgICAgdGVtcCAmPSB+KEdQSU9fT1RZUEVSX09UXzAgPDwgcG9zaXRpb24pIDsKKyAgICAgICAgdGVtcCB8PSAoKChHUElPX0luaXQtPk1vZGUgJiBHUElPX09VVFBVVF9UWVBFKSA+PiA0VSkgPDwgcG9zaXRpb24pOworICAgICAgICBHUElPeC0+T1RZUEVSID0gdGVtcDsKKyAgICAgIH0KKworICAgICAgLyogQ29uZmlndXJlIElPIERpcmVjdGlvbiBtb2RlIChJbnB1dCwgT3V0cHV0LCBBbHRlcm5hdGUgb3IgQW5hbG9nKSAqLworICAgICAgdGVtcCA9IEdQSU94LT5NT0RFUjsKKyAgICAgIHRlbXAgJj0gfihHUElPX01PREVSX01PREUwIDw8IChwb3NpdGlvbiAqIDJVKSk7CisgICAgICB0ZW1wIHw9ICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSA8PCAocG9zaXRpb24gKiAyVSkpOworICAgICAgR1BJT3gtPk1PREVSID0gdGVtcDsKKworICAgICAgLyogQWN0aXZhdGUgdGhlIFB1bGwtdXAgb3IgUHVsbCBkb3duIHJlc2lzdG9yIGZvciB0aGUgY3VycmVudCBJTyAqLworICAgICAgdGVtcCA9IEdQSU94LT5QVVBEUjsKKyAgICAgIHRlbXAgJj0gfihHUElPX1BVUERSX1BVUEQwIDw8IChwb3NpdGlvbiAqIDJVKSk7CisgICAgICB0ZW1wIHw9ICgoR1BJT19Jbml0LT5QdWxsKSA8PCAocG9zaXRpb24gKiAyVSkpOyAKKyAgICAgIEdQSU94LT5QVVBEUiA9IHRlbXA7CisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVYVEkgTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBDb25maWd1cmUgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBldmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KKyAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgJiBFWFRJX01PREUpID09IEVYVElfTU9ERSkgCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSBTWVNDRkcgQ2xvY2sgKi8KKyAgICAgICAgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCk7CisgICAgICAgIAorICAgICAgICB0ZW1wID0gU1lTQ0ZHLT5FWFRJQ1JbcG9zaXRpb24gPj4gMlVdOworICAgICAgICBDTEVBUl9CSVQodGVtcCwgKCh1aW50MzJfdCkweDBGVSkgPDwgKDRVICogKHBvc2l0aW9uICYgMHgwM1UpKSk7CisgICAgICAgIFNFVF9CSVQodGVtcCwgKEdQSU9fR0VUX0lOREVYKEdQSU94KSkgPDwgKDQgKiAocG9zaXRpb24gJiAweDAzVSkpKTsKKyAgICAgICAgU1lTQ0ZHLT5FWFRJQ1JbcG9zaXRpb24gPj4gMlVdID0gdGVtcDsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAvKiBDbGVhciBFWFRJIGxpbmUgY29uZmlndXJhdGlvbiAqLworICAgICAgICB0ZW1wID0gRVhUSS0+SU1SOworICAgICAgICB0ZW1wICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CisgICAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgJiBHUElPX01PREVfSVQpID09IEdQSU9fTU9ERV9JVCkKKyAgICAgICAgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPklNUiA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IEVYVEktPkVNUjsKKyAgICAgICAgdGVtcCAmPSB+KCh1aW50MzJfdClpb2N1cnJlbnQpOworICAgICAgICBpZigoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFX0VWVCkgPT0gR1BJT19NT0RFX0VWVCkKKyAgICAgICAgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPkVNUiA9IHRlbXA7CisKKyAgICAgICAgLyogQ2xlYXIgUmlzaW5nIEZhbGxpbmcgZWRnZSBjb25maWd1cmF0aW9uICovCisgICAgICAgIHRlbXAgPSBFWFRJLT5SVFNSOworICAgICAgICB0ZW1wICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CisgICAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgJiBSSVNJTkdfRURHRSkgPT0gUklTSU5HX0VER0UpCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wIHw9IGlvY3VycmVudDsKKyAgICAgICAgfQorICAgICAgICBFWFRJLT5SVFNSID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gRVhUSS0+RlRTUjsKKyAgICAgICAgdGVtcCAmPSB+KCh1aW50MzJfdClpb2N1cnJlbnQpOworICAgICAgICBpZigoR1BJT19Jbml0LT5Nb2RlICYgRkFMTElOR19FREdFKSA9PSBGQUxMSU5HX0VER0UpCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wIHw9IGlvY3VycmVudDsKKyAgICAgICAgfQorICAgICAgICBFWFRJLT5GVFNSID0gdGVtcDsKKyAgICAgIH0KKyAgICB9CisgICAgcG9zaXRpb24rKzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemVzIHRoZSBHUElPeCBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5FIGFuZCBIKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJMMFhYIGZhbWlseSBkZXZpY2VzLgorICAqICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBHUElPRSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdCB0byBiZSB3cml0dGVuLgorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSAoMC4uMTUpLgorICAqICAgICAgICAgICAgICAgICAgIEFsbCBwb3J0IGJpdHMgYXJlIG5vdCBuZWNlc3NhcmlseSBhdmFpbGFibGUgb24gYWxsIEdQSU9zLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfR1BJT19EZUluaXQoR1BJT19UeXBlRGVmICAqR1BJT3gsIHVpbnQzMl90IEdQSU9fUGluKQoreyAKKyAgdWludDMyX3QgcG9zaXRpb24gPSAweDAwVTsKKyAgdWludDMyX3QgaW9jdXJyZW50ID0gMHgwMFU7CisgIHVpbnQzMl90IHRtcCA9IDB4MDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTl9BVkFJTEFCTEUoR1BJT3gsR1BJT19QaW4pKTsKKworICAvKiBDb25maWd1cmUgdGhlIHBvcnQgcGlucyAqLworICB3aGlsZSAoKEdQSU9fUGluID4+IHBvc2l0aW9uKSAhPSAwKQorICB7CisgICAgLyogR2V0IHRoZSBJTyBwb3NpdGlvbiAqLworICAgIGlvY3VycmVudCA9IChHUElPX1BpbikgJiAoMVUgPDwgcG9zaXRpb24pOworCisgICAgaWYoaW9jdXJyZW50KQorICAgIHsKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHUElPIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBDb25maWd1cmUgSU8gRGlyZWN0aW9uIGluIElucHV0IEZsb3RpbmcgTW9kZSAqLworICAgICAgR1BJT3gtPk1PREVSIHw9IChHUElPX01PREVSX01PREUwIDw8IChwb3NpdGlvbiAqIDJVKSk7CisgICAgICAgICAgIAorICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IEFsdGVybmF0ZSBGdW5jdGlvbiBpbiBjdXJyZW50IElPICovIAorICAgICAgR1BJT3gtPkFGUltwb3NpdGlvbiA+PiAzVV0gJj0gfigodWludDMyX3QpMHhGVSA8PCAoKHVpbnQzMl90KShwb3NpdGlvbiAmICh1aW50MzJfdCkweDA3VSkgKiA0VSkpIDsKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBJTyBTcGVlZCAqLworICAgICAgR1BJT3gtPk9TUEVFRFIgJj0gfihHUElPX09TUEVFREVSX09TUEVFRDAgPDwgKHBvc2l0aW9uICogMlUpKTsKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IHZhbHVlIElPIE91dHB1dCBUeXBlICovCisgICAgICBHUElPeC0+T1RZUEVSICAmPSB+KEdQSU9fT1RZUEVSX09UXzAgPDwgcG9zaXRpb24pIDsKKyAgICAgIAorICAgICAgLyogRGVhY3RpdmF0ZSB0aGUgUHVsbC11cCBvYW5kIFB1bGwtZG93biByZXNpc3RvciBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KKyAgICAgIEdQSU94LT5QVVBEUiAmPSB+KEdQSU9fUFVQRFJfUFVQRDAgPDwgKHBvc2l0aW9uICogMlUpKTsKKyAgICAgIAorICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVYVEkgTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIC8qIENsZWFyIHRoZSBFeHRlcm5hbCBJbnRlcnJ1cHQgb3IgRXZlbnQgZm9yIHRoZSBjdXJyZW50IElPICovCisgICAgICAKKyAgICAgIHRtcCA9IFNZU0NGRy0+RVhUSUNSW3Bvc2l0aW9uID4+IDJVXTsKKyAgICAgIHRtcCAmPSAoKCh1aW50MzJfdCkweDBGVSkgPDwgKDRVICogKHBvc2l0aW9uICYgMHgwM1UpKSk7CisgICAgICBpZih0bXAgPT0gKEdQSU9fR0VUX0lOREVYKEdQSU94KSA8PCAoNFUgKiAocG9zaXRpb24gJiAweDAzVSkpKSkKKyAgICAgIHsKKyAgICAgICAgdG1wID0gKCh1aW50MzJfdCkweDBGVSkgPDwgKDRVICogKHBvc2l0aW9uICYgMHgwM1UpKTsKKyAgICAgICAgU1lTQ0ZHLT5FWFRJQ1JbcG9zaXRpb24gPj4gMlVdICY9IH50bXA7CisKKyAgICAgICAgLyogQ2xlYXIgRVhUSSBsaW5lIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgRVhUSS0+SU1SICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CisgICAgICAgIEVYVEktPkVNUiAmPSB+KCh1aW50MzJfdClpb2N1cnJlbnQpOworCisgICAgICAgIC8qIENsZWFyIFJpc2luZyBGYWxsaW5nIGVkZ2UgY29uZmlndXJhdGlvbiAqLworICAgICAgICBFWFRJLT5SVFNSICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CisgICAgICAgIEVYVEktPkZUU1IgJj0gfigodWludDMyX3QpaW9jdXJyZW50KTsKKyAgICAgIH0KKyAgICB9CisgICAgIHBvc2l0aW9uKys7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgIEdQSU8gUmVhZCBhbmQgV3JpdGUKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVhZHMgdGhlIHNwZWNpZmllZCBpbnB1dCBwb3J0IHBpbi4KKyAgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5FIGFuZCBIKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJMMHh4IGZhbWlseSBkZXZpY2VzLgorICAqICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBHUElPRSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdCB0byByZWFkLgorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkuCisgICogICAgICAgICAgICAgICAgICAgQWxsIHBvcnQgYml0cyBhcmUgbm90IG5lY2Vzc2FyaWx5IGF2YWlsYWJsZSBvbiBhbGwgR1BJT3MuCisgICogQHJldHZhbCBUaGUgaW5wdXQgcG9ydCBwaW4gdmFsdWUuCisgICovCitHUElPX1BpblN0YXRlIEhBTF9HUElPX1JlYWRQaW4oR1BJT19UeXBlRGVmKiBHUElPeCwgdWludDE2X3QgR1BJT19QaW4pCit7CisgIEdQSU9fUGluU3RhdGUgYml0c3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOX0FWQUlMQUJMRShHUElPeCxHUElPX1BpbikpOworICAKKyAgaWYoKEdQSU94LT5JRFIgJiBHUElPX1BpbikgIT0gKHVpbnQzMl90KUdQSU9fUElOX1JFU0VUKQorICB7CisgICAgYml0c3RhdHVzID0gR1BJT19QSU5fU0VUOworICB9CisgIGVsc2UKKyAgeworICAgIGJpdHN0YXR1cyA9IEdQSU9fUElOX1JFU0VUOworICB9CisgIHJldHVybiBiaXRzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0cyBvciBjbGVhcnMgdGhlIHNlbGVjdGVkIGRhdGEgcG9ydCBiaXQuCisgICogCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHVzZXMgR1BJT3hfQlNSUiByZWdpc3RlciB0byBhbGxvdyBhdG9taWMgcmVhZC9tb2RpZnkgCisgICogICAgICAgICBhY2Nlc3Nlcy4gSW4gdGhpcyB3YXksIHRoZXJlIGlzIG5vIHJpc2sgb2YgYW4gSVJRIG9jY3VycmluZyBiZXR3ZWVuCisgICogICAgICAgICB0aGUgcmVhZCBhbmQgdGhlIG1vZGlmeSBhY2Nlc3MuCisgICogICAgICAgICAgICAgICAKKyAgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5FIGFuZCBIKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJMMHh4IGZhbWlseSBkZXZpY2VzLgorICAqICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBHUElPRSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdCB0byBiZSB3cml0dGVuLgorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSAoMC4uMTUpLgorICAqICAgICAgICAgICAgICAgICAgIEFsbCBwb3J0IGJpdHMgYXJlIG5vdCBuZWNlc3NhcmlseSBhdmFpbGFibGUgb24gYWxsIEdQSU9zLgorICAqIEBwYXJhbSAgUGluU3RhdGUgc3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBzZWxlY3RlZCBiaXQuCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgR1BJT19QaW5TdGF0ZSBlbnVtIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUElOX1JFU0VUOiB0byBjbGVhciB0aGUgcG9ydCBwaW4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUElOX1NFVDogdG8gc2V0IHRoZSBwb3J0IHBpbgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfR1BJT19Xcml0ZVBpbihHUElPX1R5cGVEZWYqIEdQSU94LCB1aW50MTZfdCBHUElPX1BpbiwgR1BJT19QaW5TdGF0ZSBQaW5TdGF0ZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOX0FWQUlMQUJMRShHUElPeCxHUElPX1BpbikpOworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU5fQUNUSU9OKFBpblN0YXRlKSk7CisgIAorICBpZihQaW5TdGF0ZSAhPSBHUElPX1BJTl9SRVNFVCkKKyAgeworICAgIEdQSU94LT5CU1JSID0gR1BJT19QaW47CisgIH0KKyAgZWxzZQorICB7CisgICAgR1BJT3gtPkJSUiA9IEdQSU9fUGluIDsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRvZ2dsZXMgdGhlIHNwZWNpZmllZCBHUElPIHBpbnMuCisgICogQHBhcmFtICBHUElPeCBXaGVyZSB4IGNhbiBiZSAoQS4uRSBhbmQgSCkgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwgZm9yIFNUTTMyTDB4eCBmYW1pbHkgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICAgICBOb3RlIHRoYXQgR1BJT0UgaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcy4KKyAgKiAgICAgICAgICAgICAgICBBbGwgcG9ydCBiaXRzIGFyZSBub3QgbmVjZXNzYXJpbHkgYXZhaWxhYmxlIG9uIGFsbCBHUElPcy4KKyAgKiBAcGFyYW0gIEdQSU9fUGluIFNwZWNpZmllcyB0aGUgcGlucyB0byBiZSB0b2dnbGVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfR1BJT19Ub2dnbGVQaW4oR1BJT19UeXBlRGVmKiBHUElPeCwgdWludDE2X3QgR1BJT19QaW4pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTl9BVkFJTEFCTEUoR1BJT3gsR1BJT19QaW4pKTsKKworICBHUElPeC0+T0RSIF49IEdQSU9fUGluOworfQorCisvKioKKyogQGJyaWVmICBMb2NrcyBHUElPIFBpbnMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisqIEBub3RlICAgVGhlIGxvY2tlZCByZWdpc3RlcnMgYXJlIEdQSU94X01PREVSLCBHUElPeF9PVFlQRVIsIEdQSU94X09TUEVFRFIsCisqICAgICAgICAgR1BJT3hfUFVQRFIsIEdQSU94X0FGUkwgYW5kIEdQSU94X0FGUkguCisqIEBub3RlICAgVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxvY2tlZCBHUElPIHBpbnMgY2FuIG5vIGxvbmdlciBiZSBtb2RpZmllZAorKiAgICAgICAgIHVudGlsIHRoZSBuZXh0IHJlc2V0LgorKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5FIGFuZCBIKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJMMHh4IGZhbWlseS4KKyogICAgICAgICAgICAgICAgTm90ZSB0aGF0IEdQSU9FIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdCB0byBiZSBsb2NrZWQuCisqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1Bpbl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkuCisqICAgICAgICAgQWxsIHBvcnQgYml0cyBhcmUgbm90IG5lY2Vzc2FyaWx5IGF2YWlsYWJsZSBvbiBhbGwgR1BJT3MuCisqIEByZXR2YWwgTm9uZQorKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9HUElPX0xvY2tQaW4oR1BJT19UeXBlRGVmKiBHUElPeCwgdWludDE2X3QgR1BJT19QaW4pCit7CisgIF9fSU8gdWludDMyX3QgdG1wID0gR1BJT19MQ0tSX0xDS0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOX0FWQUlMQUJMRShHUElPeCxHUElPX1BpbikpOworCisgIC8qIEFwcGx5IGxvY2sga2V5IHdyaXRlIHNlcXVlbmNlICovCisgIHRtcCB8PSBHUElPX1BpbjsKKyAgLyogU2V0IExDS3ggYml0KHMpOiBMQ0tLPScxJyArIExDS1sxNS0wXSAqLworICBHUElPeC0+TENLUiA9IHRtcDsKKyAgLyogUmVzZXQgTENLeCBiaXQocyk6IExDS0s9JzAnICsgTENLWzE1LTBdICovCisgIEdQSU94LT5MQ0tSID0gR1BJT19QaW47CisgIC8qIFNldCBMQ0t4IGJpdChzKTogTENLSz0nMScgKyBMQ0tbMTUtMF0gKi8KKyAgR1BJT3gtPkxDS1IgPSB0bXA7CisgIC8qIFJlYWQgTENLSyBiaXQqLworICB0bXAgPSBHUElPeC0+TENLUjsKKworICBpZigoR1BJT3gtPkxDS1IgJiBHUElPX0xDS1JfTENLSykgIT0gUkVTRVQpCisgIHsKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEVYVEkgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBHUElPX1BpbiBTcGVjaWZpZXMgdGhlIHBpbnMgY29ubmVjdGVkIHRvIHRoZSBFWFRJIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9HUElPX0VYVElfSVJRSGFuZGxlcih1aW50MTZfdCBHUElPX1BpbikKK3sKKyAgLyogRVhUSSBsaW5lIGludGVycnVwdCBkZXRlY3RlZCAqLworICBpZihfX0hBTF9HUElPX0VYVElfR0VUX0lUKEdQSU9fUGluKSAhPSBSRVNFVCkgCisgIHsgCisgICAgX19IQUxfR1BJT19FWFRJX0NMRUFSX0lUKEdQSU9fUGluKTsKKyAgICBIQUxfR1BJT19FWFRJX0NhbGxiYWNrKEdQSU9fUGluKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgbGluZSBkZXRlY3Rpb24gY2FsbGJhY2tzLgorICAqIEBwYXJhbSAgR1BJT19QaW4gU3BlY2lmaWVzIHRoZSBwaW5zIGNvbm5lY3RlZCB0byB0aGUgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0dQSU9fRVhUSV9DYWxsYmFjayh1aW50MTZfdCBHUElPX1BpbikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoR1BJT19QaW4pOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX0dQSU9fRVhUSV9DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfaTJjLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjg1ODczCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfaTJjLmMKQEAgLTAsMCArMSw2NTAyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9pMmMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSTJDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEludGVyIEludGVncmF0ZWQgQ2lyY3VpdCAoSTJDKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBJMkMgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgKCMpIERlY2xhcmUgYSBJMkNfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLCBmb3IgZXhhbXBsZToKKyAgICAgICAgSTJDX0hhbmRsZVR5cGVEZWYgIGhpMmM7CisKKyAgICAoIylJbml0aWFsaXplIHRoZSBJMkMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEByZWYgSEFMX0kyQ19Nc3BJbml0KCkgQVBJOgorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgSTJDeCBpbnRlcmZhY2UgY2xvY2sKKyAgICAgICAgKCMjKSBJMkMgcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgSTJDIEdQSU9zCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgSTJDIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIG9wZW4tZHJhaW4KKyAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIEkyQ3ggaW50ZXJydXB0IHByaW9yaXR5CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgSTJDIElSUSBDaGFubmVsCisgICAgICAgICgjIykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzCisgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSBmb3IgdGhlIHRyYW5zbWl0IG9yIHJlY2VpdmUgY2hhbm5lbAorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jayB1c2luZworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgaGFuZGxlIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4IG9yIFJ4IGNoYW5uZWwKKyAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgaGkyYyBETUEgVHggb3IgUnggaGFuZGxlCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24KKyAgICAgICAgICAgICAgICAgIHRoZSBETUEgVHggb3IgUnggY2hhbm5lbAorCisgICAgKCMpIENvbmZpZ3VyZSB0aGUgQ29tbXVuaWNhdGlvbiBDbG9jayBUaW1pbmcsIE93biBBZGRyZXNzMSwgTWFzdGVyIEFkZHJlc3NpbmcgbW9kZSwgRHVhbCBBZGRyZXNzaW5nIG1vZGUsCisgICAgICAgIE93biBBZGRyZXNzMiwgT3duIEFkZHJlc3MyIE1hc2ssIEdlbmVyYWwgY2FsbCBhbmQgTm9zdHJldGNoIG1vZGUgaW4gdGhlIGhpMmMgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgSTJDIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBAcmVmIEhBTF9JMkNfSW5pdCgpLCBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZQorICAgICAgICAoR1BJTywgQ0xPQ0ssIE5WSUMuLi5ldGMpIGJ5IGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgQHJlZiBIQUxfSTJDX01zcEluaXQoJmhpMmMpIEFQSS4KKworICAgICgjKSBUbyBjaGVjayBpZiB0YXJnZXQgZGV2aWNlIGlzIHJlYWR5IGZvciBjb21tdW5pY2F0aW9uLCB1c2UgdGhlIGZ1bmN0aW9uIEByZWYgSEFMX0kyQ19Jc0RldmljZVJlYWR5KCkKKworICAgICgjKSBGb3IgSTJDIElPIGFuZCBJTyBNRU0gb3BlcmF0aW9ucywgdGhyZWUgb3BlcmF0aW9uIG1vZGVzIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyIDoKKworICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfVHJhbnNtaXQoKQorICAgICAgKCspIFJlY2VpdmUgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmUoKQorICAgICAgKCspIFRyYW5zbWl0IGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXQoKQorICAgICAgKCspIFJlY2VpdmUgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlKCkKKworICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gTUVNIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFdyaXRlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdG8gYSBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzcyB1c2luZyBAcmVmIEhBTF9JMkNfTWVtX1dyaXRlKCkKKyAgICAgICgrKSBSZWFkIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgZnJvbSBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nIEByZWYgSEFMX0kyQ19NZW1fUmVhZCgpCisKKworICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgVHJhbnNtaXQgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9JVCgpCisgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmVfSVQoKQorICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFRyYW5zbWl0IGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0X0lUKCkKKyAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0lUKCkKKyAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKQorICAgICAgKCspIEFib3J0IGEgbWFzdGVyIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKykgRW5kIG9mIGFib3J0IHByb2Nlc3MsIEByZWYgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIERpc2NhcmQgYSBzbGF2ZSBJMkMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHVzaW5nIEByZWYgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0soKSBtYWNyby4KKyAgICAgICAgICAgVGhpcyBhY3Rpb24gd2lsbCBpbmZvcm0gTWFzdGVyIHRvIGdlbmVyYXRlIGEgU3RvcCBjb25kaXRpb24gdG8gZGlzY2FyZCB0aGUgY29tbXVuaWNhdGlvbi4KKworCisgICAgKioqIEludGVycnVwdCBtb2RlIG9yIERNQSBtb2RlIElPIHNlcXVlbnRpYWwgb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoQCkgVGhlc2UgaW50ZXJmYWNlcyBhbGxvdyB0byBtYW5hZ2UgYSBzZXF1ZW50aWFsIHRyYW5zZmVyIHdpdGggYSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24KKyAgICAgICAgICB3aGVuIGEgZGlyZWN0aW9uIGNoYW5nZSBkdXJpbmcgdHJhbnNmZXIKKyAgICBbLi5dCisgICAgICAoKykgQSBzcGVjaWZpYyBvcHRpb24gZmllbGQgbWFuYWdlIHRoZSBkaWZmZXJlbnQgc3RlcHMgb2YgYSBzZXF1ZW50aWFsIHRyYW5zZmVyCisgICAgICAoKykgT3B0aW9uIGZpZWxkIHZhbHVlcyBhcmUgZGVmaW5lZCB0aHJvdWdoIEByZWYgSTJDX1hGRVJPUFRJT05TIGFuZCBhcmUgbGlzdGVkIGJlbG93OgorICAgICAgKCsrKSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUU6IE5vIHNlcXVlbnRpYWwgdXNhZ2UsIGZ1bmN0aW9ubmFsIGlzIHNhbWUgYXMgYXNzb2NpYXRlZCBpbnRlcmZhY2VzIGluIG5vIHNlcXVlbnRpYWwgbW9kZQorICAgICAgKCsrKSBJMkNfRklSU1RfRlJBTUU6IFNlcXVlbnRpYWwgdXNhZ2UsIHRoaXMgb3B0aW9uIGFsbG93IHRvIG1hbmFnZSBhIHNlcXVlbmNlIHdpdGggc3RhcnQgY29uZGl0aW9uLCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGRhdGEgdG8gdHJhbnNmZXIgd2l0aG91dCBhIGZpbmFsIHN0b3AgY29uZGl0aW9uCisgICAgICAoKyspIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRTogU2VxdWVudGlhbCB1c2FnZSAoTWFzdGVyIG9ubHkpLCB0aGlzIG9wdGlvbiBhbGxvdyB0byBtYW5hZ2UgYSBzZXF1ZW5jZSB3aXRoIHN0YXJ0IGNvbmRpdGlvbiwgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkYXRhIHRvIHRyYW5zZmVyIHdpdGhvdXQgYSBmaW5hbCBzdG9wIGNvbmRpdGlvbiwgYW4gdGhlbiBwZXJtaXQgYSBjYWxsIHRoZSBzYW1lIG1hc3RlciBzZXF1ZW50aWFsIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyYWwgdGltZXMgKGxpa2UgQHJlZiBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQoKSB0aGVuIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBAcmVmIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEoKSB0aGVuIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQSgpKQorICAgICAgKCsrKSBJMkNfTkVYVF9GUkFNRTogU2VxdWVudGlhbCB1c2FnZSwgdGhpcyBvcHRpb24gYWxsb3cgdG8gbWFuYWdlIGEgc2VxdWVuY2Ugd2l0aCBhIHJlc3RhcnQgY29uZGl0aW9uLCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdpdGggbmV3IGRhdGEgdG8gdHJhbnNmZXIgaWYgdGhlIGRpcmVjdGlvbiBjaGFuZ2Ugb3IgbWFuYWdlIG9ubHkgdGhlIG5ldyBkYXRhIHRvIHRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm8gZGlyZWN0aW9uIGNoYW5nZSBhbmQgd2l0aG91dCBhIGZpbmFsIHN0b3AgY29uZGl0aW9uIGluIGJvdGggY2FzZXMKKyAgICAgICgrKykgSTJDX0xBU1RfRlJBTUU6IFNlcXVlbnRpYWwgdXNhZ2UsIHRoaXMgb3B0aW9uIGFsbG93IHRvIG1hbmFnZSBhIHNlcXVhbmNlIHdpdGggYSByZXN0YXJ0IGNvbmRpdGlvbiwgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB3aXRoIG5ldyBkYXRhIHRvIHRyYW5zZmVyIGlmIHRoZSBkaXJlY3Rpb24gY2hhbmdlIG9yIG1hbmFnZSBvbmx5IHRoZSBuZXcgZGF0YSB0byB0cmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vIGRpcmVjdGlvbiBjaGFuZ2UgYW5kIHdpdGggYSBmaW5hbCBzdG9wIGNvbmRpdGlvbiBpbiBib3RoIGNhc2VzCisgICAgICAoKyspIEkyQ19MQVNUX0ZSQU1FX05PX1NUT1A6IFNlcXVlbnRpYWwgdXNhZ2UgKE1hc3RlciBvbmx5KSwgdGhpcyBvcHRpb24gYWxsb3cgdG8gbWFuYWdlIGEgcmVzdGFydCBjb25kaXRpb24gYWZ0ZXIgc2V2ZXJhbCBjYWxsIG9mIHRoZSBzYW1lIG1hc3RlciBzZXF1ZW50aWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIHNldmVyYWwgdGltZXMgKGxpbmsgd2l0aCBvcHRpb24gSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2FnZSBjYW4sIHRyYW5zZmVyIHNldmVyYWwgYnl0ZXMgb25lIGJ5IG9uZSB1c2luZyBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQob3B0aW9uIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSB0aGVuIEkyQ19ORVhUX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQob3B0aW9uIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSB0aGVuIEkyQ19ORVhUX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQShvcHRpb24gSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FIHRoZW4gSTJDX05FWFRfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEob3B0aW9uIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSB0aGVuIEkyQ19ORVhUX0ZSQU1FKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVuIHVzYWdlIG9mIHRoaXMgb3B0aW9uIEkyQ19MQVNUX0ZSQU1FX05PX1NUT1AgYXQgdGhlIGxhc3QgVHJhbnNtaXQgb3IgUmVjZWl2ZSBzZXF1ZW5jZSBwZXJtaXQgdG8gY2FsbCB0aGUgb3Bvc2l0ZSBpbnRlcmZhY2UgUmVjZWl2ZSBvciBUcmFuc21pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBzdG9wcGluZyB0aGUgY29tbXVuaWNhdGlvbiBhbmQgc28gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbi4KKyAgICAgICgrKykgSTJDX09USEVSX0ZSQU1FOiBTZXF1ZW50aWFsIHVzYWdlIChNYXN0ZXIgb25seSksIHRoaXMgb3B0aW9uIGFsbG93IHRvIG1hbmFnZSBhIHJlc3RhcnQgY29uZGl0aW9uIGFmdGVyIGVhY2ggY2FsbCBvZiB0aGUgc2FtZSBtYXN0ZXIgc2VxdWVudGlhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2FnZSBjYW4sIHRyYW5zZmVyIHNldmVyYWwgYnl0ZXMgb25lIGJ5IG9uZSB3aXRoIGEgcmVzdGFydCB3aXRoIHNsYXZlIGFkZHJlc3MgYmV0d2VlbiBlYWNoIGJ5dGVzIHVzaW5nIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVChvcHRpb24gSTJDX0ZJUlNUX0ZSQU1FIHRoZW4gSTJDX09USEVSX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQob3B0aW9uIEkyQ19GSVJTVF9GUkFNRSB0aGVuIEkyQ19PVEhFUl9GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEob3B0aW9uIEkyQ19GSVJTVF9GUkFNRSB0aGVuIEkyQ19PVEhFUl9GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQShvcHRpb24gSTJDX0ZJUlNUX0ZSQU1FIHRoZW4gSTJDX09USEVSX0ZSQU1FKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVuIHVzYWdlIG9mIHRoaXMgb3B0aW9uIEkyQ19PVEhFUl9BTkRfTEFTVF9GUkFNRSBhdCB0aGUgbGFzdCBmcmFtZSB0byBoZWxwIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIFNUT1AgY29uZGl0aW9uLgorCisgICAgICAoKykgRGlmZmVyZW50cyBzZXF1ZW50aWFsIEkyQyBpbnRlcmZhY2VzIGFyZSBsaXN0ZWQgYmVsb3c6CisgICAgICAoKyspIFNlcXVlbnRpYWwgdHJhbnNtaXQgaW4gbWFzdGVyIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgIG9yIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQSgpCisgICAgICAoKysrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGN1cnJlbnQgZnJhbWUgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCsrKSBTZXF1ZW50aWFsIHJlY2VpdmUgaW4gbWFzdGVyIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQoKQorICAgICAgICAgICAgb3IgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEoKQorICAgICAgKCsrKykgQXQgcmVjZXB0aW9uIGVuZCBvZiBjdXJyZW50IGZyYW1lIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgQWJvcnQgYSBtYXN0ZXIgSVQgb3IgRE1BIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKysrKSBFbmQgb2YgYWJvcnQgcHJvY2VzcywgQHJlZiBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpCisgICAgICAoKyspIEVuYWJsZS9kaXNhYmxlIHRoZSBBZGRyZXNzIGxpc3RlbiBtb2RlIGluIHNsYXZlIEkyQyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19FbmFibGVMaXN0ZW5fSVQoKSBAcmVmIEhBTF9JMkNfRGlzYWJsZUxpc3Rlbl9JVCgpCisgICAgICAoKysrKSBXaGVuIGFkZHJlc3Mgc2xhdmUgSTJDIG1hdGNoLCBAcmVmIEhBTF9JMkNfQWRkckNhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgdG8gY2hlY2sgdGhlIEFkZHJlc3MgTWF0Y2ggQ29kZSBhbmQgdGhlIHRyYW5zbWlzc2lvbiBkaXJlY3Rpb24gcmVxdWVzdCBieSBtYXN0ZXIgKFdyaXRlL1JlYWQpLgorICAgICAgKCsrKykgQXQgTGlzdGVuIG1vZGUgZW5kIEByZWYgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjaygpCisgICAgICAoKyspIFNlcXVlbnRpYWwgdHJhbnNtaXQgaW4gc2xhdmUgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9JVCgpCisgICAgICAgICAgICBvciB1c2luZyBAcmVmIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQSgpCisgICAgICAoKysrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGN1cnJlbnQgZnJhbWUgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgU2VxdWVudGlhbCByZWNlaXZlIGluIHNsYXZlIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9JVCgpCisgICAgICAgICAgICBvciB1c2luZyBAcmVmIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfRE1BKCkKKyAgICAgICgrKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgY3VycmVudCBmcmFtZSB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCsrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisgICAgICAoKyspIERpc2NhcmQgYSBzbGF2ZSBJMkMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHVzaW5nIEByZWYgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0soKSBtYWNyby4KKyAgICAgICAgICAgVGhpcyBhY3Rpb24gd2lsbCBpbmZvcm0gTWFzdGVyIHRvIGdlbmVyYXRlIGEgU3RvcCBjb25kaXRpb24gdG8gZGlzY2FyZCB0aGUgY29tbXVuaWNhdGlvbi4KKworICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBNRU0gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBXcml0ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdCB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nCisgICAgICAgICAgQHJlZiBIQUxfSTJDX01lbV9Xcml0ZV9JVCgpCisgICAgICAoKykgQXQgTWVtb3J5IGVuZCBvZiB3cml0ZSB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVhZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdCBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfTWVtX1JlYWRfSVQoKQorICAgICAgKCspIEF0IE1lbW9yeSBlbmQgb2YgcmVhZCB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKQorCisgICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgVHJhbnNtaXQgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0RNQSgpCisgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZworICAgICAgICAgIEByZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9ETUEoKQorICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFRyYW5zbWl0IGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfRE1BKCkKKyAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nCisgICAgICAgICAgQHJlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmVfRE1BKCkKKyAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKQorICAgICAgKCspIEFib3J0IGEgbWFzdGVyIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKykgRW5kIG9mIGFib3J0IHByb2Nlc3MsIEByZWYgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIERpc2NhcmQgYSBzbGF2ZSBJMkMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHVzaW5nIEByZWYgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0soKSBtYWNyby4KKyAgICAgICAgICAgVGhpcyBhY3Rpb24gd2lsbCBpbmZvcm0gTWFzdGVyIHRvIGdlbmVyYXRlIGEgU3RvcCBjb25kaXRpb24gdG8gZGlzY2FyZCB0aGUgY29tbXVuaWNhdGlvbi4KKworICAgICoqKiBETUEgbW9kZSBJTyBNRU0gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBXcml0ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nCisgICAgICAgICAgQHJlZiBIQUxfSTJDX01lbV9Xcml0ZV9ETUEoKQorICAgICAgKCspIEF0IE1lbW9yeSBlbmQgb2Ygd3JpdGUgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFJlYWQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEgZnJvbSBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nCisgICAgICAgICAgQHJlZiBIQUxfSTJDX01lbV9SZWFkX0RNQSgpCisgICAgICAoKykgQXQgTWVtb3J5IGVuZCBvZiByZWFkIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisKKworICAgICAqKiogSTJDIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gSTJDIEhBTCBkcml2ZXIuCisKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19FTkFCTEU6IEVuYWJsZSB0aGUgSTJDIHBlcmlwaGVyYWwKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19ESVNBQkxFOiBEaXNhYmxlIHRoZSBJMkMgcGVyaXBoZXJhbAorICAgICAgKCspIEByZWYgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0s6IEdlbmVyYXRlIGEgTm9uLUFja25vd2xlZGdlIEkyQyBwZXJpcGhlcmFsIGluIFNsYXZlIG1vZGUKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19HRVRfRkxBRzogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19DTEVBUl9GTEFHOiBDbGVhciB0aGUgc3BlY2lmaWVkIEkyQyBwZW5kaW5nIGZsYWcKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHQKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdAorCisgICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisgICAgIFVzZSBGdW5jdGlvbnMgQHJlZiBIQUxfSTJDX1JlZ2lzdGVyQ2FsbGJhY2soKSBvciBAcmVmIEhBTF9JMkNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKQorICAgICB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisKKyAgICAgRnVuY3Rpb24gQHJlZiBIQUxfSTJDX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIE1hc3RlclJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVR4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVJ4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBMaXN0ZW5DcGx0Q2FsbGJhY2sgICA6IGNhbGxiYWNrIGZvciBlbmQgb2YgbGlzdGVuIG1vZGUuCisgICAgICAgKCspIE1lbVR4Q3BsdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1lbW9yeSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBNZW1SeENwbHRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNZW1vcnkgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgorICAgICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBhYm9ydCBjb21wbGV0aW9uIHByb2Nlc3MuCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgorICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICAgRm9yIHNwZWNpZmljIGNhbGxiYWNrIEFkZHJDYWxsYmFjayB1c2UgZGVkaWNhdGVkIHJlZ2lzdGVyIGNhbGxiYWNrcyA6IEByZWYgSEFMX0kyQ19SZWdpc3RlckFkZHJDYWxsYmFjaygpLgorCisgICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9JMkNfVW5SZWdpc3RlckNhbGxiYWNrIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgd2VhayBmdW5jdGlvbi4KKyAgICAgQHJlZiBIQUxfSTJDX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgKCspIE1hc3RlclR4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBNYXN0ZXJSeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBNYXN0ZXIgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVUeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVSeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgTGlzdGVuQ3BsdENhbGxiYWNrICAgOiBjYWxsYmFjayBmb3IgZW5kIG9mIGxpc3RlbiBtb2RlLgorICAgICAgICgrKSBNZW1UeENwbHRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNZW1vcnkgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgTWVtUnhDcGx0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgTWVtb3J5IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgYWJvcnQgY29tcGxldGlvbiBwcm9jZXNzLgorICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICA6IGNhbGxiYWNrIGZvciBNc3AgSW5pdC4KKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgTXNwIERlSW5pdC4KKworICAgICBGb3IgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfSTJDX1VuUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKS4KKworICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfSTJDX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgQHJlZiBIQUxfSTJDX1NUQVRFX1JFU0VUCisgICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgICAgZXhhbXBsZXMgQHJlZiBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpLgorICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZQorICAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9JMkNfSW5pdCgpLyBAcmVmIEhBTF9JMkNfRGVJbml0KCkgb25seSB3aGVuCisgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0kyQ19Jbml0KCkvIEByZWYgSEFMX0kyQ19EZUluaXQoKQorICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4KKworICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEByZWYgSEFMX0kyQ19TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICAgaW4gQHJlZiBIQUxfSTJDX1NUQVRFX1JFQURZIG9yIEByZWYgSEFMX0kyQ19TVEFURV9SRVNFVCBzdGF0ZSwKKyAgICAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICAgVGhlbiwgdGhlIHVzZXIgZmlyc3QgcmVnaXN0ZXJzIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICB1c2luZyBAcmVmIEhBTF9JMkNfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX0kyQ19EZUluaXQoKQorICAgICBvciBAcmVmIEhBTF9JMkNfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICAgICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgorCisgICAgIFsuLl0KKyAgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgSTJDIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQyBJMkMKKyAgKiBAYnJpZWYgSTJDIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfRGVmaW5lIEkyQyBQcml2YXRlIERlZmluZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTUlOR19DTEVBUl9NQVNLICAgKDB4RjBGRkZGRkZVKSAgLyohPCBJMkMgVElNSU5HIGNsZWFyIHJlZ2lzdGVyIE1hc2sgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfQUREUiAgICAoMTAwMDBVKSAgICAgICAvKiE8IDEwIHMgICovCisjZGVmaW5lIEkyQ19USU1FT1VUX0JVU1kgICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9ESVIgICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfUlhORSAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEkyQ19USU1FT1VUX1NUT1BGICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9UQyAgICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfVENSICAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEkyQ19USU1FT1VUX1RYSVMgICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9GTEFHICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKworI2RlZmluZSBNQVhfTkJZVEVfU0laRSAgICAgIDI1NVUKKyNkZWZpbmUgU2xhdmVBZGRyX1NISUZUICAgICA3VQorI2RlZmluZSBTbGF2ZUFkZHJfTVNLICAgICAgIDB4MDZVCisKKy8qIFByaXZhdGUgZGVmaW5lIGZvciBAcmVmIFByZXZpb3VzU3RhdGUgdXNhZ2UgKi8KKyNkZWZpbmUgSTJDX1NUQVRFX01TSyAgICAgICAgICAgICAoKHVpbnQzMl90KSgodWludDMyX3QpKCh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0JVU1lfVFggfCAodWludDMyX3QpSEFMX0kyQ19TVEFURV9CVVNZX1JYKSAmICh1aW50MzJfdCkofigodWludDMyX3QpSEFMX0kyQ19TVEFURV9SRUFEWSkpKSkgLyohPCBNYXNrIFN0YXRlIGRlZmluZSwga2VlcCBvbmx5IFJYIGFuZCBUWCBiaXRzICAgICAgICAgICAgKi8KKyNkZWZpbmUgSTJDX1NUQVRFX05PTkUgICAgICAgICAgICAoKHVpbnQzMl90KShIQUxfSTJDX01PREVfTk9ORSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlZmF1bHQgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJMkNfU1RBVEVfTUFTVEVSX0JVU1lfVFggICgodWludDMyX3QpKCgodWludDMyX3QpSEFMX0kyQ19TVEFURV9CVVNZX1RYICYgSTJDX1NUQVRFX01TSykgfCAodWludDMyX3QpSEFMX0kyQ19NT0RFX01BU1RFUikpICAgICAgICAgICAgLyohPCBNYXN0ZXIgQnVzeSBUWCwgY29tYmluYWlzb24gb2YgU3RhdGUgTFNCIGFuZCBNb2RlIGVudW0gKi8KKyNkZWZpbmUgSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYICAoKHVpbnQzMl90KSgoKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfQlVTWV9SWCAmIEkyQ19TVEFURV9NU0spIHwgKHVpbnQzMl90KUhBTF9JMkNfTU9ERV9NQVNURVIpKSAgICAgICAgICAgIC8qITwgTWFzdGVyIEJ1c3kgUlgsIGNvbWJpbmFpc29uIG9mIFN0YXRlIExTQiBhbmQgTW9kZSBlbnVtICovCisjZGVmaW5lIEkyQ19TVEFURV9TTEFWRV9CVVNZX1RYICAgKCh1aW50MzJfdCkoKCh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0JVU1lfVFggJiBJMkNfU1RBVEVfTVNLKSB8ICh1aW50MzJfdClIQUxfSTJDX01PREVfU0xBVkUpKSAgICAgICAgICAgICAvKiE8IFNsYXZlIEJ1c3kgVFgsIGNvbWJpbmFpc29uIG9mIFN0YXRlIExTQiBhbmQgTW9kZSBlbnVtICAqLworI2RlZmluZSBJMkNfU1RBVEVfU0xBVkVfQlVTWV9SWCAgICgodWludDMyX3QpKCgodWludDMyX3QpSEFMX0kyQ19TVEFURV9CVVNZX1JYICYgSTJDX1NUQVRFX01TSykgfCAodWludDMyX3QpSEFMX0kyQ19NT0RFX1NMQVZFKSkgICAgICAgICAgICAgLyohPCBTbGF2ZSBCdXN5IFJYLCBjb21iaW5haXNvbiBvZiBTdGF0ZSBMU0IgYW5kIE1vZGUgZW51bSAgKi8KKyNkZWZpbmUgSTJDX1NUQVRFX01FTV9CVVNZX1RYICAgICAoKHVpbnQzMl90KSgoKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfQlVTWV9UWCAmIEkyQ19TVEFURV9NU0spIHwgKHVpbnQzMl90KUhBTF9JMkNfTU9ERV9NRU0pKSAgICAgICAgICAgICAgIC8qITwgTWVtb3J5IEJ1c3kgVFgsIGNvbWJpbmFpc29uIG9mIFN0YXRlIExTQiBhbmQgTW9kZSBlbnVtICovCisjZGVmaW5lIEkyQ19TVEFURV9NRU1fQlVTWV9SWCAgICAgKCh1aW50MzJfdCkoKCh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0JVU1lfUlggJiBJMkNfU1RBVEVfTVNLKSB8ICh1aW50MzJfdClIQUxfSTJDX01PREVfTUVNKSkgICAgICAgICAgICAgICAvKiE8IE1lbW9yeSBCdXN5IFJYLCBjb21iaW5haXNvbiBvZiBTdGF0ZSBMU0IgYW5kIE1vZGUgZW51bSAqLworCisKKy8qIFByaXZhdGUgZGVmaW5lIHRvIGNlbnRyYWxpemUgdGhlIGVuYWJsZS9kaXNhYmxlIG9mIEludGVycnVwdHMgKi8KKyNkZWZpbmUgSTJDX1hGRVJfVFhfSVQgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBJMkNfWEZFUl9SWF9JVCAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIEkyQ19YRkVSX0xJU1RFTl9JVCAgICAgICgweDAwMDAwMDA0VSkKKworI2RlZmluZSBJMkNfWEZFUl9FUlJPUl9JVCAgICAgICAoMHgwMDAwMDAxMVUpCisjZGVmaW5lIEkyQ19YRkVSX0NQTFRfSVQgICAgICAgICgweDAwMDAwMDEyVSkKKyNkZWZpbmUgSTJDX1hGRVJfUkVMT0FEX0lUICAgICAgKDB4MDAwMDAwMTJVKQorCisvKiBQcml2YXRlIGRlZmluZSBTZXF1ZW50aWFsIFRyYW5zZmVyIE9wdGlvbnMgZGVmYXVsdC9yZXNldCB2YWx1ZSAqLworI2RlZmluZSBJMkNfTk9fT1BUSU9OX0ZSQU1FICAgICAoMHhGRkZGMDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfRnVuY3Rpb25zIEkyQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyB0byBoYW5kbGUgRE1BIHRyYW5zZmVyICovCitzdGF0aWMgdm9pZCBJMkNfRE1BTWFzdGVyVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEkyQ19ETUFNYXN0ZXJSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJMkNfRE1BU2xhdmVUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSTJDX0RNQVNsYXZlUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSTJDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEkyQ19ETUFBYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIHRvIGhhbmRsZSBJVCB0cmFuc2ZlciAqLworc3RhdGljIHZvaWQgSTJDX0lUQWRkckNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpOworc3RhdGljIHZvaWQgSTJDX0lUTWFzdGVyU2VxQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CitzdGF0aWMgdm9pZCBJMkNfSVRTbGF2ZVNlcUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworc3RhdGljIHZvaWQgSTJDX0lUTWFzdGVyQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncyk7CitzdGF0aWMgdm9pZCBJMkNfSVRTbGF2ZUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpOworc3RhdGljIHZvaWQgSTJDX0lUTGlzdGVuQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncyk7CitzdGF0aWMgdm9pZCBJMkNfSVRFcnJvcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRXJyb3JDb2RlKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlIElUIHRyYW5zZmVyICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1JlcXVlc3RNZW1vcnlXcml0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfUmVxdWVzdE1lbW9yeVJlYWQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIGZvciBJMkMgdHJhbnNmZXIgSVJRIGhhbmRsZXIgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfTWFzdGVyX0lTUl9JVChzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfU2xhdmVfSVNSX0lUKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzLCB1aW50MzJfdCBJVFNvdXJjZXMpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19NYXN0ZXJfSVNSX0RNQShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfU2xhdmVfSVNSX0RNQShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlIGZsYWdzIGR1cmluZyBwb2xsaW5nIHRyYW5zZmVyICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25UWElTRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uUlhORUZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPblNUT1BGbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19Jc0Fja25vd2xlZGdlRmFpbGVkKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyB0byBjZW50cmFsaXplIHRoZSBlbmFibGUvZGlzYWJsZSBvZiBJbnRlcnJ1cHRzICovCitzdGF0aWMgdm9pZCBJMkNfRW5hYmxlX0lSUShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgSW50ZXJydXB0UmVxdWVzdCk7CitzdGF0aWMgdm9pZCBJMkNfRGlzYWJsZV9JUlEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IEludGVycnVwdFJlcXVlc3QpOworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHRvIGZsdXNoIFRYRFIgcmVnaXN0ZXIgKi8KK3N0YXRpYyB2b2lkIEkyQ19GbHVzaF9UWERSKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbiB0byBoYW5kbGUgIHN0YXJ0LCByZXN0YXJ0IG9yIHN0b3AgYSB0cmFuc2ZlciAqLworc3RhdGljIHZvaWQgSTJDX1RyYW5zZmVyQ29uZmlnKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90IFNpemUsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpOworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHRvIENvbnZlcnQgU3BlY2lmaWMgb3B0aW9ucyAqLworc3RhdGljIHZvaWQgSTJDX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9ucyBJMkMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgYW5kCisgICAgICAgICAgZGVpbml0aWFsaXplIHRoZSBJMkN4IHBlcmlwaGVyYWw6CisKKyAgICAgICgrKSBVc2VyIG11c3QgSW1wbGVtZW50IEhBTF9JMkNfTXNwSW5pdCgpIGZ1bmN0aW9uIGluIHdoaWNoIGhlIGNvbmZpZ3VyZXMKKyAgICAgICAgICBhbGwgcmVsYXRlZCBwZXJpcGhlcmFscyByZXNvdXJjZXMgKENMT0NLLCBHUElPLCBETUEsIElUIGFuZCBOVklDICkuCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfSTJDX0luaXQoKSB0byBjb25maWd1cmUgdGhlIHNlbGVjdGVkIGRldmljZSB3aXRoCisgICAgICAgICAgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb246CisgICAgICAgICgrKykgQ2xvY2sgVGltaW5nCisgICAgICAgICgrKykgT3duIEFkZHJlc3MgMQorICAgICAgICAoKyspIEFkZHJlc3NpbmcgbW9kZSAoTWFzdGVyLCBTbGF2ZSkKKyAgICAgICAgKCsrKSBEdWFsIEFkZHJlc3NpbmcgbW9kZQorICAgICAgICAoKyspIE93biBBZGRyZXNzIDIKKyAgICAgICAgKCsrKSBPd24gQWRkcmVzcyAyIE1hc2sKKyAgICAgICAgKCsrKSBHZW5lcmFsIGNhbGwgbW9kZQorICAgICAgICAoKyspIE5vc3RyZXRjaCBtb2RlCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfSTJDX0RlSW5pdCgpIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBJMkN4IHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEkyQyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiB0aGUgSTJDX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19Jbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgSTJDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoaTJjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfSU5TVEFOQ0UoaGkyYy0+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+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgSTJDIE1hc3RlciwgU2xhdmUsIE1lbW9yeSBvciBubyBtb2RlLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMkMgbW9kdWxlCisgICogQHJldHZhbCBIQUwgbW9kZQorICAqLworSEFMX0kyQ19Nb2RlVHlwZURlZiBIQUxfSTJDX0dldE1vZGUoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIHJldHVybiBoaTJjLT5Nb2RlOworfQorCisvKioKKyogQGJyaWVmICBSZXR1cm4gdGhlIEkyQyBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorKiBAcmV0dmFsIEkyQyBFcnJvciBDb2RlCisqLwordWludDMyX3QgSEFMX0kyQ19HZXRFcnJvcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgcmV0dXJuIGhpMmMtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ19Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIE1hc3RlciBNb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHBhcmFtICBJVFNvdXJjZXMgSW50ZXJydXB0IHNvdXJjZXMgZW5hYmxlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfTWFzdGVyX0lTUl9JVChzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKQoreworICB1aW50MTZfdCBkZXZhZGRyZXNzOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19BRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX05BQ0tJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAvKiBTZXQgY29ycmVzcG9uZGluZyBFcnJvciBDb2RlICovCisgICAgLyogTm8gbmVlZCB0byBnZW5lcmF0ZSBTVE9QLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgKi8KKyAgICAvKiBFcnJvciBjYWxsYmFjayB3aWxsIGJlIHNlbmQgZHVyaW5nIHN0b3AgZmxhZyB0cmVhdG1lbnQgKi8KKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BRjsKKworICAgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyICovCisgICAgSTJDX0ZsdXNoX1RYRFIoaGkyYyk7CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX1JYTkUpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9SWEkpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIFJlbW92ZSBSWE5FIGZsYWcgb24gdGVtcG9yYXJ5IHZhcmlhYmxlIGFzIHJlYWQgZG9uZSAqLworICAgIElURmxhZ3MgJj0gfkkyQ19GTEFHX1JYTkU7CisKKyAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgKmhpMmMtPnBCdWZmUHRyID0gKHVpbnQ4X3QpaGkyYy0+SW5zdGFuY2UtPlJYRFI7CisKKyAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgfQorICBlbHNlIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfVFhJUykgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1RYSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSAqaGkyYy0+cEJ1ZmZQdHI7CisKKyAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgfQorICBlbHNlIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfVENSKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfVENJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoKGhpMmMtPlhmZXJDb3VudCAhPSAwVSkgJiYgKGhpMmMtPlhmZXJTaXplID09IDBVKSkKKyAgICB7CisgICAgICBkZXZhZGRyZXNzID0gKHVpbnQxNl90KShoaTJjLT5JbnN0YW5jZS0+Q1IyICYgSTJDX0NSMl9TQUREKTsKKworICAgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgICAgeworICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgZGV2YWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgICBpZiAoaGkyYy0+WGZlck9wdGlvbnMgIT0gSTJDX05PX09QVElPTl9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBkZXZhZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgaGkyYy0+WGZlck9wdGlvbnMsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBkZXZhZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENhbGwgVHhDcGx0Q2FsbGJhY2soKSBpZiBubyBzdG9wIG1vZGUgaXMgc2V0ICovCisgICAgICBpZiAoSTJDX0dFVF9TVE9QX01PREUoaGkyYykgIT0gSTJDX0FVVE9FTkRfTU9ERSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBJMkMgTWFzdGVyIFNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICBJMkNfSVRNYXN0ZXJTZXFDcGx0KGhpMmMpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBXcm9uZyBzaXplIFN0YXR1cyByZWdhcmRpbmcgVENSIGZsYWcgZXZlbnQgKi8KKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICAgIEkyQ19JVEVycm9yKGhpMmMsIEhBTF9JMkNfRVJST1JfU0laRSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19UQykgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1RDSSkgIT0gUkVTRVQpKQorICB7CisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBpZiAoSTJDX0dFVF9TVE9QX01PREUoaGkyYykgIT0gSTJDX0FVVE9FTkRfTU9ERSkKKyAgICAgIHsKKyAgICAgICAgLyogR2VuZXJhdGUgYSBzdG9wIGNvbmRpdGlvbiBpbiBjYXNlIG9mIG5vIHRyYW5zZmVyIG9wdGlvbiAqLworICAgICAgICBpZiAoaGkyYy0+WGZlck9wdGlvbnMgPT0gSTJDX05PX09QVElPTl9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEdlbmVyYXRlIFN0b3AgKi8KKyAgICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfU1RPUDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIEkyQyBNYXN0ZXIgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgICAgSTJDX0lUTWFzdGVyU2VxQ3BsdChoaTJjKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogV3Jvbmcgc2l6ZSBTdGF0dXMgcmVnYXJkaW5nIFRDIGZsYWcgZXZlbnQgKi8KKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgSTJDX0lURXJyb3IoaGkyYywgSEFMX0kyQ19FUlJPUl9TSVpFKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDYWxsIEkyQyBNYXN0ZXIgY29tcGxldGUgcHJvY2VzcyAqLworICAgIEkyQ19JVE1hc3RlckNwbHQoaGkyYywgSVRGbGFncyk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEludGVycnVwdCBTdWItUm91dGluZSB3aGljaCBoYW5kbGUgdGhlIEludGVycnVwdCBGbGFncyBTbGF2ZSBNb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHBhcmFtICBJVFNvdXJjZXMgSW50ZXJydXB0IHNvdXJjZXMgZW5hYmxlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfU2xhdmVfSVNSX0lUKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzLCB1aW50MzJfdCBJVFNvdXJjZXMpCit7CisgIHVpbnQzMl90IHRtcG9wdGlvbnMgPSBoaTJjLT5YZmVyT3B0aW9uczsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMmMpOworCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfQUYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9OQUNLSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2hlY2sgdGhhdCBJMkMgdHJhbnNmZXIgZmluaXNoZWQgKi8KKyAgICAvKiBpZiB5ZXMsIG5vcm1hbCB1c2UgY2FzZSwgYSBOQUNLIGlzIHNlbnQgYnkgdGhlIE1BU1RFUiB3aGVuIFRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisgICAgLyogTWVhbiBYZmVyQ291bnQgPT0gMCovCisgICAgLyogU28gY2xlYXIgRmxhZyBOQUNLRiBvbmx5ICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBpZiAoKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfTElTVEVOKSAmJiAodG1wb3B0aW9ucyA9PSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUUpKSAvKiBTYW1lIGFjdGlvbiBtdXN0IGJlIGRvbmUgZm9yICh0bXBvcHRpb25zID09IEkyQ19MQVNUX0ZSQU1FKSB3aGljaCByZW1vdmVkIGZvciBXYXJuaW5nW1BhMTM0XTogbGVmdCBhbmQgcmlnaHQgb3BlcmFuZHMgYXJlIGlkZW50aWNhbCAqLworICAgICAgeworICAgICAgICAvKiBDYWxsIEkyQyBMaXN0ZW4gY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICBJMkNfSVRMaXN0ZW5DcGx0KGhpMmMsIElURmxhZ3MpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pICYmICh0bXBvcHRpb25zICE9IEkyQ19OT19PUFRJT05fRlJBTUUpKQorICAgICAgeworICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgICAgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyICovCisgICAgICAgIEkyQ19GbHVzaF9UWERSKGhpMmMpOworCisgICAgICAgIC8qIExhc3QgQnl0ZSBpcyBUcmFuc21pdHRlZCAqLworICAgICAgICAvKiBDYWxsIEkyQyBTbGF2ZSBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgSTJDX0lUU2xhdmVTZXFDcGx0KGhpMmMpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogaWYgbm8sIGVycm9yIHVzZSBjYXNlLCBhIE5vbi1BY2tub3dsZWRnZSBvZiBsYXN0IERhdGEgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBNQVNURVIqLworICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAgIC8qIFNldCBFcnJvckNvZGUgY29ycmVzcG9uZGluZyB0byBhIE5vbi1BY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisKKyAgICAgIGlmICgodG1wb3B0aW9ucyA9PSBJMkNfRklSU1RfRlJBTUUpIHx8ICh0bXBvcHRpb25zID09IEkyQ19ORVhUX0ZSQU1FKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICAgIEkyQ19JVEVycm9yKGhpMmMsIGhpMmMtPkVycm9yQ29kZSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19SWE5FKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfUlhJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogUmVtb3ZlIFJYTkUgZmxhZyBvbiB0ZW1wb3JhcnkgdmFyaWFibGUgYXMgcmVhZCBkb25lICovCisgICAgICBJVEZsYWdzICY9IH5JMkNfRkxBR19SWE5FOworCisgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgICAqaGkyYy0+cEJ1ZmZQdHIgPSAodWludDhfdCloaTJjLT5JbnN0YW5jZS0+UlhEUjsKKworICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisgICAgfQorCisgICAgaWYgKChoaTJjLT5YZmVyQ291bnQgPT0gMFUpICYmIFwKKyAgICAgICAgKHRtcG9wdGlvbnMgIT0gSTJDX05PX09QVElPTl9GUkFNRSkpCisgICAgeworICAgICAgLyogQ2FsbCBJMkMgU2xhdmUgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICBJMkNfSVRTbGF2ZVNlcUNwbHQoaGkyYyk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19BRERSKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfQUREUkkpICE9IFJFU0VUKSkKKyAgeworICAgIEkyQ19JVEFkZHJDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19UWElTKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfVFhJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgb25seSBpZiBYZmVyQ291bnQgbm90IHJlYWNoICIwIiAqLworICAgIC8qIEEgVFhJUyBmbGFnIGNhbiBiZSBzZXQsIGR1cmluZyBTVE9QIHRyZWF0bWVudCAgICAgICovCisgICAgLyogQ2hlY2sgaWYgYWxsIERhdGFzIGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQgKi8KKyAgICAvKiBJZiBpdCBpcyB0aGUgY2FzZSwgdGhpcyBsYXN0IHdyaXRlIGluIFRYRFIgaXMgbm90IHNlbnQsIGNvcnJlc3BvbmQgdG8gYSBkdW1teSBUWElTIGV2ZW50ICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSAqaGkyYy0+cEJ1ZmZQdHI7CisKKyAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisgICAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKCh0bXBvcHRpb25zID09IEkyQ19ORVhUX0ZSQU1FKSB8fCAodG1wb3B0aW9ucyA9PSBJMkNfRklSU1RfRlJBTUUpKQorICAgICAgeworICAgICAgICAvKiBMYXN0IEJ5dGUgaXMgVHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgLyogQ2FsbCBJMkMgU2xhdmUgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgIEkyQ19JVFNsYXZlU2VxQ3BsdChoaTJjKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogQ2hlY2sgaWYgU1RPUEYgaXMgc2V0ICovCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9TVE9QSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2FsbCBJMkMgU2xhdmUgY29tcGxldGUgcHJvY2VzcyAqLworICAgIEkyQ19JVFNsYXZlQ3BsdChoaTJjLCBJVEZsYWdzKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIE1hc3RlciBNb2RlIHdpdGggRE1BLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHBhcmFtICBJVFNvdXJjZXMgSW50ZXJydXB0IHNvdXJjZXMgZW5hYmxlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfTWFzdGVyX0lTUl9ETUEoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcykKK3sKKyAgdWludDE2X3QgZGV2YWRkcmVzczsKKyAgdWludDMyX3QgeGZlcm1vZGU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfTkFDS0kpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgIC8qIFNldCBjb3JyZXNwb25kaW5nIEVycm9yIENvZGUgKi8KKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BRjsKKworICAgIC8qIE5vIG5lZWQgdG8gZ2VuZXJhdGUgU1RPUCwgaXQgaXMgYXV0b21hdGljYWxseSBkb25lICovCisgICAgLyogQnV0IGVuYWJsZSBTVE9QIGludGVycnVwdCwgdG8gdHJlYXQgaXQgKi8KKyAgICAvKiBFcnJvciBjYWxsYmFjayB3aWxsIGJlIHNlbmQgZHVyaW5nIHN0b3AgZmxhZyB0cmVhdG1lbnQgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9DUExUX0lUKTsKKworICAgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyICovCisgICAgSTJDX0ZsdXNoX1RYRFIoaGkyYyk7CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX1RDUikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1RDSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogRGlzYWJsZSBUQyBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9JMkNfRElTQUJMRV9JVChoaTJjLCBJMkNfSVRfVENJKTsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgIT0gMFUpCisgICAgeworICAgICAgLyogUmVjb3ZlciBTbGF2ZSBhZGRyZXNzICovCisgICAgICBkZXZhZGRyZXNzID0gKHVpbnQxNl90KShoaTJjLT5JbnN0YW5jZS0+Q1IyICYgSTJDX0NSMl9TQUREKTsKKworICAgICAgLyogUHJlcGFyZSB0aGUgbmV3IFhmZXJTaXplIHRvIHRyYW5zZmVyICovCisgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICB7CisgICAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgICAgaWYgKGhpMmMtPlhmZXJPcHRpb25zICE9IEkyQ19OT19PUFRJT05fRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBTZXQgdGhlIG5ldyBYZmVyU2l6ZSBpbiBOYnl0ZXMgcmVnaXN0ZXIgKi8KKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBkZXZhZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19OT19TVEFSVFNUT1ApOworCisgICAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgICBoaTJjLT5YZmVyQ291bnQgLT0gaGkyYy0+WGZlclNpemU7CisKKyAgICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgICAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCkKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1JYRE1BRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9UWERNQUVOOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2FsbCBUeENwbHRDYWxsYmFjaygpIGlmIG5vIHN0b3AgbW9kZSBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfR0VUX1NUT1BfTU9ERShoaTJjKSAhPSBJMkNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBDYWxsIEkyQyBNYXN0ZXIgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgIEkyQ19JVE1hc3RlclNlcUNwbHQoaGkyYyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFdyb25nIHNpemUgU3RhdHVzIHJlZ2FyZGluZyBUQ1IgZmxhZyBldmVudCAqLworICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgSTJDX0lURXJyb3IoaGkyYywgSEFMX0kyQ19FUlJPUl9TSVpFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX1RDKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfVENJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIGlmIChJMkNfR0VUX1NUT1BfTU9ERShoaTJjKSAhPSBJMkNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBHZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIGluIGNhc2Ugb2Ygbm8gdHJhbnNmZXIgb3B0aW9uICovCisgICAgICAgIGlmIChoaTJjLT5YZmVyT3B0aW9ucyA9PSBJMkNfTk9fT1BUSU9OX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgLyogR2VuZXJhdGUgU3RvcCAqLworICAgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9TVE9QOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgSTJDIE1hc3RlciBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICBJMkNfSVRNYXN0ZXJTZXFDcGx0KGhpMmMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBXcm9uZyBzaXplIFN0YXR1cyByZWdhcmRpbmcgVEMgZmxhZyBldmVudCAqLworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICBJMkNfSVRFcnJvcihoaTJjLCBIQUxfSTJDX0VSUk9SX1NJWkUpOworICAgIH0KKyAgfQorICBlbHNlIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9TVE9QSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2FsbCBJMkMgTWFzdGVyIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICBJMkNfSVRNYXN0ZXJDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIFNsYXZlIE1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElUU291cmNlcyBJbnRlcnJ1cHQgc291cmNlcyBlbmFibGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19TbGF2ZV9JU1JfRE1BKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzLCB1aW50MzJfdCBJVFNvdXJjZXMpCit7CisgIHVpbnQzMl90IHRtcG9wdGlvbnMgPSBoaTJjLT5YZmVyT3B0aW9uczsKKyAgdWludDMyX3QgdHJlYXRkbWFuYWNrID0gMFU7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfTkFDS0kpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENoZWNrIHRoYXQgSTJDIHRyYW5zZmVyIGZpbmlzaGVkICovCisgICAgLyogaWYgeWVzLCBub3JtYWwgdXNlIGNhc2UsIGEgTkFDSyBpcyBzZW50IGJ5IHRoZSBNQVNURVIgd2hlbiBUcmFuc2ZlciBpcyBmaW5pc2hlZCAqLworICAgIC8qIE1lYW4gWGZlckNvdW50ID09IDAgKi8KKyAgICAvKiBTbyBjbGVhciBGbGFnIE5BQ0tGIG9ubHkgKi8KKyAgICBpZiAoKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfQ1IxX1RYRE1BRU4pICE9IFJFU0VUKSB8fAorICAgICAgICAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19DUjFfUlhETUFFTikgIT0gUkVTRVQpKQorICAgIHsKKyAgICAgIC8qIFNwbGl0IGNoZWNrIG9mIGhkbWFyeCwgZm9yIE1JU1JBIGNvbXBsaWFuY2UgKi8KKyAgICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaWYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfQ1IxX1JYRE1BRU4pICE9IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9fSEFMX0RNQV9HRVRfQ09VTlRFUihoaTJjLT5oZG1hcngpID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRyZWF0ZG1hbmFjayA9IDFVOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBTcGxpdCBjaGVjayBvZiBoZG1hdHgsIGZvciBNSVNSQSBjb21wbGlhbmNlICAqLworICAgICAgaWYgKGhpMmMtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19DUjFfVFhETUFFTikgIT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19IQUxfRE1BX0dFVF9DT1VOVEVSKGhpMmMtPmhkbWF0eCkgPT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgdHJlYXRkbWFuYWNrID0gMVU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh0cmVhdGRtYW5hY2sgPT0gMVUpCisgICAgICB7CisgICAgICAgIGlmICgoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pICYmICh0bXBvcHRpb25zID09IEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRSkpIC8qIFNhbWUgYWN0aW9uIG11c3QgYmUgZG9uZSBmb3IgKHRtcG9wdGlvbnMgPT0gSTJDX0xBU1RfRlJBTUUpIHdoaWNoIHJlbW92ZWQgZm9yIFdhcm5pbmdbUGExMzRdOiBsZWZ0IGFuZCByaWdodCBvcGVyYW5kcyBhcmUgaWRlbnRpY2FsICovCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIEkyQyBMaXN0ZW4gY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICAgIEkyQ19JVExpc3RlbkNwbHQoaGkyYywgSVRGbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pICYmICh0bXBvcHRpb25zICE9IEkyQ19OT19PUFRJT05fRlJBTUUpKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgICAgICAgLyogRmx1c2ggVFggcmVnaXN0ZXIgKi8KKyAgICAgICAgICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKworICAgICAgICAgIC8qIExhc3QgQnl0ZSBpcyBUcmFuc21pdHRlZCAqLworICAgICAgICAgIC8qIENhbGwgSTJDIFNsYXZlIFNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICAgIEkyQ19JVFNsYXZlU2VxQ3BsdChoaTJjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogaWYgbm8sIGVycm9yIHVzZSBjYXNlLCBhIE5vbi1BY2tub3dsZWRnZSBvZiBsYXN0IERhdGEgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBNQVNURVIqLworICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgICAgIC8qIFNldCBFcnJvckNvZGUgY29ycmVzcG9uZGluZyB0byBhIE5vbi1BY2tub3dsZWRnZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BRjsKKworICAgICAgICBpZiAoKHRtcG9wdGlvbnMgPT0gSTJDX0ZJUlNUX0ZSQU1FKSB8fCAodG1wb3B0aW9ucyA9PSBJMkNfTkVYVF9GUkFNRSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgICBJMkNfSVRFcnJvcihoaTJjLCBoaTJjLT5FcnJvckNvZGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBPbmx5IENsZWFyIE5BQ0sgRmxhZywgbm8gRE1BIHRyZWF0bWVudCBpcyBwZW5kaW5nICovCisgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisgICAgfQorICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19BRERSKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfQUREUkkpICE9IFJFU0VUKSkKKyAgeworICAgIEkyQ19JVEFkZHJDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDYWxsIEkyQyBTbGF2ZSBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgSTJDX0lUU2xhdmVDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgTWFzdGVyIHNlbmRzIHRhcmdldCBkZXZpY2UgYWRkcmVzcyBmb2xsb3dlZCBieSBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcyBmb3Igd3JpdGUgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgTWVtQWRkcmVzcyBJbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgTWVtQWRkU2l6ZSBTaXplIG9mIGludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1JlcXVlc3RNZW1vcnlXcml0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpTWVtQWRkU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworCisgIC8qIFdhaXQgdW50aWwgVFhJUyBmbGFnIGlzIHNldCAqLworICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIElmIE1lbW9yeSBhZGRyZXNzIHNpemUgaXMgOEJpdCAqLworICBpZiAoTWVtQWRkU2l6ZSA9PSBJMkNfTUVNQUREX1NJWkVfOEJJVCkKKyAgeworICAgIC8qIFNlbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX0xTQihNZW1BZGRyZXNzKTsKKyAgfQorICAvKiBJZiBNZW1vcnkgYWRkcmVzcyBzaXplIGlzIDE2Qml0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFNlbmQgTVNCIG9mIE1lbW9yeSBBZGRyZXNzICovCisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSBJMkNfTUVNX0FERF9NU0IoTWVtQWRkcmVzcyk7CisKKyAgICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2VuZCBMU0Igb2YgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX0xTQihNZW1BZGRyZXNzKTsKKyAgfQorCisgIC8qIFdhaXQgdW50aWwgVENSIGZsYWcgaXMgc2V0ICovCisgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19UQ1IsIFJFU0VULCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1hc3RlciBzZW5kcyB0YXJnZXQgZGV2aWNlIGFkZHJlc3MgZm9sbG93ZWQgYnkgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MgZm9yIHJlYWQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgTWVtQWRkcmVzcyBJbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgTWVtQWRkU2l6ZSBTaXplIG9mIGludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1JlcXVlc3RNZW1vcnlSZWFkKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdClNZW1BZGRTaXplLCBJMkNfU09GVEVORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworCisgIC8qIFdhaXQgdW50aWwgVFhJUyBmbGFnIGlzIHNldCAqLworICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIElmIE1lbW9yeSBhZGRyZXNzIHNpemUgaXMgOEJpdCAqLworICBpZiAoTWVtQWRkU2l6ZSA9PSBJMkNfTUVNQUREX1NJWkVfOEJJVCkKKyAgeworICAgIC8qIFNlbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX0xTQihNZW1BZGRyZXNzKTsKKyAgfQorICAvKiBJZiBNZW1vcnkgYWRkcmVzcyBzaXplIGlzIDE2Qml0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFNlbmQgTVNCIG9mIE1lbW9yeSBBZGRyZXNzICovCisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSBJMkNfTUVNX0FERF9NU0IoTWVtQWRkcmVzcyk7CisKKyAgICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2VuZCBMU0Igb2YgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX0xTQihNZW1BZGRyZXNzKTsKKyAgfQorCisgIC8qIFdhaXQgdW50aWwgVEMgZmxhZyBpcyBzZXQgKi8KKyAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1RDLCBSRVNFVCwgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJMkMgQWRkcmVzcyBjb21wbGV0ZSBwcm9jZXNzIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUQWRkckNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpCit7CisgIHVpbnQ4X3QgdHJhbnNmZXJkaXJlY3Rpb247CisgIHVpbnQxNl90IHNsYXZlYWRkcmNvZGU7CisgIHVpbnQxNl90IG93bmFkZDFjb2RlOworICB1aW50MTZfdCBvd25hZGQyY29kZTsKKworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChJVEZsYWdzKTsKKworICAvKiBJbiBjYXNlIG9mIExpc3RlbiBzdGF0ZSwgbmVlZCB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgYWRkcmVzcyBtYXRjaCBjb2RlIGV2ZW50ICovCisgIGlmICgoKHVpbnQzMl90KWhpMmMtPlN0YXRlICYgKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKSA9PSAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pCisgIHsKKyAgICB0cmFuc2ZlcmRpcmVjdGlvbiA9IEkyQ19HRVRfRElSKGhpMmMpOworICAgIHNsYXZlYWRkcmNvZGUgICAgID0gSTJDX0dFVF9BRERSX01BVENIKGhpMmMpOworICAgIG93bmFkZDFjb2RlICAgICAgID0gSTJDX0dFVF9PV05fQUREUkVTUzEoaGkyYyk7CisgICAgb3duYWRkMmNvZGUgICAgICAgPSBJMkNfR0VUX09XTl9BRERSRVNTMihoaTJjKTsKKworICAgIC8qIElmIDEwYml0cyBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgICBpZiAoaGkyYy0+SW5pdC5BZGRyZXNzaW5nTW9kZSA9PSBJMkNfQUREUkVTU0lOR01PREVfMTBCSVQpCisgICAgeworICAgICAgaWYgKChzbGF2ZWFkZHJjb2RlICYgU2xhdmVBZGRyX01TSykgPT0gKChvd25hZGQxY29kZSA+PiBTbGF2ZUFkZHJfU0hJRlQpICYgU2xhdmVBZGRyX01TSykpCisgICAgICB7CisgICAgICAgIHNsYXZlYWRkcmNvZGUgPSBvd25hZGQxY29kZTsKKyAgICAgICAgaGkyYy0+QWRkckV2ZW50Q291bnQrKzsKKyAgICAgICAgaWYgKGhpMmMtPkFkZHJFdmVudENvdW50ID09IDJVKQorICAgICAgICB7CisgICAgICAgICAgLyogUmVzZXQgQWRkcmVzcyBFdmVudCBjb3VudGVyICovCisgICAgICAgICAgaGkyYy0+QWRkckV2ZW50Q291bnQgPSAwVTsKKworICAgICAgICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgICAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICAgIC8qIENhbGwgU2xhdmUgQWRkciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBoaTJjLT5BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworI2Vsc2UKKyAgICAgICAgICBIQUxfSTJDX0FkZHJDYWxsYmFjayhoaTJjLCB0cmFuc2ZlcmRpcmVjdGlvbiwgc2xhdmVhZGRyY29kZSk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc2xhdmVhZGRyY29kZSA9IG93bmFkZDJjb2RlOworCisgICAgICAgIC8qIERpc2FibGUgQUREUiBJbnRlcnJ1cHRzICovCisgICAgICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIC8qIENhbGwgU2xhdmUgQWRkciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaGkyYy0+QWRkckNhbGxiYWNrKGhpMmMsIHRyYW5zZmVyZGlyZWN0aW9uLCBzbGF2ZWFkZHJjb2RlKTsKKyNlbHNlCisgICAgICAgIEhBTF9JMkNfQWRkckNhbGxiYWNrKGhpMmMsIHRyYW5zZmVyZGlyZWN0aW9uLCBzbGF2ZWFkZHJjb2RlKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9CisgICAgLyogZWxzZSA3IGJpdHMgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQUREUiBJbnRlcnJ1cHRzICovCisgICAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBDYWxsIFNsYXZlIEFkZHIgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoaTJjLT5BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworI2Vsc2UKKyAgICAgIEhBTF9JMkNfQWRkckNhbGxiYWNrKGhpMmMsIHRyYW5zZmVyZGlyZWN0aW9uLCBzbGF2ZWFkZHJjb2RlKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgLyogRWxzZSBjbGVhciBhZGRyZXNzIGZsYWcgb25seSAqLworICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBBRERSIGZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRERSKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgTWFzdGVyIHNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2Vzcy4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19JVE1hc3RlclNlcUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFJlc2V0IEkyQyBoYW5kbGUgbW9kZSAqLworICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgLyogTm8gR2VuZXJhdGUgU3RvcCwgdG8gcGVybWl0IHJlc3RhcnQgbW9kZSAqLworICAvKiBUaGUgc3RvcCB3aWxsIGJlIGRvbmUgYXQgdGhlIGVuZCBvZiB0cmFuc2Zlciwgd2hlbiBJMkNfQVVUT0VORF9NT0RFIGVuYWJsZSAqLworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYKQorICB7CisgICAgaGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9NQVNURVJfQlVTWV9UWDsKKyAgICBoaTJjLT5YZmVySVNSICAgICAgID0gTlVMTDsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhpMmMtPk1hc3RlclR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIC8qIGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCAqLworICBlbHNlCisgIHsKKyAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYOworICAgIGhpMmMtPlhmZXJJU1IgICAgICAgPSBOVUxMOworCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgU2xhdmUgc2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUU2xhdmVTZXFDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBSZXNldCBJMkMgaGFuZGxlIG1vZGUgKi8KKyAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOKQorICB7CisgICAgLyogUmVtb3ZlIEhBTF9JMkNfU1RBVEVfU0xBVkVfQlVTWV9UWCwga2VlcCBvbmx5IEhBTF9JMkNfU1RBVEVfTElTVEVOICovCisgICAgaGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9JMkNfU1RBVEVfTElTVEVOOworICAgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfU0xBVkVfQlVTWV9UWDsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhpMmMtPlNsYXZlVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIGVsc2UgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4pCisgIHsKKyAgICAvKiBSZW1vdmUgSEFMX0kyQ19TVEFURV9TTEFWRV9CVVNZX1JYLCBrZWVwIG9ubHkgSEFMX0kyQ19TVEFURV9MSVNURU4gKi8KKyAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9TTEFWRV9CVVNZX1JYOworCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+U2xhdmVSeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBNYXN0ZXIgY29tcGxldGUgcHJvY2Vzcy4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19JVE1hc3RlckNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpCit7CisgIHVpbnQzMl90IHRtcGVycm9yOworCisgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgIEkyQ19SRVNFVF9DUjIoaGkyYyk7CisKKyAgLyogUmVzZXQgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKyAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9OT05FOworICBoaTJjLT5YZmVySVNSICAgICAgID0gTlVMTDsKKyAgaGkyYy0+WGZlck9wdGlvbnMgICA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisKKyAgaWYgKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgIC8qIFNldCBhY2tub3dsZWRnZSBlcnJvciBjb2RlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisgIH0KKworICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKworICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKyAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUIHwgSTJDX1hGRVJfUlhfSVQpOworCisgIC8qIFN0b3JlIGN1cnJlbnQgdm9sYXRpbGUgaGkyYy0+RXJyb3JDb2RlLCBtaXNyYSBydWxlICovCisgIHRtcGVycm9yID0gaGkyYy0+RXJyb3JDb2RlOworCisgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICBpZiAoKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQUJPUlQpIHx8ICh0bXBlcnJvciAhPSBIQUxfSTJDX0VSUk9SX05PTkUpKQorICB7CisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgSTJDX0lURXJyb3IoaGkyYywgaGkyYy0+RXJyb3JDb2RlKTsKKyAgfQorICAvKiBoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFggKi8KKyAgZWxzZSBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYKQorICB7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgaWYgKGhpMmMtPk1vZGUgPT0gSEFMX0kyQ19NT0RFX01FTSkKKyAgICB7CisgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGkyYy0+TWVtVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgICAgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoaTJjLT5NYXN0ZXJUeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgICBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfUlggKi8KKyAgZWxzZSBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYKQorICB7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgaWYgKGhpMmMtPk1vZGUgPT0gSEFMX0kyQ19NT0RFX01FTSkKKyAgICB7CisgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGkyYy0+TWVtUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgICAgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoaTJjLT5NYXN0ZXJSeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgICBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgU2xhdmUgY29tcGxldGUgcHJvY2Vzcy4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19JVFNsYXZlQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncykKK3sKKyAgdWludDMyX3QgdG1wY3IxdmFsdWUgPSBSRUFEX1JFRyhoaTJjLT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKyAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCB8IEkyQ19YRkVSX1RYX0lUIHwgSTJDX1hGRVJfUlhfSVQpOworCisgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKworICAvKiBJZiBhIERNQSBpcyBvbmdvaW5nLCBVcGRhdGUgaGFuZGxlIHNpemUgY29udGV4dCAqLworICBpZiAoSTJDX0NIRUNLX0lUX1NPVVJDRSh0bXBjcjF2YWx1ZSwgSTJDX0NSMV9UWERNQUVOKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyQ291bnQgPSAodWludDE2X3QpX19IQUxfRE1BX0dFVF9DT1VOVEVSKGhpMmMtPmhkbWF0eCk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEkyQ19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIEkyQ19DUjFfUlhETUFFTikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoaGkyYy0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgaGkyYy0+WGZlckNvdW50ID0gKHVpbnQxNl90KV9fSEFMX0RNQV9HRVRfQ09VTlRFUihoaTJjLT5oZG1hcngpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBEbyBub3RoaW5nICovCisgIH0KKworICAvKiBTdG9yZSBMYXN0IHJlY2VpdmUgZGF0YSBpZiBhbnkgKi8KKyAgaWYgKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX1JYTkUpICE9IFJFU0VUKQorICB7CisgICAgLyogUmVtb3ZlIFJYTkUgZmxhZyBvbiB0ZW1wb3JhcnkgdmFyaWFibGUgYXMgcmVhZCBkb25lICovCisgICAgSVRGbGFncyAmPSB+STJDX0ZMQUdfUlhORTsKKworICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAqaGkyYy0+cEJ1ZmZQdHIgPSAodWludDhfdCloaTJjLT5JbnN0YW5jZS0+UlhEUjsKKworICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICBpZiAoKGhpMmMtPlhmZXJTaXplID4gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgICB9CisgIH0KKworICAvKiBBbGwgZGF0YSBhcmUgbm90IHRyYW5zZmVycmVkLCBzbyBzZXQgZXJyb3IgY29kZSBhY2NvcmRpbmdseSAqLworICBpZiAoaGkyYy0+WGZlckNvdW50ICE9IDBVKQorICB7CisgICAgLyogU2V0IEVycm9yQ29kZSBjb3JyZXNwb25kaW5nIHRvIGEgTm9uLUFja25vd2xlZGdlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisgIH0KKworICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKyAgaGkyYy0+WGZlcklTUiA9IE5VTEw7CisKKyAgaWYgKGhpMmMtPkVycm9yQ29kZSAhPSBIQUxfSTJDX0VSUk9SX05PTkUpCisgIHsKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICBJMkNfSVRFcnJvcihoaTJjLCBoaTJjLT5FcnJvckNvZGUpOworCisgICAgLyogQ2FsbCB0aGUgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrLCB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgdGhlIGVuZCBvZiBMaXN0ZW4gdXNlY2FzZSAqLworICAgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBDYWxsIEkyQyBMaXN0ZW4gY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgSTJDX0lUTGlzdGVuQ3BsdChoaTJjLCBJVEZsYWdzKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGkyYy0+WGZlck9wdGlvbnMgIT0gSTJDX05PX09QVElPTl9GUkFNRSkKKyAgeworICAgIC8qIENhbGwgdGhlIFNlcXVlbnRpYWwgQ29tcGxldGUgY2FsbGJhY2ssIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiB0aGUgZW5kIG9mIFRyYW5mZXIgKi8KKyAgICBJMkNfSVRTbGF2ZVNlcUNwbHQoaGkyYyk7CisKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjaywgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIHRoZSBlbmQgb2YgTGlzdGVuIHVzZWNhc2UgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+TGlzdGVuQ3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgZWxzZSBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYKQorICB7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoaTJjLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoaTJjLT5TbGF2ZVR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgTGlzdGVuIGNvbXBsZXRlIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRMaXN0ZW5DcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzKQoreworICAvKiBSZXNldCBoYW5kbGUgcGFyYW1ldGVycyAqLworICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTk9ORTsKKyAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisgIGhpMmMtPlhmZXJJU1IgPSBOVUxMOworCisgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICBpZiAoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfUlhORSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBSZW1vdmUgUlhORSBmbGFnIG9uIHRlbXBvcmFyeSB2YXJpYWJsZSBhcyByZWFkIGRvbmUgKi8KKyAgICBJVEZsYWdzICY9IH5JMkNfRkxBR19SWE5FOworCisgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICpoaTJjLT5wQnVmZlB0ciA9ICh1aW50OF90KWhpMmMtPkluc3RhbmNlLT5SWERSOworCisgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgIGlmICgoaGkyYy0+WGZlclNpemUgPiAwVSkpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworCisgICAgICAvKiBTZXQgRXJyb3JDb2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBOb24tQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgYWxsIEludGVycnVwdHMqLworICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUIHwgSTJDX1hGRVJfUlhfSVQgfCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAvKiBDYWxsIHRoZSBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2ssIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiB0aGUgZW5kIG9mIExpc3RlbiB1c2VjYXNlICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBoaTJjLT5MaXN0ZW5DcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgaW50ZXJydXB0cyBlcnJvciBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgRXJyb3JDb2RlIEVycm9yIGNvZGUgdG8gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lURXJyb3IoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IEVycm9yQ29kZSkKK3sKKyAgSEFMX0kyQ19TdGF0ZVR5cGVEZWYgdG1wc3RhdGUgPSBoaTJjLT5TdGF0ZTsKKworICAvKiBSZXNldCBoYW5kbGUgcGFyYW1ldGVycyAqLworICBoaTJjLT5Nb2RlICAgICAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisgIGhpMmMtPlhmZXJPcHRpb25zICAgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICBoaTJjLT5YZmVyQ291bnQgICAgID0gMFU7CisKKyAgLyogU2V0IG5ldyBlcnJvciBjb2RlICovCisgIGhpMmMtPkVycm9yQ29kZSB8PSBFcnJvckNvZGU7CisKKyAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgIGlmICgodG1wc3RhdGUgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pICAgICAgICAgfHwKKyAgICAgICh0bXBzdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOKSB8fAorICAgICAgKHRtcHN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4pKQorICB7CisgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cywgZXhjZXB0IGludGVycnVwdHMgcmVsYXRlZCB0byBMSVNURU4gc3RhdGUgKi8KKyAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQgfCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBrZWVwIEhBTF9JMkNfU1RBVEVfTElTVEVOIGlmIHNldCAqLworICAgIGhpMmMtPlN0YXRlICAgICAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgICA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQgfCBJMkNfWEZFUl9SWF9JVCB8IEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIElmIHN0YXRlIGlzIGFuIGFib3J0IHRyZWF0bWVudCBvbiBnb2luZCwgZG9uJ3QgY2hhbmdlIHN0YXRlICovCisgICAgLyogVGhpcyBjaGFuZ2Ugd2lsbCBiZSBkbyBsYXRlciAqLworICAgIGlmIChoaTJjLT5TdGF0ZSAhPSBIQUxfSTJDX1NUQVRFX0FCT1JUKQorICAgIHsKKyAgICAgIC8qIFNldCBIQUxfSTJDX1NUQVRFX1JFQURZICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICB9CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9OT05FOworICAgIGhpMmMtPlhmZXJJU1IgICAgICAgPSBOVUxMOworICB9CisKKyAgLyogQWJvcnQgRE1BIFRYIHRyYW5zZmVyIGlmIGFueSAqLworICBpZiAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1RYRE1BRU4pID09IEkyQ19DUjFfVFhETUFFTikKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfVFhETUFFTjsKKworICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gSTJDX0RNQUFib3J0OworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGkyYy0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgWGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrKGhpMmMtPmhkbWF0eCk7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIEFib3J0IERNQSBSWCB0cmFuc2ZlciBpZiBhbnkgKi8KKyAgZWxzZSBpZiAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1JYRE1BRU4pID09IEkyQ19DUjFfUlhETUFFTikKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfUlhETUFFTjsKKworICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IEkyQ19ETUFBYm9ydDsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpMmMtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGhpMmMtPmhkbWFyeCk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQUJPUlQpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhpMmMtPkFib3J0Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+RXJyb3JDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19FcnJvckNhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSTJDIFR4IGRhdGEgcmVnaXN0ZXIgZmx1c2ggcHJvY2Vzcy4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19GbHVzaF9UWERSKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBJZiBhIHBlbmRpbmcgVFhJUyBmbGFnIGlzIHNldCAqLworICAvKiBXcml0ZSBhIGR1bW15IGRhdGEgaW4gVFhEUiB0byBjbGVhciBpdCAqLworICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1RYSVMpICE9IFJFU0VUKQorICB7CisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSAweDAwVTsKKyAgfQorCisgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyIGlmIG5vdCBlbXB0eSAqLworICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1RYRSkgPT0gUkVTRVQpCisgIHsKKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19UWEUpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIEkyQyBtYXN0ZXIgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0RNQU1hc3RlclRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMgPSAoSTJDX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1RYRE1BRU47CisKKyAgLyogSWYgbGFzdCB0cmFuc2ZlciwgZW5hYmxlIFNUT1AgaW50ZXJydXB0ICovCisgIGlmIChoaTJjLT5YZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHQgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9DUExUX0lUKTsKKyAgfQorICAvKiBlbHNlIHByZXBhcmUgYSBuZXcgRE1BIHRyYW5zZmVyIGFuZCBlbmFibGUgVENSZWxvYWQgaW50ZXJydXB0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBCdWZmZXIgcG9pbnRlciAqLworICAgIGhpMmMtPnBCdWZmUHRyICs9IGhpMmMtPlhmZXJTaXplOworCisgICAgLyogU2V0IHRoZSBYZmVyU2l6ZSB0byB0cmFuc2ZlciAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWF0eCwgKHVpbnQzMl90KWhpMmMtPnBCdWZmUHRyLCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5UWERSLCBoaTJjLT5YZmVyU2l6ZSkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgSTJDX0lURXJyb3IoaGkyYywgSEFMX0kyQ19FUlJPUl9ETUEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5hYmxlIFRDIGludGVycnVwdHMgKi8KKyAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JFTE9BRF9JVCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIEkyQyBzbGF2ZSB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BU2xhdmVUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjID0gKEkyQ19IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworICB1aW50MzJfdCB0bXBvcHRpb25zID0gaGkyYy0+WGZlck9wdGlvbnM7CisKKyAgaWYgKCh0bXBvcHRpb25zID09IEkyQ19ORVhUX0ZSQU1FKSB8fCAodG1wb3B0aW9ucyA9PSBJMkNfRklSU1RfRlJBTUUpKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfVFhETUFFTjsKKworICAgIC8qIExhc3QgQnl0ZSBpcyBUcmFuc21pdHRlZCAqLworICAgIC8qIENhbGwgSTJDIFNsYXZlIFNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2VzcyAqLworICAgIEkyQ19JVFNsYXZlU2VxQ3BsdChoaTJjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBObyBzcGVjaWZpYyBhY3Rpb24sIE1hc3RlciBmdWxseSBtYW5hZ2UgdGhlIGdlbmVyYXRpb24gb2YgU1RPUCBjb25kaXRpb24gKi8KKyAgICAvKiBNZWFuIHRoYXQgdGhpcyBnZW5lcmF0aW9uIGNhbiBhcnJpdmUgYXQgYW55IHRpbWUsIGF0IHRoZSBlbmQgb3IgZHVyaW5nIERNQSBwcm9jZXNzICovCisgICAgLyogU28gU1RPUCBjb25kaXRpb24gc2hvdWxkIGJlIG1hbmFnZSB0aHJvdWdoIEludGVycnVwdCB0cmVhdG1lbnQgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIEkyQyBtYXN0ZXIgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BTWFzdGVyUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjID0gKEkyQ19IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIERpc2FibGUgRE1BIFJlcXVlc3QgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+STJDX0NSMV9SWERNQUVOOworCisgIC8qIElmIGxhc3QgdHJhbnNmZXIsIGVuYWJsZSBTVE9QIGludGVycnVwdCAqLworICBpZiAoaGkyYy0+WGZlckNvdW50ID09IDBVKQorICB7CisgICAgLyogRW5hYmxlIFNUT1AgaW50ZXJydXB0ICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfQ1BMVF9JVCk7CisgIH0KKyAgLyogZWxzZSBwcmVwYXJlIGEgbmV3IERNQSB0cmFuc2ZlciBhbmQgZW5hYmxlIFRDUmVsb2FkIGludGVycnVwdCAqLworICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciArPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgIC8qIFNldCB0aGUgWGZlclNpemUgdG8gdHJhbnNmZXIgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hcngsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlJYRFIsICh1aW50MzJfdCloaTJjLT5wQnVmZlB0ciwgaGkyYy0+WGZlclNpemUpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgIEkyQ19JVEVycm9yKGhpMmMsIEhBTF9JMkNfRVJST1JfRE1BKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBUQyBpbnRlcnJ1cHRzICovCisgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SRUxPQURfSVQpOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMkMgc2xhdmUgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BU2xhdmVSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMgPSAoSTJDX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisgIHVpbnQzMl90IHRtcG9wdGlvbnMgPSBoaTJjLT5YZmVyT3B0aW9uczsKKworICBpZiAoKF9fSEFMX0RNQV9HRVRfQ09VTlRFUihoaTJjLT5oZG1hcngpID09IDBVKSAmJiBcCisgICAgICAodG1wb3B0aW9ucyAhPSBJMkNfTk9fT1BUSU9OX0ZSQU1FKSkKKyAgeworICAgIC8qIERpc2FibGUgRE1BIFJlcXVlc3QgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1JYRE1BRU47CisKKyAgICAvKiBDYWxsIEkyQyBTbGF2ZSBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICBJMkNfSVRTbGF2ZVNlcUNwbHQoaGkyYyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm8gc3BlY2lmaWMgYWN0aW9uLCBNYXN0ZXIgZnVsbHkgbWFuYWdlIHRoZSBnZW5lcmF0aW9uIG9mIFNUT1AgY29uZGl0aW9uICovCisgICAgLyogTWVhbiB0aGF0IHRoaXMgZ2VuZXJhdGlvbiBjYW4gYXJyaXZlIGF0IGFueSB0aW1lLCBhdCB0aGUgZW5kIG9yIGR1cmluZyBETUEgcHJvY2VzcyAqLworICAgIC8qIFNvIFNUT1AgY29uZGl0aW9uIHNob3VsZCBiZSBtYW5hZ2UgdGhyb3VnaCBJbnRlcnJ1cHQgdHJlYXRtZW50ICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSTJDIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyA9IChJMkNfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKworICAvKiBEaXNhYmxlIEFja25vd2xlZGdlICovCisgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworCisgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICBJMkNfSVRFcnJvcihoaTJjLCBIQUxfSTJDX0VSUk9SX0RNQSk7Cit9CisKKy8qKgorICAqIEBicmllZiBETUEgSTJDIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2sKKyAgKiAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSkuCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19ETUFBYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMgPSAoSTJDX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogUmVzZXQgQWJvcnRDcGx0Q2FsbGJhY2sgKi8KKyAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGNvbWUgZnJvbSBhYm9ydCBmcm9tIHVzZXIgKi8KKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQUJPUlQpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+QWJvcnRDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhpMmMtPkVycm9yQ2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfRXJyb3JDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBGbGFnIFNwZWNpZmllcyB0aGUgSTJDIGZsYWcgdG8gY2hlY2suCisgICogQHBhcmFtICBTdGF0dXMgVGhlIG5ldyBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgd2hpbGUgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBGbGFnKSA9PSBTdGF0dXMpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJDIENvbW11bmljYXRpb24gVGltZW91dCBmb3Igc3BlY2lmaWMgdXNhZ2Ugb2YgVFhJUyBmbGFnLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIHdoaWxlIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfVFhJUykgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBpZiBhIE5BQ0sgaXMgZGV0ZWN0ZWQgKi8KKyAgICBpZiAoSTJDX0lzQWNrbm93bGVkZ2VGYWlsZWQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0IGZvciBzcGVjaWZpYyB1c2FnZSBvZiBTVE9QIGZsYWcuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uU1RPUEZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgd2hpbGUgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRikgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBpZiBhIE5BQ0sgaXMgZGV0ZWN0ZWQgKi8KKyAgICBpZiAoSTJDX0lzQWNrbm93bGVkZ2VGYWlsZWQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEkyQyBDb21tdW5pY2F0aW9uIFRpbWVvdXQgZm9yIHNwZWNpZmljIHVzYWdlIG9mIFJYTkUgZmxhZy4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25SWE5FRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICB3aGlsZSAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1JYTkUpID09IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgaWYgYSBOQUNLIGlzIGRldGVjdGVkICovCisgICAgaWYgKEkyQ19Jc0Fja25vd2xlZGdlRmFpbGVkKGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgYSBTVE9QRiBpcyBkZXRlY3RlZCAqLworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpID09IFNFVCkKKyAgICB7CisgICAgICAvKiBDaGVjayBpZiBhbiBSWE5FIGlzIHBlbmRpbmcgKi8KKyAgICAgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICAgICAgaWYgKChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfUlhORSkgPT0gU0VUKSAmJiAoaGkyYy0+WGZlclNpemUgPiAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFJldHVybiBIQUxfT0sgKi8KKyAgICAgICAgLyogVGhlIFJlYWRpbmcgb2YgZGF0YSBmcm9tIFJYRFIgd2lsbCBiZSBkb25lIGluIGNhbGxlciBmdW5jdGlvbiAqLworICAgICAgICByZXR1cm4gSEFMX09LOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgICAgICBJMkNfUkVTRVRfQ1IyKGhpMmMpOworCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKyAgICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEFja25vd2xlZGdlIGZhaWxlZCBkZXRlY3Rpb24gZHVyaW5nIGFuIEkyQyBDb21tdW5pY2F0aW9uLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX0lzQWNrbm93bGVkZ2VGYWlsZWQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19BRikgPT0gU0VUKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBTVE9QIEZsYWcgaXMgcmVzZXQgKi8KKyAgICAvKiBBdXRvRW5kIHNob3VsZCBiZSBpbml0aWF0ZSBhZnRlciBBRiAqLworICAgIHdoaWxlIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpID09IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIE5BQ0tGIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICAgIEkyQ19GbHVzaF9UWERSKGhpMmMpOworCisgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZXMgSTJDeCBjb21tdW5pY2F0aW9uIHdoZW4gc3RhcnRpbmcgdHJhbnNmZXIgb3IgZHVyaW5nIHRyYW5zZmVyIChUQyBvciBUQ1IgZmxhZyBhcmUgc2V0KS4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgU3BlY2lmaWVzIHRoZSBzbGF2ZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBTaXplIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2dyYW1tZWQuCisgICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuCisgICogQHBhcmFtICBNb2RlIE5ldyBzdGF0ZSBvZiB0aGUgSTJDIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEkyQ19SRUxPQURfTU9ERSBFbmFibGUgUmVsb2FkIG1vZGUgLgorICAqICAgICBAYXJnIEByZWYgSTJDX0FVVE9FTkRfTU9ERSBFbmFibGUgQXV0b21hdGljIGVuZCBtb2RlLgorICAqICAgICBAYXJnIEByZWYgSTJDX1NPRlRFTkRfTU9ERSBFbmFibGUgU29mdHdhcmUgZW5kIG1vZGUuCisgICogQHBhcmFtICBSZXF1ZXN0IE5ldyBzdGF0ZSBvZiB0aGUgSTJDIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEkyQ19OT19TVEFSVFNUT1AgRG9uJ3QgR2VuZXJhdGUgc3RvcCBhbmQgc3RhcnQgY29uZGl0aW9uLgorICAqICAgICBAYXJnIEByZWYgSTJDX0dFTkVSQVRFX1NUT1AgR2VuZXJhdGUgc3RvcCBjb25kaXRpb24gKFNpemUgc2hvdWxkIGJlIHNldCB0byAwKS4KKyAgKiAgICAgQGFyZyBAcmVmIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEIEdlbmVyYXRlIFJlc3RhcnQgZm9yIHJlYWQgcmVxdWVzdC4KKyAgKiAgICAgQGFyZyBAcmVmIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSBHZW5lcmF0ZSBSZXN0YXJ0IGZvciB3cml0ZSByZXF1ZXN0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX1RyYW5zZmVyQ29uZmlnKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90IFNpemUsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UUkFOU0ZFUl9NT0RFKE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RSQU5TRkVSX1JFUVVFU1QoUmVxdWVzdCkpOworCisgIC8qIHVwZGF0ZSBDUjIgcmVnaXN0ZXIgKi8KKyAgTU9ESUZZX1JFRyhoaTJjLT5JbnN0YW5jZS0+Q1IyLCAoKEkyQ19DUjJfU0FERCB8IEkyQ19DUjJfTkJZVEVTIHwgSTJDX0NSMl9SRUxPQUQgfCBJMkNfQ1IyX0FVVE9FTkQgfCAoSTJDX0NSMl9SRF9XUk4gJiAodWludDMyX3QpKFJlcXVlc3QgPj4gKDMxVSAtIEkyQ19DUjJfUkRfV1JOX1BvcykpKSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1NUT1ApKSwgXAorICAgICAgICAgICAgICh1aW50MzJfdCkoKCh1aW50MzJfdClEZXZBZGRyZXNzICYgSTJDX0NSMl9TQUREKSB8ICgoKHVpbnQzMl90KVNpemUgPDwgSTJDX0NSMl9OQllURVNfUG9zKSAmIEkyQ19DUjJfTkJZVEVTKSB8ICh1aW50MzJfdClNb2RlIHwgKHVpbnQzMl90KVJlcXVlc3QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIGVuYWJsaW5nIG9mIEludGVycnVwdHMuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIEludGVycnVwdFJlcXVlc3QgVmFsdWUgb2YgQHJlZiBJMkNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19FbmFibGVfSVJRKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBJbnRlcnJ1cHRSZXF1ZXN0KQoreworICB1aW50MzJfdCB0bXBpc3IgPSAwVTsKKworICBpZiAoKGhpMmMtPlhmZXJJU1IgPT0gSTJDX01hc3Rlcl9JU1JfRE1BKSB8fCBcCisgICAgICAoaGkyYy0+WGZlcklTUiA9PSBJMkNfU2xhdmVfSVNSX0RNQSkpCisgIHsKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9MSVNURU5fSVQpID09IEkyQ19YRkVSX0xJU1RFTl9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgRVJSLCBTVE9QLCBOQUNLIGFuZCBBRERSIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfQUREUkkgfCBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfRVJSSTsKKyAgICB9CisKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9FUlJPUl9JVCkgPT0gSTJDX1hGRVJfRVJST1JfSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIEVSUiBhbmQgTkFDSyBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX0VSUkkgfCBJMkNfSVRfTkFDS0k7CisgICAgfQorCisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfQ1BMVF9JVCkgPT0gSTJDX1hGRVJfQ1BMVF9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX1NUT1BJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX1JFTE9BRF9JVCkgPT0gSTJDX1hGRVJfUkVMT0FEX0lUKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBUQyBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX1RDSTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfTElTVEVOX0lUKSA9PSBJMkNfWEZFUl9MSVNURU5fSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIEVSUiwgU1RPUCwgTkFDSywgYW5kIEFERFIgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9TVE9QSSB8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9FUlJJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX1RYX0lUKSA9PSBJMkNfWEZFUl9UWF9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSyBhbmQgUlhJIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0kgfCBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfVFhJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX1JYX0lUKSA9PSBJMkNfWEZFUl9SWF9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSyBhbmQgVFhJIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0kgfCBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfUlhJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX0NQTFRfSVQpID09IEkyQ19YRkVSX0NQTFRfSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIFNUT1AgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9TVE9QSTsKKyAgICB9CisgIH0KKworICAvKiBFbmFibGUgaW50ZXJydXB0cyBvbmx5IGF0IHRoZSBlbmQgKi8KKyAgLyogdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSAqLworICAvKiBhbGwgaW50ZXJydXB0cyByZXF1ZXN0ZWQgZG9uZSAqLworICBfX0hBTF9JMkNfRU5BQkxFX0lUKGhpMmMsIHRtcGlzcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBkaXNhYmxpbmcgb2YgSW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgSW50ZXJydXB0UmVxdWVzdCBWYWx1ZSBvZiBAcmVmIEkyQ19JbnRlcnJ1cHRfY29uZmlndXJhdGlvbl9kZWZpbml0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0Rpc2FibGVfSVJRKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBJbnRlcnJ1cHRSZXF1ZXN0KQoreworICB1aW50MzJfdCB0bXBpc3IgPSAwVTsKKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9UWF9JVCkgPT0gSTJDX1hGRVJfVFhfSVQpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRDIGFuZCBUWEkgaW50ZXJydXB0cyAqLworICAgIHRtcGlzciB8PSBJMkNfSVRfVENJIHwgSTJDX0lUX1RYSTsKKworICAgIGlmICgoKHVpbnQzMl90KWhpMmMtPlN0YXRlICYgKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKSAhPSAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBOQUNLIGFuZCBTVE9QIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfRVJSSTsKKyAgICB9CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9SWF9JVCkgPT0gSTJDX1hGRVJfUlhfSVQpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRDIGFuZCBSWEkgaW50ZXJydXB0cyAqLworICAgIHRtcGlzciB8PSBJMkNfSVRfVENJIHwgSTJDX0lUX1JYSTsKKworICAgIGlmICgoKHVpbnQzMl90KWhpMmMtPlN0YXRlICYgKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKSAhPSAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBOQUNLIGFuZCBTVE9QIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfRVJSSTsKKyAgICB9CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9MSVNURU5fSVQpID09IEkyQ19YRkVSX0xJU1RFTl9JVCkKKyAgeworICAgIC8qIERpc2FibGUgQUREUiwgTkFDSyBhbmQgU1RPUCBpbnRlcnJ1cHRzICovCisgICAgdG1waXNyIHw9IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9TVE9QSSB8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9FUlJJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfRVJST1JfSVQpID09IEkyQ19YRkVSX0VSUk9SX0lUKQorICB7CisgICAgLyogRW5hYmxlIEVSUiBhbmQgTkFDSyBpbnRlcnJ1cHRzICovCisgICAgdG1waXNyIHw9IEkyQ19JVF9FUlJJIHwgSTJDX0lUX05BQ0tJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfQ1BMVF9JVCkgPT0gSTJDX1hGRVJfQ1BMVF9JVCkKKyAgeworICAgIC8qIEVuYWJsZSBTVE9QIGludGVycnVwdHMgKi8KKyAgICB0bXBpc3IgfD0gSTJDX0lUX1NUT1BJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfUkVMT0FEX0lUKSA9PSBJMkNfWEZFUl9SRUxPQURfSVQpCisgIHsKKyAgICAvKiBFbmFibGUgVEMgaW50ZXJydXB0cyAqLworICAgIHRtcGlzciB8PSBJMkNfSVRfVENJOworICB9CisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9ubHkgYXQgdGhlIGVuZCAqLworICAvKiB0byBhdm9pZCBhIGJyZWFraW5nIHNpdHVhdGlvbiBsaWtlIGF0ICJ0IiB0aW1lICovCisgIC8qIGFsbCBkaXNhYmxlIGludGVycnVwdHMgcmVxdWVzdCBhcmUgbm90IGRvbmUgKi8KKyAgX19IQUxfSTJDX0RJU0FCTEVfSVQoaGkyYywgdG1waXNyKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IEkyQ3ggT1RIRVJfeHh4IFhmZXJPcHRpb25zIHRvIGZ1bmN0aW9ubmFsIFhmZXJPcHRpb25zLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBJMkNfT1RIRVJfRlJBTUUgICAgICAgICAgICAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gSTJDX0ZJUlNUX0ZSQU1FICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoaGkyYy0+WGZlck9wdGlvbnMgPT0gSTJDX09USEVSX0ZSQU1FKQorICB7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfRklSU1RfRlJBTUU7CisgIH0KKyAgLyogZWxzZSBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBJMkNfT1RIRVJfQU5EX0xBU1RfRlJBTUUgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gICAgKi8KKyAgLyogdGhlbiBnZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIGF0IHRoZSBlbmQgb2YgdHJhbnNmZXIgICAgKi8KKyAgLyogc2V0IFhmZXJPcHRpb25zIHRvIEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRSAgICAgICAgICAgICAgKi8KKyAgZWxzZSBpZiAoaGkyYy0+WGZlck9wdGlvbnMgPT0gSTJDX09USEVSX0FORF9MQVNUX0ZSQU1FKQorICB7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUU7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfSTJDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfaTJjX2V4LmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9pMmNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGY4NzYxCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfaTJjX2V4LmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2kyY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBJMkMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiBJMkMgRXh0ZW5kZWQgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAjIyMjIyBJMkMgcGVyaXBoZXJhbCBFeHRlbmRlZCBmZWF0dXJlcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXSBDb21wYXJpbmcgdG8gb3RoZXIgcHJldmlvdXMgZGV2aWNlcywgdGhlIEkyQyBpbnRlcmZhY2UgZm9yIFNUTTMyTDB4eAorICAgICAgIGRldmljZXMgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZlYXR1cmVzCisKKyAgICAgICAoKykgUG9zc2liaWxpdHkgdG8gZGlzYWJsZSBvciBlbmFibGUgQW5hbG9nIE5vaXNlIEZpbHRlcgorICAgICAgICgrKSBVc2Ugb2YgYSBjb25maWd1cmVkIERpZ2l0YWwgTm9pc2UgRmlsdGVyCisgICAgICAgKCspIERpc2FibGUgb3IgZW5hYmxlIHdha2V1cCBmcm9tIFN0b3AgbW9kZShzKQorICAgICAgICgrKSBEaXNhYmxlIG9yIGVuYWJsZSBGYXN0IE1vZGUgUGx1cworCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgTm9pc2UgRmlsdGVyIGFuZCBXYWtlIFVwIEZlYXR1cmUKKyAgICAoIykgQ29uZmlndXJlIEkyQyBBbmFsb2cgbm9pc2UgZmlsdGVyIHVzaW5nIHRoZSBmdW5jdGlvbiBIQUxfSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyKCkKKyAgICAoIykgQ29uZmlndXJlIEkyQyBEaWdpdGFsIG5vaXNlIGZpbHRlciB1c2luZyB0aGUgZnVuY3Rpb24gSEFMX0kyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIoKQorICAgICgjKSBDb25maWd1cmUgdGhlIGVuYWJsZSBvciBkaXNhYmxlIG9mIEkyQyBXYWtlIFVwIE1vZGUgdXNpbmcgdGhlIGZ1bmN0aW9ucyA6CisgICAgICAgICAgKCsrKSBIQUxfSTJDRXhfRW5hYmxlV2FrZVVwKCkKKyAgICAgICAgICAoKyspIEhBTF9JMkNFeF9EaXNhYmxlV2FrZVVwKCkKKyAgICAoIykgQ29uZmlndXJlIHRoZSBlbmFibGUgb3IgZGlzYWJsZSBvZiBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgdXNpbmcgdGhlIGZ1bmN0aW9ucyA6CisgICAgICAgICAgKCsrKSBIQUxfSTJDRXhfRW5hYmxlRmFzdE1vZGVQbHVzKCkKKyAgICAgICAgICAoKyspIEhBTF9JMkNFeF9EaXNhYmxlRmFzdE1vZGVQbHVzKCkKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDRXggSTJDRXgKKyAgKiBAYnJpZWYgSTJDIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBJMkMgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgTm9pc2UgRmlsdGVycworICAgICAgKCspIENvbmZpZ3VyZSBXYWtlIFVwIEZlYXR1cmUKKyAgICAgICgrKSBDb25maWd1cmUgRmFzdCBNb2RlIFBsdXMKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgSTJDIEFuYWxvZyBub2lzZSBmaWx0ZXIuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQ3ggcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIEFuYWxvZ0ZpbHRlciBOZXcgc3RhdGUgb2YgdGhlIEFuYWxvZyBmaWx0ZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBBbmFsb2dGaWx0ZXIpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfQU5BTE9HX0ZJTFRFUihBbmFsb2dGaWx0ZXIpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9CVVNZOworCisgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9JMkNfRElTQUJMRShoaTJjKTsKKworICAgIC8qIFJlc2V0IEkyQ3ggQU5PRkYgYml0ICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+KEkyQ19DUjFfQU5GT0ZGKTsKKworICAgIC8qIFNldCBhbmFsb2cgZmlsdGVyIGJpdCovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBBbmFsb2dGaWx0ZXI7CisKKyAgICBfX0hBTF9JMkNfRU5BQkxFKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIEkyQyBEaWdpdGFsIG5vaXNlIGZpbHRlci4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDeCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgRGlnaXRhbEZpbHRlciBDb2VmZmljaWVudCBvZiBkaWdpdGFsIG5vaXNlIGZpbHRlciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MEYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfQ29uZmlnRGlnaXRhbEZpbHRlcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRGlnaXRhbEZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfRElHSVRBTF9GSUxURVIoRGlnaXRhbEZpbHRlcikpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICB0bXByZWcgPSBoaTJjLT5JbnN0YW5jZS0+Q1IxOworCisgICAgLyogUmVzZXQgSTJDeCBETkYgYml0cyBbMTE6OF0gKi8KKyAgICB0bXByZWcgJj0gfihJMkNfQ1IxX0RORik7CisKKyAgICAvKiBTZXQgSTJDeCBETkYgY29lZmZpY2llbnQgKi8KKyAgICB0bXByZWcgfD0gRGlnaXRhbEZpbHRlciA8PCA4VTsKKworICAgIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxID0gdG1wcmVnOworCisgICAgX19IQUxfSTJDX0VOQUJMRShoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJMkMgd2FrZXVwIGZyb20gU3RvcCBtb2RlKHMpLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkN4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfRW5hYmxlV2FrZVVwKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShoaTJjLT5JbnN0YW5jZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogRW5hYmxlIHdha2V1cCBmcm9tIHN0b3AgbW9kZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9XVVBFTjsKKworICAgIF9fSEFMX0kyQ19FTkFCTEUoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEkyQyB3YWtldXAgZnJvbSBTdG9wIG1vZGUocykuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQ3ggcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9EaXNhYmxlV2FrZVVwKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShoaTJjLT5JbnN0YW5jZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogRW5hYmxlIHdha2V1cCBmcm9tIHN0b3AgbW9kZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfihJMkNfQ1IxX1dVUEVOKTsKKworICAgIF9fSEFMX0kyQ19FTkFCTEUoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworI2lmICAoZGVmaW5lZChTWVNDRkdfQ0ZHUjJfSTJDX1BCNl9GTVApIHx8IGRlZmluZWQoU1lTQ0ZHX0NGR1IyX0kyQ19QQjdfRk1QKSkgfHwgKGRlZmluZWQoU1lTQ0ZHX0NGR1IyX0kyQ19QQjhfRk1QKSB8fCBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkNfUEI5X0ZNUCkpIHx8IChkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkMxX0ZNUCkpIHx8IGRlZmluZWQoU1lTQ0ZHX0NGR1IyX0kyQzJfRk1QKSB8fCBkZWZpbmVkKFNZU0NGR19DRkdSMl9JMkMzX0ZNUCkKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIEkyQyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkuCisgICogQHBhcmFtIENvbmZpZ0Zhc3RNb2RlUGx1cyBTZWxlY3RzIHRoZSBwaW4uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBAcmVmIEkyQ0V4X0Zhc3RNb2RlUGx1cyB2YWx1ZXMKKyAgKiBAbm90ZSAgRm9yIEkyQzEsIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBjYW4gYmUgZW5hYmxlZCBvbiBhbGwgc2VsZWN0ZWQKKyAgKiAgICAgICAgSTJDMSBwaW5zIHVzaW5nIEkyQ19GQVNUTU9ERVBMVVNfSTJDMSBwYXJhbWV0ZXIgb3IgaW5kZXBlbmRlbnRseQorICAqICAgICAgICBvbiBlYWNoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBpbnMgUEI2LCBQQjcsIFBCOCBhbmQgUEI5LgorICAqIEBub3RlICBGb3IgcmVtYWluaW5nIEkyQzEgcGlucyAoUEExNCwgUEExNS4uLikgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5CisgICogICAgICAgIGNhbiBiZSBlbmFibGVkIG9ubHkgYnkgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMxIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgRm9yIGFsbCBJMkMyIHBpbnMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGNhbiBiZSBlbmFibGVkCisgICogICAgICAgIG9ubHkgYnkgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMyIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgRm9yIGFsbCBJMkMzIHBpbnMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGNhbiBiZSBlbmFibGVkCisgICogICAgICAgIG9ubHkgYnkgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMzIHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0kyQ0V4X0VuYWJsZUZhc3RNb2RlUGx1cyh1aW50MzJfdCBDb25maWdGYXN0TW9kZVBsdXMpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19GQVNUTU9ERVBMVVMoQ29uZmlnRmFzdE1vZGVQbHVzKSk7CisKKyAgLyogRW5hYmxlIFNZU0NGRyBjbG9jayAqLworICBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKTsKKworICAvKiBFbmFibGUgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGZvciBzZWxlY3RlZCBwaW4gKi8KKyAgU0VUX0JJVChTWVNDRkctPkNGR1IyLCAodWludDMyX3QpQ29uZmlnRmFzdE1vZGVQbHVzKTsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIEkyQyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkuCisgICogQHBhcmFtIENvbmZpZ0Zhc3RNb2RlUGx1cyBTZWxlY3RzIHRoZSBwaW4uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBAcmVmIEkyQ0V4X0Zhc3RNb2RlUGx1cyB2YWx1ZXMKKyAgKiBAbm90ZSAgRm9yIEkyQzEsIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBjYW4gYmUgZGlzYWJsZWQgb24gYWxsIHNlbGVjdGVkCisgICogICAgICAgIEkyQzEgcGlucyB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzEgcGFyYW1ldGVyIG9yIGluZGVwZW5kZW50bHkKKyAgKiAgICAgICAgb24gZWFjaCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwaW5zIFBCNiwgUEI3LCBQQjggYW5kIFBCOS4KKyAgKiBAbm90ZSAgRm9yIHJlbWFpbmluZyBJMkMxIHBpbnMgKFBBMTQsIFBBMTUuLi4pIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eQorICAqICAgICAgICBjYW4gYmUgZGlzYWJsZWQgb25seSBieSB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzEgcGFyYW1ldGVyLgorICAqIEBub3RlICBGb3IgYWxsIEkyQzIgcGlucyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgY2FuIGJlIGRpc2FibGVkCisgICogICAgICAgIG9ubHkgYnkgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMyIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgRm9yIGFsbCBJMkMzIHBpbnMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGNhbiBiZSBkaXNhYmxlZAorICAqICAgICAgICBvbmx5IGJ5IHVzaW5nIEkyQ19GQVNUTU9ERVBMVVNfSTJDMyBwYXJhbWV0ZXIuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JMkNFeF9EaXNhYmxlRmFzdE1vZGVQbHVzKHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0ZBU1RNT0RFUExVUyhDb25maWdGYXN0TW9kZVBsdXMpKTsKKworICAvKiBFbmFibGUgU1lTQ0ZHIGNsb2NrICovCisgIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpOworCisgIC8qIERpc2FibGUgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGZvciBzZWxlY3RlZCBwaW4gKi8KKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjIsICh1aW50MzJfdClDb25maWdGYXN0TW9kZVBsdXMpOworfQorCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfSTJDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfaTJzLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9pMnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBmNzIxCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfaTJzLmMKQEAgLTAsMCArMSwxNzcxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9pMnMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSTJTIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEludGVncmF0ZWQgSW50ZXJjaGlwIFNvdW5kIChJMlMpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXQorICAgIFRoZSBJMlMgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3c6CisKKyAgICAoIykgRGVjbGFyZSBhIEkyU19IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUuCisgICAgKCMpIEluaXRpYWxpemUgdGhlIEkyUyBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudCB0aGUgSEFMX0kyU19Nc3BJbml0KCkgQVBJOgorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgU1BJeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgjIykgSTJTIHBpbnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBJMlMgR1BJT3MuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgSTJTIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCisgICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX0kyU19UcmFuc21pdF9JVCgpCisgICAgICAgICAgICAgYW5kIEhBTF9JMlNfUmVjZWl2ZV9JVCgpIEFQSXMpLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBJMlN4IGludGVycnVwdCBwcmlvcml0eS4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBJMlMgSVJRIGhhbmRsZS4KKyAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9JMlNfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgICAgICBhbmQgSEFMX0kyU19SZWNlaXZlX0RNQSgpIEFQSXM6CisgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBTdHJlYW0vQ2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBTdHJlYW0vQ2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgSTJTIERNQSBUeC9SeCBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlCisgICAgICAgICAgICAgICAgICBETUEgVHgvUnggU3RyZWFtL0NoYW5uZWwuCisKKyAgICgjKSBQcm9ncmFtIHRoZSBNb2RlLCBTdGFuZGFyZCwgRGF0YSBGb3JtYXQsIE1DTEsgT3V0cHV0LCBBdWRpbyBmcmVxdWVuY3kgYW5kIFBvbGFyaXR5CisgICAgICAgdXNpbmcgSEFMX0kyU19Jbml0KCkgZnVuY3Rpb24uCisKKyAgIC1ALSBUaGUgc3BlY2lmaWMgSTJTIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgX19IQUxfSTJTX0VOQUJMRV9JVCgpIGFuZCBfX0hBTF9JMlNfRElTQUJMRV9JVCgpIGluc2lkZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzcy4KKyAgIC1ALSBNYWtlIHN1cmUgdGhhdCBlaXRoZXI6CisgICAgICAgICgrQCkgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGlzIGNvbmZpZ3VyZWQgYWZ0ZXIgc2V0dGluZyBjb3JyZWN0bHkKKyAgICAgICAgICAgICB0aGUgZGVmaW5lIGNvbnN0YW50IEhTRV9WQUxVRSBpbiB0aGUgc3RtMzJsMHh4X2hhbF9jb25mLmggZmlsZS4KKworICAgICgjKSBUaHJlZSBtb2RlIG9mIG9wZXJhdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBkcml2ZXIgOgorCisgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgWy4uXQorICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JMlNfVHJhbnNtaXQoKQorICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JMlNfUmVjZWl2ZSgpCisKKyAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgWy4uXQorICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSTJTX1RyYW5zbWl0X0lUKCkKKyAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgaGFsZiB0cmFuc2ZlciBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrCisgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrCisgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JMlNfUmVjZWl2ZV9JVCgpCisgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX1J4SGFsZkNwbHRDYWxsYmFjaworICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19SeENwbHRDYWxsYmFjaworICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0kyU19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX0Vycm9yQ2FsbGJhY2sKKworICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgWy4uXQorICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfSTJTX1RyYW5zbWl0X0RNQSgpCisgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjaworICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19UeENwbHRDYWxsYmFjaworICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfSTJTX1JlY2VpdmVfRE1BKCkKKyAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgaGFsZiB0cmFuc2ZlciBIQUxfSTJTX1J4SGFsZkNwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfUnhIYWxmQ3BsdENhbGxiYWNrCisgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrCisgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfRXJyb3JDYWxsYmFjaworICAgICAoKykgUGF1c2UgdGhlIERNQSBUcmFuc2ZlciB1c2luZyBIQUxfSTJTX0RNQVBhdXNlKCkKKyAgICAgKCspIFJlc3VtZSB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9JMlNfRE1BUmVzdW1lKCkKKyAgICAgKCspIFN0b3AgdGhlIERNQSBUcmFuc2ZlciB1c2luZyBIQUxfSTJTX0RNQVN0b3AoKQorCisgICAqKiogSTJTIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgWy4uXQorICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIEkyUyBIQUwgZHJpdmVyLgorCisgICAgICAoKykgX19IQUxfSTJTX0VOQUJMRTogRW5hYmxlIHRoZSBzcGVjaWZpZWQgU1BJIHBlcmlwaGVyYWwgKGluIEkyUyBtb2RlKQorICAgICAgKCspIF9fSEFMX0kyU19ESVNBQkxFOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU1BJIHBlcmlwaGVyYWwgKGluIEkyUyBtb2RlKQorICAgICAgKCspIF9fSEFMX0kyU19FTkFCTEVfSVQgOiBFbmFibGUgdGhlIHNwZWNpZmllZCBJMlMgaW50ZXJydXB0cworICAgICAgKCspIF9fSEFMX0kyU19ESVNBQkxFX0lUIDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIEkyUyBpbnRlcnJ1cHRzCisgICAgICAoKykgX19IQUxfSTJTX0dFVF9GTEFHOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSTJTIGZsYWcgaXMgc2V0IG9yIG5vdAorCisgICAgWy4uXQorICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIEkyUyBIQUwgZHJpdmVyIGhlYWRlciBmaWxlIGZvciBtb3JlIHVzZWZ1bCBtYWNyb3MKKworICAgKioqIEkyUyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0KKyAgICAgICBDYWxsYmFjayByZWdpc3RyYXRpb246CisKKyAgICAgICgjKSBUaGUgY29tcGlsYXRpb24gZmxhZyBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMVUKKyAgICAgICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICAgICAgICAgIFVzZSBGdW5jdGlvbnMgSEFMX0kyU19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorCisgICAgICAgICAgRnVuY3Rpb24gSEFMX0kyU19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgICAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgIDogSTJTIFR4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICA6IEkyUyBSeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBJMlMgVHggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBJMlMgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgOiBJMlMgRXJyb3IgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgOiBJMlMgTXNwIEluaXQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBJMlMgTXNwIERlSW5pdCBjYWxsYmFjaworICAgICAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICAgICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisKKyAgICAgICgjKSBVc2UgZnVuY3Rpb24gSEFMX0kyU19VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgICAgICAgIHdlYWsgZnVuY3Rpb24uCisgICAgICAgICAgSEFMX0kyU19VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgICAgICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAgICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgICAgOiBJMlMgVHggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgIDogSTJTIFJ4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayAgICA6IEkyUyBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFJ4SGFsZkNwbHRDYWxsYmFjayAgICA6IEkyUyBSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICA6IEkyUyBFcnJvciBjYWxsYmFjaworICAgICAgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICA6IEkyUyBNc3AgSW5pdCBjYWxsYmFjaworICAgICAgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICA6IEkyUyBNc3AgRGVJbml0IGNhbGxiYWNrCisKKyAgICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgSEFMX0kyU19Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9JMlNfU1RBVEVfUkVTRVQKKyAgICAgICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CisgICAgICAgZXhhbXBsZXMgSEFMX0kyU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpLCBIQUxfSTJTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkuCisgICAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgICAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb25zIGluIHRoZSBIQUxfSTJTX0luaXQoKS8gSEFMX0kyU19EZUluaXQoKSBvbmx5IHdoZW4KKyAgICAgICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEhBTF9JMlNfSW5pdCgpLyBIQUxfSTJTX0RlSW5pdCgpCisgICAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKSB3aGF0ZXZlciB0aGUgc3RhdGUuCisKKyAgICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEhBTF9JMlNfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICAgICBpbiBIQUxfSTJTX1NUQVRFX1JFQURZIG9yIEhBTF9JMlNfU1RBVEVfUkVTRVQgc3RhdGUsCisgICAgICAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgICAgdXNpbmcgSEFMX0kyU19SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgSEFMX0kyU19EZUluaXQoKQorICAgICAgIG9yIEhBTF9JMlNfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgICAgV2hlbiBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfUFBQX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJpbmcgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisjaWZkZWYgSEFMX0kyU19NT0RVTEVfRU5BQkxFRAorCisjaWYgZGVmaW5lZChTUElfSTJTX1NVUFBPUlQpCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyUyBJMlMKKyAgKiBAYnJpZWYgSTJTIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyU19Qcml2YXRlX0Z1bmN0aW9ucyBJMlMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBJMlNfRE1BVHhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgSTJTX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBJMlNfRE1BUnhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgSTJTX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBJMlNfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBJMlNfVHJhbnNtaXRfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBJMlNfUmVjZWl2ZV9JVChJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgIEkyU19XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MzJfdCBGbGFnLCB1aW50MzJfdCBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zIEkyUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwICBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSBhbmQKKyAgICAgICAgICBkZS1pbml0aWFsaXplIHRoZSBJMlN4IHBlcmlwaGVyYWwgaW4gc2ltcGxleCBtb2RlOgorCisgICAgICAoKykgVXNlciBtdXN0IEltcGxlbWVudCBIQUxfSTJTX01zcEluaXQoKSBmdW5jdGlvbiBpbiB3aGljaCBoZSBjb25maWd1cmVzCisgICAgICAgICAgYWxsIHJlbGF0ZWQgcGVyaXBoZXJhbHMgcmVzb3VyY2VzIChDTE9DSywgR1BJTywgRE1BLCBJVCBhbmQgTlZJQyApLgorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX0kyU19Jbml0KCkgdG8gY29uZmlndXJlIHRoZSBzZWxlY3RlZCBkZXZpY2Ugd2l0aAorICAgICAgICAgIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uOgorICAgICAgICAoKyspIE1vZGUKKyAgICAgICAgKCsrKSBTdGFuZGFyZAorICAgICAgICAoKyspIERhdGEgRm9ybWF0CisgICAgICAgICgrKykgTUNMSyBPdXRwdXQKKyAgICAgICAgKCsrKSBBdWRpbyBmcmVxdWVuY3kKKyAgICAgICAgKCsrKSBQb2xhcml0eQorCisgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfSTJTX0RlSW5pdCgpIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBJMlN4IHBlcmlwaGVyYWwuCisgIEBlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEkyUyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiB0aGUgSTJTX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0luaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIHVpbnQzMl90IGkyc2RpdiA9IDJVLCBpMnNvZGQgPSAwVSwgcGFja2V0bGVuZ3RoID0gMTZVOworICB1aW50MzJfdCB0bXAgPSAwVSwgaTJzY2xrID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIEkyUyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGkycyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBJMlMgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0FMTF9JTlNUQU5DRShoaTJzLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX01PREUoaGkycy0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMlNfU1RBTkRBUkQoaGkycy0+SW5pdC5TdGFuZGFyZCkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0RBVEFfRk9STUFUKGhpMnMtPkluaXQuRGF0YUZvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX01DTEtfT1VUUFVUKGhpMnMtPkluaXQuTUNMS091dHB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0FVRElPX0ZSRVEoaGkycy0+SW5pdC5BdWRpb0ZyZXEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyU19DUE9MKGhpMnMtPkluaXQuQ1BPTCkpOworCisgIGlmIChoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhpMnMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIC8qIEluaXQgdGhlIEkyUyBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgIGhpMnMtPlR4Q3BsdENhbGxiYWNrICAgICAgID0gSEFMX0kyU19UeENwbHRDYWxsYmFjazsgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgICBoaTJzLT5SeENwbHRDYWxsYmFjayAgICAgICA9IEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgaGkycy0+VHhIYWxmQ3BsdENhbGxiYWNrICAgPSBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjazsgICAgICAvKiBMZWdhY3kgd2VhayBUeEhhbGZDcGx0Q2FsbGJhY2sgICAqLworICAgIGhpMnMtPlJ4SGFsZkNwbHRDYWxsYmFjayAgID0gSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICBoaTJzLT5FcnJvckNhbGxiYWNrICAgICAgICA9IEhBTF9JMlNfRXJyb3JDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisKKyAgICBpZiAoaGkycy0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaGkycy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0kyU19Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgICAgaGkycy0+TXNwSW5pdENhbGxiYWNrKGhpMnMpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjICovCisgICAgSEFMX0kyU19Nc3BJbml0KGhpMnMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1k7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IEkyU0NGR1IgJiBJMlNQUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDbGVhciBJMlNNT0QsIEkyU0UsIEkyU0NGRywgUENNU1lOQywgSTJTU1RELCBDS1BPTCwgREFUTEVOIGFuZCBDSExFTiBiaXRzICovCisgIENMRUFSX0JJVChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiwgKFNQSV9JMlNDRkdSX0NITEVOIHwgU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0tQT0wgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9JMlNDRkdSX0kyU1NURCB8IFNQSV9JMlNDRkdSX1BDTVNZTkMgfCBTUElfSTJTQ0ZHUl9JMlNDRkcgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9JMlNDRkdSX0kyU0UgfCBTUElfSTJTQ0ZHUl9JMlNNT0QpKTsKKyAgaGkycy0+SW5zdGFuY2UtPkkyU1BSID0gMHgwMDAyVTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyU1BSOiBJMlNESVYgYW5kIE9ERCBDYWxjdWxhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIElmIHRoZSByZXF1ZXN0ZWQgYXVkaW8gZnJlcXVlbmN5IGlzIG5vdCB0aGUgZGVmYXVsdCwgY29tcHV0ZSB0aGUgcHJlc2NhbGVyICovCisgIGlmIChoaTJzLT5Jbml0LkF1ZGlvRnJlcSAhPSBJMlNfQVVESU9GUkVRX0RFRkFVTFQpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgZnJhbWUgbGVuZ3RoIChGb3IgdGhlIFByZXNjYWxlciBjb21wdXRpbmcpICoqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChoaTJzLT5Jbml0LkRhdGFGb3JtYXQgPT0gSTJTX0RBVEFGT1JNQVRfMTZCKQorICAgIHsKKyAgICAgIC8qIFBhY2tldCBsZW5ndGggaXMgMTYgYml0cyAqLworICAgICAgcGFja2V0bGVuZ3RoID0gMTZVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUGFja2V0IGxlbmd0aCBpcyAzMiBiaXRzICovCisgICAgICBwYWNrZXRsZW5ndGggPSAzMlU7CisgICAgfQorCisgICAgLyogSTJTIHN0YW5kYXJkICovCisgICAgaWYgKGhpMnMtPkluaXQuU3RhbmRhcmQgPD0gSTJTX1NUQU5EQVJEX0xTQikKKyAgICB7CisgICAgICAvKiBJbiBJMlMgc3RhbmRhcmQgcGFja2V0IGxlbmdodCBpcyBtdWx0aXBsaWVkIGJ5IDIgKi8KKyAgICAgIHBhY2tldGxlbmd0aCA9IHBhY2tldGxlbmd0aCAqIDJVOworICAgIH0KKworICAgIC8qIEdldCB0aGUgc291cmNlIGNsb2NrIHZhbHVlOiBiYXNlZCBvbiBTeXN0ZW0gQ2xvY2sgdmFsdWUgKi8KKyAgICBpMnNjbGsgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworCisgICAgLyogQ29tcHV0ZSB0aGUgUmVhbCBkaXZpZGVyIGRlcGVuZGluZyBvbiB0aGUgTUNMSyBvdXRwdXQgc3RhdGUsIHdpdGggYSBmbG9hdGluZyBwb2ludCAqLworICAgIGlmIChoaTJzLT5Jbml0Lk1DTEtPdXRwdXQgPT0gSTJTX01DTEtPVVRQVVRfRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIE1DTEsgb3V0cHV0IGlzIGVuYWJsZWQgKi8KKyAgICAgIGlmIChoaTJzLT5Jbml0LkRhdGFGb3JtYXQgIT0gSTJTX0RBVEFGT1JNQVRfMTZCKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDMyX3QpKCgoKChpMnNjbGsgLyAocGFja2V0bGVuZ3RoICogNCkpICogMTApIC8gaGkycy0+SW5pdC5BdWRpb0ZyZXEpKSArIDUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDMyX3QpKCgoKChpMnNjbGsgLyAocGFja2V0bGVuZ3RoICogOCkpICogMTApIC8gaGkycy0+SW5pdC5BdWRpb0ZyZXEpKSArIDUpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTUNMSyBvdXRwdXQgaXMgZGlzYWJsZWQgKi8KKyAgICAgIHRtcCA9ICh1aW50MzJfdCkoKCgoKGkyc2NsayAvIHBhY2tldGxlbmd0aCkgKiAxMCkgLyBoaTJzLT5Jbml0LkF1ZGlvRnJlcSkpICsgNSk7CisgICAgfQorCisgICAgLyogUmVtb3ZlIHRoZSBmbGF0dGluZyBwb2ludCAqLworICAgIHRtcCA9IHRtcCAvIDEwVTsKKworICAgIC8qIENoZWNrIHRoZSBwYXJpdHkgb2YgdGhlIGRpdmlkZXIgKi8KKyAgICBpMnNvZGQgPSAodWludDMyX3QpKHRtcCAmICh1aW50MzJfdCkxVSk7CisKKyAgICAvKiBDb21wdXRlIHRoZSBpMnNkaXYgcHJlc2NhbGVyICovCisgICAgaTJzZGl2ID0gKHVpbnQzMl90KSgodG1wIC0gaTJzb2RkKSAvIDJVKTsKKworICAgIC8qIEdldCB0aGUgTWFzayBmb3IgdGhlIE9kZCBiaXQgKFNQSV9JMlNQUls4XSkgcmVnaXN0ZXIgKi8KKyAgICBpMnNvZGQgPSAodWludDMyX3QpKGkyc29kZCA8PCA4VSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlcyAqLworICAgIGkyc2RpdiA9IDJVOworICAgIGkyc29kZCA9IDBVOworICB9CisKKyAgLyogVGVzdCBpZiB0aGUgZGl2aWRlciBpcyAxIG9yIDAgb3IgZ3JlYXRlciB0aGFuIDB4RkYgKi8KKyAgaWYgKChpMnNkaXYgPCAyVSkgfHwgKGkyc2RpdiA+IDB4RkZVKSkKKyAgeworICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSBhbmQgZXhlY3V0ZSBlcnJvciBjYWxsYmFjayovCisgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfUFJFU0NBTEVSKTsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBJMlNDRkdSICYgSTJTUFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tKi8KKworICAvKiBXcml0ZSB0byBTUEl4IEkyU1BSIHJlZ2lzdGVyIHRoZSBjb21wdXRlZCB2YWx1ZSAqLworICBoaTJzLT5JbnN0YW5jZS0+STJTUFIgPSAodWludDMyX3QpKCh1aW50MzJfdClpMnNkaXYgfCAodWludDMyX3QpKGkyc29kZCB8ICh1aW50MzJfdCloaTJzLT5Jbml0Lk1DTEtPdXRwdXQpKTsKKworICAvKiBDbGVhciBJMlNNT0QsIEkyU0UsIEkyU0NGRywgUENNU1lOQywgSTJTU1RELCBDS1BPTCwgREFUTEVOIGFuZCBDSExFTiBiaXRzICovCisgIC8qIEFuZCBjb25maWd1cmUgdGhlIEkyUyB3aXRoIHRoZSBJMlNfSW5pdFN0cnVjdCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiwgKFNQSV9JMlNDRkdSX0NITEVOIHwgU1BJX0kyU0NGR1JfREFUTEVOIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfQ0tQT0wgfCBTUElfSTJTQ0ZHUl9JMlNTVEQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfSTJTQ0ZHUl9QQ01TWU5DIHwgU1BJX0kyU0NGR1JfSTJTQ0ZHIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfSTJTRSAgfCBTUElfSTJTQ0ZHUl9JMlNNT0QpLCBcCisgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU01PRCB8IGhpMnMtPkluaXQuTW9kZSB8IFwKKyAgICAgICAgICAgICAgaGkycy0+SW5pdC5TdGFuZGFyZCB8IGhpMnMtPkluaXQuRGF0YUZvcm1hdCB8IFwKKyAgICAgICAgICAgICAgaGkycy0+SW5pdC5DUE9MKSk7CisKKyNpZiBkZWZpbmVkKFNQSV9JMlNDRkdSX0FTVFJURU4pCisgIGlmICgoaGkycy0+SW5pdC5TdGFuZGFyZCA9PSBJMlNfU1RBTkRBUkRfUENNX1NIT1JUKSB8fCAoKGhpMnMtPkluaXQuU3RhbmRhcmQgPT0gSTJTX1NUQU5EQVJEX1BDTV9MT05HKSkpCisgIHsKKyAgICAvKiBXcml0ZSB0byBTUEl4IEkyU0NGR1IgKi8KKyAgICBTRVRfQklUKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9BU1RSVEVOKTsKKyAgfQorI2VuZGlmCisKKyAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICBoaTJzLT5TdGF0ZSAgICAgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemVzIHRoZSBJMlMgcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RlSW5pdChJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogQ2hlY2sgdGhlIEkyUyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGkycyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMlNfQUxMX0lOU1RBTkNFKGhpMnMtPkluc3RhbmNlKSk7CisKKyAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgSTJTIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfSTJTX0RJU0FCTEUoaGkycyk7CisKKyNpZiAoVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBpZiAoaGkycy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGhpMnMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0kyU19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLworICBoaTJzLT5Nc3BEZUluaXRDYWxsYmFjayhoaTJzKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLworICBIQUxfSTJTX01zcERlSW5pdChoaTJzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgIGhpMnMtPlN0YXRlICAgICA9IEhBTF9JMlNfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSTJTIE1TUCBJbml0CisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfTXNwSW5pdChJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkycyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMlNfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgSTJTIE1TUCBEZUluaXQKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyU19Nc3BEZUluaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIEkyUyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhpMnMgUG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJTLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlZ2lzdGVyQ2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIEhBTF9JMlNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcEkyU19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGkycy0+RXJyb3JDb2RlIHw9IEhBTF9JMlNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJzKTsKKworICBpZiAoSEFMX0kyU19TVEFURV9SRUFEWSA9PSBoaTJzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JMlNfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJzLT5UeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyU19SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMnMtPlJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJTX1RYX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJzLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfUlhfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMnMtPlJ4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyU19FUlJPUl9DQl9JRCA6CisgICAgICAgIGhpMnMtPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMnMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyU19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoaTJzLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX0kyU19TVEFURV9SRVNFVCA9PSBoaTJzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JMlNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMnMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyU19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoaTJzLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGkycyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBJMlMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIEkyUyBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhpMnMgUG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJTLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1VuUmVnaXN0ZXJDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgSEFMX0kyU19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJzKTsKKworICBpZiAoSEFMX0kyU19TVEFURV9SRUFEWSA9PSBoaTJzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JMlNfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJzLT5UeENwbHRDYWxsYmFjayA9IEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJzLT5SeENwbHRDYWxsYmFjayA9IEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfVFhfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMnMtPlR4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyU19SWF9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkycy0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJTX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaGkycy0+RXJyb3JDYWxsYmFjayA9IEhBTF9JMlNfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJTX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaTJzLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfSTJTX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGkycy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfSTJTX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfSTJTX1NUQVRFX1JFU0VUID09IGhpMnMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0kyU19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGkycy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0kyU19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJTX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMnMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0kyU19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGkycyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIEkyUyBkYXRhCisgICAgdHJhbnNmZXJzLgorCisgICAgKCMpIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CisgICAgICAgKCsrKSBCbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHRoZSBwb2xsaW5nIG1vZGUuCisgICAgICAgICAgICBUaGUgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUgZnVuY3Rpb24KKyAgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKyspIE5vLUJsb2NraW5nIG1vZGUgOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cworICAgICAgICAgICAgb3IgRE1BLiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyIHN0YXJ0dXAuCisgICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgIGRlZGljYXRlZCBJMlMgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbgorICAgICAgICAgICAgdXNpbmcgRE1BIG1vZGUuCisKKyAgICAoIykgQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSTJTX1RyYW5zbWl0KCkKKyAgICAgICAgKCsrKSBIQUxfSTJTX1JlY2VpdmUoKQorCisgICAgKCMpIE5vLUJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX0kyU19UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0kyU19SZWNlaXZlX0lUKCkKKworICAgICgjKSBOby1CbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9JMlNfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJTX1JlY2VpdmVfRE1BKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIG5vbiBCbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMlNfRXJyb3JDYWxsYmFjaygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHBhcmFtICBwRGF0YSBhIDE2LWJpdCBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBudW1iZXIgb2YgZGF0YSBzYW1wbGUgdG8gYmUgc2VudDoKKyAgKiBAbm90ZSAgIFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTCisgICogICAgICAgICBjb25maWd1cmF0aW9uIHBoYXNlLCB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGgKKyAgKiAgICAgICAgIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgZnJhbWUgaXMgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyIG9mIDE2LWJpdCBkYXRhIGxlbmd0aC4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBub3RlICAgVGhlIEkyUyBpcyBrZXB0IGVuYWJsZWQgYXQgdGhlIGVuZCBvZiB0cmFuc2FjdGlvbiB0byBhdm9pZCB0aGUgY2xvY2sgZGUtc3luY2hyb25pemF0aW9uCisgICogICAgICAgICBiZXR3ZWVuIE1hc3RlciBhbmQgU2xhdmUoZXhhbXBsZTogYXVkaW8gc3RyZWFtaW5nKS4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGNhbiB1c2UgYW4gQXVkaW8gRnJlcXVlbmN5IHVwIHRvIDQ4S0h6IHdoZW4gSTJTIENsb2NrIFNvdXJjZSBpcyAzMk1IegorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19UcmFuc21pdChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0bXByZWdfY2ZnciA9IDBVOworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgaWYgKGhpMnMtPlN0YXRlICE9IEhBTF9JMlNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgLyogU2V0IHN0YXRlIGFuZCByZXNldCBlcnJvciBjb2RlICovCisgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1RYOworICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgIGhpMnMtPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKKworICB0bXByZWdfY2ZnciA9IGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKTsKKworICBpZiAoKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzI0QikgfHwgKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzMyQikpCisgIHsKKyAgICBoaTJzLT5UeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgIGhpMnMtPlR4WGZlckNvdW50ID0gKFNpemUgPDwgMVUpOworICB9CisgIGVsc2UKKyAgeworICAgIGhpMnMtPlR4WGZlclNpemUgPSBTaXplOworICAgIGhpMnMtPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNFKSAhPSBTUElfSTJTQ0ZHUl9JMlNFKQorICB7CisgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorCisgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0ICovCisgIGlmIChJMlNfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoaTJzLCBJMlNfRkxBR19UWEUsIFNFVCwgVGltZW91dCkgIT0gSEFMX09LKQorICB7CisgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfVElNRU9VVCk7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICB3aGlsZSAoaGkycy0+VHhYZmVyQ291bnQgPiAwVSkKKyAgeworICAgIGhpMnMtPkluc3RhbmNlLT5EUiA9ICgqcERhdGErKyk7CisgICAgaGkycy0+VHhYZmVyQ291bnQtLTsKKworICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyU19XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhpMnMsIEkyU19GTEFHX1RYRSwgU0VULCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlICovCisgICAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9USU1FT1VUKTsKKyAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgYW4gdW5kZXJydW4gb2NjdXJzICovCisgICAgaWYgKF9fSEFMX0kyU19HRVRfRkxBRyhoaTJzLCBJMlNfRkxBR19VRFIpID09IFNFVCkKKyAgICB7CisgICAgICAvKiBDbGVhciB1bmRlcnJ1biBmbGFnICovCisgICAgICBfX0hBTF9JMlNfQ0xFQVJfVURSRkxBRyhoaTJzKTsKKworICAgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlICovCisgICAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9VRFIpOworICAgIH0KKyAgfQorCisgIC8qIENoZWNrIGlmIFNsYXZlIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgaWYgKCgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNDRkcpID09IEkyU19NT0RFX1NMQVZFX1RYKSB8fCAoKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgU1BJX0kyU0NGR1JfSTJTQ0ZHKSA9PSBJMlNfTU9ERV9TTEFWRV9SWCkpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIEJ1c3kgZmxhZyBpcyByZXNldCAqLworICAgIGlmIChJMlNfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoaTJzLCBJMlNfRkxBR19CU1ksIFJFU0VULCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlICovCisgICAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9USU1FT1VUKTsKKyAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICB9CisKKyAgaWYgKGhpMnMtPkVycm9yQ29kZSAhPSBIQUxfSTJTX0VSUk9SX05PTkUpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgIH0KKworZXJyb3IgOgorICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSAgcERhdGEgYSAxNi1iaXQgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgICBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoCisgICogICAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkCisgICogICAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAbm90ZSAgIFRoZSBJMlMgaXMga2VwdCBlbmFibGVkIGF0IHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdG8gYXZvaWQgdGhlIGNsb2NrIGRlLXN5bmNocm9uaXphdGlvbgorICAqICAgICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQG5vdGUgICBJbiBJMlMgTWFzdGVyIFJlY2VpdmVyIG1vZGUsIGp1c3QgYWZ0ZXIgZW5hYmxpbmcgdGhlIHBlcmlwaGVyYWwgdGhlIGNsb2NrIHdpbGwgYmUgZ2VuZXJhdGUKKyAgKiAgICAgICAgIGluIGNvbnRpbnVvdXMgd2F5IGFuZCBhcyB0aGUgSTJTIGlzIG5vdCBkaXNhYmxlZCBhdCB0aGUgZW5kIG9mIHRoZSBJMlMgdHJhbnNhY3Rpb24uCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gdXNlIGFuIEF1ZGlvIEZyZXF1ZW5jeSB1cCB0byA0OEtIeiB3aGVuIEkyUyBDbG9jayBTb3VyY2UgaXMgMzJNSHoKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfUmVjZWl2ZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0bXByZWdfY2ZnciA9IDBVOworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgaWYgKGhpMnMtPlN0YXRlICE9IEhBTF9JMlNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgLyogU2V0IHN0YXRlIGFuZCByZXNldCBlcnJvciBjb2RlICovCisgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1JYOworICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgIGhpMnMtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKworICB0bXByZWdfY2ZnciA9IGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKTsKKworICBpZiAoKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzI0QikgfHwgKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzMyQikpCisgIHsKKyAgICBoaTJzLT5SeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gKFNpemUgPDwgMVUpOworICB9CisgIGVsc2UKKyAgeworICAgIGhpMnMtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNFKSAhPSBTUElfSTJTQ0ZHUl9JMlNFKQorICB7CisgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIE1hc3RlciBSZWNlaXZlciBtb2RlIGlzIHNlbGVjdGVkICovCisgIGlmICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNDRkcpID09IEkyU19NT0RFX01BU1RFUl9SWCkKKyAgeworICAgIC8qIENsZWFyIHRoZSBPdmVycnVuIEZsYWcgYnkgYSByZWFkIG9wZXJhdGlvbiBvbiB0aGUgU1BJX0RSIHJlZ2lzdGVyIGZvbGxvd2VkIGJ5IGEgcmVhZAorICAgIGFjY2VzcyB0byB0aGUgU1BJX1NSIHJlZ2lzdGVyLiAqLworICAgIF9fSEFMX0kyU19DTEVBUl9PVlJGTEFHKGhpMnMpOworICB9CisKKyAgLyogUmVjZWl2ZSBkYXRhICovCisgIHdoaWxlIChoaTJzLT5SeFhmZXJDb3VudCA+IDBVKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyU19XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhpMnMsIEkyU19GTEFHX1JYTkUsIFNFVCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfVElNRU9VVCk7CisgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgICgqcERhdGErKykgPSBoaTJzLT5JbnN0YW5jZS0+RFI7CisgICAgaGkycy0+UnhYZmVyQ291bnQtLTsKKworICAgIC8qIENoZWNrIGlmIGFuIG92ZXJydW4gb2NjdXJzICovCisgICAgaWYgKF9fSEFMX0kyU19HRVRfRkxBRyhoaTJzLCBJMlNfRkxBR19PVlIpID09IFNFVCkKKyAgICB7CisgICAgICAvKiBDbGVhciBvdmVycnVuIGZsYWcgKi8KKyAgICAgIF9fSEFMX0kyU19DTEVBUl9PVlJGTEFHKGhpMnMpOworCisgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX09WUik7CisgICAgfQorICB9CisKKyAgaWYgKGhpMnMtPkVycm9yQ29kZSAhPSBIQUxfSTJTX0VSUk9SX05PTkUpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgIH0KKworZXJyb3IgOgorICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHBhcmFtICBwRGF0YSBhIDE2LWJpdCBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBudW1iZXIgb2YgZGF0YSBzYW1wbGUgdG8gYmUgc2VudDoKKyAgKiBAbm90ZSAgIFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTCisgICogICAgICAgICBjb25maWd1cmF0aW9uIHBoYXNlLCB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGgKKyAgKiAgICAgICAgIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgZnJhbWUgaXMgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyIG9mIDE2LWJpdCBkYXRhIGxlbmd0aC4KKyAgKiBAbm90ZSAgIFRoZSBJMlMgaXMga2VwdCBlbmFibGVkIGF0IHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdG8gYXZvaWQgdGhlIGNsb2NrIGRlLXN5bmNocm9uaXphdGlvbgorICAqICAgICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gdXNlIGFuIEF1ZGlvIEZyZXF1ZW5jeSB1cCB0byA0OEtIeiB3aGVuIEkyUyBDbG9jayBTb3VyY2UgaXMgMzJNSHoKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfVHJhbnNtaXRfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgdG1wcmVnX2NmZ3IgPSAwVTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOworCisgIGlmIChoaTJzLT5TdGF0ZSAhPSBIQUxfSTJTX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgcmV0dXJuICBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMnMpOworCisgIC8qIFNldCBzdGF0ZSBhbmQgcmVzZXQgZXJyb3IgY29kZSAqLworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfQlVTWV9UWDsKKyAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICBoaTJzLT5wVHhCdWZmUHRyID0gcERhdGE7CisKKyAgdG1wcmVnX2NmZ3IgPSBoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIChTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTik7CisKKyAgaWYgKCh0bXByZWdfY2ZnciA9PSBJMlNfREFUQUZPUk1BVF8yNEIpIHx8ICh0bXByZWdfY2ZnciA9PSBJMlNfREFUQUZPUk1BVF8zMkIpKQorICB7CisgICAgaGkycy0+VHhYZmVyU2l6ZSA9IChTaXplIDw8IDFVKTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IChTaXplIDw8IDFVKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoaTJzLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIH0KKworICAvKiBFbmFibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgIF9fSEFMX0kyU19FTkFCTEVfSVQoaGkycywgKEkyU19JVF9UWEUgfCBJMlNfSVRfRVJSKSk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIEkyUyBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0UpICE9IFNQSV9JMlNDRkdSX0kyU0UpCisgIHsKKyAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9JMlNfRU5BQkxFKGhpMnMpOworICB9CisKK2Vycm9yIDoKKyAgX19IQUxfVU5MT0NLKGhpMnMpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSAgcERhdGEgYSAxNi1iaXQgcG9pbnRlciB0byB0aGUgUmVjZWl2ZSBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgICBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoCisgICogICAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkCisgICogICAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguCisgICogQG5vdGUgICBUaGUgSTJTIGlzIGtlcHQgZW5hYmxlZCBhdCB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24KKyAgKiAgICAgICAgIGJldHdlZW4gTWFzdGVyIGFuZCBTbGF2ZShleGFtcGxlOiBhdWRpbyBzdHJlYW1pbmcpLgorICAqIEBub3RlICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIERNQSBmb3IgdGhlIEkyUyByZWNlaXZlciB0byBhdm9pZCBkZS1zeW5jaHJvbmlzYXRpb24KKyAgKiBiZXR3ZWVuIE1hc3RlciBhbmQgU2xhdmUgb3RoZXJ3aXNlIHRoZSBJMlMgaW50ZXJydXB0IHNob3VsZCBiZSBvcHRpbWl6ZWQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gdXNlIGFuIEF1ZGlvIEZyZXF1ZW5jeSB1cCB0byA0OEtIeiB3aGVuIEkyUyBDbG9jayBTb3VyY2UgaXMgMzJNSHoKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfUmVjZWl2ZV9JVChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB0bXByZWdfY2ZnciA9IDBVOworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgaWYgKGhpMnMtPlN0YXRlICE9IEhBTF9JMlNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgLyogU2V0IHN0YXRlIGFuZCByZXNldCBlcnJvciBjb2RlICovCisgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1JYOworICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgIGhpMnMtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKworICB0bXByZWdfY2ZnciA9IGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKTsKKworICBpZiAoKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzI0QikgfHwgKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzMyQikpCisgIHsKKyAgICBoaTJzLT5SeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gKFNpemUgPDwgMVUpOworICB9CisgIGVsc2UKKyAgeworICAgIGhpMnMtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgfQorCisgIC8qIEVuYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgIF9fSEFMX0kyU19FTkFCTEVfSVQoaGkycywgKEkyU19JVF9SWE5FIHwgSTJTX0lUX0VSUikpOworCisgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNFKSAhPSBTUElfSTJTQ0ZHUl9JMlNFKQorICB7CisgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorCitlcnJvciA6CisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQQorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHBhcmFtICBwRGF0YSBhIDE2LWJpdCBwb2ludGVyIHRvIHRoZSBUcmFuc21pdCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgICBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoCisgICogICAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkCisgICogICAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguCisgICogQG5vdGUgICBUaGUgSTJTIGlzIGtlcHQgZW5hYmxlZCBhdCB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24KKyAgKiAgICAgICAgIGJldHdlZW4gTWFzdGVyIGFuZCBTbGF2ZShleGFtcGxlOiBhdWRpbyBzdHJlYW1pbmcpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19UcmFuc21pdF9ETUEoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgdG1wcmVnX2NmZ3IgPSAwVTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOworCisgIGlmIChoaTJzLT5TdGF0ZSAhPSBIQUxfSTJTX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgcmV0dXJuICBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMnMpOworCisgIC8qIFNldCBzdGF0ZSBhbmQgcmVzZXQgZXJyb3IgY29kZSAqLworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfQlVTWV9UWDsKKyAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICBoaTJzLT5wVHhCdWZmUHRyID0gcERhdGE7CisKKyAgdG1wcmVnX2NmZ3IgPSBoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIChTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTik7CisKKyAgaWYgKCh0bXByZWdfY2ZnciA9PSBJMlNfREFUQUZPUk1BVF8yNEIpIHx8ICh0bXByZWdfY2ZnciA9PSBJMlNfREFUQUZPUk1BVF8zMkIpKQorICB7CisgICAgaGkycy0+VHhYZmVyU2l6ZSA9IChTaXplIDw8IDFVKTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IChTaXplIDw8IDFVKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoaTJzLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIH0KKworICAvKiBTZXQgdGhlIEkyUyBUeCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoaTJzLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gSTJTX0RNQVR4SGFsZkNwbHQ7CisKKyAgLyogU2V0IHRoZSBJMlMgVHggRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhpMnMtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IEkyU19ETUFUeENwbHQ7CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaGkycy0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyU19ETUFFcnJvcjsKKworICAvKiBFbmFibGUgdGhlIFR4IERNQSBTdHJlYW0vQ2hhbm5lbCAqLworICBIQUxfRE1BX1N0YXJ0X0lUKGhpMnMtPmhkbWF0eCwgKHVpbnQzMl90KWhpMnMtPnBUeEJ1ZmZQdHIsICh1aW50MzJfdCkmaGkycy0+SW5zdGFuY2UtPkRSLCBoaTJzLT5UeFhmZXJTaXplKTsKKworICAvKiBDaGVjayBpZiB0aGUgSTJTIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU0UpKQorICB7CisgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBJMlMgVHggcmVxdWVzdCBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTikpCisgIHsKKyAgICAvKiBFbmFibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisgIH0KKworZXJyb3IgOgorICBfX0hBTF9VTkxPQ0soaGkycyk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQQorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHBhcmFtICBwRGF0YSBhIDE2LWJpdCBwb2ludGVyIHRvIHRoZSBSZWNlaXZlIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBudW1iZXIgb2YgZGF0YSBzYW1wbGUgdG8gYmUgc2VudDoKKyAgKiBAbm90ZSAgIFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTCisgICogICAgICAgICBjb25maWd1cmF0aW9uIHBoYXNlLCB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGgKKyAgKiAgICAgICAgIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgZnJhbWUgaXMgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyIG9mIDE2LWJpdCBkYXRhIGxlbmd0aC4KKyAgKiBAbm90ZSAgIFRoZSBJMlMgaXMga2VwdCBlbmFibGVkIGF0IHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdG8gYXZvaWQgdGhlIGNsb2NrIGRlLXN5bmNocm9uaXphdGlvbgorICAqICAgICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmVfRE1BKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHRtcHJlZ19jZmdyID0gMFU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworICBpZiAoaGkycy0+U3RhdGUgIT0gSEFMX0kyU19TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJzKTsKKworICAvKiBTZXQgc3RhdGUgYW5kIHJlc2V0IGVycm9yIGNvZGUgKi8KKyAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1lfUlg7CisgIGhpMnMtPkVycm9yQ29kZSA9IEhBTF9JMlNfRVJST1JfTk9ORTsKKyAgaGkycy0+cFJ4QnVmZlB0ciA9IHBEYXRhOworCisgIHRtcHJlZ19jZmdyID0gaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiAoU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0hMRU4pOworCisgIGlmICgodG1wcmVnX2NmZ3IgPT0gSTJTX0RBVEFGT1JNQVRfMjRCKSB8fCAodG1wcmVnX2NmZ3IgPT0gSTJTX0RBVEFGT1JNQVRfMzJCKSkKKyAgeworICAgIGhpMnMtPlJ4WGZlclNpemUgPSAoU2l6ZSA8PCAxVSk7CisgICAgaGkycy0+UnhYZmVyQ291bnQgPSAoU2l6ZSA8PCAxVSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaGkycy0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaGkycy0+UnhYZmVyQ291bnQgPSBTaXplOworICB9CisKKyAgLyogU2V0IHRoZSBJMlMgUnggRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGkycy0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IEkyU19ETUFSeEhhbGZDcGx0OworCisgIC8qIFNldCB0aGUgSTJTIFJ4IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoaTJzLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMlNfRE1BUnhDcGx0OworCisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgIGhpMnMtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJMlNfRE1BRXJyb3I7CisKKyAgLyogQ2hlY2sgaWYgTWFzdGVyIFJlY2VpdmVyIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgaWYgKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0NGRykgPT0gSTJTX01PREVfTUFTVEVSX1JYKQorICB7CisgICAgLyogQ2xlYXIgdGhlIE92ZXJydW4gRmxhZyBieSBhIHJlYWQgb3BlcmF0aW9uIHRvIHRoZSBTUElfRFIgcmVnaXN0ZXIgZm9sbG93ZWQgYnkgYSByZWFkCisgICAgYWNjZXNzIHRvIHRoZSBTUElfU1IgcmVnaXN0ZXIuICovCisgICAgX19IQUxfSTJTX0NMRUFSX09WUkZMQUcoaGkycyk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFJ4IERNQSBTdHJlYW0vQ2hhbm5lbCAqLworICBIQUxfRE1BX1N0YXJ0X0lUKGhpMnMtPmhkbWFyeCwgKHVpbnQzMl90KSZoaTJzLT5JbnN0YW5jZS0+RFIsICh1aW50MzJfdCloaTJzLT5wUnhCdWZmUHRyLCBoaTJzLT5SeFhmZXJTaXplKTsKKworICAvKiBDaGVjayBpZiB0aGUgSTJTIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU0UpKQorICB7CisgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBJMlMgUnggcmVxdWVzdCBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTikpCisgIHsKKyAgICAvKiBFbmFibGUgUnggRE1BIFJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisgIH0KKworZXJyb3IgOgorICBfX0hBTF9VTkxPQ0soaGkycyk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGF1c2VzIHRoZSBhdWRpbyBETUEgU3RyZWFtL0NoYW5uZWwgcGxheWluZyBmcm9tIHRoZSBNZWRpYS4KKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19ETUFQYXVzZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJzKTsKKworICBpZiAoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9CVVNZX1RYKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgSTJTIERNQSBUeCByZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisgIH0KKyAgZWxzZSBpZiAoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9CVVNZX1JYKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgSTJTIERNQSBSeCByZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlc3VtZXMgdGhlIGF1ZGlvIERNQSBTdHJlYW0vQ2hhbm5lbCBwbGF5aW5nIGZyb20gdGhlIE1lZGlhLgorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVJlc3VtZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJzKTsKKworICBpZiAoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9CVVNZX1RYKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBJMlMgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisgIH0KKyAgZWxzZSBpZiAoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9CVVNZX1JYKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBJMlMgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisgIH0KKworICAvKiBJZiB0aGUgSTJTIHBlcmlwaGVyYWwgaXMgc3RpbGwgbm90IGVuYWJsZWQsIGVuYWJsZSBpdCAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU0UpKQorICB7CisgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMnMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIGF1ZGlvIERNQSBTdHJlYW0vQ2hhbm5lbCBwbGF5aW5nIGZyb20gdGhlIE1lZGlhLgorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVN0b3AoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgLyogRGlzYWJsZSB0aGUgSTJTIFR4L1J4IERNQSByZXF1ZXN0cyAqLworICBDTEVBUl9CSVQoaGkycy0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKyAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisKKyAgLyogQWJvcnQgdGhlIEkyUyBETUEgdHggU3RyZWFtL0NoYW5uZWwgKi8KKyAgaWYgKGhpMnMtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgSTJTIERNQSB0eCBTdHJlYW0vQ2hhbm5lbCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhpMnMtPmhkbWF0eCk7CisgICAgSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hdHgpOworICB9CisKKyAgLyogQWJvcnQgdGhlIEkyUyBETUEgcnggU3RyZWFtL0NoYW5uZWwgKi8KKyAgaWYgKGhpMnMtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgSTJTIERNQSBTdHJlYW0vQ2hhbm5lbCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhpMnMtPmhkbWFyeCk7CisgICAgSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hcngpOworICB9CisKKyAgLyogRGlzYWJsZSBJMlMgcGVyaXBoZXJhbCAqLworICBfX0hBTF9JMlNfRElTQUJMRShoaTJzKTsKKworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkycyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJTIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JMlNfSVJRSGFuZGxlcihJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgdWludDMyX3QgaTJzc3IgPSBoaTJzLT5JbnN0YW5jZS0+U1I7CisKKyAgLyogSTJTIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaTJzc3IgJiBJMlNfRkxBR19PVlIpICE9IEkyU19GTEFHX09WUikgJiYKKyAgICAgICgoaTJzc3IgJiBJMlNfRkxBR19SWE5FKSA9PSBJMlNfRkxBR19SWE5FKSAmJiAoX19IQUxfSTJTX0dFVF9JVF9TT1VSQ0UoaGkycywgSTJTX0lUX1JYTkUpICE9IFJFU0VUKSkKKyAgeworICAgIEkyU19SZWNlaXZlX0lUKGhpMnMpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIEkyUyBpbiBtb2RlIFRyYW1pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGkyc3NyICYgSTJTX0ZMQUdfVFhFKSA9PSBJMlNfRkxBR19UWEUpICYmIChfX0hBTF9JMlNfR0VUX0lUX1NPVVJDRShoaTJzLCBJMlNfSVRfVFhFKSAhPSBSRVNFVCkpCisgIHsKKyAgICBJMlNfVHJhbnNtaXRfSVQoaGkycyk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogSTJTIGludGVycnVwdCBlcnJvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKF9fSEFMX0kyU19HRVRfSVRfU09VUkNFKGhpMnMsIEkyU19JVF9FUlIpICE9IFJFU0VUKQorICB7CisgICAgLyogSTJTIE92ZXJydW4gZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKChpMnNzciAmIEkyU19GTEFHX09WUikgPT0gSTJTX0ZMQUdfT1ZSKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICAgICAgX19IQUxfSTJTX0RJU0FCTEVfSVQoaGkycywgKEkyU19JVF9SWE5FIHwgSTJTX0lUX0VSUikpOworCisgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfT1ZSKTsKKyAgICB9CisKKyAgICAvKiBJMlMgVW5kZXJydW4gZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKGkyc3NyICYgSTJTX0ZMQUdfVURSKSA9PSBJMlNfRkxBR19VRFIpCisgICAgeworICAgICAgLyogRGlzYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworCisgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfVURSKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaGkycy0+RXJyb3JDYWxsYmFjayhoaTJzKTsKKyNlbHNlCisgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHggVHJhbnNmZXIgSGFsZiBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggVHJhbnNmZXIgaGFsZiBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfUnhIYWxmQ3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSTJTIGVycm9yIGNhbGxiYWNrcworICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbAorICAgIGFuZCB0aGUgZGF0YSBmbG93LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgSTJTIHN0YXRlCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX0kyU19TdGF0ZVR5cGVEZWYgSEFMX0kyU19HZXRTdGF0ZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgcmV0dXJuIGhpMnMtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgSTJTIGVycm9yIGNvZGUKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgSTJTIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9JMlNfR2V0RXJyb3IoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIHJldHVybiBoaTJzLT5FcnJvckNvZGU7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTX1ByaXZhdGVfRnVuY3Rpb25zIEkyUyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMlMgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJTX0RNQVR4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMgPSAoSTJTX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICAvKiBpZiBETUEgaXMgY29uZmlndXJlZCBpbiBETUFfTk9STUFMIE1vZGUgKi8KKyAgaWYgKGhkbWEtPkluaXQuTW9kZSA9PSBETUFfTk9STUFMKQorICB7CisgICAgLyogRGlzYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICAgIENMRUFSX0JJVChoaTJzLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOworCisgICAgaGkycy0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgIH0KKyAgLyogQ2FsbCB1c2VyIFR4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaGkycy0+VHhDcGx0Q2FsbGJhY2soaGkycyk7CisjZWxzZQorICBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrKGhpMnMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMlMgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMlNfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMgPSAoSTJTX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICAvKiBDYWxsIHVzZXIgVHggaGFsZiBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhpMnMtPlR4SGFsZkNwbHRDYWxsYmFjayhoaTJzKTsKKyNlbHNlCisgIEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrKGhpMnMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMlMgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMlNfRE1BUnhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMlNfSGFuZGxlVHlwZURlZiAqaGkycyA9IChJMlNfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIGlmIERNQSBpcyBjb25maWd1cmVkIGluIERNQV9OT1JNQUwgTW9kZSAqLworICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpCisgIHsKKyAgICAvKiBEaXNhYmxlIFJ4IERNQSBSZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisgICAgaGkycy0+UnhYZmVyQ291bnQgPSAwVTsKKyAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgIH0KKyAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaGkycy0+UnhDcGx0Q2FsbGJhY2soaGkycyk7CisjZWxzZQorICBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrKGhpMnMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMlMgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyU19ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMlNfSGFuZGxlVHlwZURlZiAqaGkycyA9IChJMlNfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIENhbGwgdXNlciBSeCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaGkycy0+UnhIYWxmQ3BsdENhbGxiYWNrKGhpMnMpOworI2Vsc2UKKyAgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2soaGkycyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIEkyUyBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMlNfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyU19IYW5kbGVUeXBlRGVmICpoaTJzID0gKEkyU19IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogRGlzYWJsZSBSeCBhbmQgVHggRE1BIFJlcXVlc3QgKi8KKyAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1JYRE1BRU4gfCBTUElfQ1IyX1RYRE1BRU4pKTsKKyAgaGkycy0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaGkycy0+UnhYZmVyQ291bnQgPSAwVTsKKworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisKKyAgLyogU2V0IHRoZSBlcnJvciBjb2RlIGFuZCBleGVjdXRlIGVycm9yIGNhbGxiYWNrKi8KKyAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfRE1BKTsKKyAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaGkycy0+RXJyb3JDYWxsYmFjayhoaTJzKTsKKyNlbHNlCisgIEhBTF9JMlNfRXJyb3JDYWxsYmFjayhoaTJzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMlNfVHJhbnNtaXRfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFRyYW5zbWl0IGRhdGEgKi8KKyAgaGkycy0+SW5zdGFuY2UtPkRSID0gKCpoaTJzLT5wVHhCdWZmUHRyKyspOworICBoaTJzLT5UeFhmZXJDb3VudC0tOworCisgIGlmIChoaTJzLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgeworICAgIC8qIERpc2FibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfSTJTX0RJU0FCTEVfSVQoaGkycywgKEkyU19JVF9UWEUgfCBJMlNfSVRfRVJSKSk7CisKKyAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgICAgLyogQ2FsbCB1c2VyIFR4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoaTJzLT5UeENwbHRDYWxsYmFjayhoaTJzKTsKKyNlbHNlCisgICAgSEFMX0kyU19UeENwbHRDYWxsYmFjayhoaTJzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJTX1JlY2VpdmVfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFJlY2VpdmUgZGF0YSAqLworICAoKmhpMnMtPnBSeEJ1ZmZQdHIrKykgPSBoaTJzLT5JbnN0YW5jZS0+RFI7CisgIGhpMnMtPlJ4WGZlckNvdW50LS07CisKKyAgaWYgKGhpMnMtPlJ4WGZlckNvdW50ID09IDBVKQorICB7CisgICAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfSTJTX0RJU0FCTEVfSVQoaGkycywgKEkyU19JVF9SWE5FIHwgSTJTX0lUX0VSUikpOworCisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAgIC8qIENhbGwgdXNlciBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaGkycy0+UnhDcGx0Q2FsbGJhY2soaGkycyk7CisjZWxzZQorICAgIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soaGkycyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJTIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSAgRmxhZyBGbGFnIGNoZWNrZWQKKyAgKiBAcGFyYW0gIFN0YXRlIFZhbHVlIG9mIHRoZSBmbGFnIGV4cGVjdGVkCisgICogQHBhcmFtICBUaW1lb3V0IER1cmF0aW9uIG9mIHRoZSB0aW1lb3V0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJTX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQzMl90IEZsYWcsIHVpbnQzMl90IFN0YXRlLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgdG8gc3RhdHVzKi8KKyAgd2hpbGUgKCgoX19IQUxfSTJTX0dFVF9GTEFHKGhpMnMsIEZsYWcpKSA/IFNFVCA6IFJFU0VUKSAhPSBTdGF0ZSkKKyAgeworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICB7CisgICAgICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1BJX0kyU19TVVBQT1JUICovCisKKyNlbmRpZiAvKiBIQUxfSTJTX01PRFVMRV9FTkFCTEVEICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9pcmRhLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9pcmRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmODNkMgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX2lyZGEuYwpAQCAtMCwwICsxLDI5NTYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX2lyZGEuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSVJEQSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBJckRBIChJbmZyYXJlZCBEYXRhIEFzc29jaWF0aW9uKSBQZXJpcGhlcmFsCisgICogICAgICAgICAgKElSREEpCisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGUgSVJEQSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIElSREFfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gSVJEQV9IYW5kbGVUeXBlRGVmIGhpcmRhKS4KKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgSVJEQSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX0lSREFfTXNwSW5pdCgpIEFQSQorICAgICAgICBpbiBzZXR0aW5nIHRoZSBhc3NvY2lhdGVkIFVTQVJUIG9yIFVBUlQgaW4gSVJEQSBtb2RlOgorICAgICAgICAoKyspIEVuYWJsZSB0aGUgVVNBUlR4L1VBUlR4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgKCsrKSBVU0FSVHgvVUFSVHggcGlucyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFVTQVJUeC9VQVJUeCBHUElPcy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBVU0FSVHgvVUFSVHggcGlucyAoVFggYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAsIFJYIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBJbnB1dCkuCisgICAgICAgICgrKykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX0lSREFfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgIGFuZCBIQUxfSVJEQV9SZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeC9VQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlR4L1VBUlR4IElSUSBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBUaGUgc3BlY2lmaWMgSVJEQSBpbnRlcnJ1cHRzIChUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0LAorICAgICAgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgICAgICAgICAgICBfX0hBTF9JUkRBX0VOQUJMRV9JVCgpIGFuZCBfX0hBTF9JUkRBX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisKKyAgICAgICAgKCsrKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9JUkRBX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgYW5kIEhBTF9JUkRBX1JlY2VpdmVfRE1BKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQgVHgvUnggcGFyYW1ldGVycy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIElSREEgRE1BIFR4L1J4IGhhbmRsZS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisKKyAgICAoIykgUHJvZ3JhbSB0aGUgQmF1ZCBSYXRlLCBXb3JkIExlbmd0aCBhbmQgUGFyaXR5IGFuZCBNb2RlKFJlY2VpdmVyL1RyYW5zbWl0dGVyKSwKKyAgICAgICAgdGhlIG5vcm1hbCBvciBsb3cgcG93ZXIgbW9kZSBhbmQgdGhlIGNsb2NrIHByZXNjYWxlciBpbiB0aGUgaGlyZGEgaGFuZGxlIEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIElSREEgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9JUkRBX0luaXQoKSBBUEk6CisgICAgICAgICgrKykgVGhpcyBBUEkgY29uZmlndXJlcyBhbHNvIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YykKKyAgICAgICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEhBTF9JUkRBX01zcEluaXQoKSBBUEkuCisKKyAgICAgICAgIC1AQC0gVGhlIHNwZWNpZmljIElSREEgaW50ZXJydXB0cyAoVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCwKKyAgICAgICAgICAgICBSWE5FIGludGVycnVwdCBhbmQgRXJyb3IgSW50ZXJydXB0cykgd2lsbCBiZSBtYW5hZ2VkIHVzaW5nIHRoZSBtYWNyb3MKKyAgICAgICAgICAgICBfX0hBTF9JUkRBX0VOQUJMRV9JVCgpIGFuZCBfX0hBTF9JUkRBX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisKKyAgICAoIykgVGhyZWUgb3BlcmF0aW9uIG1vZGVzIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyIDoKKworICAgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JUkRBX1RyYW5zbWl0KCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JUkRBX1JlY2VpdmUoKQorCisgICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSVJEQV9UcmFuc21pdF9JVCgpCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSVJEQV9SZWNlaXZlX0lUKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSVJEQV9SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkKKworICAgICAqKiogRE1BIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9JUkRBX1RyYW5zbWl0X0RNQSgpCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBoYWxmIG9mIHRyYW5zZmVyIEhBTF9JUkRBX1R4SGFsZkNwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSVJEQV9UeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9JUkRBX1JlY2VpdmVfRE1BKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGhhbGYgb2YgdHJhbnNmZXIgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9SeENwbHRDYWxsYmFjaygpCisgICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKQorCisgICAgICoqKiBJUkRBIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBJUkRBIEhBTCBkcml2ZXIuCisKKyAgICAgICAoKykgX19IQUxfSVJEQV9FTkFCTEU6IEVuYWJsZSB0aGUgSVJEQSBwZXJpcGhlcmFsCisgICAgICAgKCspIF9fSEFMX0lSREFfRElTQUJMRTogRGlzYWJsZSB0aGUgSVJEQSBwZXJpcGhlcmFsCisgICAgICAgKCspIF9fSEFMX0lSREFfR0VUX0ZMQUcgOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSVJEQSBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICAoKykgX19IQUxfSVJEQV9DTEVBUl9GTEFHIDogQ2xlYXIgdGhlIHNwZWNpZmllZCBJUkRBIHBlbmRpbmcgZmxhZworICAgICAgICgrKSBfX0hBTF9JUkRBX0VOQUJMRV9JVDogRW5hYmxlIHRoZSBzcGVjaWZpZWQgSVJEQSBpbnRlcnJ1cHQKKyAgICAgICAoKykgX19IQUxfSVJEQV9ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSVJEQSBpbnRlcnJ1cHQKKyAgICAgICAoKykgX19IQUxfSVJEQV9HRVRfSVRfU09VUkNFOiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0IGlzIGVuYWJsZWQKKworICAgICBbLi5dCisgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIElSREEgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisKKyAgICAjIyMjIyBDYWxsYmFjayByZWdpc3RyYXRpb24gIyMjIyMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBbLi5dCisgICAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorCisgICAgWy4uXQorICAgIFVzZSBGdW5jdGlvbiBAcmVmIEhBTF9JUkRBX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIHVzZXIgY2FsbGJhY2suCisgICAgRnVuY3Rpb24gQHJlZiBIQUxfSVJEQV9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogVHggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogUnggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBFcnJvciBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICA6IEFib3J0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIDogQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgOiBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogSVJEQSBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogSVJEQSBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0lSREFfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLgorICAgIEByZWYgSEFMX0lSREFfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBJUkRBIE1zcEluaXQuCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgOiBJUkRBIE1zcERlSW5pdC4KKworICAgIFsuLl0KKyAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfSVJEQV9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9JUkRBX1NUQVRFX1JFU0VUCisgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uczoKKyAgICBleGFtcGxlcyBAcmVmIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKCkuCisgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVzcGVjdGl2ZWx5CisgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX0lSREFfSW5pdCgpCisgICAgYW5kIEByZWYgSEFMX0lSREFfRGVJbml0KCkgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9JUkRBX0luaXQoKSBhbmQgQHJlZiBIQUxfSVJEQV9EZUluaXQoKQorICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisKKyAgICBbLi5dCisgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfSVJEQV9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgaW4gSEFMX0lSREFfU1RBVEVfUkVBRFkgb3IgSEFMX0lSREFfU1RBVEVfUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikKKyAgICBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgdXNpbmcgQHJlZiBIQUxfSVJEQV9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfSVJEQV9EZUluaXQoKQorICAgIG9yIEByZWYgSEFMX0lSREFfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElSREEgSVJEQQorICAqIEBicmllZiBIQUwgSVJEQSBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9JUkRBX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJUkRBX1ByaXZhdGVfQ29uc3RhbnRzIElSREEgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX1RFQUNLX1JFQUNLX1RJTUVPVVQgICAgICAgICAgICAxMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJUkRBIFRYIG9yIFJYIGVuYWJsZSBhY2tub3dsZWRnZSB0aW1lLW91dCB2YWx1ZSAgKi8KKworI2RlZmluZSBJUkRBX0NSMV9GSUVMRFMgICgodWludDMyX3QpKFVTQVJUX0NSMV9NIHwgVVNBUlRfQ1IxX1BDRSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFKSkgIC8qITwgVUFSVCBvciBVU0FSVCBDUjEgZmllbGRzIG9mIHBhcmFtZXRlcnMgc2V0IGJ5IElSREFfU2V0Q29uZmlnIEFQSSAqLworCisjZGVmaW5lIFVTQVJUX0JSUl9NSU4gICAgMHgxMFUgICAgICAgIC8qITwgVVNBUlQgQlJSIG1pbmltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworCisjZGVmaW5lIFVTQVJUX0JSUl9NQVggICAgMHgwMDAwRkZGRlUgIC8qITwgVVNBUlQgQlJSIG1heGltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVJEQV9Qcml2YXRlX01hY3JvcyBJUkRBIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAYnJpZWYgIEJSUiBkaXZpc2lvbiBvcGVyYXRpb24gdG8gc2V0IEJSUiByZWdpc3RlciBpbiAxNi1iaXQgb3ZlcnNhbXBsaW5nIG1vZGUuCisgICogQHBhcmFtICBfX1BDTEtfXyBJUkRBIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHJldHZhbCBEaXZpc2lvbiByZXN1bHQKKyAgKi8KKyNkZWZpbmUgSVJEQV9ESVZfU0FNUExJTkcxNihfX1BDTEtfXywgX19CQVVEX18pICAoKChfX1BDTEtfXykgKyAoKF9fQkFVRF9fKS8yVSkpIC8gKF9fQkFVRF9fKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIElSREFfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIElSREFfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9TZXRDb25maWcoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9DaGVja0lkbGVTdGF0ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgdm9pZCBJUkRBX0VuZFR4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX0VuZFJ4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVRyYW5zbWl0SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSVJEQV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVJlY2VpdmVIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BVHhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSVJEQV9UcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3N0YXRpYyB2b2lkIElSREFfRW5kVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zIElSREEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4CisgIGluIGFzeW5jaHJvbm91cyBJUkRBIG1vZGUuCisgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlIG9ubHkgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAoKyspIFdvcmQgTGVuZ3RoCisgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgaW4gdGhlIGRhdGEgcmVnaXN0ZXIgaXMgdHJhbnNtaXR0ZWQgYnV0IGlzIGNoYW5nZWQgYnkgdGhlIHBhcml0eSBiaXQuCisgICAgICAoKyspIFBvd2VyIG1vZGUKKyAgICAgICgrKykgUHJlc2NhbGVyIHNldHRpbmcKKyAgICAgICgrKykgUmVjZWl2ZXIvdHJhbnNtaXR0ZXIgbW9kZXMKKworICBbLi5dCisgIFRoZSBIQUxfSVJEQV9Jbml0KCkgQVBJIGZvbGxvd3MgdGhlIFVTQVJUIGFzeW5jaHJvbm91cyBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMKKyAgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmVzIGFyZSBhdmFpbGFibGUgaW4gcmVmZXJlbmNlIG1hbnVhbCkuCisKK0BlbmR2ZXJiYXRpbQorCisgIERlcGVuZGluZyBvbiB0aGUgZnJhbWUgbGVuZ3RoIGRlZmluZWQgYnkgdGhlIE0xIGFuZCBNMCBiaXRzICg3LWJpdCwKKyAgOC1iaXQgb3IgOS1iaXQpLCB0aGUgcG9zc2libGUgSVJEQSBmcmFtZSBmb3JtYXRzIGFyZSBsaXN0ZWQgaW4gdGhlCisgIGZvbGxvd2luZyB0YWJsZS4KKworICAgIFRhYmxlIDEuIElSREEgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICBNMSBiaXQgfCAgTTAgYml0IHwgIFBDRSBiaXQgIHwgICAgICAgICAgICAgSVJEQSBmcmFtZSAgICAgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDkgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDYgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIElSREEgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBJUkRBX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9Jbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIENoZWNrIHRoZSBJUkRBIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoaXJkYSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBVU0FSVC9VQVJUIGFzc29jaWF0ZWQgdG8gdGhlIElSREEgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19JUkRBX0lOU1RBTkNFKGhpcmRhLT5JbnN0YW5jZSkpOworCisgIGlmIChoaXJkYS0+Z1N0YXRlID09IEhBTF9JUkRBX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhpcmRhLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgSVJEQV9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGhpcmRhKTsKKworICAgIGlmIChoaXJkYS0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9JUkRBX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX0lSREFfTXNwSW5pdChoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCB0byB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisgIF9fSEFMX0lSREFfRElTQUJMRShoaXJkYSk7CisKKyAgLyogU2V0IHRoZSBJUkRBIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoSVJEQV9TZXRDb25maWcoaGlyZGEpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBJUkRBIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiwgU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworCisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBJUkRBIG1vZGUgKi8KKyAgaGlyZGEtPkluc3RhbmNlLT5DUjMgfD0gVVNBUlRfQ1IzX0lSRU47CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0lSREFfRU5BQkxFKGhpcmRhKTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBoaXJkYS0+Z1N0YXRlIGFuZCBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKElSREFfQ2hlY2tJZGxlU3RhdGUoaGlyZGEpKTsKK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgSVJEQSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RlSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBDaGVjayB0aGUgSVJEQSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGlyZGEgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgVVNBUlQvVUFSVCBhc3NvY2lhdGVkIHRvIHRoZSBJUkRBIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9JTlNUQU5DRShoaXJkYS0+SW5zdGFuY2UpKTsKKworICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWTsKKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworI2lmIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQorICBpZiAoaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoaXJkYS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfSVJEQV9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIEhBTF9JUkRBX01zcERlSW5pdChoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0lSREFfRElTQUJMRShoaXJkYSk7CisKKyAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgIGhpcmRhLT5nU3RhdGUgICAgPSBIQUxfSVJEQV9TVEFURV9SRVNFVDsKKyAgaGlyZGEtPlJ4U3RhdGUgICA9IEhBTF9JUkRBX1NUQVRFX1JFU0VUOworCisgIC8qIFByb2Nlc3MgVW5sb2NrICovCisgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIElSREEgTVNQLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX01zcEluaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX0lSREFfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgSVJEQSBNU1AuCisgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfTXNwRGVJbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9JUkRBX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBJUkRBIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGlyZGEgaXJkYSBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9NU1BJTklUX0NCX0lEIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVnaXN0ZXJDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCBIQUxfSVJEQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwSVJEQV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5SeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfRVJST1JfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBJUkRBIGNhbGxiYWNrCisgICogICAgICAgICBJUkRBIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGlyZGEgaXJkYSBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9UWF9DT01QTEVURV9DQl9JRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX1JYX0NPTVBMRVRFX0NCX0lEIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVW5SZWdpc3RlckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIEhBTF9JUkRBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICBpZiAoSEFMX0lSREFfU1RBVEVfUkVBRFkgPT0gaGlyZGEtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5UeENwbHRDYWxsYmFjayA9IEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfRVJST1JfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+RXJyb3JDYWxsYmFjayA9IEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9JUkRBX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9JUkRBX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX0lSREFfU1RBVEVfUkVTRVQgPT0gaGlyZGEtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0lSREFfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0lSREFfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBJUkRBIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBJUkRBIGRhdGEgdHJhbnNmZXJzLgorCisgIFsuLl0KKyAgICBJckRBIGlzIGEgaGFsZiBkdXBsZXggY29tbXVuaWNhdGlvbiBwcm90b2NvbC4gSWYgdGhlIFRyYW5zbWl0dGVyIGlzIGJ1c3ksIGFueSBkYXRhCisgICAgb24gdGhlIElyREEgcmVjZWl2ZSBsaW5lIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgSXJEQSBkZWNvZGVyIGFuZCBpZiB0aGUgUmVjZWl2ZXIKKyAgICBpcyBidXN5LCBkYXRhIG9uIHRoZSBUWCBmcm9tIHRoZSBVU0FSVCB0byBJckRBIHdpbGwgbm90IGJlIGVuY29kZWQgYnkgSXJEQS4KKyAgICBXaGlsZSByZWNlaXZpbmcgZGF0YSwgdHJhbnNtaXNzaW9uIHNob3VsZCBiZSBhdm9pZGVkIGFzIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkCisgICAgY291bGQgYmUgY29ycnVwdGVkLgorCisgICAgKCMpIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CisgICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogdGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLgorICAgICAgICAoKyspIE5vbi1CbG9ja2luZyBtb2RlOiB0aGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cworICAgICAgICAgICAgIG9yIERNQSwgdGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgIGRlZGljYXRlZCBJUkRBIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKSwgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrcworICAgICAgICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIFRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcworICAgICAgICAgICAgIFRoZSBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkCisKKyAgICAoIykgQmxvY2tpbmcgbW9kZSBBUElzIGFyZSA6CisgICAgICAgICgrKykgSEFMX0lSREFfVHJhbnNtaXQoKQorICAgICAgICAoKyspIEhBTF9JUkRBX1JlY2VpdmUoKQorCisgICAgKCMpIE5vbiBCbG9ja2luZyBtb2RlIEFQSXMgd2l0aCBJbnRlcnJ1cHQgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0lSREFfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0lSREFfSVJRSGFuZGxlcigpCisKKyAgICAoIykgTm9uIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggRE1BIGFyZSA6CisgICAgICAgICgrKykgSEFMX0lSREFfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9SZWNlaXZlX0RNQSgpCisgICAgICAgICgrKykgSEFMX0lSREFfRE1BUGF1c2UoKQorICAgICAgICAoKyspIEhBTF9JUkRBX0RNQVJlc3VtZSgpCisgICAgICAgICgrKykgSEFMX0lSREFfRE1BU3RvcCgpCisKKyAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBOb24gQmxvY2tpbmcgbW9kZToKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMgY291bGQgYmUgYWJvcnRlZCB1c2luZyBBYm9ydCBBUEkncyA6CisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydCgpCisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0KCkKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZSgpCisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydF9JVCgpCisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0X0lUKCkKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZV9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9JUkRBX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgUmVjb3ZlcmFibGUgYW5kIG5vbiBibG9ja2luZyA6IFRyYW5zZmVyIGNvdWxkIGdvIHRpbGwgZW5kLCBidXQgZXJyb3Igc2V2ZXJpdHkgaXMKKyAgICAgICAgICAgIHRvIGJlIGV2YWx1YXRlZCBieSB1c2VyIDogdGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciwgUGFyaXR5IEVycm9yIG9yIE5vaXNlIEVycm9yIGluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiAuCisgICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKKyAgICAgICAgICAgIGFuZCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4gVHJhbnNmZXIgaXMga2VwdCBvbmdvaW5nIG9uIElSREEgc2lkZS4KKyAgICAgICAgICAgIElmIHVzZXIgd2FudHMgdG8gYWJvcnQgaXQsIEFib3J0IHNlcnZpY2VzIHNob3VsZCBiZSBjYWxsZWQgYnkgdXNlci4KKyAgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICAgVGhpcyBjb25jZXJucyBPdmVycnVuIEVycm9yIEluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiBhbmQgYWxsIGVycm9ycyBpbiBETUEgbW9kZS4KKyAgICAgICAgICAgIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwgYW5kIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEBwYXJhbSBUaW1lb3V0IFNwZWNpZnkgdGltZW91dCB2YWx1ZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKy8qKgorICAqIEBub3RlICAgV2hlbiBJUkRBIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwRGF0YS4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1RyYW5zbWl0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50OF90ICAqcGRhdGE4Yml0czsKKyAgdWludDE2X3QgKnBkYXRhMTZiaXRzOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW10ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSBmaWxsZWQgaW50byBURFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDEpICE9IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKyAgICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGhpcmRhLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBEYXRhIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYSB1aW50MTZfdCBwb2ludGVyICovCisgICAgaWYgKChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgJiYgKGhpcmRhLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBwZGF0YThiaXRzICA9IE5VTEw7CisgICAgICBwZGF0YTE2Yml0cyA9ICh1aW50MTZfdCAqKSBwRGF0YTsgLyogRGVyb2dhdGlvbiBSLjExLjMgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBkYXRhOGJpdHMgID0gcERhdGE7CisgICAgICBwZGF0YTE2Yml0cyA9IE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKGhpcmRhLT5UeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGhpcmRhLT5UeFhmZXJDb3VudC0tOworCisgICAgICBpZiAoSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpcmRhLCBJUkRBX0ZMQUdfVFhFLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIGlmIChwZGF0YThiaXRzID09IE5VTEwpCisgICAgICB7CisgICAgICAgIGhpcmRhLT5JbnN0YW5jZS0+VERSID0gKHVpbnQxNl90KSgqcGRhdGExNmJpdHMgJiAweDAxRkZVKTsKKyAgICAgICAgcGRhdGExNmJpdHMrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaGlyZGEtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKnBkYXRhOGJpdHMgJiAweEZGVSk7CisgICAgICAgIHBkYXRhOGJpdHMrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpcmRhLCBJUkRBX0ZMQUdfVEMsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gVGltZW91dCBTcGVjaWZ5IHRpbWVvdXQgdmFsdWUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCisvKioKKyAgKiBAbm90ZSAgIFdoZW4gSVJEQSBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVyIGZvciBzdG9yaW5nIGRhdGEgdG8gYmUgcmVjZWl2ZWQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHJlY2VpdmVkIGRhdGEgd2lsbCBiZSBoYW5kbGVkIHVzaW5nIHUxNiBwb2ludGVyIGNhc3QpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcERhdGEuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWNlaXZlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50OF90ICAqcGRhdGE4Yml0czsKKyAgdWludDE2X3QgKnBkYXRhMTZiaXRzOworICB1aW50MTZfdCB1aE1hc2s7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW10ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSByZWNlaXZlZCBmcm9tIFJEUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgJiYgKGhpcmRhLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcERhdGEpICYgMSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGhpcmRhLT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaXJkYS0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ29tcHV0YXRpb24gb2YgdGhlIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyCisgICAgICAgb2YgdGhlIFVBUlQgYXNzb2NpYXRlZCB0byB0aGUgSVJEQSAqLworICAgIElSREFfTUFTS19DT01QVVRBVElPTihoaXJkYSk7CisgICAgdWhNYXNrID0gaGlyZGEtPk1hc2s7CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFJ4RGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgdWludDE2X3QgcG9pbnRlciAqLworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgcGRhdGE4Yml0cyAgPSBOVUxMOworICAgICAgcGRhdGExNmJpdHMgPSAodWludDE2X3QgKikgcERhdGE7IC8qIERlcm9nYXRpb24gUi4xMS4zICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwZGF0YThiaXRzICA9IHBEYXRhOworICAgICAgcGRhdGExNmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIC8qIENoZWNrIGRhdGEgcmVtYWluaW5nIHRvIGJlIHJlY2VpdmVkICovCisgICAgd2hpbGUgKGhpcmRhLT5SeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGhpcmRhLT5SeFhmZXJDb3VudC0tOworCisgICAgICBpZiAoSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpcmRhLCBJUkRBX0ZMQUdfUlhORSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICBpZiAocGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAqcGRhdGExNmJpdHMgPSAodWludDE2X3QpKGhpcmRhLT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgcGRhdGExNmJpdHMrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgKnBkYXRhOGJpdHMgPSAodWludDhfdCkoaGlyZGEtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCl1aE1hc2spOworICAgICAgICBwZGF0YThiaXRzKys7CisgICAgICB9CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworLyoqCisgICogQG5vdGUgICBXaGVuIElSREEgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlciBjb250YWluaW5nIGRhdGEgdG8gYmUgc2VudCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgc2VudCBkYXRhIHdpbGwgYmUgaGFuZGxlZCB1c2luZyB1MTYgcG9pbnRlciBjYXN0KS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBEYXRhLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW10ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSBmaWxsZWQgaW50byBURFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDEpICE9IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+cFR4QnVmZlB0ciA9IHBEYXRhOworICAgIGhpcmRhLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKy8qKgorICAqIEBub3RlICAgV2hlbiBJUkRBIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgZm9yIHN0b3JpbmcgZGF0YSB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwRGF0YS4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5SeFN0YXRlID09IEhBTF9JUkRBX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtdGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgdG8gYmUgcmVjZWl2ZWQgZnJvbSBSRFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDEpICE9IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+cFJ4QnVmZlB0ciA9IHBEYXRhOworICAgIGhpcmRhLT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaXJkYS0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ29tcHV0YXRpb24gb2YgdGhlIG1hc2sgdG8gYXBwbHkgdG8gdGhlIFJEUiByZWdpc3RlcgorICAgICAgIG9mIHRoZSBVQVJUIGFzc29jaWF0ZWQgdG8gdGhlIElSREEgKi8KKyAgICBJUkRBX01BU0tfQ09NUFVUQVRJT04oaGlyZGEpOworCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICAvKiBFbmFibGUgdGhlIElSREEgUGFyaXR5IEVycm9yIGFuZCBEYXRhIFJlZ2lzdGVyIG5vdCBlbXB0eSBJbnRlcnJ1cHRzICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfUlhORUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKy8qKgorICAqIEBub3RlICAgV2hlbiBJUkRBIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgYnkgRE1BIGZyb20gaGFsZndvcmQgZnJvbnRpZXIpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcERhdGEuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdF9ETUEoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW10ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSBjb3B5IGludG8gVERSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIGJ5IERNQSBmcm9tIGEgdTE2IGZyb250aWVyLiAqLworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDEpICE9IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+cFR4QnVmZlB0ciA9IHBEYXRhOworICAgIGhpcmRhLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBTZXQgdGhlIElSREEgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IElSREFfRE1BVHJhbnNtaXRDcGx0OworCisgICAgLyogU2V0IHRoZSBJUkRBIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBJUkRBX0RNQVRyYW5zbWl0SGFsZkNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gSVJEQV9ETUFFcnJvcjsKKworICAgIC8qIFNldCB0aGUgRE1BIGFib3J0IGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBJUkRBIHRyYW5zbWl0IERNQSBjaGFubmVsICovCisgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGlyZGEtPmhkbWF0eCwgKHVpbnQzMl90KWhpcmRhLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhpcmRhLT5JbnN0YW5jZS0+VERSLCBTaXplKSA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFRDIGZsYWcgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX1RDRik7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICAgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byByZWFkeSAqLworICAgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQG5vdGUgICBXaGVuIHRoZSBJUkRBIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKy8qKgorICAqIEBub3RlICAgV2hlbiBJUkRBIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgZm9yIHN0b3JpbmcgZGF0YSB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgYnkgRE1BIGZyb20gaGFsZndvcmQgZnJvbnRpZXIpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcERhdGEuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWNlaXZlX0RNQShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW10ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSBjb3B5IGZyb20gUkRSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIGJ5IERNQSBmcm9tIGEgdTE2IGZyb250aWVyLiAqLworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDEpICE9IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+cFJ4QnVmZlB0ciA9IHBEYXRhOworICAgIGhpcmRhLT5SeFhmZXJTaXplID0gU2l6ZTsKKworICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIFNldCB0aGUgSVJEQSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gSVJEQV9ETUFSZWNlaXZlQ3BsdDsKKworICAgIC8qIFNldCB0aGUgSVJEQSBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gSVJEQV9ETUFSZWNlaXZlSGFsZkNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gSVJEQV9ETUFFcnJvcjsKKworICAgIC8qIFNldCB0aGUgRE1BIGFib3J0IGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhpcmRhLT5oZG1hcngsICh1aW50MzJfdCkmaGlyZGEtPkluc3RhbmNlLT5SRFIsICh1aW50MzJfdCloaXJkYS0+cFJ4QnVmZlB0ciwgU2l6ZSkgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICAgIC8qIFJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gcmVhZHkgKi8KKyAgICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisKKy8qKgorICAqIEBicmllZiBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BUGF1c2UoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICAgIH0KKyAgfQorICBpZiAoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9ETUFSZXN1bWUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBETUEgVHggcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBpZiAoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIC8qIENsZWFyIHRoZSBPdmVycnVuIGZsYWcgYmVmb3JlIHJlc3VtaW5nIHRoZSBSeCB0cmFuc2ZlciovCisgICAgX19IQUxfSVJEQV9DTEVBUl9PUkVGTEFHKGhpcmRhKTsKKworICAgIC8qIFJlZW5hYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBETUEgUnggcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgU3RvcCB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BU3RvcChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBUaGUgTG9jayBpcyBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBBUEkgdG8gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24KKyAgICAgdG8gY2FsbCB0aGUgSEFMIElSREEgQVBJIHVuZGVyIGNhbGxiYWNrcyBIQUxfSVJEQV9UeENwbHRDYWxsYmFjaygpIC8gSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKSAvCisgICAgIEhBTF9JUkRBX1R4SGFsZkNwbHRDYWxsYmFjayAvIEhBTF9JUkRBX1J4SGFsZkNwbHRDYWxsYmFjazoKKyAgICAgaW5kZWVkLCB3aGVuIEhBTF9ETUFfQWJvcnQoKSBBUEkgaXMgY2FsbGVkLCB0aGUgRE1BIFRYL1JYIFRyYW5zZmVyIG9yIEhhbGYgVHJhbnNmZXIgY29tcGxldGUKKyAgICAgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBpZiB0aGUgRE1BIHRyYW5zZmVyIGludGVycnVwdGlvbiBvY2N1cnMgYXQgdGhlIG1pZGRsZSBvciBhdCB0aGUgZW5kIG9mCisgICAgIHRoZSBzdHJlYW0gYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgYmFjayBpcyBleGVjdXRlZC4gKi8KKworICAvKiBTdG9wIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYKQorICB7CisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgICAgeworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBUeCBjaGFubmVsICovCisgICAgICBpZiAoaGlyZGEtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihoaXJkYS0+aGRtYXR4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfRE1BOworCisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIElSREFfRW5kVHhUcmFuc2ZlcihoaXJkYSk7CisgICAgfQorICB9CisKKyAgLyogU3RvcCBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5SeFN0YXRlID09IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFJ4IGNoYW5uZWwgKi8KKyAgICAgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhpcmRhLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhpcmRhLT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgSVJEQV9FbmRSeFRyYW5zZmVyKGhpcmRhKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBJUkRBIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFRYRUlFLCBUQ0lFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhpcmRhLT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhpcmRhLT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyhoaXJkYSwgSVJEQV9DTEVBUl9PUkVGIHwgSVJEQV9DTEVBUl9ORUYgfCBJUkRBX0NMRUFSX1BFRiB8IElSREFfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGhpcmRhLT5nU3RhdGUgYW5kIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5nU3RhdGUgID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVzZXQgSGFuZGxlIEVycm9yQ29kZSB0byBObyBFcnJvciAqLworICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgVHJhbnNtaXQgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIElSREEgSW50ZXJydXB0cyAoVHgpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRUcmFuc21pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhpcmRhLT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byBSZWFkeSAqLworICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBSeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIElSREEgSW50ZXJydXB0cyAoUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRSZWNlaXZlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIElSREEgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhpcmRhLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaGlyZGEtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MzJfdCBhYm9ydGNwbHQgPSAxVTsKKworICAvKiBEaXNhYmxlIFRYRUlFLCBUQ0lFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBJZiBETUEgVHggYW5kL29yIERNQSBSeCBIYW5kbGVzIGFyZSBhc3NvY2lhdGVkIHRvIElSREEgSGFuZGxlLCBETUEgQWJvcnQgY29tcGxldGUgY2FsbGJhY2tzIHNob3VsZCBiZSBpbml0aWFsaXNlZAorICAgICBiZWZvcmUgYW55IGNhbGwgdG8gRE1BIEFib3J0IGZ1bmN0aW9ucyAqLworICAvKiBETUEgVHggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgICAgeworICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJUkRBX0RNQVR4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKyAgLyogRE1BIFJ4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaGlyZGEtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gSVJEQV9ETUFSeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgVHggYXQgVUFSVCBsZXZlbCAqLworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogSVJEQSBUeCBETUEgQWJvcnQgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGlyZGEtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFJ4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogSVJEQSBSeCBETUEgQWJvcnQgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGlyZGEtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGFib3J0Y3BsdCA9IDFVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBpZiBubyBETUEgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uIGlzIHJlcXVpcmVkID0+IGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBpZiAoYWJvcnRjcGx0ID09IDFVKQorICB7CisgICAgLyogUmVzZXQgVHggYW5kIFJ4IHRyYW5zZmVyIGNvdW50ZXJzICovCisgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisgICAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgICAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIGFuZCBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5nU3RhdGUgID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpcmRhLT5BYm9ydENwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgVHJhbnNtaXQgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBJUkRBIEludGVycnVwdHMgKFR4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRUcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaGlyZGEtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSVJEQSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJUkRBX0RNQVR4T25seUFib3J0Q2FsbGJhY2s7CisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGlyZGEtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2soaGlyZGEtPmhkbWF0eCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgICAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBoaXJkYS0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX0lSREFfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGhpcmRhLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgUnggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBJUkRBIEludGVycnVwdHMgKFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRSZWNlaXZlX0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFJ4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IElSREFfRE1BUnhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaXJkYS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoaXJkYS0+aGRtYXJ4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgICAgICAvKiBSZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBoaXJkYS0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBoaXJkYS0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgICAgLyogUmVzdG9yZSBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGhpcmRhLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEhhbmRsZSBJUkRBIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSBoaXJkYSAgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JUkRBX0lSUUhhbmRsZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgdWludDMyX3QgaXNyZmxhZ3MgICA9IFJFQURfUkVHKGhpcmRhLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgY3IxaXRzICAgICA9IFJFQURfUkVHKGhpcmRhLT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgY3IzaXRzOworICB1aW50MzJfdCBlcnJvcmZsYWdzOworCisgIC8qIElmIG5vIGVycm9yIG9jY3VycyAqLworICBlcnJvcmZsYWdzID0gKGlzcmZsYWdzICYgKHVpbnQzMl90KShVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfT1JFIHwgVVNBUlRfSVNSX05FKSk7CisgIGlmIChlcnJvcmZsYWdzID09IDBVKQorICB7CisgICAgLyogSVJEQSBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIElSREFfUmVjZWl2ZV9JVChoaXJkYSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogSWYgc29tZSBlcnJvcnMgb2NjdXIgKi8KKyAgY3IzaXRzID0gUkVBRF9SRUcoaGlyZGEtPkluc3RhbmNlLT5DUjMpOworICBpZiAoKGVycm9yZmxhZ3MgIT0gMFUpCisgICAgICAmJiAoKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkKKyAgICAgICAgICB8fCAoKGNyMWl0cyAmIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKSAhPSAwVSkpKQorICB7CisgICAgLyogSVJEQSBwYXJpdHkgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1BFKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUEVJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX0lSREFfQ0xFQVJfSVQoaGlyZGEsIElSREFfQ0xFQVJfUEVGKTsKKworICAgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9QRTsKKyAgICB9CisKKyAgICAvKiBJUkRBIGZyYW1lIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfRkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9JUkRBX0NMRUFSX0lUKGhpcmRhLCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgICAgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfRkU7CisgICAgfQorCisgICAgLyogSVJEQSBub2lzZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX05FKSAhPSAwVSkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfSVJEQV9DTEVBUl9JVChoaXJkYSwgSVJEQV9DTEVBUl9ORUYpOworCisgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX05FOworICAgIH0KKworICAgIC8qIElSREEgT3Zlci1SdW4gaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9PUkUpICE9IDBVKSAmJgorICAgICAgICAoKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSAwVSkgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpKQorICAgIHsKKyAgICAgIF9fSEFMX0lSREFfQ0xFQVJfSVQoaGlyZGEsIElSREFfQ0xFQVJfT1JFRik7CisKKyAgICAgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfT1JFOworICAgIH0KKworICAgIC8qIENhbGwgSVJEQSBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZCBiZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKGhpcmRhLT5FcnJvckNvZGUgIT0gSEFMX0lSREFfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBJUkRBIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkUpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgSVJEQV9SZWNlaXZlX0lUKGhpcmRhKTsKKyAgICAgIH0KKworICAgICAgLyogSWYgT3ZlcnJ1biBlcnJvciBvY2N1cnMsIG9yIGlmIGFueSBlcnJvciBvY2N1cnMgaW4gRE1BIG1vZGUgcmVjZXB0aW9uLAorICAgICAgICAgY29uc2lkZXIgZXJyb3IgYXMgYmxvY2tpbmcgKi8KKyAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgfHwKKyAgICAgICAgICAoKGhpcmRhLT5FcnJvckNvZGUgJiBIQUxfSVJEQV9FUlJPUl9PUkUpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBpcyBhYm9ydGVkCisgICAgICAgICAgIFNldCB0aGUgSVJEQSBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzLAorICAgICAgICAgICBEaXNhYmxlIFJ4IEludGVycnVwdHMsIGFuZCBkaXNhYmxlIFJ4IERNQSByZXF1ZXN0LCBpZiBvbmdvaW5nICovCisgICAgICAgIElSREFfRW5kUnhUcmFuc2ZlcihoaXJkYSk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgICAgICAgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgICAgICB7CisgICAgICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgICAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgUnggY2hhbm5lbCAqLworICAgICAgICAgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gSVJEQV9ETUFBYm9ydE9uRXJyb3I7CisKKyAgICAgICAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGlyZGEtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaGlyZGEtPmhkbWFyeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBoaXJkYS0+RXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgICAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIGhpcmRhLT5FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgICAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgSEFMX0lSREFfRXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm9uIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgY291bGQgZ28gb24uCisgICAgICAgICAgIEVycm9yIGlzIG5vdGlmaWVkIHRvIHVzZXIgdGhyb3VnaCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaGlyZGEtPkVycm9yQ2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCisgIH0gLyogRW5kIGlmIHNvbWUgZXJyb3Igb2NjdXJzICovCisKKyAgLyogSVJEQSBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRUlFKSAhPSAwVSkpCisgIHsKKyAgICBJUkRBX1RyYW5zbWl0X0lUKGhpcmRhKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBJUkRBIGluIG1vZGUgVHJhbnNtaXR0ZXIgKHRyYW5zbWlzc2lvbiBlbmQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVEMpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UQ0lFKSAhPSAwVSkpCisgIHsKKyAgICBJUkRBX0VuZFRyYW5zbWl0X0lUKGhpcmRhKTsKKyAgICByZXR1cm47CisgIH0KKworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVJEQV9UeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0FSVCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVJEQV9SeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJUkRBIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSVJEQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSVJEQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaXJkYSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIElSREEgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgICogIEBicmllZiAgIElSREEgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byByZXR1cm4gdGhlIFN0YXRlIG9mIElyREEKKyAgICBjb21tdW5pY2F0aW9uIHByb2Nlc3MgYW5kIGFsc28gcmV0dXJuIFBlcmlwaGVyYWwgRXJyb3JzIG9jY3VycmVkIGR1cmluZyBjb21tdW5pY2F0aW9uIHByb2Nlc3MKKyAgICAgKCspIEhBTF9JUkRBX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZQorICAgICAgICAgb2YgdGhlIElSREEgcGVyaXBoZXJhbCBoYW5kbGUuCisgICAgICgrKSBIQUxfSVJEQV9HZXRFcnJvcigpIGNoZWNrcyBpbiBydW4tdGltZSBlcnJvcnMgdGhhdCBjb3VsZCBvY2N1ciBkdXJpbmcKKyAgICAgICAgIGNvbW11bmljYXRpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBSZXR1cm4gdGhlIElSREEgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9JUkRBX1N0YXRlVHlwZURlZiBIQUxfSVJEQV9HZXRTdGF0ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBSZXR1cm4gSVJEQSBoYW5kbGUgc3RhdGUgKi8KKyAgdWludDMyX3QgdGVtcDEsIHRlbXAyOworICB0ZW1wMSA9ICh1aW50MzJfdCloaXJkYS0+Z1N0YXRlOworICB0ZW1wMiA9ICh1aW50MzJfdCloaXJkYS0+UnhTdGF0ZTsKKworICByZXR1cm4gKEhBTF9JUkRBX1N0YXRlVHlwZURlZikodGVtcDEgfCB0ZW1wMik7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXR1cm4gdGhlIElSREEgaGFuZGxlIGVycm9yIGNvZGUuCisgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSVJEQSBFcnJvciBDb2RlCisgICovCit1aW50MzJfdCBIQUxfSVJEQV9HZXRFcnJvcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICByZXR1cm4gaGlyZGEtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX1ByaXZhdGVfRnVuY3Rpb25zIElSREEgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgY2FsbGJhY2tzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBwYXJhbSAgaGlyZGEgSVJEQSBoYW5kbGUuCisgICogQHJldHZhbCBub25lCisgICovCit2b2lkIElSREFfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBJbml0IHRoZSBJUkRBIENhbGxiYWNrIHNldHRpbmdzICovCisgIGhpcmRhLT5UeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgID0gSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBoaXJkYS0+VHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgaGlyZGEtPlJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICovCisgIGhpcmRhLT5SeENwbHRDYWxsYmFjayAgICAgICAgICAgID0gSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBoaXJkYS0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgaGlyZGEtPkFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgPSBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCisgIGhpcmRhLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gSEFMX0lSREFfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayAqLworICBoaXJkYS0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA9IEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgKi8KKworfQorI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgSVJEQSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJUkRBX1NldENvbmZpZyhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MzJfdCB0bXByZWc7CisgIElSREFfQ2xvY2tTb3VyY2VUeXBlRGVmIGNsb2Nrc291cmNlOworICBIQUxfU3RhdHVzVHlwZURlZiByZXQgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9CQVVEUkFURShoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9XT1JEX0xFTkdUSChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoKSk7CisgIGFzc2VydF9wYXJhbShJU19JUkRBX1BBUklUWShoaXJkYS0+SW5pdC5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lSREFfVFhfUlhfTU9ERShoaXJkYS0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19JUkRBX1BSRVNDQUxFUihoaXJkYS0+SW5pdC5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lSREFfUE9XRVJNT0RFKGhpcmRhLT5Jbml0LlBvd2VyTW9kZSkpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgdGhlIElSREEgV29yZCBMZW5ndGgsIFBhcml0eSBhbmQgdHJhbnNmZXIgTW9kZToKKyAgICAgU2V0IHRoZSBNIGJpdHMgYWNjb3JkaW5nIHRvIGhpcmRhLT5Jbml0LldvcmRMZW5ndGggdmFsdWUKKyAgICAgU2V0IFBDRSBhbmQgUFMgYml0cyBhY2NvcmRpbmcgdG8gaGlyZGEtPkluaXQuUGFyaXR5IHZhbHVlCisgICAgIFNldCBURSBhbmQgUkUgYml0cyBhY2NvcmRpbmcgdG8gaGlyZGEtPkluaXQuTW9kZSB2YWx1ZSAqLworICB0bXByZWcgPSAodWludDMyX3QpaGlyZGEtPkluaXQuV29yZExlbmd0aCB8IGhpcmRhLT5Jbml0LlBhcml0eSB8IGhpcmRhLT5Jbml0Lk1vZGUgOworCisgIE1PRElGWV9SRUcoaGlyZGEtPkluc3RhbmNlLT5DUjEsIElSREFfQ1IxX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgTU9ESUZZX1JFRyhoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0lSTFAsIGhpcmRhLT5Jbml0LlBvd2VyTW9kZSk7CisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEdUUFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgTU9ESUZZX1JFRyhoaXJkYS0+SW5zdGFuY2UtPkdUUFIsICh1aW50MTZfdClVU0FSVF9HVFBSX1BTQywgaGlyZGEtPkluaXQuUHJlc2NhbGVyKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgSVJEQV9HRVRDTE9DS1NPVVJDRShoaXJkYSwgY2xvY2tzb3VyY2UpOworICB0bXByZWcgPSAgIDBVOworICBzd2l0Y2ggKGNsb2Nrc291cmNlKQorICB7CisgICAgY2FzZSBJUkRBX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgdG1wcmVnID0gKHVpbnQxNl90KShJUkRBX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0UENMSzFGcmVxKCksIGhpcmRhLT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSREFfQ0xPQ0tTT1VSQ0VfUENMSzI6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKElSREFfRElWX1NBTVBMSU5HMTYoSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSwgaGlyZGEtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVJEQV9DTE9DS1NPVVJDRV9IU0k6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKElSREFfRElWX1NBTVBMSU5HMTYoSFNJX1ZBTFVFLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUkRBX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoSVJEQV9ESVZfU0FNUExJTkcxNihIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUkRBX0NMT0NLU09VUkNFX0xTRToKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoSVJEQV9ESVZfU0FNUExJTkcxNigodWludDMyX3QpTFNFX1ZBTFVFLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogVVNBUlRESVYgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMGQxNiAqLworICBpZiAoKHRtcHJlZyA+PSBVU0FSVF9CUlJfTUlOKSAmJiAodG1wcmVnIDw9IFVTQVJUX0JSUl9NQVgpKQorICB7CisgICAgaGlyZGEtPkluc3RhbmNlLT5CUlIgPSB0bXByZWc7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0ID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmIENoZWNrIHRoZSBJUkRBIElkbGUgU3RhdGUuCisgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfQ2hlY2tJZGxlU3RhdGUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXRpYWxpemUgdGhlIElSREEgRXJyb3JDb2RlICovCisgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChoaXJkYS0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmIChJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGlyZGEsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgSVJEQV9URUFDS19SRUFDS19USU1FT1VUKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorICAvKiBDaGVjayBpZiB0aGUgUmVjZWl2ZXIgaXMgZW5hYmxlZCAqLworICBpZiAoKGhpcmRhLT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1JFKSA9PSBVU0FSVF9DUjFfUkUpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFJFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaXJkYSwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBJUkRBX1RFQUNLX1JFQUNLX1RJTUVPVVQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgSVJEQSBzdGF0ZSovCisgIGhpcmRhLT5nU3RhdGUgID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIElSREEgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtICBGbGFnIFNwZWNpZmllcyB0aGUgSVJEQSBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgU3RhdHVzIEZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KKyAgd2hpbGUgKChfX0hBTF9JUkRBX0dFVF9GTEFHKGhpcmRhLCBGbGFnKSA/IFNFVCA6IFJFU0VUKSA9PSBTdGF0dXMpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFKSk7CisgICAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgICAgaGlyZGEtPmdTdGF0ZSAgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKyAgICAgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFR4IHRyYW5zZmVyIG9uIElSREEgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBUcmFuc21pdCBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9FbmRUeFRyYW5zZmVyKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgVFhFSUUgYW5kIFRDSUUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworCisgIC8qIEF0IGVuZCBvZiBUeCBwcm9jZXNzLCByZXN0b3JlIGhpcmRhLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgUnggdHJhbnNmZXIgb24gVUFSVCBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uIG9yIFJlY2VwdGlvbiBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9FbmRSeFRyYW5zZmVyKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+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+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBJUkRBIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgJiYgKGhpcmRhLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgdG1wID0gKHVpbnQxNl90ICopIGhpcmRhLT5wVHhCdWZmUHRyOyAvKiBEZXJvZ2F0aW9uIFIuMTEuMyAqLworICAgICAgICBoaXJkYS0+SW5zdGFuY2UtPlREUiA9ICh1aW50MTZfdCkoKnRtcCAmIDB4MDFGRlUpOworICAgICAgICBoaXJkYS0+cFR4QnVmZlB0ciArPSAyVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaGlyZGEtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKmhpcmRhLT5wVHhCdWZmUHRyICYgMHhGRlUpOworICAgICAgICBoaXJkYS0+cFR4QnVmZlB0cisrOworICAgICAgfQorICAgICAgaGlyZGEtPlR4WGZlckNvdW50LS07CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JhcCB1cCB0cmFuc21pc3Npb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRW5kVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogRGlzYWJsZSB0aGUgSVJEQSBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisKKyAgLyogVHggcHJvY2VzcyBpcyBlbmRlZCwgcmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoaXJkYS0+VHhDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfSVJEQV9UeENwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfSVJEQV9SZWNlaXZlX0lUKCkKKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9SZWNlaXZlX0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIHVpbnQxNl90ICp0bXA7CisgIHVpbnQxNl90ICB1aE1hc2sgPSBoaXJkYS0+TWFzazsKKyAgdWludDE2X3QgIHVoZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgdWhkYXRhID0gKHVpbnQxNl90KSBSRUFEX1JFRyhoaXJkYS0+SW5zdGFuY2UtPlJEUik7CisgICAgaWYgKChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgJiYgKGhpcmRhLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICB0bXAgPSAodWludDE2X3QgKikgaGlyZGEtPnBSeEJ1ZmZQdHI7IC8qIERlcm9nYXRpb24gUi4xMS4zICovCisgICAgICAqdG1wID0gKHVpbnQxNl90KSh1aGRhdGEgJiB1aE1hc2spOworICAgICAgaGlyZGEtPnBSeEJ1ZmZQdHIgICs9IDJVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgKmhpcmRhLT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QpKHVoZGF0YSAmICh1aW50OF90KXVoTWFzayk7CisgICAgICBoaXJkYS0+cFJ4QnVmZlB0cisrOworICAgIH0KKworICAgIGhpcmRhLT5SeFhmZXJDb3VudC0tOworICAgIGlmIChoaXJkYS0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgSVJEQSBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdCAqLworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIElSREEgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoaXJkYS0+UnhDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8KKyAgICBfX0hBTF9JUkRBX1NFTkRfUkVRKGhpcmRhLCBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0lSREFfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICYmICFkZWZpbmVkIChTVE0zMkwwMTB4OCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsX2l3ZGcuYyBiL1NyYy9zdG0zMmwweHhfaGFsX2l3ZGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGUyNmVjCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfaXdkZy5jCkBAIC0wLDAgKzEsMjY0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9pd2RnLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIElXREcgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEluZGVwZW5kZW50IFdhdGNoZG9nIChJV0RHKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBJV0RHIEdlbmVyaWMgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgVGhlIElXREcgY2FuIGJlIHN0YXJ0ZWQgYnkgZWl0aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlIChjb25maWd1cmFibGUKKyAgICAgICAgdGhyb3VnaCBvcHRpb24gYnl0ZSkuCisKKyAgICAoKykgVGhlIElXREcgaXMgY2xvY2tlZCBieSBMb3ctU3BlZWQgY2xvY2sgKExTSSkgYW5kIHRodXMgc3RheXMgYWN0aXZlIGV2ZW4KKyAgICAgICAgaWYgdGhlIG1haW4gY2xvY2sgZmFpbHMuCisKKyAgICAoKykgT25jZSB0aGUgSVdERyBpcyBzdGFydGVkLCB0aGUgTFNJIGlzIGZvcmNlZCBPTiBhbmQgYm90aCBjYW4gbm90IGJlIAorICAgICAgICBkaXNhYmxlZC4gVGhlIGNvdW50ZXIgc3RhcnRzIGNvdW50aW5nIGRvd24gZnJvbSB0aGUgcmVzZXQgdmFsdWUgKDB4RkZGKS4KKyAgICAgICAgV2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgY291bnQgdmFsdWUgKDB4MDAwKSBhIHJlc2V0IHNpZ25hbCBpcyAKKyAgICAgICAgZ2VuZXJhdGVkIChJV0RHIHJlc2V0KS4KKworICAgICgrKSBXaGVuZXZlciB0aGUga2V5IHZhbHVlIDB4MDAwMCBBQUFBIGlzIHdyaXR0ZW4gaW4gdGhlIElXREdfS1IgcmVnaXN0ZXIsIAorICAgICAgICB0aGUgSVdER19STFIgdmFsdWUgaXMgcmVsb2FkZWQgaW4gdGhlIGNvdW50ZXIgYW5kIHRoZSB3YXRjaGRvZyByZXNldCBpcworICAgICAgICBwcmV2ZW50ZWQuCisKKyAgICAoKykgVGhlIElXREcgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIFZERCB2b2x0YWdlIGRvbWFpbiB0aGF0IGlzIHN0aWxsIGZ1bmN0aW9uYWwKKyAgICAgICAgaW4gU1RPUCBhbmQgU1RBTkRCWSBtb2RlIChJV0RHIHJlc2V0IGNhbiB3YWtlLXVwIGZyb20gU1RBTkRCWSkuCisgICAgICAgIElXREdSU1QgZmxhZyBpbiBSQ0NfQ1NSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIHRvIGluZm9ybSB3aGVuIGFuIElXREcKKyAgICAgICAgcmVzZXQgb2NjdXJzLgorCisgICAgKCspIERlYnVnIG1vZGUgOiBXaGVuIHRoZSBtaWNyb2NvbnRyb2xsZXIgZW50ZXJzIGRlYnVnIG1vZGUgKGNvcmUgaGFsdGVkKSwKKyAgICAgICAgdGhlIElXREcgY291bnRlciBlaXRoZXIgY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkgb3Igc3RvcHMsIGRlcGVuZGluZyAKKyAgICAgICAgb24gREJHX0lXREdfU1RPUCBjb25maWd1cmF0aW9uIGJpdCBpbiBEQkcgbW9kdWxlLCBhY2Nlc3NpYmxlIHRocm91Z2gKKyAgICAgICAgX19IQUxfREJHTUNVX0ZSRUVaRV9JV0RHKCkgYW5kIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JV0RHKCkgbWFjcm9zCisKKyAgICBbLi5dIE1pbi1tYXggdGltZW91dCB2YWx1ZSBAMzJLSHogKExTSSk6IH4wLjUxMm1zIC8gfjMyLjBzCisgICAgICAgICBUaGUgSVdERyB0aW1lb3V0IG1heSB2YXJ5IGR1ZSB0byBMU0kgZnJlcXVlbmN5IGRpc3BlcnNpb24uIFNUTTMyTDB4eAorICAgICAgICAgZGV2aWNlcyBwcm92aWRlIHRoZSBjYXBhYmlsaXR5IHRvIG1lYXN1cmUgdGhlIExTSSBmcmVxdWVuY3kgKExTSSBjbG9jaworICAgICAgICAgY29ubmVjdGVkIGludGVybmFsbHkgdG8gVElNNSBDSDQgaW5wdXQgY2FwdHVyZSkuIFRoZSBtZWFzdXJlZCB2YWx1ZQorICAgICAgICAgY2FuIGJlIHVzZWQgdG8gaGF2ZSBhbiBJV0RHIHRpbWVvdXQgd2l0aCBhbiBhY2NlcHRhYmxlIGFjY3VyYWN5LgorCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCMpIFVzZSBJV0RHIHVzaW5nIEhBTF9JV0RHX0luaXQoKSBmdW5jdGlvbiB0byA6CisgICAgICAoKyspIEVuYWJsZSBpbnN0YW5jZSBieSB3cml0aW5nIFN0YXJ0IGtleXdvcmQgaW4gSVdER19LRVkgcmVnaXN0ZXIuIExTSSAKKyAgICAgICAgICAgY2xvY2sgaXMgZm9yY2VkIE9OIGFuZCBJV0RHIGNvdW50ZXIgc3RhcnRzIGRvd25jb3VudGluZy4KKyAgICAgICgrKykgRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBjb25maWd1cmF0aW9uIHJlZ2lzdGVyOiBJV0RHX1BSLCBJV0RHX1JMUiAmIAorICAgICAgICAgICBJV0RHX1dJTlIuCisgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgSVdERyBwcmVzY2FsZXIgYW5kIGNvdW50ZXIgcmVsb2FkIHZhbHVlLiBUaGlzIHJlbG9hZCAKKyAgICAgICAgICAgdmFsdWUgd2lsbCBiZSBsb2FkZWQgaW4gdGhlIElXREcgY291bnRlciBlYWNoIHRpbWUgdGhlIHdhdGNoZG9nIGlzIAorICAgICAgICAgICByZWxvYWRlZCwgdGhlbiB0aGUgSVdERyB3aWxsIHN0YXJ0IGNvdW50aW5nIGRvd24gZnJvbSB0aGlzIHZhbHVlLgorICAgICAgKCsrKSBXYWl0IGZvciBzdGF0dXMgZmxhZ3MgdG8gYmUgcmVzZXQKKyAgICAgICgrKykgRGVwZW5kaW5nIG9uIHdpbmRvdyBwYXJhbWV0ZXI6CisgICAgICAgICgrKyspIElmIFdpbmRvdyBJbml0IHBhcmFtZXRlciBpcyBzYW1lIGFzIFdpbmRvdyByZWdpc3RlciB2YWx1ZSwgCisgICAgICAgICAgICAgbm90aGluZyBtb3JlIGlzIGRvbmUgYnV0IHJlbG9hZCBjb3VudGVyIHZhbHVlIGluIG9yZGVyIHRvIGV4aXQgCisgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aHkgZXhhY3QgdGltZSBiYXNlLgorICAgICAgICAoKysrKSBFbHNlIG1vZGlmeSBXaW5kb3cgcmVnaXN0ZXIuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHJlbG9hZAorICAgICAgICAgICAgIHdhdGNoZG9nIGNvdW50ZXIuCisKKyAgICAoIykgVGhlbiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSBtdXN0IHJlZnJlc2ggdGhlIElXREcgY291bnRlciBhdCByZWd1bGFyCisgICAgICAgIGludGVydmFscyBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiB0byBwcmV2ZW50IGFuIE1DVSByZXNldCwgdXNpbmcKKyAgICAgICAgSEFMX0lXREdfUmVmcmVzaCgpIGZ1bmN0aW9uLgorCisgICAgICoqKiBJV0RHIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBJV0RHIEhBTCBkcml2ZXI6CisgICAgICAoKykgX19IQUxfSVdER19TVEFSVDogRW5hYmxlIHRoZSBJV0RHIHBlcmlwaGVyYWwKKyAgICAgICgrKSBfX0hBTF9JV0RHX1JFTE9BRF9DT1VOVEVSOiBSZWxvYWRzIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4KKyAgICAgICAgICB0aGUgcmVsb2FkIHJlZ2lzdGVyCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9JV0RHX01PRFVMRV9FTkFCTEVECisvKiogQGFkZHRvZ3JvdXAgSVdERworICAqIEBicmllZiBJV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfRGVmaW5lcyBJV0RHIFByaXZhdGUgRGVmaW5lcworICAqIEB7CisgICovCisvKiBTdGF0dXMgcmVnaXN0ZXIgbmVlZCA1IFJDIExTSSBkaXZpZGVkIGJ5IHByZXNjYWxlciBjbG9jayB0byBiZSB1cGRhdGVkLiBXaXRoIAorICAgaGlnaGVyIHByZXNjYWxlciAoMjU2KSwgYW5kIGFjY29yZGluZyB0byBMU0kgdmFyaWF0aW9uLCB3ZSBuZWVkIHRvIHdhaXQgYXQgCisgICBsZWFzdCA2IGN5Y2xlcyBzbyA0OCBtcy4gKi8KKyNkZWZpbmUgSEFMX0lXREdfREVGQVVMVF9USU1FT1VUICAgICAgICAgICAgNDhVCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBJV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIAorICAgICAgICAgIElXREdfSW5pdFR5cGVEZWYgb2YgYXNzb2NpYXRlZCBoYW5kbGUuCisgICAgICAoKykgTWFuYWdlIFdpbmRvdyBvcHRpb24uCisgICAgICAoKykgT25jZSBpbml0aWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgaW4gSEFMX0lXREdfSW5pdCBmdW5jdGlvbiwgV2F0Y2hkb2cgCisgICAgICAgICAgaXMgcmVsb2FkZWQgaW4gb3JkZXIgdG8gZXhpdCBmdW5jdGlvbiB3aXRoIGNvcnJlY3QgdGltZSBiYXNlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIElXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgCisgICogICAgICAgICBJV0RHX0luaXRUeXBlRGVmIGFuZCBzdGFydCB3YXRjaGRvZy4gQmVmb3JlIGV4aXRpbmcgZnVuY3Rpb24sIAorICAqICAgICAgICAgd2F0Y2hkb2cgaXMgcmVmcmVzaGVkIGluIG9yZGVyIHRvIGhhdmUgY29ycmVjdCB0aW1lIGJhc2UuCisgICogQHBhcmFtICBoaXdkZyAgcG9pbnRlciB0byBhIElXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElXREcgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lXREdfSW5pdChJV0RHX0hhbmRsZVR5cGVEZWYgKmhpd2RnKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhlIElXREcgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaGl3ZGcgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSVdER19BTExfSU5TVEFOQ0UoaGl3ZGctPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JV0RHX1BSRVNDQUxFUihoaXdkZy0+SW5pdC5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lXREdfUkVMT0FEKGhpd2RnLT5Jbml0LlJlbG9hZCkpOworICBhc3NlcnRfcGFyYW0oSVNfSVdER19XSU5ET1coaGl3ZGctPkluaXQuV2luZG93KSk7CisKKyAgLyogRW5hYmxlIElXREcuIExTSSBpcyB0dXJuZWQgb24gYXV0b21hdGljYWx5ICovCisgIF9fSEFMX0lXREdfU1RBUlQoaGl3ZGcpOworCisgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMgYnkgd3JpdGluZworICAweDU1NTUgaW4gS1IgKi8KKyAgSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTKGhpd2RnKTsKKworICAvKiBXcml0ZSB0byBJV0RHIHJlZ2lzdGVycyB0aGUgUHJlc2NhbGVyICYgUmVsb2FkIHZhbHVlcyB0byB3b3JrIHdpdGggKi8KKyAgaGl3ZGctPkluc3RhbmNlLT5QUiA9IGhpd2RnLT5Jbml0LlByZXNjYWxlcjsKKyAgaGl3ZGctPkluc3RhbmNlLT5STFIgPSBoaXdkZy0+SW5pdC5SZWxvYWQ7CisKKyAgLyogQ2hlY2sgcGVuZGluZyBmbGFnLCBpZiBwcmV2aW91cyB1cGRhdGUgbm90IGRvbmUsIHJldHVybiB0aW1lb3V0ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgIC8qIFdhaXQgZm9yIHJlZ2lzdGVyIHRvIGJlIHVwZGF0ZWQgKi8KKyAgd2hpbGUoaGl3ZGctPkluc3RhbmNlLT5TUiAhPSBSRVNFVCkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBIQUxfSVdER19ERUZBVUxUX1RJTUVPVVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIElmIHdpbmRvdyBwYXJhbWV0ZXIgaXMgZGlmZmVyZW50IHRoYW4gY3VycmVudCB2YWx1ZSwgbW9kaWZ5IHdpbmRvdyAKKyAgcmVnaXN0ZXIgKi8KKyAgaWYoaGl3ZGctPkluc3RhbmNlLT5XSU5SICE9IGhpd2RnLT5Jbml0LldpbmRvdykKKyAgeworICAgIC8qIFdyaXRlIHRvIElXREcgV0lOUiB0aGUgSVdER19XaW5kb3cgdmFsdWUgdG8gY29tcGFyZSB3aXRoLiBJbiBhbnkgY2FzZSwKKyAgICBldmVuIGlmIHdpbmRvdyBmZWF0dXJlIGlzIGRpc2FibGVkLCBXYXRjaGRvZyB3aWxsIGJlIHJlbG9hZGVkIGJ5IHdyaXRpbmcgCisgICAgd2luZG93cyByZWdpc3RlciAqLworICAgIGhpd2RnLT5JbnN0YW5jZS0+V0lOUiA9IGhpd2RnLT5Jbml0LldpbmRvdzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZWxvYWQgSVdERyBjb3VudGVyIHdpdGggdmFsdWUgZGVmaW5lZCBpbiB0aGUgcmVsb2FkIHJlZ2lzdGVyICovCisgICAgX19IQUxfSVdER19SRUxPQURfQ09VTlRFUihoaXdkZyk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIElXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFJlZnJlc2ggdGhlIElXREcuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKworLyoqCisgICogQGJyaWVmICBSZWZyZXNoIHRoZSBJV0RHLgorICAqIEBwYXJhbSAgaGl3ZGcgIHBvaW50ZXIgdG8gYSBJV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJV0RHIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JV0RHX1JlZnJlc2goSVdER19IYW5kbGVUeXBlRGVmICpoaXdkZykKK3sKKyAgLyogUmVsb2FkIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4gdGhlIHJlbG9hZCByZWdpc3RlciAqLworICBfX0hBTF9JV0RHX1JFTE9BRF9DT1VOVEVSKGhpd2RnKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfSVdER19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsX2xjZC5jIGIvU3JjL3N0bTMybDB4eF9oYWxfbGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjNDA1ZAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX2xjZC5jCkBAIC0wLDAgKzEsNjA5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9sY2QuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgTENEIENvbnRyb2xsZXIgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIExDRCBDb250cm9sbGVyIChMQ0QpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gbWV0aG9kcworICAqICAgICAgICAgICArIEkvTyBvcGVyYXRpb24gbWV0aG9kcworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgbWV0aG9kcworICAqICAgICAgICAgICAKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAKKyAgICAgIFsuLl0gVGhlIExDRCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvdzoKKyAgICAKKyAgICAgICgjKSBEZWNsYXJlIGEgTENEX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZS4KKworICAgICAgKCMpIFByZXBhcmUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBMQ0QgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgeW91ciBIQUxfTENEX01zcEluaXQoKSBBUEk6CisgICAgICAgICAgKCMjKSBFbmFibGUgdGhlIExDRENMSyAoc2FtZSBhcyBSVENDTEspOiB0byBjb25maWd1cmUgdGhlIFJUQ0NMSy9MQ0RDTEssIHVzZSB0aGUgUkNDIGZ1bmN0aW9uIAorICAgICAgICAgICAgICAgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZywgaW5kaWNhdGluZyBoZXJlIFJDQ19QRVJJUEhDTEtfTENEIGFuZCB0aGUgc2VsZWN0ZWQgY2xvY2sgCisgICAgICAgICAgICAgICBzb3VyY2UgKEhTRSwgTFNJIG9yIExTRSkKKyAgICAgICAgICAoIyMpIFRoZSBmcmVxdWVuY3kgZ2VuZXJhdG9yIGFsbG93cyB5b3UgdG8gYWNoaWV2ZSB2YXJpb3VzIExDRCBmcmFtZSByYXRlcyBzdGFydGluZyBmcm9tIGFuIAorICAgICAgICAgICAgICAgTENEIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoTENEQ0xLKSB3aGljaCBjYW4gdmFyeSBmcm9tIDMyIGtIeiB1cCB0byAxIE1Iei4KKyAgICAgICAgICAoIyMpIExDRCBwaW5zIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAgIC0gRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIExDRCBHUElPcworICAgICAgICAgICAgICAtIENvbmZpZ3VyZSB0aGVzZSBMQ0QgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gbm8tcHVsbC4KKyAgICAgICAgICAoIyMpIEVuYWJsZSB0aGUgTENEIGludGVyZmFjZSBjbG9jay4KKworICAgICAgKCMpIFNldCB0aGUgUHJlc2NhbGVyLCBEaXZpZGVyLCBCbGluayBtb2RlLCBCbGluayBGcmVxdWVuY3kgRHV0eSwgQmlhcywgVm9sdGFnZSBTb3VyY2UsIAorICAgICAgICAgIERlYWQgVGltZSwgUHVsc2UgT24gRHVyYXRpb24gYW5kIENvbnRyYXN0IGluIHRoZSBobGNkIEluaXQgc3RydWN0dXJlLgorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgTENEIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfTENEX0luaXQoKSBBUEkuCisgICAgICAgICAgKCMjKSBUaGUgSEFMX0xDRF9Jbml0KCkgQVBJIGNvbmZpZ3VyZXMgdGhlIGxvdyBsZXZlbCBIYXJkd2FyZSAoR1BJTywgQ0xPQ0ssIC4uLmV0YykKKyAgICAgICAgICAgICAgIGJ5IGNhbGxpbmcgdGhlIHVzZXIgY3VzdG9taXplZCBIQUxfTENEX01zcEluaXQoKSBBUEkuCisgICAgICAoIykgQWZ0ZXIgY2FsbGluZyB0aGUgSEFMX0xDRF9Jbml0KCkgdGhlIExDRCBSQU0gbWVtb3J5IGlzIGNsZWFyZWQKKworICAgICAgKCMpIE9wdGlvbmFsbHkgeW91IGNhbiB1cGRhdGUgdGhlIExDRCBjb25maWd1cmF0aW9uIHVzaW5nIHRoZXNlIG1hY3JvczoKKyAgICAgICAgICAgKCMjKSBMQ0QgSGlnaCBEcml2ZSB1c2luZyB0aGUgX19IQUxfTENEX0hJR0hEUklWRVJfRU5BQkxFKCkgYW5kIF9fSEFMX0xDRF9ISUdIRFJJVkVSX0RJU0FCTEUoKSBtYWNyb3MKKyAgICAgICAgICAgKCMjKSBMQ0QgUHVsc2UgT04gRHVyYXRpb24gdXNpbmcgdGhlIF9fSEFMX0xDRF9QVUxTRU9ORFVSQVRJT05fQ09ORklHKCkgbWFjcm8KKyAgICAgICAgICAgKCMjKSBMQ0QgRGVhZCBUaW1lIHVzaW5nIHRoZSBfX0hBTF9MQ0RfREVBRFRJTUVfQ09ORklHKCkgbWFjcm8gIAorICAgICAgICAgICAoIyMpIFRoZSBMQ0QgQmxpbmsgbW9kZSBhbmQgZnJlcXVlbmN5IHVzaW5nIHRoZSBfX0hBTF9MQ0RfQkxJTktfQ09ORklHKCkgbWFjcm8KKyAgICAgICAgICAgKCMjKSBUaGUgTENEIENvbnRyYXN0IHVzaW5nIHRoZSBfX0hBTF9MQ0RfQ09OVFJBU1RfQ09ORklHKCkgbWFjcm8gIAorCisgICAgICAoIykgV3JpdGUgdG8gdGhlIExDRCBSQU0gbWVtb3J5IHVzaW5nIHRoZSBIQUxfTENEX1dyaXRlKCkgQVBJLCB0aGlzIEFQSSBjYW4gYmUgY2FsbGVkCisgICAgICAgICAgc2V2ZXJhbCB0aW1lcyB0byB1cGRhdGUgdGhlIGRpZmZlcmVudCBMQ0QgUkFNIHJlZ2lzdGVycyBiZWZvcmUgY2FsbGluZyAKKyAgICAgICAgICBIQUxfTENEX1VwZGF0ZURpc3BsYXlSZXF1ZXN0KCkgQVBJLgorCisgICAgICAoIykgVGhlIEhBTF9MQ0RfQ2xlYXIoKSBBUEkgY2FuIGJlIHVzZWQgdG8gY2xlYXIgdGhlIExDRCBSQU0gbWVtb3J5LgorCisgICAgICAoIykgV2hlbiB0aGUgTENEIFJBTSBtZW1vcnkgaXMgdXBkYXRlZCwgZW5hYmxlIHRoZSB1cGRhdGUgZGlzcGxheSByZXF1ZXN0IGNhbGxpbmcKKyAgICAgICAgICB0aGUgSEFMX0xDRF9VcGRhdGVEaXNwbGF5UmVxdWVzdCgpIEFQSS4KKworICAgICAgWy4uXSBMQ0QgYW5kIGxvdyBwb3dlciBtb2RlczogVGhlIExDRCByZW1haW4gYWN0aXZlIGR1cmluZyBTVE9QIG1vZGUuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworI2lmIGRlZmluZWQgKFNUTTMyTDA1M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwNjN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KQorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0xDRF9NT0RVTEVfRU5BQkxFRAorCisvKiogQGFkZHRvZ3JvdXAgTENECisgICogQGJyaWVmIExDRCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIExDRF9Qcml2YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTENEX1RJTUVPVVRfVkFMVUUgICAgICAgICAgICAgMTAwMFUKKy8qKgorICAqIEB9CisgICovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgTENEX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBMQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorICAqCitAdmVyYmF0aW0gICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisgCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIExDRCBwZXJpcGhlcmFsLiAKKyAgKiBAcGFyYW0gIGhsY2QgTENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xDRF9EZUluaXQoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpCit7CisgIC8qIENoZWNrIHRoZSBMQ0QgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaGxjZCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9BTExfSU5TVEFOQ0UoaGxjZC0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayB0aGUgTENEIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaWYoaGxjZC0+U3RhdGUgPT0gSEFMX0xDRF9TVEFURV9CVVNZKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgaGxjZC0+U3RhdGUgPSBIQUxfTENEX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsICovCisgIF9fSEFMX0xDRF9ESVNBQkxFKGhsY2QpOworCisgIC8qRGlzYWJsZSBIaWdoZHJpdmUgYnkgZGVmYXVsdCovCisgIF9fSEFMX0xDRF9ISUdIRFJJVkVSX0RJU0FCTEUoaGxjZCk7CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX0xDRF9Nc3BEZUluaXQoaGxjZCk7CisgIAorICBobGNkLT5FcnJvckNvZGUgPSBIQUxfTENEX0VSUk9SX05PTkU7CisgIGhsY2QtPlN0YXRlID0gSEFMX0xDRF9TVEFURV9SRVNFVDsKKyAgICAKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhobGNkKTsKKyAgCisgIHJldHVybiBIQUxfT0s7ICAKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgTENEIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyAKKyAgKiAgICAgICAgIGluIHRoZSBMQ0RfSW5pdFN0cnVjdC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgb25seSB3aGVuIHRoZSBMQ0QgaXMgZGlzYWJsZWQuCisgICogICAgICAgICBUaGUgTENEIEhpZ2hEcml2ZSBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCB1c2luZyByZWxhdGVkIG1hY3JvcyB1cCB0byB1c2VyLgorICAqIEBwYXJhbSAgaGxjZCBMQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTENEX0luaXQoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDB4MDBVOworICB1aW50OF90IGNvdW50ZXIgPSAwVTsKKyAgICAKKyAgLyogQ2hlY2sgdGhlIExDRCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihobGNkID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MQ0RfQUxMX0lOU1RBTkNFKGhsY2QtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MQ0RfUFJFU0NBTEVSKGhsY2QtPkluaXQuUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MQ0RfRElWSURFUihobGNkLT5Jbml0LkRpdmlkZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9EVVRZKGhsY2QtPkluaXQuRHV0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTENEX0JJQVMoaGxjZC0+SW5pdC5CaWFzKSk7ICAKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9WT0xUQUdFX1NPVVJDRShobGNkLT5Jbml0LlZvbHRhZ2VTb3VyY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9QVUxTRV9PTl9EVVJBVElPTihobGNkLT5Jbml0LlB1bHNlT25EdXJhdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfTENEX0hJR0hEUklWRShobGNkLT5Jbml0LkhpZ2hEcml2ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTENEX0RFQURfVElNRShobGNkLT5Jbml0LkRlYWRUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19MQ0RfQ09OVFJBU1QoaGxjZC0+SW5pdC5Db250cmFzdCkpOyAKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9CTElOS19GUkVRVUVOQ1koaGxjZC0+SW5pdC5CbGlua0ZyZXF1ZW5jeSkpOyAKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9CTElOS19NT0RFKGhsY2QtPkluaXQuQmxpbmtNb2RlKSk7IAorICBhc3NlcnRfcGFyYW0oSVNfTENEX01VWFNFR01FTlQoaGxjZC0+SW5pdC5NdXhTZWdtZW50KSk7CisgIAorICBpZihobGNkLT5TdGF0ZSA9PSBIQUxfTENEX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIF9fSEFMX1VOTE9DSyhobGNkKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAoTVNQKSAqLworICAgIEhBTF9MQ0RfTXNwSW5pdChobGNkKTsKKyAgfQorICAKKyAgaGxjZC0+U3RhdGUgPSBIQUxfTENEX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsICovCisgIF9fSEFMX0xDRF9ESVNBQkxFKGhsY2QpOworICAKKyAgLyogQ2xlYXIgdGhlIExDRF9SQU0gcmVnaXN0ZXJzIGFuZCBlbmFibGUgdGhlIGRpc3BsYXkgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBVRFIgYml0CisgICAgIGluIHRoZSBMQ0RfU1IgcmVnaXN0ZXIgKi8KKyAgZm9yKGNvdW50ZXIgPSBMQ0RfUkFNX1JFR0lTVEVSMDsgY291bnRlciA8PSBMQ0RfUkFNX1JFR0lTVEVSMTU7IGNvdW50ZXIrKykKKyAgeworICAgIGhsY2QtPkluc3RhbmNlLT5SQU1bY291bnRlcl0gPSAwVTsKKyAgfQorICAvKiBFbmFibGUgdGhlIGRpc3BsYXkgcmVxdWVzdCAqLworICBTRVRfQklUKGhsY2QtPkluc3RhbmNlLT5TUiwgTENEX1NSX1VEUik7CisgIAorICAvKiBDb25maWd1cmUgdGhlIExDRCBQcmVzY2FsZXIsIERpdmlkZXIsIEJsaW5rIG1vZGUgYW5kIEJsaW5rIEZyZXF1ZW5jeTogCisgIFNldCBQU1szOjBdIGJpdHMgYWNjb3JkaW5nIHRvIGhsY2QtPkluaXQuUHJlc2NhbGVyIHZhbHVlIAorICAgICBTZXQgRElWWzM6MF0gYml0cyBhY2NvcmRpbmcgdG8gaGxjZC0+SW5pdC5EaXZpZGVyIHZhbHVlCisgICAgIFNldCBCTElOS1sxOjBdIGJpdHMgYWNjb3JkaW5nIHRvIGhsY2QtPkluaXQuQmxpbmtNb2RlIHZhbHVlCisgICAgIFNldCBCTElOS0ZbMjowXSBiaXRzIGFjY29yZGluZyB0byBobGNkLT5Jbml0LkJsaW5rRnJlcXVlbmN5IHZhbHVlCisgICAgIFNldCBERUFEWzI6MF0gYml0cyBhY2NvcmRpbmcgdG8gaGxjZC0+SW5pdC5EZWFkVGltZSB2YWx1ZQorICAgICBTZXQgUE9OWzI6MF0gYml0cyBhY2NvcmRpbmcgdG8gaGxjZC0+SW5pdC5QdWxzZU9uRHVyYXRpb24gdmFsdWUgCisgICAgIFNldCBDQ1syOjBdIGJpdHMgYWNjb3JkaW5nIHRvIGhsY2QtPkluaXQuQ29udHJhc3QgdmFsdWUKKyAgICAgU2V0IEhEWzBdIGJpdCBhY2NvcmRpbmcgdG8gaGxjZC0+SW5pdC5IaWdoRHJpdmUgdmFsdWUqLworCisgIE1PRElGWV9SRUcoaGxjZC0+SW5zdGFuY2UtPkZDUiwgXAorICAgICAgICAgICAgIChMQ0RfRkNSX1BTIHwgTENEX0ZDUl9ESVYgfCBMQ0RfRkNSX0JMSU5LfCBMQ0RfRkNSX0JMSU5LRiB8IFwKKyAgICAgICAgICAgICBMQ0RfRkNSX0RFQUQgfCBMQ0RfRkNSX1BPTiB8IExDRF9GQ1JfQ0MpLCBcCisgICAgICAgICAgICAgKGhsY2QtPkluaXQuUHJlc2NhbGVyIHwgaGxjZC0+SW5pdC5EaXZpZGVyIHwgaGxjZC0+SW5pdC5CbGlua01vZGUgfCBobGNkLT5Jbml0LkJsaW5rRnJlcXVlbmN5IHwgXAorICAgICAgICAgICAgIGhsY2QtPkluaXQuRGVhZFRpbWUgfCBobGNkLT5Jbml0LlB1bHNlT25EdXJhdGlvbiB8IGhsY2QtPkluaXQuQ29udHJhc3QgfCBobGNkLT5Jbml0LkhpZ2hEcml2ZSkpOworCisgIC8qIFdhaXQgdW50aWwgTENEIEZyYW1lIENvbnRyb2wgUmVnaXN0ZXIgU3luY2hyb25pemF0aW9uIGZsYWcgKEZDUlNGKSBpcyBzZXQgaW4gdGhlIExDRF9TUiByZWdpc3RlciAKKyAgICAgVGhpcyBiaXQgaXMgc2V0IGJ5IGhhcmR3YXJlIGVhY2ggdGltZSB0aGUgTENEX0ZDUiByZWdpc3RlciBpcyB1cGRhdGVkIGluIHRoZSBMQ0RDTEsKKyAgICAgZG9tYWluLiBJdCBpcyBjbGVhcmVkIGJ5IGhhcmR3YXJlIHdoZW4gd3JpdGluZyB0byB0aGUgTENEX0ZDUiByZWdpc3Rlci4qLworICBMQ0RfV2FpdEZvclN5bmNocm8oaGxjZCk7CisgIAorICAvKiBDb25maWd1cmUgdGhlIExDRCBEdXR5LCBCaWFzLCBWb2x0YWdlIFNvdXJjZSwgRGVhZCBUaW1lOgorICAgICBTZXQgRFVUWVsyOjBdIGJpdHMgYWNjb3JkaW5nIHRvIGhsY2QtPkluaXQuRHV0eSB2YWx1ZSAKKyAgICAgU2V0IEJJQVNbMTowXSBiaXRzIGFjY29yZGluZyB0byBobGNkLT5Jbml0LkJpYXMgdmFsdWUKKyAgICAgU2V0IFZTRUwgYml0IGFjY29yZGluZyB0byBobGNkLT5Jbml0LlZvbHRhZ2VTb3VyY2UgdmFsdWUKKyAgICAgU2V0IE1VWF9TRUcgYml0IGFjY29yZGluZyB0byBobGNkLT5Jbml0Lk11eFNlZ21lbnQgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhobGNkLT5JbnN0YW5jZS0+Q1IsIFwKKyAgICAgICAgICAgICAoTENEX0NSX0RVVFkgfCBMQ0RfQ1JfQklBUyB8IExDRF9DUl9WU0VMIHwgTENEX0NSX01VWF9TRUcpLCBcCisgICAgICAgICAgICAgKGhsY2QtPkluaXQuRHV0eSB8IGhsY2QtPkluaXQuQmlhcyB8IGhsY2QtPkluaXQuVm9sdGFnZVNvdXJjZSB8IGhsY2QtPkluaXQuTXV4U2VnbWVudCkpOworICAKKyAgLyogRW5hYmxlIHRoZSBwZXJpcGhlcmFsICovCisgIF9fSEFMX0xDRF9FTkFCTEUoaGxjZCk7CisgIAorICAvKiBHZXQgdGltZW91dCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgCisgIC8qIFdhaXQgVW50aWwgdGhlIExDRCBpcyBlbmFibGVkICovCisgIHdoaWxlKF9fSEFMX0xDRF9HRVRfRkxBRyhobGNkLCBMQ0RfRkxBR19FTlMpID09IFJFU0VUKQorICB7CisgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IExDRF9USU1FT1VUX1ZBTFVFKQorICAgIHsgCisgICAgICBobGNkLT5FcnJvckNvZGUgPSBIQUxfTENEX0VSUk9SX0VOUzsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9IAorICB9CisgIAorICAvKiBHZXQgdGltZW91dCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAKKyAgLyohPCBXYWl0IFVudGlsIHRoZSBMQ0QgQm9vc3RlciBpcyByZWFkeSAqLworICB3aGlsZShfX0hBTF9MQ0RfR0VUX0ZMQUcoaGxjZCwgTENEX0ZMQUdfUkRZKSA9PSBSRVNFVCkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBMQ0RfVElNRU9VVF9WQUxVRSkKKyAgICB7ICAgCisgICAgICBobGNkLT5FcnJvckNvZGUgPSBIQUxfTENEX0VSUk9SX1JEWTsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9IAorICB9CisgCisgIC8qIEluaXRpYWxpemUgdGhlIExDRCBzdGF0ZSAqLworICBobGNkLT5FcnJvckNvZGUgPSBIQUxfTENEX0VSUk9SX05PTkU7CisgIGhsY2QtPlN0YXRlPSBIQUxfTENEX1NUQVRFX1JFQURZOworICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBMQ0QgTVNQIERlSW5pdC4KKyAgKiBAcGFyYW0gIGhsY2QgTENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworIF9fd2VhayB2b2lkIEhBTF9MQ0RfTXNwRGVJbml0KExDRF9IYW5kbGVUeXBlRGVmICpobGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobGNkKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9MQ0RfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIExDRCBNU1AgSW5pdC4KKyAgKiBAcGFyYW0gIGhsY2QgTENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworIF9fd2VhayB2b2lkIEhBTF9MQ0RfTXNwSW5pdChMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxjZCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfTENEX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBMQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqICBAYnJpZWYgTENEIFJBTSBmdW5jdGlvbnMgCisgICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgWy4uXSBVc2luZyBpdHMgZG91YmxlIGJ1ZmZlciBtZW1vcnkgdGhlIExDRCBjb250cm9sbGVyIGVuc3VyZXMgdGhlIGNvaGVyZW5jeSBvZiB0aGUgCisgZGlzcGxheWVkIGluZm9ybWF0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBpbnRlcnJ1cHRzIHRvIGNvbnRyb2wgTENEX1JBTSAKKyBtb2RpZmljYXRpb24uCisgVGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGNhbiBhY2Nlc3MgdGhlIGZpcnN0IGJ1ZmZlciBsZXZlbCAoTENEX1JBTSkgdGhyb3VnaCAKKyB0aGUgQVBCIGludGVyZmFjZS4gT25jZSBpdCBoYXMgbW9kaWZpZWQgdGhlIExDRF9SQU0gdXNpbmcgdGhlIEhBTF9MQ0RfV3JpdGUoKSBBUEksCisgaXQgc2V0cyB0aGUgVURSIGZsYWcgaW4gdGhlIExDRF9TUiByZWdpc3RlciB1c2luZyB0aGUgSEFMX0xDRF9VcGRhdGVEaXNwbGF5UmVxdWVzdCgpIEFQSS4KKyBUaGlzIFVEUiBmbGFnICh1cGRhdGUgZGlzcGxheSByZXF1ZXN0KSByZXF1ZXN0cyB0aGUgdXBkYXRlZCBpbmZvcm1hdGlvbiB0byBiZSAKKyBtb3ZlZCBpbnRvIHRoZSBzZWNvbmQgYnVmZmVyIGxldmVsIChMQ0RfRElTUExBWSkuCisgVGhpcyBvcGVyYXRpb24gaXMgZG9uZSBzeW5jaHJvbm91c2x5IHdpdGggdGhlIGZyYW1lIChhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSAKKyBuZXh0IGZyYW1lKSwgdW50aWwgdGhlIHVwZGF0ZSBpcyBjb21wbGV0ZWQsIHRoZSBMQ0RfUkFNIGlzIHdyaXRlIHByb3RlY3RlZCBhbmQgCisgdGhlIFVEUiBmbGFnIHN0YXlzIGhpZ2guCisgT25jZSB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlZCBhbm90aGVyIGZsYWcgKFVERCAtIFVwZGF0ZSBEaXNwbGF5IERvbmUpIGlzIHNldCBhbmQKKyBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0IGlmIHRoZSBVRERJRSBiaXQgaW4gdGhlIExDRF9GQ1IgcmVnaXN0ZXIgaXMgc2V0LgorIFRoZSB0aW1lIGl0IHRha2VzIHRvIHVwZGF0ZSBMQ0RfRElTUExBWSBpcywgaW4gdGhlIHdvcnN0IGNhc2UsIG9uZSBvZGQgYW5kIG9uZSAKKyBldmVuIGZyYW1lLgorIFRoZSB1cGRhdGUgd2lsbCBub3Qgb2NjdXIgKFVEUiA9IDEgYW5kIFVERCA9IDApIHVudGlsIHRoZSBkaXNwbGF5IGlzIAorIGVuYWJsZWQgKExDREVOID0gMSkuCisgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGVzIGEgd29yZCBpbiB0aGUgc3BlY2lmaWMgTENEIFJBTS4KKyAgKiBAcGFyYW0gIGhsY2QgTENEIGhhbmRsZQorICAqIEBwYXJhbSAgUkFNUmVnaXN0ZXJJbmRleCBzcGVjaWZpZXMgdGhlIExDRCBSQU0gUmVnaXN0ZXIuCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIExDRF9SQU1fUkVHSVNURVIwOiBMQ0QgUkFNIFJlZ2lzdGVyIDAKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTogTENEIFJBTSBSZWdpc3RlciAxCisgICogICAgIEBhcmcgTENEX1JBTV9SRUdJU1RFUjI6IExDRCBSQU0gUmVnaXN0ZXIgMgorICAqICAgICBAYXJnIExDRF9SQU1fUkVHSVNURVIzOiBMQ0QgUkFNIFJlZ2lzdGVyIDMKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSNDogTENEIFJBTSBSZWdpc3RlciA0CisgICogICAgIEBhcmcgTENEX1JBTV9SRUdJU1RFUjU6IExDRCBSQU0gUmVnaXN0ZXIgNQorICAqICAgICBAYXJnIExDRF9SQU1fUkVHSVNURVI2OiBMQ0QgUkFNIFJlZ2lzdGVyIDYgCisgICogICAgIEBhcmcgTENEX1JBTV9SRUdJU1RFUjc6IExDRCBSQU0gUmVnaXN0ZXIgNyAgCisgICogICAgIEBhcmcgTENEX1JBTV9SRUdJU1RFUjg6IExDRCBSQU0gUmVnaXN0ZXIgOAorICAqICAgICBAYXJnIExDRF9SQU1fUkVHSVNURVI5OiBMQ0QgUkFNIFJlZ2lzdGVyIDkKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTA6IExDRCBSQU0gUmVnaXN0ZXIgMTAKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTE6IExDRCBSQU0gUmVnaXN0ZXIgMTEKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTI6IExDRCBSQU0gUmVnaXN0ZXIgMTIgCisgICogICAgIEBhcmcgTENEX1JBTV9SRUdJU1RFUjEzOiBMQ0QgUkFNIFJlZ2lzdGVyIDEzIAorICAqICAgICBAYXJnIExDRF9SQU1fUkVHSVNURVIxNDogTENEIFJBTSBSZWdpc3RlciAxNCAKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTU6IExDRCBSQU0gUmVnaXN0ZXIgMTUKKyAgKiBAcGFyYW0gIFJBTVJlZ2lzdGVyTWFzayBzcGVjaWZpZXMgdGhlIExDRCBSQU0gUmVnaXN0ZXIgRGF0YSBNYXNrLgorICAqIEBwYXJhbSAgRGF0YSBzcGVjaWZpZXMgTENEIERhdGEgVmFsdWUgdG8gYmUgd3JpdHRlbi4KKyAgKiBAbm90ZSAgIEZvciBMQ0QgZ2xhc3MgQ09NKlNFRyBhcyA4KjQwIGZvciBleGFtcGxlLCB0aGUgTENEIGNvbW1vbiB0ZXJtaW5hbHMgQ09NWzAsN10KKyAgKiAgICAgICAgIGFyZSBtYXBwZWQgb24gMzJiaXRzIExDRF9SQU1fUkVHSVNURVJbMCwxNF0gYWNjb3JkaW5nIHRvIHJ1bGVzOiBDT00obikgc3ByZWFkCisgICogIAkgICAgb24gTENEX1JBTV9SRUdJU1RFUigyKm4pIGFuZCAgTENEX1JBTV9SRUdJU1RFUigyKm4rMSkuVGhlIHNlZ21lbnQgdGVybWluYWxzIAorICAqCQkgICAgU0VHWzAsMzldIG9mIENPTShuKSBjb3JyZXNwb25kIHRvIExTQiBiaXRzIG9mIHJlbGF0ZWQgTENEX1JBTV9SRUdJU1RFUigyKm4pWzAsMzFdCisgICoJCSAgICBhbmQgTENEX1JBTV9SRUdJU1RFUigyKm4rMSlbMCw3XSAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MQ0RfV3JpdGUoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QsIHVpbnQzMl90IFJBTVJlZ2lzdGVySW5kZXgsIHVpbnQzMl90IFJBTVJlZ2lzdGVyTWFzaywgdWludDMyX3QgRGF0YSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gMHgwMFU7IAorICAKKyAgaWYoKGhsY2QtPlN0YXRlID09IEhBTF9MQ0RfU1RBVEVfUkVBRFkpIHx8IChobGNkLT5TdGF0ZSA9PSBIQUxfTENEX1NUQVRFX0JVU1kpKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfTENEX1JBTV9SRUdJU1RFUihSQU1SZWdpc3RlckluZGV4KSk7CisgICAgCisgICAgaWYoaGxjZC0+U3RhdGUgPT0gSEFMX0xDRF9TVEFURV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgICAgX19IQUxfTE9DSyhobGNkKTsKKyAgICAgIGhsY2QtPlN0YXRlID0gSEFMX0xDRF9TVEFURV9CVVNZOworICAgICAgCisgICAgICAvKiBHZXQgdGltZW91dCAqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgIAorICAgICAgLyohPCBXYWl0IFVudGlsIHRoZSBMQ0QgaXMgcmVhZHkgKi8KKyAgd2hpbGUoX19IQUxfTENEX0dFVF9GTEFHKGhsY2QsIExDRF9GTEFHX1VEUikgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IExDRF9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7IAorICAgICAgICAgIGhsY2QtPkVycm9yQ29kZSA9IEhBTF9MQ0RfRVJST1JfVURSOyAgICAgIAorICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGxjZCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9IAorICAgICAgfQorICAgIH0KKy8qIENvcHkgdGhlIG5ldyBEYXRhIGJ5dGVzIHRvIExDRCBSQU0gcmVnaXN0ZXIgKi8KKyAgICBNT0RJRllfUkVHKGhsY2QtPkluc3RhbmNlLT5SQU1bUkFNUmVnaXN0ZXJJbmRleF0sIH4oUkFNUmVnaXN0ZXJNYXNrKSwgRGF0YSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIENsZWFycyB0aGUgTENEIFJBTSByZWdpc3RlcnMuCisgICogQHBhcmFtIGhsY2Q6IExDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MQ0RfQ2xlYXIoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDB4MDBVOyAKKyAgdWludDMyX3QgY291bnRlciA9IDBVOworCisgIGlmKChobGNkLT5TdGF0ZSA9PSBIQUxfTENEX1NUQVRFX1JFQURZKSB8fCAoaGxjZC0+U3RhdGUgPT0gSEFMX0xDRF9TVEFURV9CVVNZKSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhobGNkKTsKKyAgICAKKyAgICBobGNkLT5TdGF0ZSA9IEhBTF9MQ0RfU1RBVEVfQlVTWTsKKyAgICAKKyAgICAvKiBHZXQgdGltZW91dCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgCisgICAgLyohPCBXYWl0IFVudGlsIHRoZSBMQ0QgaXMgcmVhZHkgKi8KKyAgICB3aGlsZShfX0hBTF9MQ0RfR0VUX0ZMQUcoaGxjZCwgTENEX0ZMQUdfVURSKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBpZiggKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTENEX1RJTUVPVVRfVkFMVUUpCisgICAgICB7IAorICAgICAgICBobGNkLT5FcnJvckNvZGUgPSBIQUxfTENEX0VSUk9SX1VEUjsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhobGNkKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9IAorICAgIH0KKyAgICAvKiBDbGVhciB0aGUgTENEX1JBTSByZWdpc3RlcnMgKi8KKyAgICBmb3IoY291bnRlciA9IExDRF9SQU1fUkVHSVNURVIwOyBjb3VudGVyIDw9IExDRF9SQU1fUkVHSVNURVIxNTsgY291bnRlcisrKQorICAgIHsKKyAgICAgIGhsY2QtPkluc3RhbmNlLT5SQU1bY291bnRlcl0gPSAwVTsKKyAgICB9CisgICAgCisgICAgLyogVXBkYXRlIHRoZSBMQ0QgZGlzcGxheSAqLworICAgIEhBTF9MQ0RfVXBkYXRlRGlzcGxheVJlcXVlc3QoaGxjZCk7ICAgICAKKyAgICAKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBVcGRhdGUgRGlzcGxheSBSZXF1ZXN0LgorICAqIEBwYXJhbSAgaGxjZCBMQ0QgaGFuZGxlCisgICogQG5vdGUgICBFYWNoIHRpbWUgc29mdHdhcmUgbW9kaWZpZXMgdGhlIExDRF9SQU0gaXQgbXVzdCBzZXQgdGhlIFVEUiBiaXQgdG8gCisgICogICAgICAgICB0cmFuc2ZlciB0aGUgdXBkYXRlZCBkYXRhIHRvIHRoZSBzZWNvbmQgbGV2ZWwgYnVmZmVyLiAKKyAgKiAgICAgICAgIFRoZSBVRFIgYml0IHN0YXlzIHNldCB1bnRpbCB0aGUgZW5kIG9mIHRoZSB1cGRhdGUgYW5kIGR1cmluZyB0aGlzIAorICAqICAgICAgICAgdGltZSB0aGUgTENEX1JBTSBpcyB3cml0ZSBwcm90ZWN0ZWQuIAorICAqIEBub3RlICAgV2hlbiB0aGUgZGlzcGxheSBpcyBkaXNhYmxlZCwgdGhlIHVwZGF0ZSBpcyBwZXJmb3JtZWQgZm9yIGFsbCAKKyAgKiAgICAgICAgIExDRF9ESVNQTEFZIGxvY2F0aW9ucy4KKyAgKiAgICAgICAgIFdoZW4gdGhlIGRpc3BsYXkgaXMgZW5hYmxlZCwgdGhlIHVwZGF0ZSBpcyBwZXJmb3JtZWQgb25seSBmb3IgbG9jYXRpb25zIAorICAqICAgICAgICAgZm9yIHdoaWNoIGNvbW1vbnMgYXJlIGFjdGl2ZSAoZGVwZW5kaW5nIG9uIERVVFkpLiBGb3IgZXhhbXBsZSBpZiAKKyAgKiAgICAgICAgIERVVFkgPSAxLzIsIG9ubHkgdGhlIExDRF9ESVNQTEFZIG9mIENPTTAgYW5kIENPTTEgd2lsbCBiZSB1cGRhdGVkLiAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MQ0RfVXBkYXRlRGlzcGxheVJlcXVlc3QoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IDB4MDBVOworICAKKyAgLyogQ2xlYXIgdGhlIFVwZGF0ZSBEaXNwbGF5IERvbmUgZmxhZyBiZWZvcmUgc3RhcnRpbmcgdGhlIHVwZGF0ZSBkaXNwbGF5IHJlcXVlc3QgKi8KKyAgX19IQUxfTENEX0NMRUFSX0ZMQUcoaGxjZCwgTENEX0ZMQUdfVUREKTsKKyAgCisgIC8qIEVuYWJsZSB0aGUgZGlzcGxheSByZXF1ZXN0ICovCisgIGhsY2QtPkluc3RhbmNlLT5TUiB8PSBMQ0RfU1JfVURSOworICAKKyAgLyogR2V0IHRpbWVvdXQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgCisgIC8qITwgV2FpdCBVbnRpbCB0aGUgTENEIGRpc3BsYXkgaXMgZG9uZSAqLworICB3aGlsZShfX0hBTF9MQ0RfR0VUX0ZMQUcoaGxjZCwgTENEX0ZMQUdfVUREKSA9PSBSRVNFVCkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBMQ0RfVElNRU9VVF9WQUxVRSkKKyAgICB7IAorICAgICAgaGxjZC0+RXJyb3JDb2RlID0gSEFMX0xDRF9FUlJPUl9VREQ7CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhobGNkKTsKKyAgCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgaGxjZC0+U3RhdGUgPSBIQUxfTENEX1NUQVRFX1JFQURZOworICAKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGxjZCk7CisgIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgTENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiAgQGJyaWVmICAgTENEIFN0YXRlIGZ1bmN0aW9ucyAKKyAgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIExDRDoKKyAgICAgICgrKSBIQUxfTENEX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZSBvZiB0aGUgTENEIHBlcmlwaGVyYWwgU3RhdGUuIAorICAgICAgKCspIEhBTF9MQ0RfR2V0RXJyb3IoKSBBUEkgdG8gcmV0dXJuIHRoZSBMQ0QgZXJyb3IgY29kZS4gCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgUmV0dXJucyB0aGUgTENEIHN0YXRlLgorICAqIEBwYXJhbSBobGNkOiBMQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9MQ0RfU3RhdGVUeXBlRGVmIEhBTF9MQ0RfR2V0U3RhdGUoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpCit7CisgIHJldHVybiBobGNkLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgTENEIGVycm9yIGNvZGUKKyAgKiBAcGFyYW0gaGxjZDogTENEIGhhbmRsZQorICAqIEByZXR2YWwgTENEIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9MQ0RfR2V0RXJyb3IoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpCit7CisgIHJldHVybiBobGNkLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBhZGR0b2dyb3VwIExDRF9Qcml2YXRlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXYWl0cyB1bnRpbCB0aGUgTENEIEZDUiByZWdpc3RlciBpcyBzeW5jaHJvbml6ZWQgaW4gdGhlIExDRENMSyBkb21haW4uCisgICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFueSB3cml0ZSBvcGVyYXRpb24gdG8gTENEX0ZDUiByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIGhsY2QgTENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgTENEX1dhaXRGb3JTeW5jaHJvKExDRF9IYW5kbGVUeXBlRGVmICpobGNkKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAweDAwVTsgCisgIAorICAvKiBHZXQgdGltZW91dCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIExvb3AgdW50aWwgRkNSU0YgZmxhZyBpcyBzZXQgKi8KKyAgd2hpbGUoX19IQUxfTENEX0dFVF9GTEFHKGhsY2QsIExDRF9GTEFHX0ZDUlNGKSA9PSBSRVNFVCkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IExDRF9USU1FT1VUX1ZBTFVFKQorICAgIHsgICAgICAgCisgICAgICBobGNkLT5FcnJvckNvZGUgPSBIQUxfTENEX0VSUk9SX0ZDUlNGOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0gCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfTENEX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qICNpZiBkZWZpbmVkIChTVE0zMkwwNTN4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDYzeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkIChTVE0zMkwwODN4eCkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsX2xwdGltLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9scHRpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YWUyM2IKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9scHRpbS5jCkBAIC0wLDAgKzEsMjEwOSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfbHB0aW0uYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgTFBUSU0gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgTG93IFBvd2VyIFRpbWVyIChMUFRJTSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorICAqICAgICAgICAgICArIFN0YXJ0L1N0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucyBpbiBwb2xsaW5nIG1vZGUuCisgICogICAgICAgICAgICsgU3RhcnQvU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zIGluIGludGVycnVwdCBtb2RlLgorICAqICAgICAgICAgICArIFJlYWRpbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucy4KKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBMUFRJTSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKUluaXRpYWxpemUgdGhlIExQVElNIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZQorICAgICAgICBIQUxfTFBUSU1fTXNwSW5pdCgpOgorICAgICAgICAgKCsrKSBFbmFibGUgdGhlIExQVElNIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfTFBUSU14X0NMS19FTkFCTEUoKS4KKyAgICAgICAgICgrKykgSW4gY2FzZSBvZiB1c2luZyBpbnRlcnJ1cHRzIChlLmcuIEhBTF9MUFRJTV9QV01fU3RhcnRfSVQoKSk6CisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBMUFRJTSBpbnRlcnJ1cHQgcHJpb3JpdHkgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKS4KKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIExQVElNIElSUSBoYW5kbGVyIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpLgorICAgICAgICAgICAgICgrKyspIEluIExQVElNIElSUSBoYW5kbGVyLCBjYWxsIEhBTF9MUFRJTV9JUlFIYW5kbGVyKCkuCisKKyAgICAgICgjKUluaXRpYWxpemUgdGhlIExQVElNIEhBTCB1c2luZyBIQUxfTFBUSU1fSW5pdCgpLiBUaGlzIGZ1bmN0aW9uCisgICAgICAgICBjb25maWd1cmVzIG1haW5seToKKyAgICAgICAgICgrKykgVGhlIGluc3RhbmNlOiBMUFRJTTEuCisgICAgICAgICAoKyspIENsb2NrOiB0aGUgY291bnRlciBjbG9jay4KKyAgICAgICAgICAgICAoKysrKSBTb3VyY2UgICA6IGl0IGNhbiBiZSBlaXRoZXIgdGhlIFVMUFRJTSBpbnB1dCAoSU4xKSBvciBvbmUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBjbG9jazsgKEFQQiwgTFNFLCBMU0kgb3IgTVNJKS4KKyAgICAgICAgICAgICAoKysrKSBQcmVzY2FsZXI6IHNlbGVjdCB0aGUgY2xvY2sgZGl2aWRlci4KKyAgICAgICAgICgrKykgIFVsdHJhTG93UG93ZXJDbG9jayA6IFRvIGJlIHVzZWQgb25seSBpZiB0aGUgVUxQVElNIGlzIHNlbGVjdGVkCisgICAgICAgICAgICAgICBhcyBjb3VudGVyIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAoKysrKSBQb2xhcml0eTogICBwb2xhcml0eSBvZiB0aGUgYWN0aXZlIGVkZ2UgZm9yIHRoZSBjb3VudGVyIHVuaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgVUxQVElNIGlucHV0IGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICgrKyspIFNhbXBsZVRpbWU6IGNsb2NrIHNhbXBsaW5nIHRpbWUgdG8gY29uZmlndXJlIHRoZSBjbG9jayBnbGl0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuCisgICAgICAgICAoKyspIFRyaWdnZXI6IEhvdyB0aGUgY291bnRlciBzdGFydC4KKyAgICAgICAgICAgICAoKysrKSBTb3VyY2U6IHRyaWdnZXIgY2FuIGJlIHNvZnR3YXJlIG9yIG9uZSBvZiB0aGUgaGFyZHdhcmUgdHJpZ2dlcnMuCisgICAgICAgICAgICAgKCsrKykgQWN0aXZlRWRnZSA6IG9ubHkgZm9yIGhhcmR3YXJlIHRyaWdnZXIuCisgICAgICAgICAgICAgKCsrKykgU2FtcGxlVGltZSA6IHRyaWdnZXIgc2FtcGxpbmcgdGltZSB0byBjb25maWd1cmUgdGhlIHRyaWdnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xpdGNoIGZpbHRlci4KKyAgICAgICAgICgrKykgT3V0cHV0UG9sYXJpdHkgOiAyIG9wcG9zaXRlIHBvbGFyaXRpZXMgYXJlIHBvc3NpYmxlLgorICAgICAgICAgKCsrKSBVcGRhdGVNb2RlOiBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBkYXRlIG9mIHRoZSBhdXRvcmVsb2FkIGFuZAorICAgICAgICAgICAgICB0aGUgY29tcGFyZSB2YWx1ZXMgaXMgZG9uZSBpbW1lZGlhdGVseSBvciBhZnRlciB0aGUgZW5kIG9mIGN1cnJlbnQKKyAgICAgICAgICAgICAgcGVyaW9kLgorCisgICAgICAoIylTaXggbW9kZXMgYXJlIGF2YWlsYWJsZToKKworICAgICAgICAgKCsrKSBQV00gTW9kZTogVG8gZ2VuZXJhdGUgYSBQV00gc2lnbmFsIHdpdGggc3BlY2lmaWVkIHBlcmlvZCBhbmQgcHVsc2UsCisgICAgICAgICBjYWxsIEhBTF9MUFRJTV9QV01fU3RhcnQoKSBvciBIQUxfTFBUSU1fUFdNX1N0YXJ0X0lUKCkgZm9yIGludGVycnVwdGlvbgorICAgICAgICAgbW9kZS4KKworICAgICAgICAgKCsrKSBPbmUgUHVsc2UgTW9kZTogVG8gZ2VuZXJhdGUgcHVsc2Ugd2l0aCBzcGVjaWZpZWQgd2lkdGggaW4gcmVzcG9uc2UKKyAgICAgICAgIHRvIGEgc3RpbXVsdXMsIGNhbGwgSEFMX0xQVElNX09uZVB1bHNlX1N0YXJ0KCkgb3IKKyAgICAgICAgIEhBTF9MUFRJTV9PbmVQdWxzZV9TdGFydF9JVCgpIGZvciBpbnRlcnJ1cHRpb24gbW9kZS4KKworICAgICAgICAgKCsrKSBTZXQgb25jZSBNb2RlOiBJbiB0aGlzIG1vZGUsIHRoZSBvdXRwdXQgY2hhbmdlcyB0aGUgbGV2ZWwgKGZyb20KKyAgICAgICAgIGxvdyBsZXZlbCB0byBoaWdoIGxldmVsIGlmIHRoZSBvdXRwdXQgcG9sYXJpdHkgaXMgY29uZmlndXJlZCBoaWdoLCBlbHNlCisgICAgICAgICB0aGUgb3Bwb3NpdGUpIHdoZW4gYSBjb21wYXJlIG1hdGNoIG9jY3Vycy4gVG8gc3RhcnQgdGhpcyBtb2RlLCBjYWxsCisgICAgICAgICBIQUxfTFBUSU1fU2V0T25jZV9TdGFydCgpIG9yIEhBTF9MUFRJTV9TZXRPbmNlX1N0YXJ0X0lUKCkgZm9yCisgICAgICAgICBpbnRlcnJ1cHRpb24gbW9kZS4KKworICAgICAgICAgKCsrKSBFbmNvZGVyIE1vZGU6IFRvIHVzZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgY2FsbAorICAgICAgICAgSEFMX0xQVElNX0VuY29kZXJfU3RhcnQoKSBvciBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydF9JVCgpIGZvcgorICAgICAgICAgaW50ZXJydXB0aW9uIG1vZGUuIE9ubHkgYXZhaWxhYmxlIGZvciBMUFRJTTEgaW5zdGFuY2UuCisKKyAgICAgICAgICgrKykgVGltZSBvdXQgTW9kZTogYW4gYWN0aXZlIGVkZ2Ugb24gb25lIHNlbGVjdGVkIHRyaWdnZXIgaW5wdXQgcmVzdHMKKyAgICAgICAgIHRoZSBjb3VudGVyLiBUaGUgZmlyc3QgdHJpZ2dlciBldmVudCB3aWxsIHN0YXJ0IHRoZSB0aW1lciwgYW55CisgICAgICAgICBzdWNjZXNzaXZlIHRyaWdnZXIgZXZlbnQgd2lsbCByZXNldCB0aGUgY291bnRlciBhbmQgdGhlIHRpbWVyIHdpbGwKKyAgICAgICAgIHJlc3RhcnQuIFRvIHN0YXJ0IHRoaXMgbW9kZSBjYWxsIEhBTF9MUFRJTV9UaW1lT3V0X1N0YXJ0X0lUKCkgb3IKKyAgICAgICAgIEhBTF9MUFRJTV9UaW1lT3V0X1N0YXJ0X0lUKCkgZm9yIGludGVycnVwdGlvbiBtb2RlLgorCisgICAgICAgICAoKyspIENvdW50ZXIgTW9kZTogY291bnRlciBjYW4gYmUgdXNlZCB0byBjb3VudCBleHRlcm5hbCBldmVudHMgb24KKyAgICAgICAgIHRoZSBMUFRJTSBJbnB1dDEgb3IgaXQgY2FuIGJlIHVzZWQgdG8gY291bnQgaW50ZXJuYWwgY2xvY2sgY3ljbGVzLgorICAgICAgICAgVG8gc3RhcnQgdGhpcyBtb2RlLCBjYWxsIEhBTF9MUFRJTV9Db3VudGVyX1N0YXJ0KCkgb3IKKyAgICAgICAgIEhBTF9MUFRJTV9Db3VudGVyX1N0YXJ0X0lUKCkgZm9yIGludGVycnVwdGlvbiBtb2RlLgorCisKKyAgICAgICgjKSBVc2VyIGNhbiBzdG9wIGFueSBwcm9jZXNzIGJ5IGNhbGxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgQVBJOgorICAgICAgICAgIEhBTF9MUFRJTV9YeHhfU3RvcCgpIG9yIEhBTF9MUFRJTV9YeHhfU3RvcF9JVCgpIGlmIHRoZSBwcm9jZXNzIGlzCisgICAgICAgICAgYWxyZWFkeSBzdGFydGVkIGluIGludGVycnVwdGlvbiBtb2RlLgorCisgICAgICAoIykgRGUtaW5pdGlhbGl6ZSB0aGUgTFBUSU0gcGVyaXBoZXJhbCB1c2luZyBIQUxfTFBUSU1fRGVJbml0KCkuCisKKyAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrLgorICBAcmVmIEhBTF9MUFRJTV9SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICB0aGUgQ2FsbGJhY2sgSUQgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKworICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfTFBUSU1fVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUKKyAgZGVmYXVsdCB3ZWFrIGZ1bmN0aW9uLgorICBAcmVmIEhBTF9MUFRJTV9VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICBhbmQgdGhlIENhbGxiYWNrIElELgorCisgIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyB0byByZWdpc3Rlci91bnJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisKKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgOiBMUFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICA6IExQVElNIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgQ29tcGFyZU1hdGNoQ2FsbGJhY2sgICAgOiBDb21wYXJlIG1hdGNoIENhbGxiYWNrLgorICAgICgrKSBBdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayA6IEF1dG8tcmVsb2FkIG1hdGNoIENhbGxiYWNrLgorICAgICgrKSBUcmlnZ2VyQ2FsbGJhY2sgICAgICAgICA6IEV4dGVybmFsIHRyaWdnZXIgZXZlbnQgZGV0ZWN0aW9uIENhbGxiYWNrLgorICAgICgrKSBDb21wYXJlV3JpdGVDYWxsYmFjayAgICA6IENvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrIDogQXV0by1yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIERpcmVjdGlvblVwQ2FsbGJhY2sgICAgIDogVXAtY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjay4KKyAgICAoKykgRGlyZWN0aW9uRG93bkNhbGxiYWNrICAgOiBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2suCisKKyAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEluaXQgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9MUFRJTV9TVEFURV9SRVNFVAorICBhbGwgaW50ZXJydXB0IGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICBleGFtcGxlcyBAcmVmIEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2soKSwgQHJlZiBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2soKS4KKworICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsKKyAgZnVuY3Rpb25hbGl0aWVzIGluIHRoZSBJbml0L0RlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsCisgIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4gSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBJbml0L0RlSW5pdAorICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCisKKyAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfTFBUSU1fU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgaW4gSEFMX0xQVElNX1NUQVRFX1JFQURZIG9yIEhBTF9MUFRJTV9TVEFURV9SRVNFVCBzdGF0ZSwKKyAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICB1c2luZyBAcmVmIEhBTF9MUFRJTV9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgRGVJbml0IG9yIEluaXQgZnVuY3Rpb24uCisKKyAgV2hlbiBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIExQVElNIExQVElNCisgICogQGJyaWVmIExQVElNIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQKKworI2lmIGRlZmluZWQgKExQVElNMSkKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUSU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDBVTCAvKiBUaW1lb3V0IGlzIDFzICovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3N0YXRpYyB2b2lkIExQVElNX1Jlc2V0Q2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqbHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zIExQVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEluaXRpYWxpemUgdGhlIExQVElNIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCisgICAgICAgICAgTFBUSU1fSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBMUFRJTSBNU1AuCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBMUFRJTSBNU1AuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgTFBUSU0gYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUKKyAgKiAgICAgICAgIExQVElNX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Jbml0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgdWludDMyX3QgdG1wY2ZncjsKKworICAvKiBDaGVjayB0aGUgTFBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhscHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1NPVVJDRShobHB0aW0tPkluaXQuQ2xvY2suU291cmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVIoaGxwdGltLT5Jbml0LkNsb2NrLlByZXNjYWxlcikpOworICBpZiAoKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UpID09IExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DTE9DS19QT0xBUklUWShobHB0aW0tPkluaXQuVWx0cmFMb3dQb3dlckNsb2NrLlBvbGFyaXR5KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1NBTVBMRV9USU1FKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suU2FtcGxlVGltZSkpOworICB9CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9UUkdfU09VUkNFKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkpOworICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9UUklHX1NBTVBMRV9USU1FKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNhbXBsZVRpbWUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fRVhUX1RSR19QT0xBUklUWShobHB0aW0tPkluaXQuVHJpZ2dlci5BY3RpdmVFZGdlKSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX09VVFBVVF9QT0xBUklUWShobHB0aW0tPkluaXQuT3V0cHV0UG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1VQREFURV9NT0RFKGhscHRpbS0+SW5pdC5VcGRhdGVNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DT1VOVEVSX1NPVVJDRShobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSkpOworCisgIGlmIChobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBobHB0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICAgIExQVElNX1Jlc2V0Q2FsbGJhY2soaGxwdGltKTsKKworICAgIGlmIChobHB0aW0tPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhscHRpbS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0xQVElNX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBobHB0aW0tPk1zcEluaXRDYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIEhBTF9MUFRJTV9Nc3BJbml0KGhscHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIENoYW5nZSB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIEdldCB0aGUgTFBUSU14IENGR1IgdmFsdWUgKi8KKyAgdG1wY2ZnciA9IGhscHRpbS0+SW5zdGFuY2UtPkNGR1I7CisKKyAgaWYgKCgoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSkgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSB8fCAoKGhscHRpbS0+SW5pdC5Db3VudGVyU291cmNlKSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKyAgeworICAgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+KExQVElNX0NGR1JfQ0tQT0wgfCBMUFRJTV9DRkdSX0NLRkxUKSk7CisgIH0KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIHsKKyAgICB0bXBjZmdyICY9ICh1aW50MzJfdCkofihMUFRJTV9DRkdSX1RSR0ZMVCB8IExQVElNX0NGR1JfVFJJR1NFTCkpOworICB9CisKKyAgLyogQ2xlYXIgQ0tTRUwsIENLUE9MLCBQUkVTQywgVFJJR0VOLCBUUkdGTFQsIFdBVlBPTCwgUFJFTE9BRCAmIENPVU5UTU9ERSBiaXRzICovCisgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+KExQVElNX0NGR1JfQ0tTRUwgfCBMUFRJTV9DRkdSX0NLUE9MIHwgTFBUSU1fQ0ZHUl9UUklHRU4gfCBMUFRJTV9DRkdSX1BSRUxPQUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1dBVlBPTCB8IExQVElNX0NGR1JfUFJFU0MgfCBMUFRJTV9DRkdSX0NPVU5UTU9ERSkpOworCisgIC8qIFNldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCisgIHRtcGNmZ3IgfD0gKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgICAgfAorICAgICAgICAgICAgICBobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyIHwKKyAgICAgICAgICAgICAgaGxwdGltLT5Jbml0Lk91dHB1dFBvbGFyaXR5ICB8CisgICAgICAgICAgICAgIGhscHRpbS0+SW5pdC5VcGRhdGVNb2RlICAgICAgfAorICAgICAgICAgICAgICBobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSk7CisKKyAgaWYgKCgoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSkgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSB8fCAoKGhscHRpbS0+SW5pdC5Db3VudGVyU291cmNlKSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKyAgeworICAgIHRtcGNmZ3IgfD0gKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHkgfAorICAgICAgICAgICAgICAgIGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suU2FtcGxlVGltZSk7CisgIH0KKworICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIC8qIEVuYWJsZSBFeHRlcm5hbCB0cmlnZ2VyIGFuZCBzZXQgdGhlIHRyaWdnZXIgc291cmNlICovCisgICAgdG1wY2ZnciB8PSAoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlICAgICB8CisgICAgICAgICAgICAgICAgaGxwdGltLT5Jbml0LlRyaWdnZXIuQWN0aXZlRWRnZSB8CisgICAgICAgICAgICAgICAgaGxwdGltLT5Jbml0LlRyaWdnZXIuU2FtcGxlVGltZSk7CisgIH0KKworICAvKiBXcml0ZSB0byBMUFRJTXggQ0ZHUiAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSID0gdG1wY2ZncjsKKworICAvKiBDaGFuZ2UgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9EZUluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgTFBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhscHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoYW5nZSB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIExQVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0xQVElNX01zcERlSW5pdDsKKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQy4qLworICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrKGhscHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMuKi8KKyAgSEFMX0xQVElNX01zcERlSW5pdChobHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGxwdGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgTFBUSU0gTVNQLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX01zcEluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobHB0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSBMUFRJTSBNU1AuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTFBUSU1fTXNwRGVJbml0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgTFBUSU0gU3RhcnQtU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgU3RhcnQtU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBMUFRJTSBTdGFydCBTdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTdGFydCB0aGUgUFdNIG1vZGUuCisgICAgICAoKykgU3RvcCB0aGUgUFdNIG1vZGUuCisgICAgICAoKykgU3RhcnQgdGhlIE9uZSBwdWxzZSBtb2RlLgorICAgICAgKCspIFN0b3AgdGhlIE9uZSBwdWxzZSBtb2RlLgorICAgICAgKCspIFN0YXJ0IHRoZSBTZXQgb25jZSBtb2RlLgorICAgICAgKCspIFN0b3AgdGhlIFNldCBvbmNlIG1vZGUuCisgICAgICAoKykgU3RhcnQgdGhlIEVuY29kZXIgbW9kZS4KKyAgICAgICgrKSBTdG9wIHRoZSBFbmNvZGVyIG1vZGUuCisgICAgICAoKykgU3RhcnQgdGhlIFRpbWVvdXQgbW9kZS4KKyAgICAgICgrKSBTdG9wIHRoZSBUaW1lb3V0IG1vZGUuCisgICAgICAoKykgU3RhcnQgdGhlIENvdW50ZXIgbW9kZS4KKyAgICAgICgrKSBTdG9wIHRoZSBDb3VudGVyIG1vZGUuCisKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9QV01fU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoUHVsc2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBSZXNldCBXQVZFIGJpdCB0byBzZXQgUFdNIG1vZGUgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9XQVZFOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBMUFRJTSBQV00gZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9QV01fU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYKKyAgKiBAcGFyYW0gIFB1bHNlIFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BVTFNFKFB1bHNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogUmVzZXQgV0FWRSBiaXQgdG8gc2V0IFBXTSBtb2RlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfV0FWRTsKKworICAvKiBFbmFibGUgQXV0b3JlbG9hZCB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOworCisgIC8qIEVuYWJsZSBDb21wYXJlIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBPSyk7CisKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk0pOworCisgIC8qIEVuYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKKworICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSBpcyB1c2VkLCB0aGVuIGVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLworICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLworICAgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0VYVFRSSUcpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCisgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7CisKKyAgLyogTG9hZCB0aGUgcHVsc2UgdmFsdWUgaW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoaGxwdGltLCBQdWxzZSk7CisKKyAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIExQVElNIFBXTSBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1BXTV9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7CisKKyAgLyogRGlzYWJsZSBDb21wYXJlIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOworCisgIC8qIERpc2FibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk0pOworCisgIC8qIERpc2FibGUgQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworCisgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgc291cmNlIGlzIHVzZWQsIHRoZW4gZGlzYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLworICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIC8qIERpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7CisgIH0KKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBPbmUgcHVsc2UgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcGFyYW0gIFB1bHNlIFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX09uZVB1bHNlX1N0YXJ0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BVTFNFKFB1bHNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogUmVzZXQgV0FWRSBiaXQgdG8gc2V0IG9uZSBwdWxzZSBtb2RlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfV0FWRTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CisKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKworICAvKiBMb2FkIHRoZSBwdWxzZSB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFB1bHNlKTsKKworICAvKiBTdGFydCB0aW1lciBpbiBzaW5nbGUgKG9uZSBzaG90KSBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX1NJTkdMRShobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gT25lIHB1bHNlIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fT25lUHVsc2VfU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gT25lIHB1bHNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9PbmVQdWxzZV9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIFJlc2V0IFdBVkUgYml0IHRvIHNldCBvbmUgcHVsc2UgbW9kZSAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1dBVkU7CisKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk9LKTsKKworICAvKiBFbmFibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOworCisgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKworICAvKiBFbmFibGUgQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QTSk7CisKKyAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBlbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIHsKKyAgICAvKiBFbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9FWFRUUklHKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIHNpbmdsZSAob25lIHNob3QpIG1vZGUgKi8KKyAgX19IQUxfTFBUSU1fU1RBUlRfU0lOR0xFKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBMUFRJTSBPbmUgcHVsc2UgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9PbmVQdWxzZV9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7CisKKyAgLyogRGlzYWJsZSBDb21wYXJlIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOworCisgIC8qIERpc2FibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk0pOworCisgIC8qIERpc2FibGUgQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworCisgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgc291cmNlIGlzIHVzZWQsIHRoZW4gZGlzYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLworICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIC8qIERpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7CisgIH0KKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBpbiBTZXQgb25jZSBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEBwYXJhbSAgUHVsc2UgU3BlY2lmaWVzIHRoZSBjb21wYXJlIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fU2V0T25jZV9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIFNldCBXQVZFIGJpdCB0byBlbmFibGUgdGhlIHNldCBvbmNlIG1vZGUgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiB8PSBMUFRJTV9DRkdSX1dBVkU7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCisgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7CisKKyAgLyogTG9hZCB0aGUgcHVsc2UgdmFsdWUgaW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoaGxwdGltLCBQdWxzZSk7CisKKyAgLyogU3RhcnQgdGltZXIgaW4gc2luZ2xlIChvbmUgc2hvdCkgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9TSU5HTEUoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIExQVElNIFNldCBvbmNlIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fU2V0T25jZV9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBTZXQgb25jZSBtb2RlIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEBwYXJhbSAgUHVsc2UgU3BlY2lmaWVzIHRoZSBjb21wYXJlIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fU2V0T25jZV9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIFNldCBXQVZFIGJpdCB0byBlbmFibGUgdGhlIHNldCBvbmNlIG1vZGUgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiB8PSBMUFRJTV9DRkdSX1dBVkU7CisKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk9LKTsKKworICAvKiBFbmFibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOworCisgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKworICAvKiBFbmFibGUgQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QTSk7CisKKyAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBlbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIHsKKyAgICAvKiBFbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9FWFRUUklHKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIHNpbmdsZSAob25lIHNob3QpIG1vZGUgKi8KKyAgX19IQUxfTFBUSU1fU1RBUlRfU0lOR0xFKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBMUFRJTSBTZXQgb25jZSBtb2RlIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1NldE9uY2VfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOworCisgIC8qIERpc2FibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE9LKTsKKworICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKworICAvKiBEaXNhYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKKworICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSBpcyB1c2VkLCB0aGVuIGRpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIHsKKyAgICAvKiBEaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0VYVFRSSUcpOworICB9CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgRW5jb2RlciBpbnRlcmZhY2UuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCkKK3sKKyAgdWludDMyX3QgICAgICAgICAgdG1wY2ZncjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9BUEJDTE9DS19MUE9TQyk7CisgIGFzc2VydF9wYXJhbShobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyID09IExQVElNX1BSRVNDQUxFUl9ESVYxKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHkpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIExQVElNeCBDRkdSIHZhbHVlICovCisgIHRtcGNmZ3IgPSBobHB0aW0tPkluc3RhbmNlLT5DRkdSOworCisgIC8qIENsZWFyIENLUE9MIGJpdHMgKi8KKyAgdG1wY2ZnciAmPSAodWludDMyX3QpKH5MUFRJTV9DRkdSX0NLUE9MKTsKKworICAvKiBTZXQgSW5wdXQgcG9sYXJpdHkgKi8KKyAgdG1wY2ZnciB8PSAgaGxwdGltLT5Jbml0LlVsdHJhTG93UG93ZXJDbG9jay5Qb2xhcml0eTsKKworICAvKiBXcml0ZSB0byBMUFRJTXggQ0ZHUiAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSID0gdG1wY2ZncjsKKworICAvKiBTZXQgRU5DIGJpdCB0byBlbmFibGUgdGhlIGVuY29kZXIgaW50ZXJmYWNlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgfD0gTFBUSU1fQ0ZHUl9FTkM7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCisgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7CisKKyAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIEVuY29kZXIgaW50ZXJmYWNlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0VuY29kZXJfU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgLyogUmVzZXQgRU5DIGJpdCB0byBkaXNhYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX0VOQzsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBFbmNvZGVyIGludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9FbmNvZGVyX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kKQoreworICB1aW50MzJfdCAgICAgICAgICB0bXBjZmdyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShobHB0aW0tPkluaXQuQ2xvY2suU291cmNlID09IExQVElNX0NMT0NLU09VUkNFX0FQQkNMT0NLX0xQT1NDKTsKKyAgYXNzZXJ0X3BhcmFtKGhscHRpbS0+SW5pdC5DbG9jay5QcmVzY2FsZXIgPT0gTFBUSU1fUFJFU0NBTEVSX0RJVjEpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfUE9MQVJJVFkoaGxwdGltLT5Jbml0LlVsdHJhTG93UG93ZXJDbG9jay5Qb2xhcml0eSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIENvbmZpZ3VyZSBlZGdlIHNlbnNpdGl2aXR5IGZvciBlbmNvZGVyIG1vZGUgKi8KKyAgLyogR2V0IHRoZSBMUFRJTXggQ0ZHUiB2YWx1ZSAqLworICB0bXBjZmdyID0gaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUjsKKworICAvKiBDbGVhciBDS1BPTCBiaXRzICovCisgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+TFBUSU1fQ0ZHUl9DS1BPTCk7CisKKyAgLyogU2V0IElucHV0IHBvbGFyaXR5ICovCisgIHRtcGNmZ3IgfD0gIGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHk7CisKKyAgLyogV3JpdGUgdG8gTFBUSU14IENGR1IgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiA9IHRtcGNmZ3I7CisKKyAgLyogU2V0IEVOQyBiaXQgdG8gZW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSIHw9IExQVElNX0NGR1JfRU5DOworCisgIC8qIEVuYWJsZSAic3dpdGNoIHRvIGRvd24gZGlyZWN0aW9uIiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRE9XTik7CisKKyAgLyogRW5hYmxlICJzd2l0Y2ggdG8gdXAgZGlyZWN0aW9uIiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfVVApOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBFbmNvZGVyIGludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9FbmNvZGVyX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIC8qIFJlc2V0IEVOQyBiaXQgdG8gZGlzYWJsZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9FTkM7CisKKyAgLyogRGlzYWJsZSAic3dpdGNoIHRvIGRvd24gZGlyZWN0aW9uIiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0RPV04pOworCisgIC8qIERpc2FibGUgInN3aXRjaCB0byB1cCBkaXJlY3Rpb24iIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfVVApOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIFRpbWVvdXQgZnVuY3Rpb24uCisgICogQG5vdGUgICBUaGUgZmlyc3QgdHJpZ2dlciBldmVudCB3aWxsIHN0YXJ0IHRoZSB0aW1lciwgYW55IHN1Y2Nlc3NpdmUKKyAgKiAgICAgICAgIHRyaWdnZXIgZXZlbnQgd2lsbCByZXNldCB0aGUgY291bnRlciBhbmQgdGhlIHRpbWVyIHJlc3RhcnRzLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZpZXMgdGhlIFRpbWVPdXQgdmFsdWUgdG8gcmVzZXQgdGhlIGNvdW50ZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9UaW1lT3V0X1N0YXJ0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoVGltZW91dCkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIFNldCBUSU1PVVQgYml0IHRvIGVuYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbiAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSIHw9IExQVElNX0NGR1JfVElNT1VUOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIExvYWQgdGhlIFRpbWVvdXQgdmFsdWUgaW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoaGxwdGltLCBUaW1lb3V0KTsKKworICAvKiBTdGFydCB0aW1lciBpbiBjb250aW51b3VzIG1vZGUgKi8KKyAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgVGltZW91dCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9UaW1lT3V0X1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIC8qIFJlc2V0IFRJTU9VVCBiaXQgdG8gZW5hYmxlIHRoZSB0aW1lb3V0IGZ1bmN0aW9uICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfVElNT1VUOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIFRpbWVvdXQgZnVuY3Rpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBUaGUgZmlyc3QgdHJpZ2dlciBldmVudCB3aWxsIHN0YXJ0IHRoZSB0aW1lciwgYW55IHN1Y2Nlc3NpdmUKKyAgKiAgICAgICAgIHRyaWdnZXIgZXZlbnQgd2lsbCByZXNldCB0aGUgY291bnRlciBhbmQgdGhlIHRpbWVyIHJlc3RhcnRzLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZpZXMgdGhlIFRpbWVPdXQgdmFsdWUgdG8gcmVzZXQgdGhlIGNvdW50ZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9UaW1lT3V0X1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoVGltZW91dCkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIEVuYWJsZSBFWFRJIExpbmUgaW50ZXJydXB0IG9uIHRoZSBMUFRJTSBXYWtlLXVwIFRpbWVyICovCisgIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0lUKCk7CisKKyAgLyogU2V0IFRJTU9VVCBiaXQgdG8gZW5hYmxlIHRoZSB0aW1lb3V0IGZ1bmN0aW9uICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgfD0gTFBUSU1fQ0ZHUl9USU1PVVQ7CisKKyAgLyogRW5hYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIExvYWQgdGhlIFRpbWVvdXQgdmFsdWUgaW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoaGxwdGltLCBUaW1lb3V0KTsKKworICAvKiBTdGFydCB0aW1lciBpbiBjb250aW51b3VzIG1vZGUgKi8KKyAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgVGltZW91dCBmdW5jdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9UaW1lT3V0X1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgRVhUSSBMaW5lIGludGVycnVwdCBvbiB0aGUgTFBUSU0gV2FrZS11cCBUaW1lciAqLworICBfX0hBTF9MUFRJTV9XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfSVQoKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBSZXNldCBUSU1PVVQgYml0IHRvIGVuYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbiAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1RJTU9VVDsKKworICAvKiBEaXNhYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBDb3VudGVyIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBJZiBjbG9jayBzb3VyY2UgaXMgbm90IFVMUFRJTSBjbG9jayBhbmQgY291bnRlciBzb3VyY2UgaXMgZXh0ZXJuYWwsIHRoZW4gaXQgbXVzdCBub3QgYmUgcHJlc2NhbGVkICovCisgIGlmICgoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSAhPSBMUFRJTV9DTE9DS1NPVVJDRV9VTFBUSU0pICYmIChobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKyAgeworICAgIC8qIENoZWNrIGlmIGNsb2NrIGlzIHByZXNjYWxlZCAqLworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVJESVYxKGhscHRpbS0+SW5pdC5DbG9jay5QcmVzY2FsZXIpKTsKKyAgICAvKiBTZXQgY2xvY2sgcHJlc2NhbGVyIHRvIDAgKi8KKyAgICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1BSRVNDOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCisgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7CisKKyAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIENvdW50ZXIgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Db3VudGVyX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIENvdW50ZXIgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Db3VudGVyX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIEVuYWJsZSBFWFRJIExpbmUgaW50ZXJydXB0IG9uIHRoZSBMUFRJTSBXYWtlLXVwIFRpbWVyICovCisgIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0lUKCk7CisKKyAgLyogSWYgY2xvY2sgc291cmNlIGlzIG5vdCBVTFBUSU0gY2xvY2sgYW5kIGNvdW50ZXIgc291cmNlIGlzIGV4dGVybmFsLCB0aGVuIGl0IG11c3Qgbm90IGJlIHByZXNjYWxlZCAqLworICBpZiAoKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgIT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSAmJiAoaGxwdGltLT5Jbml0LkNvdW50ZXJTb3VyY2UgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCkpCisgIHsKKyAgICAvKiBDaGVjayBpZiBjbG9jayBpcyBwcmVzY2FsZWQgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSRElWMShobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyKSk7CisgICAgLyogU2V0IGNsb2NrIHByZXNjYWxlciB0byAwICovCisgICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9QUkVTQzsKKyAgfQorCisgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7CisKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk0pOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBDb3VudGVyIG1vZGUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIEVYVEkgTGluZSBpbnRlcnJ1cHQgb24gdGhlIExQVElNIFdha2UtdXAgVGltZXIgKi8KKyAgX19IQUxfTFBUSU1fV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX0lUKCk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOworCisgIC8qIERpc2FibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBMUFRJTSBSZWFkIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgIFJlYWQgb3BlcmF0aW9uIGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBMUFRJTSBSZWFkIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgTFBUSU0gUmVhZGluZyBmdW5jdGlvbnMuCisgICAgICAoKykgUmVhZCB0aGUgY291bnRlciB2YWx1ZS4KKyAgICAgICgrKSBSZWFkIHRoZSBwZXJpb2QgKEF1dG8tcmVsb2FkKSB2YWx1ZS4KKyAgICAgICgrKSBSZWFkIHRoZSBwdWxzZSAoQ29tcGFyZSl2YWx1ZS4KK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBDb3VudGVyIHZhbHVlLgorICAqLwordWludDMyX3QgSEFMX0xQVElNX1JlYWRDb3VudGVyKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICByZXR1cm4gKGhscHRpbS0+SW5zdGFuY2UtPkNOVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IEF1dG9yZWxvYWQgKFBlcmlvZCkgdmFsdWUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBBdXRvcmVsb2FkIHZhbHVlLgorICAqLwordWludDMyX3QgSEFMX0xQVElNX1JlYWRBdXRvUmVsb2FkKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICByZXR1cm4gKGhscHRpbS0+SW5zdGFuY2UtPkFSUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IENvbXBhcmUgKFB1bHNlKSB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIENvbXBhcmUgdmFsdWUuCisgICovCit1aW50MzJfdCBIQUxfTFBUSU1fUmVhZENvbXBhcmUoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIHJldHVybiAoaGxwdGltLT5JbnN0YW5jZS0+Q01QKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IExQVElNIElSUSBoYW5kbGVyIGFuZCBjYWxsYmFja3MKKyAqICBAYnJpZWYgIExQVElNICBJUlEgaGFuZGxlci4KKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgTFBUSU0gSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgTFBUSU0gSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucyBjYWxsZWQgd2l0aGluCisgICAgICB0aGUgSVJRIGhhbmRsZXI6CisgICAoKykgTFBUSU0gaW50ZXJydXB0IHJlcXVlc3QgaGFuZGxlcgorICAgKCspIENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sKKyAgICgrKSBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjaworICAgKCspIEV4dGVybmFsIHRyaWdnZXIgZXZlbnQgZGV0ZWN0aW9uIENhbGxiYWNrCisgICAoKykgQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjaworICAgKCspIEF1dG8tcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrCisgICAoKykgVXAtY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjaworICAgKCspIERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjaworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBMUFRJTSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0xQVElNX0lSUUhhbmRsZXIoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLworICBpZiAoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE0pICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9DTVBNKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBDbGVhciBDb21wYXJlIG1hdGNoIGZsYWcgKi8KKyAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE0pOworCisgICAgICAvKiBDb21wYXJlIG1hdGNoIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPkNvbXBhcmVNYXRjaENhbGxiYWNrKGhscHRpbSk7CisjZWxzZQorICAgICAgSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrKGhscHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLworICBpZiAoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk0pICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9BUlJNKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBDbGVhciBBdXRvcmVsb2FkIG1hdGNoIGZsYWcgKi8KKyAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk0pOworCisgICAgICAvKiBBdXRvcmVsb2FkIG1hdGNoIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPkF1dG9SZWxvYWRNYXRjaENhbGxiYWNrKGhscHRpbSk7CisjZWxzZQorICAgICAgSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrKGhscHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBUcmlnZ2VyIGRldGVjdGVkIGludGVycnVwdCAqLworICBpZiAoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0VYVFRSSUcpICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9FWFRUUklHKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBDbGVhciBUcmlnZ2VyIGRldGVjdGVkIGZsYWcgKi8KKyAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0VYVFRSSUcpOworCisgICAgICAvKiBUcmlnZ2VyIGRldGVjdGVkIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPlRyaWdnZXJDYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2soaGxwdGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIC8qIENvbXBhcmUgd3JpdGUgaW50ZXJydXB0ICovCisgIGlmIChfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9DTVBPSykgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgQ29tcGFyZSB3cml0ZSBmbGFnICovCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19DTVBPSyk7CisKKyAgICAgIC8qIENvbXBhcmUgd3JpdGUgQ2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhscHRpbS0+Q29tcGFyZVdyaXRlQ2FsbGJhY2soaGxwdGltKTsKKyNlbHNlCisgICAgICBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2soaGxwdGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIC8qIEF1dG9yZWxvYWQgd3JpdGUgaW50ZXJydXB0ICovCisgIGlmIChfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9BUlJPSykgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgQXV0b3JlbG9hZCB3cml0ZSBmbGFnICovCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSyk7CisKKyAgICAgIC8qIEF1dG9yZWxvYWQgd3JpdGUgQ2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhscHRpbS0+QXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2soaGxwdGltKTsKKyNlbHNlCisgICAgICBIQUxfTFBUSU1fQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2soaGxwdGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIC8qIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBEb3duIHRvIFVwIGludGVycnVwdCAqLworICBpZiAoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX1VQKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfVVApICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBEb3duIHRvIFVwIGZsYWcgKi8KKyAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX1VQKTsKKworICAgICAgLyogRGlyZWN0aW9uIGNvdW50ZXIgY2hhbmdlZCBmcm9tIERvd24gdG8gVXAgQ2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhscHRpbS0+RGlyZWN0aW9uVXBDYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9MUFRJTV9EaXJlY3Rpb25VcENhbGxiYWNrKGhscHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gVXAgdG8gRG93biBpbnRlcnJ1cHQgKi8KKyAgaWYgKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19ET1dOKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfRE9XTikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgRGlyZWN0aW9uIGNvdW50ZXIgY2hhbmdlZCBmcm9tIFVwIHRvIERvd24gZmxhZyAqLworICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfRE9XTik7CisKKyAgICAgIC8qIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBVcCB0byBEb3duIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPkRpcmVjdGlvbkRvd25DYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9MUFRJTV9EaXJlY3Rpb25Eb3duQ2FsbGJhY2soaGxwdGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbXBhcmUgbWF0Y2ggY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobHB0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBBdXRvcmVsb2FkIG1hdGNoIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHJpZ2dlciBkZXRlY3RlZCBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobHB0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29tcGFyZSB3cml0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9MUFRJTV9Db21wYXJlV3JpdGVDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhscHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9MUFRJTV9Db21wYXJlV3JpdGVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEF1dG9yZWxvYWQgd3JpdGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTFBUSU1fQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobHB0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gRG93biB0byBVcCBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9MUFRJTV9EaXJlY3Rpb25VcENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0RpcmVjdGlvblVwQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gVXAgdG8gRG93biBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9MUFRJTV9EaXJlY3Rpb25Eb3duQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobHB0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIExQVElNIGNhbGxiYWNrIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fTVNQSU5JVF9DQl9JRCAgICAgICAgICBMUFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgICAgICAgIExQVElNIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQ09NUEFSRV9NQVRDSF9DQl9JRCAgICBDb21wYXJlIG1hdGNoIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9BVVRPUkVMT0FEX01BVENIX0NCX0lEIEF1dG8tcmVsb2FkIG1hdGNoIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9UUklHR0VSX0NCX0lEICAgICAgICAgIEV4dGVybmFsIHRyaWdnZXIgZXZlbnQgZGV0ZWN0aW9uIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9DT01QQVJFX1dSSVRFX0NCX0lEICAgIENvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0FVVE9SRUxPQURfV1JJVEVfQ0JfSUQgQXV0by1yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0RJUkVDVElPTl9VUF9DQl9JRCAgICAgVXAtY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fRElSRUNUSU9OX0RPV05fQ0JfSUQgICBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9SZWdpc3RlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgICAgICAgICpobHB0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTFBUSU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMUFRJTV9DYWxsYmFja1R5cGVEZWYgICAgICBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobHB0aW0pOworCisgIGlmIChobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fQ09NUEFSRV9NQVRDSF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+Q29tcGFyZU1hdGNoQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9BVVRPUkVMT0FEX01BVENIX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX1RSSUdHRVJfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPlRyaWdnZXJDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkNvbXBhcmVXcml0ZUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fQVVUT1JFTE9BRF9XUklURV9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+QXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkRpcmVjdGlvblVwQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+RGlyZWN0aW9uRG93bkNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhscHRpbS0+U3RhdGUgPT0gSEFMX0xQVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhscHRpbSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGEgTFBUSU0gY2FsbGJhY2sKKyAgKiAgICAgICAgIExMUFRJTSBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgICAgICAgICAgTFBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fTVNQREVJTklUX0NCX0lEICAgICAgICBMUFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0NPTVBBUkVfTUFUQ0hfQ0JfSUQgICAgQ29tcGFyZSBtYXRjaCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQVVUT1JFTE9BRF9NQVRDSF9DQl9JRCBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fVFJJR0dFUl9DQl9JRCAgICAgICAgICBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQ09NUEFSRV9XUklURV9DQl9JRCAgICBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9BVVRPUkVMT0FEX1dSSVRFX0NCX0lEIEF1dG8tcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgICAgIFVwLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0RJUkVDVElPTl9ET1dOX0NCX0lEICAgRG93bi1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElECisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9VblJlZ2lzdGVyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAgICAgICAgKmhscHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhscHRpbSk7CisKKyAgaWYgKGhscHRpbS0+U3RhdGUgPT0gSEFMX0xQVElNX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPk1zcEluaXRDYWxsYmFjayA9IEhBTF9MUFRJTV9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9MUFRJTV9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9DT01QQVJFX01BVENIX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Db21wYXJlTWF0Y2hDYWxsYmFjayA9IEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBDb21wYXJlIG1hdGNoIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9BVVRPUkVMT0FEX01BVENIX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayA9IEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fVFJJR0dFUl9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+VHJpZ2dlckNhbGxiYWNrID0gSEFMX0xQVElNX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkNvbXBhcmVXcml0ZUNhbGxiYWNrID0gSEFMX0xQVElNX0NvbXBhcmVXcml0ZUNhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIENvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX0FVVE9SRUxPQURfV1JJVEVfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrID0gSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIEF1dG8tcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkRpcmVjdGlvblVwQ2FsbGJhY2sgPSBIQUxfTFBUSU1fRGlyZWN0aW9uVXBDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFVwLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX0RJUkVDVElPTl9ET1dOX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5EaXJlY3Rpb25Eb3duQ2FsbGJhY2sgPSBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrOyAgICAgICAvKiBMZWdhY3kgd2VhayBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0xQVElNX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhscHRpbSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0dyb3VwNSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBMUFRJTSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9MUFRJTV9TdGF0ZVR5cGVEZWYgSEFMX0xQVElNX0dldFN0YXRlKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUmV0dXJuIExQVElNIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaGxwdGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfRnVuY3Rpb25zIExQVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byB0aGUgbGVnYWN5IHdlYWsgY2FsbGJhY2tzLgorICAqIEBwYXJhbSAgbHB0aW0gcG9pbnRlciB0byBhIExQVElNX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTFBUSU0gbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgTFBUSU1fUmVzZXRDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpscHRpbSkKK3sKKyAgLyogUmVzZXQgdGhlIExQVElNIGNhbGxiYWNrIHRvIHRoZSBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgbHB0aW0tPkNvbXBhcmVNYXRjaENhbGxiYWNrICAgID0gSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrOyAgICAvKiBDb21wYXJlIG1hdGNoIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAqLworICBscHRpbS0+QXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2sgPSBIQUxfTFBUSU1fQXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2s7IC8qIEF1dG8tcmVsb2FkIG1hdGNoIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICovCisgIGxwdGltLT5UcmlnZ2VyQ2FsbGJhY2sgICAgICAgICA9IEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2s7ICAgICAgICAgLyogRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2sgICAgKi8KKyAgbHB0aW0tPkNvbXBhcmVXcml0ZUNhbGxiYWNrICAgID0gSEFMX0xQVElNX0NvbXBhcmVXcml0ZUNhbGxiYWNrOyAgICAvKiBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrICAgICAqLworICBscHRpbS0+QXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgPSBIQUxfTFBUSU1fQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2s7IC8qIEF1dG8tcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrICovCisgIGxwdGltLT5EaXJlY3Rpb25VcENhbGxiYWNrICAgICA9IEhBTF9MUFRJTV9EaXJlY3Rpb25VcENhbGxiYWNrOyAgICAgLyogVXAtY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayAgICAgICAgKi8KKyAgbHB0aW0tPkRpcmVjdGlvbkRvd25DYWxsYmFjayAgID0gSEFMX0xQVElNX0RpcmVjdGlvbkRvd25DYWxsYmFjazsgICAvKiBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgICAgICAgKi8KK30KKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTFBUSU0gSFcgaW5zdGFuY2UuCisgICogQHBhcmFtICBscHRpbSBwb2ludGVyIHRvIGEgTFBUSU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBMUFRJTSBtb2R1bGUuCisgICogQG5vdGUgICBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHJlcXVpcmVkIHRvIHNvbHZlIExQVElNIGRpc2FibGUgSFcgbGltaXRhdGlvbi4KKyAgKiAgICAgICAgIFBsZWFzZSBjaGVjayBFcnJhdGEgU2hlZXQgRVMwMzM1IGZvciBtb3JlIGRldGFpbHMgdW5kZXIgIk1DVSBtYXkgcmVtYWluCisgICogICAgICAgICBzdHVjayBpbiBMUFRJTSBpbnRlcnJ1cHQgd2hlbiBlbnRlcmluZyBTdG9wIG1vZGUiIHNlY3Rpb24uCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExQVElNX0Rpc2FibGUoTFBUSU1fSGFuZGxlVHlwZURlZiAqbHB0aW0pCit7CisgIHVpbnQzMl90IHRtcGNsa3NvdXJjZSA9IDA7CisgIHVpbnQzMl90IHRtcElFUjsKKyAgdWludDMyX3QgdG1wQ0ZHUjsKKyAgdWludDMyX3QgdG1wQ01QOworICB1aW50MzJfdCB0bXBBUlI7CisKKyAgX19kaXNhYmxlX2lycSgpOworCisgIC8qKioqKioqKioqKiBTYXZlIExQVElNIENvbmZpZyAqKioqKioqKioqKi8KKyAgLyogU2F2ZSBMUFRJTSBzb3VyY2UgY2xvY2sgKi8KKyAgc3dpdGNoICgodWludDMyX3QpbHB0aW0tPkluc3RhbmNlKQorICB7CisgICAgIGNhc2UgTFBUSU0xX0JBU0U6CisgICAgICAgdG1wY2xrc291cmNlID0gX19IQUxfUkNDX0dFVF9MUFRJTTFfU09VUkNFKCk7CisgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChMUFRJTTIpCisgICAgIGNhc2UgTFBUSU0yX0JBU0U6CisgICAgICAgdG1wY2xrc291cmNlID0gX19IQUxfUkNDX0dFVF9MUFRJTTJfU09VUkNFKCk7CisgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFBUSU0yICovCisgICAgIGRlZmF1bHQ6CisgICAgICAgYnJlYWs7CisgIH0KKworICAvKiBTYXZlIExQVElNIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisgIHRtcElFUiA9IGxwdGltLT5JbnN0YW5jZS0+SUVSOworICB0bXBDRkdSID0gbHB0aW0tPkluc3RhbmNlLT5DRkdSOworICB0bXBDTVAgPSBscHRpbS0+SW5zdGFuY2UtPkNNUDsKKyAgdG1wQVJSID0gbHB0aW0tPkluc3RhbmNlLT5BUlI7CisKKyAgLyoqKioqKioqKioqIFJlc2V0IExQVElNICoqKioqKioqKioqLworICBzd2l0Y2ggKCh1aW50MzJfdClscHRpbS0+SW5zdGFuY2UpCisgIHsKKyAgICAgY2FzZSBMUFRJTTFfQkFTRToKKyAgICAgICBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUKCk7CisgICAgICAgX19IQUxfUkNDX0xQVElNMV9SRUxFQVNFX1JFU0VUKCk7CisgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChMUFRJTTIpCisgICAgIGNhc2UgTFBUSU0yX0JBU0U6CisgICAgICAgX19IQUxfUkNDX0xQVElNMl9GT1JDRV9SRVNFVCgpOworICAgICAgIF9fSEFMX1JDQ19MUFRJTTJfUkVMRUFTRV9SRVNFVCgpOworICAgICAgIGJyZWFrOworI2VuZGlmIC8qIExQVElNMiAqLworICAgICBkZWZhdWx0OgorICAgICAgIGJyZWFrOworICB9CisKKyAgLyoqKioqKioqKioqIFJlc3RvcmUgTFBUSU0gQ29uZmlnICoqKioqKioqKioqLworICB1aW50MzJfdCBSZWZfVGltZTsKKyAgdWludDMyX3QgVGltZV9FbGFwc2VkOworCisgIGlmICgodG1wQ01QICE9IDBVTCkgfHwgKHRtcEFSUiAhPSAwVUwpKQorICB7CisgICAgLyogRm9yY2UgTFBUSU0gc291cmNlIGtlcm5lbCBjbG9jayBmcm9tIEFQQiAqLworICAgIHN3aXRjaCAoKHVpbnQzMl90KWxwdGltLT5JbnN0YW5jZSkKKyAgICB7CisgICAgICAgY2FzZSBMUFRJTTFfQkFTRToKKyAgICAgICAgIF9fSEFMX1JDQ19MUFRJTTFfQ09ORklHKDBVTCk7CisgICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKExQVElNMikKKyAgICAgICBjYXNlIExQVElNMl9CQVNFOgorICAgICAgICAgX19IQUxfUkNDX0xQVElNMl9DT05GSUcoMFVMKTsKKyAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIExQVElNMiAqLworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAodG1wQ01QICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBSZXN0b3JlIENNUCByZWdpc3RlciAoTFBUSU0gc2hvdWxkIGJlIGVuYWJsZWQgZmlyc3QpICovCisgICAgICBscHRpbS0+SW5zdGFuY2UtPkNSIHw9IExQVElNX0NSX0VOQUJMRTsKKyAgICAgIGxwdGltLT5JbnN0YW5jZS0+Q01QID0gdG1wQ01QOworICAgICAgLyogUG9sbGluZyBvbiBDTVAgd3JpdGUgb2sgc3RhdHVzIGFmdGVyIGFib3ZlIHJlc3RvcmUgb3BlcmF0aW9uICovCisgICAgICBSZWZfVGltZSA9IEhBTF9HZXRUaWNrKCk7CisgICAgICBkbworICAgICAgeworICAgICAgICBUaW1lX0VsYXBzZWQgPSBIQUxfR2V0VGljaygpIC0gUmVmX1RpbWU7CisgICAgICB9IHdoaWxlICgoIShfX0hBTF9MUFRJTV9HRVRfRkxBRyhscHRpbSwgTFBUSU1fRkxBR19DTVBPSykpKSAmJiAoVGltZV9FbGFwc2VkIDw9IFRJTUVPVVQpKTsKKworICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhscHRpbSwgTFBUSU1fRkxBR19DTVBPSyk7CisgICAgfQorCisgICAgaWYgKHRtcEFSUiAhPSAwVUwpCisgICAgeworICAgICAgLyogUmVzdG9yZSBBUlIgcmVnaXN0ZXIgKExQVElNIHNob3VsZCBiZSBlbmFibGVkIGZpcnN0KSAqLworICAgICAgbHB0aW0tPkluc3RhbmNlLT5DUiB8PSBMUFRJTV9DUl9FTkFCTEU7CisgICAgICBscHRpbS0+SW5zdGFuY2UtPkFSUiA9IHRtcEFSUjsKKyAgICAgIC8qIFBvbGxpbmcgb24gQVJSIHdyaXRlIG9rIHN0YXR1cyBhZnRlciBhYm92ZSByZXN0b3JlIG9wZXJhdGlvbiAqLworICAgICAgUmVmX1RpbWUgPSBIQUxfR2V0VGljaygpOworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgVGltZV9FbGFwc2VkID0gSEFMX0dldFRpY2soKSAtIFJlZl9UaW1lOworICAgICAgfSB3aGlsZSAoKCEoX19IQUxfTFBUSU1fR0VUX0ZMQUcobHB0aW0sIExQVElNX0ZMQUdfQVJST0spKSkgJiYgKFRpbWVfRWxhcHNlZCA8PSBUSU1FT1VUKSk7CisKKyAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcobHB0aW0sIExQVElNX0ZMQUdfQVJST0spOworICAgIH0KKworICAgIC8qIFJlc3RvcmUgTFBUSU0gc291cmNlIGtlcm5lbCBjbG9jayAqLworICAgIHN3aXRjaCAoKHVpbnQzMl90KWxwdGltLT5JbnN0YW5jZSkKKyAgICB7CisgICAgICAgY2FzZSBMUFRJTTFfQkFTRToKKyAgICAgICAgIF9fSEFMX1JDQ19MUFRJTTFfQ09ORklHKHRtcGNsa3NvdXJjZSk7CisgICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKExQVElNMikKKyAgICAgICBjYXNlIExQVElNMl9CQVNFOgorICAgICAgICAgX19IQUxfUkNDX0xQVElNMl9DT05GSUcodG1wY2xrc291cmNlKTsKKyAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIExQVElNMiAqLworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBSZXN0b3JlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChMUFRJTSBzaG91bGQgYmUgZGlzYWJsZWQgZmlyc3QpICovCisgIGxwdGltLT5JbnN0YW5jZS0+Q1IgJj0gfihMUFRJTV9DUl9FTkFCTEUpOworICBscHRpbS0+SW5zdGFuY2UtPklFUiA9IHRtcElFUjsKKyAgbHB0aW0tPkluc3RhbmNlLT5DRkdSID0gdG1wQ0ZHUjsKKworICBfX2VuYWJsZV9pcnEoKTsKK30KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogTFBUSU0xICovCisKKyNlbmRpZiAvKiBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9tc3BfdGVtcGxhdGUuYyBiL1NyYy9zdG0zMmwweHhfaGFsX21zcF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDFiMGUKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9tc3BfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfbXNwX3RlbXBsYXRlLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhBTCBNU1AgbW9kdWxlLgorICAqICAgICAgICAgIFRoaXMgZmlsZSB0ZW1wbGF0ZSBpcyBsb2NhdGVkIGluIHRoZSBIQUwgZm9sZGVyIGFuZCBzaG91bGQgYmUgY29waWVkIAorICAqICAgICAgICAgIHRvIHRoZSB1c2VyIGZvbGRlci4KKyAgKiAgICAgICAgIAorICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIGZpbGUgaXMgZXZlbnR1YWxseSBtb2RpZmllZCBieSB0aGUgdXNlci4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8gCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9NU1AKKyAgKiBAYnJpZWYgSEFMIE1TUCBtb2R1bGUuCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9NU1BfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBHbG9iYWwgQlNQLgorICAqIEBwYXJhbSAgTm9uZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTXNwSW5pdCh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBpcyBldmVudHVhbGx5IG1vZGlmaWVkIGJ5IHRoZSB1c2VyICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIEdsb2JhbCBNU1AuCisgICogQHBhcmFtICBOb25lICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX01zcERlSW5pdCh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBpcyBldmVudHVhbGx5IG1vZGlmaWVkIGJ5IHRoZSB1c2VyICovCit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFBQUCBNU1AuCisgICogQHBhcmFtICBOb25lCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QUFBfTXNwSW5pdCh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBpcyBldmVudHVhbGx5IG1vZGlmaWVkIGJ5IHRoZSB1c2VyICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFBQUCBNU1AuCisgICogQHBhcmFtICBOb25lICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BQUF9Nc3BEZUluaXQodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gaXMgZXZlbnR1YWxseSBtb2RpZmllZCBieSB0aGUgdXNlciAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9wY2QuYyBiL1NyYy9zdG0zMmwweHhfaGFsX3BjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOGEyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9wY2QuYwpAQCAtMCwwICsxLDE4NzggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3BjZC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBQQ0QgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGUgUENEIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAoIykgRGVjbGFyZSBhIFBDRF9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUsIGZvciBleGFtcGxlOgorICAgICAgICAgUENEX0hhbmRsZVR5cGVEZWYgIGhwY2Q7CisKKyAgICAgKCMpIEZpbGwgcGFyYW1ldGVycyBvZiBJbml0IHN0cnVjdHVyZSBpbiBIQ0QgaGFuZGxlCisKKyAgICAgKCMpIENhbGwgSEFMX1BDRF9Jbml0KCkgQVBJIHRvIGluaXRpYWxpemUgdGhlIFBDRCBwZXJpcGhlcmFsIChDb3JlLCBEZXZpY2UgY29yZSwgLi4uKQorCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBQQ0QgbG93IGxldmVsIHJlc291cmNlcyB0aHJvdWdoIHRoZSBIQUxfUENEX01zcEluaXQoKSBBUEk6CisgICAgICAgICAoIyMpIEVuYWJsZSB0aGUgUENEL1VTQiBMb3cgTGV2ZWwgaW50ZXJmYWNlIGNsb2NrIHVzaW5nCisgICAgICAgICAgICAgICgrKyspIF9fSEFMX1JDQ19VU0JfQ0xLX0VOQUJMRSgpOyBGb3IgVVNCIERldmljZSBvbmx5IEZTIHBlcmlwaGVyYWwKKworICAgICAgICAgKCMjKSBJbml0aWFsaXplIHRoZSByZWxhdGVkIEdQSU8gY2xvY2tzCisgICAgICAgICAoIyMpIENvbmZpZ3VyZSBQQ0QgcGluLW91dAorICAgICAgICAgKCMjKSBDb25maWd1cmUgUENEIE5WSUMgaW50ZXJydXB0CisKKyAgICAgKCMpQXNzb2NpYXRlIHRoZSBVcHBlciBVU0IgZGV2aWNlIHN0YWNrIHRvIHRoZSBIQUwgUENEIERyaXZlcjoKKyAgICAgICAgICgjIykgaHBjZC5wRGF0YSA9IHBkZXY7CisKKyAgICAgKCMpRW5hYmxlIFBDRCB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbjoKKyAgICAgICAgICgjIykgSEFMX1BDRF9TdGFydCgpOworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBDRCBQQ0QKKyAgKiBAYnJpZWYgUENEIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQKKworI2lmIGRlZmluZWQgKFVTQikKKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfTWFjcm9zIFBDRCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIFBDRF9NSU4oYSwgYikgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgUENEX01BWChhLCBiKSAgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfRnVuY3Rpb25zIFBDRCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBQQ0RfRVBfSVNSX0hhbmRsZXIoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zIFBDRCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBQQ0QgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFBDRF9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgdWludDhfdCBpOworCisgIC8qIENoZWNrIHRoZSBQQ0QgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhwY2QgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUENEX0FMTF9JTlNUQU5DRShocGNkLT5JbnN0YW5jZSkpOworCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhwY2QtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhwY2QtPlNPRkNhbGxiYWNrID0gSEFMX1BDRF9TT0ZDYWxsYmFjazsKKyAgICBocGNkLT5TZXR1cFN0YWdlQ2FsbGJhY2sgPSBIQUxfUENEX1NldHVwU3RhZ2VDYWxsYmFjazsKKyAgICBocGNkLT5SZXNldENhbGxiYWNrID0gSEFMX1BDRF9SZXNldENhbGxiYWNrOworICAgIGhwY2QtPlN1c3BlbmRDYWxsYmFjayA9IEhBTF9QQ0RfU3VzcGVuZENhbGxiYWNrOworICAgIGhwY2QtPlJlc3VtZUNhbGxiYWNrID0gSEFMX1BDRF9SZXN1bWVDYWxsYmFjazsKKyAgICBocGNkLT5Db25uZWN0Q2FsbGJhY2sgPSBIQUxfUENEX0Nvbm5lY3RDYWxsYmFjazsKKyAgICBocGNkLT5EaXNjb25uZWN0Q2FsbGJhY2sgPSBIQUxfUENEX0Rpc2Nvbm5lY3RDYWxsYmFjazsKKyAgICBocGNkLT5EYXRhT3V0U3RhZ2VDYWxsYmFjayA9IEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2s7CisgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayA9IEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjazsKKyAgICBocGNkLT5JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2sgPSBIQUxfUENEX0lTT09VVEluY29tcGxldGVDYWxsYmFjazsKKyAgICBocGNkLT5JU09JTkluY29tcGxldGVDYWxsYmFjayA9IEhBTF9QQ0RfSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2s7CisgICAgaHBjZC0+TFBNQ2FsbGJhY2sgPSBIQUxfUENERXhfTFBNX0NhbGxiYWNrOworICAgIGhwY2QtPkJDRENhbGxiYWNrID0gSEFMX1BDREV4X0JDRF9DYWxsYmFjazsKKworICAgIGlmIChocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUENEX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHBjZC0+TXNwSW5pdENhbGxiYWNrKGhwY2QpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLworICAgIEhBTF9QQ0RfTXNwSW5pdChocGNkKTsKKyNlbmRpZiAvKiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICB9CisKKyAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgSW50ZXJydXB0cyAqLworICBfX0hBTF9QQ0RfRElTQUJMRShocGNkKTsKKworICAvKiBJbml0IGVuZHBvaW50cyBzdHJ1Y3R1cmVzICovCisgIGZvciAoaSA9IDBVOyBpIDwgaHBjZC0+SW5pdC5kZXZfZW5kcG9pbnRzOyBpKyspCisgIHsKKyAgICAvKiBJbml0IGVwIHN0cnVjdHVyZSAqLworICAgIGhwY2QtPklOX2VwW2ldLmlzX2luID0gMVU7CisgICAgaHBjZC0+SU5fZXBbaV0ubnVtID0gaTsKKyAgICBocGNkLT5JTl9lcFtpXS50eF9maWZvX251bSA9IGk7CisgICAgLyogQ29udHJvbCB1bnRpbCBlcCBpcyBhY3RpdmF0ZWQgKi8KKyAgICBocGNkLT5JTl9lcFtpXS50eXBlID0gRVBfVFlQRV9DVFJMOworICAgIGhwY2QtPklOX2VwW2ldLm1heHBhY2tldCA9IDBVOworICAgIGhwY2QtPklOX2VwW2ldLnhmZXJfYnVmZiA9IDBVOworICAgIGhwY2QtPklOX2VwW2ldLnhmZXJfbGVuID0gMFU7CisgIH0KKworICBmb3IgKGkgPSAwVTsgaSA8IGhwY2QtPkluaXQuZGV2X2VuZHBvaW50czsgaSsrKQorICB7CisgICAgaHBjZC0+T1VUX2VwW2ldLmlzX2luID0gMFU7CisgICAgaHBjZC0+T1VUX2VwW2ldLm51bSA9IGk7CisgICAgLyogQ29udHJvbCB1bnRpbCBlcCBpcyBhY3RpdmF0ZWQgKi8KKyAgICBocGNkLT5PVVRfZXBbaV0udHlwZSA9IEVQX1RZUEVfQ1RSTDsKKyAgICBocGNkLT5PVVRfZXBbaV0ubWF4cGFja2V0ID0gMFU7CisgICAgaHBjZC0+T1VUX2VwW2ldLnhmZXJfYnVmZiA9IDBVOworICAgIGhwY2QtPk9VVF9lcFtpXS54ZmVyX2xlbiA9IDBVOworICB9CisKKyAgLyogSW5pdCBEZXZpY2UgKi8KKyAgaWYgKFVTQl9EZXZJbml0KGhwY2QtPkluc3RhbmNlLCBocGNkLT5Jbml0KSAhPSBIQUxfT0spCisgIHsKKyAgICBocGNkLT5TdGF0ZSA9IEhBTF9QQ0RfU1RBVEVfRVJST1I7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGhwY2QtPlVTQl9BZGRyZXNzID0gMFU7CisgIGhwY2QtPlN0YXRlID0gSEFMX1BDRF9TVEFURV9SRUFEWTsKKworICAvKiBBY3RpdmF0ZSBMUE0gKi8KKyAgaWYgKGhwY2QtPkluaXQubHBtX2VuYWJsZSA9PSAxVSkKKyAgeworICAgICh2b2lkKUhBTF9QQ0RFeF9BY3RpdmF0ZUxQTShocGNkKTsKKyAgfQorCisKKyAgLyogQWN0aXZhdGUgQmF0dGVyeSBjaGFyZ2luZyAqLworICBpZiAoaHBjZC0+SW5pdC5iYXR0ZXJ5X2NoYXJnaW5nX2VuYWJsZSA9PSAxVSkKKyAgeworICAgICh2b2lkKUhBTF9QQ0RFeF9BY3RpdmF0ZUJDRChocGNkKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgUENEIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGVJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBDaGVjayB0aGUgUENEIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChocGNkID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX0JVU1k7CisKKyAgLyogU3RvcCBEZXZpY2UgKi8KKyAgKHZvaWQpSEFMX1BDRF9TdG9wKGhwY2QpOworCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaWYgKGhwY2QtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQy4qLworICBIQUxfUENEX01zcERlSW5pdChocGNkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBocGNkLT5TdGF0ZSA9IEhBTF9QQ0RfU1RBVEVfUkVTRVQ7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUENEIE1TUC4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9Nc3BJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBQQ0QgTVNQLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX01zcERlSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgVVNCIFBDRCBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgVVNCIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfU09GX0NCX0lEIFVTQiBQQ0QgU09GIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfU0VUVVBTVEFHRV9DQl9JRCBVU0IgUENEIFNldHVwIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfUkVTRVRfQ0JfSUQgVVNCIFBDRCBSZXNldCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX1NVU1BFTkRfQ0JfSUQgVVNCIFBDRCBTdXNwZW5kIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfUkVTVU1FX0NCX0lEIFVTQiBQQ0QgUmVzdW1lIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfQ09OTkVDVF9DQl9JRCBVU0IgUENEIENvbm5lY3QgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEIE9URyBQQ0QgRGlzY29ubmVjdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX01TUElOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIEhBTF9QQ0RfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFBDRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfUENEX1NPRl9DQl9JRCA6CisgICAgICAgIGhwY2QtPlNPRkNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1NFVFVQU1RBR0VfQ0JfSUQgOgorICAgICAgICBocGNkLT5TZXR1cFN0YWdlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfUkVTRVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5SZXNldENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1NVU1BFTkRfQ0JfSUQgOgorICAgICAgICBocGNkLT5TdXNwZW5kQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfUkVTVU1FX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfQ09OTkVDVF9DQl9JRCA6CisgICAgICAgIGhwY2QtPkNvbm5lY3RDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+RGlzY29ubmVjdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfUENEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gVVNCIFBDRCBDYWxsYmFjaworICAqICAgICAgICAgVVNCIFBDRCBjYWxsYWJjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgVVNCIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9TT0ZfQ0JfSUQgVVNCIFBDRCBTT0YgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9TRVRVUFNUQUdFX0NCX0lEIFVTQiBQQ0QgU2V0dXAgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9SRVNFVF9DQl9JRCBVU0IgUENEIFJlc2V0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfU1VTUEVORF9DQl9JRCBVU0IgUENEIFN1c3BlbmQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9SRVNVTUVfQ0JfSUQgVVNCIFBDRCBSZXN1bWUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9DT05ORUNUX0NCX0lEIFVTQiBQQ0QgQ29ubmVjdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX0RJU0NPTk5FQ1RfQ0JfSUQgT1RHIFBDRCBEaXNjb25uZWN0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgSEFMX1BDRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICAvKiBTZXR1cCBMZWdhY3kgd2VhayBDYWxsYmFja3MgICovCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1BDRF9TT0ZfQ0JfSUQgOgorICAgICAgICBocGNkLT5TT0ZDYWxsYmFjayA9IEhBTF9QQ0RfU09GQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfU0VUVVBTVEFHRV9DQl9JRCA6CisgICAgICAgIGhwY2QtPlNldHVwU3RhZ2VDYWxsYmFjayA9IEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1JFU0VUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+UmVzZXRDYWxsYmFjayA9IEhBTF9QQ0RfUmVzZXRDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9TVVNQRU5EX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+U3VzcGVuZENhbGxiYWNrID0gSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfUkVTVU1FX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2sgPSBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX0NPTk5FQ1RfQ0JfSUQgOgorICAgICAgICBocGNkLT5Db25uZWN0Q2FsbGJhY2sgPSBIQUxfUENEX0Nvbm5lY3RDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+RGlzY29ubmVjdENhbGxiYWNrID0gSEFMX1BDRF9EaXNjb25uZWN0Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhwY2QtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfUENEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUENEX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUENEX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgRGF0YSBPVVQgU3RhZ2UgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5EYXRhT3V0U3RhZ2VDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjaworICAqICAgICAgICAgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrID0gSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgRGF0YU91dFN0YWdlQ2FsbGJhY2sgICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgRGF0YSBJTiBTdGFnZSBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFVTQiBQQ0QgRGF0YSBJTiBTdGFnZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfRGF0YUluU3RhZ2VDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2QpOworCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKQorICB7CisgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgVVNCIFBDRCBEYXRhIElOIFN0YWdlIENhbGxiYWNrCisgICogICAgICAgICBVU0IgUENEIERhdGEgT1VUIFN0YWdlIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJEYXRhSW5TdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2sgPSBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIERhdGFJblN0YWdlQ2FsbGJhY2sgICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgSXNvIE9VVCBpbmNvbXBsZXRlIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBVU0IgUENEIElzbyBPVVQgaW5jb21wbGV0ZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3Rlcklzb091dEluY3BsdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0lzb091dEluY3BsdENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFVTQiBQQ0QgSXNvIE9VVCBpbmNvbXBsZXRlIENhbGxiYWNrCisgICogICAgICAgICBVU0IgUENEIElzbyBPVVQgaW5jb21wbGV0ZSBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJJc29PdXRJbmNwbHRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2sgPSBIQUxfUENEX0lTT09VVEluY29tcGxldGVDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrICAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBVU0IgUENEIElzbyBJTiBpbmNvbXBsZXRlIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFVTQiBQQ0QgSXNvIElOIGluY29tcGxldGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJJc29JbkluY3BsdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0lzb0luSW5jcGx0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPklTT0lOSW5jb21wbGV0ZUNhbGxiYWNrID0gcENhbGxiYWNrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVblJlZ2lzdGVyIHRoZSBVU0IgUENEIElzbyBJTiBpbmNvbXBsZXRlIENhbGxiYWNrCisgICogICAgICAgICBVU0IgUENEIElzbyBJTiBpbmNvbXBsZXRlIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVySXNvSW5JbmNwbHRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5JU09JTkluY29tcGxldGVDYWxsYmFjayA9IEhBTF9QQ0RfSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIElTT0lOSW5jb21wbGV0ZUNhbGxiYWNrICAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBVU0IgUENEIEJDRCBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBVU0IgUENEIEJDRCBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckJjZENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0JjZENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5CQ0RDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgVVNCIFBDRCBCQ0QgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFVTQiBCQ0QgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBIQUxfUENERXhfQkNEX0NhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJCY2RDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5CQ0RDYWxsYmFjayA9IEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2sgICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgTFBNIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDREV4X0xQTV9DYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFVTQiBQQ0QgTFBNIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyTHBtQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfTHBtQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPkxQTUNhbGxiYWNrID0gcENhbGxiYWNrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVblJlZ2lzdGVyIHRoZSBVU0IgUENEIExQTSBDYWxsYmFjaworICAqICAgICAgICAgVVNCIExQTSBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIEhBTF9QQ0RFeF9MUE1fQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckxwbUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPkxQTUNhbGxiYWNrID0gSEFMX1BDREV4X0xQTV9DYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgSEFMX1BDREV4X0xQTV9DYWxsYmFjayAgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBQQ0QgZGF0YQorICAgIHRyYW5zZmVycy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgVVNCIGRldmljZQorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0YXJ0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBfX0hBTF9MT0NLKGhwY2QpOworICAodm9pZClVU0JfRGV2Q29ubmVjdChocGNkLT5JbnN0YW5jZSk7CisgIF9fSEFMX1BDRF9FTkFCTEUoaHBjZCk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBVU0IgZGV2aWNlLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0b3AoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIF9fSEFMX0xPQ0soaHBjZCk7CisgIF9fSEFMX1BDRF9ESVNBQkxFKGhwY2QpOworCisgIGlmIChVU0JfU3RvcERldmljZShocGNkLT5JbnN0YW5jZSkgIT0gSEFMX09LKQorICB7CisgICAgIF9fSEFMX1VOTE9DSyhocGNkKTsKKyAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFBDRCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLwordm9pZCBIQUxfUENEX0lSUUhhbmRsZXIoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX0lTVFJfQ1RSKSkKKyAgeworICAgIC8qIHNlcnZpY2luZyBvZiB0aGUgZW5kcG9pbnQgY29ycmVjdCB0cmFuc2ZlciBpbnRlcnJ1cHQgKi8KKyAgICAvKiBjbGVhciBvZiB0aGUgQ1RSIGZsYWcgaW50byB0aGUgc3ViICovCisgICAgKHZvaWQpUENEX0VQX0lTUl9IYW5kbGVyKGhwY2QpOworICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyhocGNkLCBVU0JfSVNUUl9SRVNFVCkpCisgIHsKKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9SRVNFVCk7CisKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhwY2QtPlJlc2V0Q2FsbGJhY2soaHBjZCk7CisjZWxzZQorICAgIEhBTF9QQ0RfUmVzZXRDYWxsYmFjayhocGNkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgICh2b2lkKUhBTF9QQ0RfU2V0QWRkcmVzcyhocGNkLCAwVSk7CisgIH0KKworICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9JU1RSX1BNQU9WUikpCisgIHsKKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9QTUFPVlIpOworICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyhocGNkLCBVU0JfSVNUUl9FUlIpKQorICB7CisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfRVJSKTsKKyAgfQorCisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX0lTVFJfV0tVUCkpCisgIHsKKyAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiAmPSAodWludDE2X3QpIH4oVVNCX0NOVFJfTFBNT0RFKTsKKyAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiAmPSAodWludDE2X3QpIH4oVVNCX0NOVFJfRlNVU1ApOworCisgICAgaWYgKGhwY2QtPkxQTV9TdGF0ZSA9PSBMUE1fTDEpCisgICAgeworICAgICAgaHBjZC0+TFBNX1N0YXRlID0gTFBNX0wwOworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBocGNkLT5MUE1DYWxsYmFjayhocGNkLCBQQ0RfTFBNX0wwX0FDVElWRSk7CisjZWxzZQorICAgICAgSEFMX1BDREV4X0xQTV9DYWxsYmFjayhocGNkLCBQQ0RfTFBNX0wwX0FDVElWRSk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBocGNkLT5SZXN1bWVDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgICAgSEFMX1BDRF9SZXN1bWVDYWxsYmFjayhocGNkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX1dLVVApOworICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyhocGNkLCBVU0JfSVNUUl9TVVNQKSkKKyAgeworICAgIC8qIEZvcmNlIGxvdy1wb3dlciBtb2RlIGluIHRoZSBtYWNyb2NlbGwgKi8KKyAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiB8PSBVU0JfQ05UUl9GU1VTUDsKKworICAgIC8qIGNsZWFyIG9mIHRoZSBJU1RSIGJpdCBtdXN0IGJlIGRvbmUgYWZ0ZXIgc2V0dGluZyBvZiBDTlRSX0ZTVVNQICovCisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfU1VTUCk7CisKKyAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiB8PSBVU0JfQ05UUl9MUE1PREU7CisKKyAgICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9JU1RSX1dLVVApID09IDBVKQorICAgIHsKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHBjZC0+U3VzcGVuZENhbGxiYWNrKGhwY2QpOworI2Vsc2UKKyAgICAgIEhBTF9QQ0RfU3VzcGVuZENhbGxiYWNrKGhwY2QpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIC8qIEhhbmRsZSBMUE0gSW50ZXJydXB0ICovCisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX0lTVFJfTDFSRVEpKQorICB7CisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfTDFSRVEpOworICAgIGlmIChocGNkLT5MUE1fU3RhdGUgPT0gTFBNX0wwKQorICAgIHsKKyAgICAgIC8qIEZvcmNlIHN1c3BlbmQgYW5kIGxvdy1wb3dlciBtb2RlIGJlZm9yZSBnb2luZyB0byBMMSBzdGF0ZSovCisgICAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiB8PSBVU0JfQ05UUl9MUE1PREU7CisgICAgICBocGNkLT5JbnN0YW5jZS0+Q05UUiB8PSBVU0JfQ05UUl9GU1VTUDsKKworICAgICAgaHBjZC0+TFBNX1N0YXRlID0gTFBNX0wxOworICAgICAgaHBjZC0+QkVTTCA9ICgodWludDMyX3QpaHBjZC0+SW5zdGFuY2UtPkxQTUNTUiAmIFVTQl9MUE1DU1JfQkVTTCkgPj4gMjsKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHBjZC0+TFBNQ2FsbGJhY2soaHBjZCwgUENEX0xQTV9MMV9BQ1RJVkUpOworI2Vsc2UKKyAgICAgIEhBTF9QQ0RFeF9MUE1fQ2FsbGJhY2soaHBjZCwgUENEX0xQTV9MMV9BQ1RJVkUpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBocGNkLT5TdXNwZW5kQ2FsbGJhY2soaHBjZCk7CisjZWxzZQorICAgICAgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyhocGNkLCBVU0JfSVNUUl9TT0YpKQorICB7CisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfU09GKTsKKworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHBjZC0+U09GQ2FsbGJhY2soaHBjZCk7CisjZWxzZQorICAgIEhBTF9QQ0RfU09GQ2FsbGJhY2soaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9JU1RSX0VTT0YpKQorICB7CisgICAgLyogY2xlYXIgRVNPRiBmbGFnIGluIElTVFIgKi8KKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9FU09GKTsKKyAgfQorfQorCisKKy8qKgorICAqIEBicmllZiAgRGF0YSBPVVQgc3RhZ2UgY2FsbGJhY2suCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwbnVtIGVuZHBvaW50IG51bWJlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChlcG51bSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEYXRhIElOIHN0YWdlIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwbnVtIGVuZHBvaW50IG51bWJlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKyAgVU5VU0VEKGVwbnVtKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisvKioKKyAgKiBAYnJpZWYgIFNldHVwIHN0YWdlIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9TZXR1cFN0YWdlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVU0IgU3RhcnQgT2YgRnJhbWUgY2FsbGJhY2suCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfU09GQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX1NPRkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVVNCIFJlc2V0IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX1Jlc2V0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX1Jlc2V0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdXNwZW5kIGV2ZW50IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX1N1c3BlbmRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfU3VzcGVuZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUmVzdW1lIGV2ZW50IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9SZXN1bWVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEluY29tcGxldGUgSVNPIE9VVCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBudW0gZW5kcG9pbnQgbnVtYmVyCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX0lTT09VVEluY29tcGxldGVDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChlcG51bSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSW5jb21wbGV0ZSBJU08gSU4gY2FsbGJhY2suCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwbnVtIGVuZHBvaW50IG51bWJlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChlcG51bSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBDb25uZWN0aW9uIGV2ZW50IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX0Nvbm5lY3RDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGlzY29ubmVjdGlvbiBldmVudCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9EaXNjb25uZWN0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0Rpc2Nvbm5lY3RDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBtYW5hZ2VtZW50IGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFBDRCBkYXRhCisgICAgdHJhbnNmZXJzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbm5lY3QgdGhlIFVTQiBkZXZpY2UKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZDb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBfX0hBTF9MT0NLKGhwY2QpOworICAodm9pZClVU0JfRGV2Q29ubmVjdChocGNkLT5JbnN0YW5jZSk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNjb25uZWN0IHRoZSBVU0IgZGV2aWNlLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RldkRpc2Nvbm5lY3QoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIF9fSEFMX0xPQ0soaHBjZCk7CisgICh2b2lkKVVTQl9EZXZEaXNjb25uZWN0KGhwY2QtPkluc3RhbmNlKTsKKyAgX19IQUxfVU5MT0NLKGhwY2QpOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVVNCIERldmljZSBhZGRyZXNzLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBhZGRyZXNzIG5ldyBkZXZpY2UgYWRkcmVzcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9TZXRBZGRyZXNzKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGFkZHJlc3MpCit7CisgIF9fSEFMX0xPQ0soaHBjZCk7CisgIGhwY2QtPlVTQl9BZGRyZXNzID0gYWRkcmVzczsKKyAgKHZvaWQpVVNCX1NldERldkFkZHJlc3MoaHBjZC0+SW5zdGFuY2UsIGFkZHJlc3MpOworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisgIHJldHVybiBIQUxfT0s7Cit9CisvKioKKyAgKiBAYnJpZWYgIE9wZW4gYW5kIGNvbmZpZ3VyZSBhbiBlbmRwb2ludC4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHBhcmFtICBlcF9tcHMgZW5kcG9pbnQgbWF4IHBhY2tldCBzaXplCisgICogQHBhcmFtICBlcF90eXBlIGVuZHBvaW50IHR5cGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfT3BlbihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50MTZfdCBlcF9tcHMsIHVpbnQ4X3QgZXBfdHlwZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgIHJldCA9IEhBTF9PSzsKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgaWYgKChlcF9hZGRyICYgMHg4MFUpID09IDB4ODBVKQorICB7CisgICAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKyAgICBlcC0+aXNfaW4gPSAxVTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBlcCA9ICZocGNkLT5PVVRfZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKyAgICBlcC0+aXNfaW4gPSAwVTsKKyAgfQorCisgIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7CisgIGVwLT5tYXhwYWNrZXQgPSBlcF9tcHM7CisgIGVwLT50eXBlID0gZXBfdHlwZTsKKworICBpZiAoZXAtPmlzX2luICE9IDBVKQorICB7CisgICAgLyogQXNzaWduIGEgVHggRklGTyAqLworICAgIGVwLT50eF9maWZvX251bSA9IGVwLT5udW07CisgIH0KKyAgLyogU2V0IGluaXRpYWwgZGF0YSBQSUQuICovCisgIGlmIChlcF90eXBlID09IEVQX1RZUEVfQlVMSykKKyAgeworICAgIGVwLT5kYXRhX3BpZF9zdGFydCA9IDBVOworICB9CisKKyAgX19IQUxfTE9DSyhocGNkKTsKKyAgKHZvaWQpVVNCX0FjdGl2YXRlRW5kcG9pbnQoaHBjZC0+SW5zdGFuY2UsIGVwKTsKKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVhY3RpdmF0ZSBhbiBlbmRwb2ludC4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX0Nsb3NlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpCit7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworCisgIGlmICgoZXBfYWRkciAmIDB4ODBVKSA9PSAweDgwVSkKKyAgeworICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMVU7CisgIH0KKyAgZWxzZQorICB7CisgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMFU7CisgIH0KKyAgZXAtPm51bSAgID0gZXBfYWRkciAmIEVQX0FERFJfTVNLOworCisgIF9fSEFMX0xPQ0soaHBjZCk7CisgICh2b2lkKVVTQl9EZWFjdGl2YXRlRW5kcG9pbnQoaHBjZC0+SW5zdGFuY2UsIGVwKTsKKyAgX19IQUxfVU5MT0NLKGhwY2QpOworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YS4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHBhcmFtICBwQnVmIHBvaW50ZXIgdG8gdGhlIHJlY2VwdGlvbiBidWZmZXIKKyAgKiBAcGFyYW0gIGxlbiBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9SZWNlaXZlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIsIHVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IGxlbikKK3sKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisKKyAgLypzZXR1cCBhbmQgc3RhcnQgdGhlIFhmZXIgKi8KKyAgZXAtPnhmZXJfYnVmZiA9IHBCdWY7CisgIGVwLT54ZmVyX2xlbiA9IGxlbjsKKyAgZXAtPnhmZXJfY291bnQgPSAwVTsKKyAgZXAtPmlzX2luID0gMFU7CisgIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7CisKKyAgaWYgKChlcF9hZGRyICYgRVBfQUREUl9NU0spID09IDBVKQorICB7CisgICAgKHZvaWQpVVNCX0VQMFN0YXJ0WGZlcihocGNkLT5JbnN0YW5jZSwgZXApOworICB9CisgIGVsc2UKKyAgeworICAgICh2b2lkKVVTQl9FUFN0YXJ0WGZlcihocGNkLT5JbnN0YW5jZSwgZXApOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUmVjZWl2ZWQgRGF0YSBTaXplCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEByZXR2YWwgRGF0YSBTaXplCisgICovCit1aW50MzJfdCBIQUxfUENEX0VQX0dldFJ4Q291bnQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcikKK3sKKyAgcmV0dXJuIGhwY2QtPk9VVF9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdLnhmZXJfY291bnQ7Cit9CisvKioKKyAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHBhcmFtICBwQnVmIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWlzc2lvbiBidWZmZXIKKyAgKiBAcGFyYW0gIGxlbiBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX1RyYW5zbWl0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIsIHVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IGxlbikKK3sKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgZXAgPSAmaHBjZC0+SU5fZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXTsKKworICAvKnNldHVwIGFuZCBzdGFydCB0aGUgWGZlciAqLworICBlcC0+eGZlcl9idWZmID0gcEJ1ZjsKKyAgZXAtPnhmZXJfbGVuID0gbGVuOworICBlcC0+eGZlcl9jb3VudCA9IDBVOworICBlcC0+aXNfaW4gPSAxVTsKKyAgZXAtPm51bSA9IGVwX2FkZHIgJiBFUF9BRERSX01TSzsKKworICBpZiAoKGVwX2FkZHIgJiBFUF9BRERSX01TSykgPT0gMFUpCisgIHsKKyAgICAodm9pZClVU0JfRVAwU3RhcnRYZmVyKGhwY2QtPkluc3RhbmNlLCBlcCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgKHZvaWQpVVNCX0VQU3RhcnRYZmVyKGhwY2QtPkluc3RhbmNlLCBlcCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBhIFNUQUxMIGNvbmRpdGlvbiBvdmVyIGFuIGVuZHBvaW50CisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9TZXRTdGFsbChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKQoreworICBQQ0RfRVBUeXBlRGVmICplcDsKKworICBpZiAoKCh1aW50MzJfdCllcF9hZGRyICYgRVBfQUREUl9NU0spID4gaHBjZC0+SW5pdC5kZXZfZW5kcG9pbnRzKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmICgoMHg4MFUgJiBlcF9hZGRyKSA9PSAweDgwVSkKKyAgeworICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMVU7CisgIH0KKyAgZWxzZQorICB7CisgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHJdOworICAgIGVwLT5pc19pbiA9IDBVOworICB9CisKKyAgZXAtPmlzX3N0YWxsID0gMVU7CisgIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7CisKKyAgX19IQUxfTE9DSyhocGNkKTsKKworICAodm9pZClVU0JfRVBTZXRTdGFsbChocGNkLT5JbnN0YW5jZSwgZXApOworICBpZiAoKGVwX2FkZHIgJiBFUF9BRERSX01TSykgPT0gMFUpCisgIHsKKyAgICAodm9pZClVU0JfRVAwX091dFN0YXJ0KGhwY2QtPkluc3RhbmNlLCAodWludDhfdCAqKWhwY2QtPlNldHVwKTsKKyAgfQorICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBhIFNUQUxMIGNvbmRpdGlvbiBvdmVyIGluIGFuIGVuZHBvaW50CisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9DbHJTdGFsbChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKQoreworICBQQ0RfRVBUeXBlRGVmICplcDsKKworICBpZiAoKCh1aW50MzJfdCllcF9hZGRyICYgMHgwRlUpID4gaHBjZC0+SW5pdC5kZXZfZW5kcG9pbnRzKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmICgoMHg4MFUgJiBlcF9hZGRyKSA9PSAweDgwVSkKKyAgeworICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMVU7CisgIH0KKyAgZWxzZQorICB7CisgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMFU7CisgIH0KKworICBlcC0+aXNfc3RhbGwgPSAwVTsKKyAgZXAtPm51bSA9IGVwX2FkZHIgJiBFUF9BRERSX01TSzsKKworICBfX0hBTF9MT0NLKGhwY2QpOworICAodm9pZClVU0JfRVBDbGVhclN0YWxsKGhwY2QtPkluc3RhbmNlLCBlcCk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZsdXNoIGFuIGVuZHBvaW50CisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9GbHVzaChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKyAgVU5VU0VEKGVwX2FkZHIpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWN0aXZhdGUgcmVtb3RlIHdha2V1cCBzaWduYWxsaW5nCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfQWN0aXZhdGVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIHJldHVybiAoVVNCX0FjdGl2YXRlUmVtb3RlV2FrZXVwKGhwY2QtPkluc3RhbmNlKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGUtYWN0aXZhdGUgcmVtb3RlIHdha2V1cCBzaWduYWxsaW5nLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIHJldHVybiAoVVNCX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoaHBjZC0+SW5zdGFuY2UpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbAorICAgIGFuZCB0aGUgZGF0YSBmbG93LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgUENEIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitQQ0RfU3RhdGVUeXBlRGVmIEhBTF9QQ0RfR2V0U3RhdGUoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIHJldHVybiBocGNkLT5TdGF0ZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBQQ0RfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFBDRCBFbmRwb2ludCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFBDRF9FUF9JU1JfSGFuZGxlcihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgUENEX0VQVHlwZURlZiAqZXA7CisgIHVpbnQxNl90IGNvdW50OworICB1aW50MTZfdCB3SXN0cjsKKyAgdWludDE2X3Qgd0VQVmFsOworICB1aW50OF90IGVwaW5kZXg7CisKKyAgLyogc3RheSBpbiBsb29wIHdoaWxlIHBlbmRpbmcgaW50ZXJydXB0cyAqLworICB3aGlsZSAoKGhwY2QtPkluc3RhbmNlLT5JU1RSICYgVVNCX0lTVFJfQ1RSKSAhPSAwVSkKKyAgeworICAgIHdJc3RyID0gaHBjZC0+SW5zdGFuY2UtPklTVFI7CisgICAgLyogZXh0cmFjdCBoaWdoZXN0IHByaW9yaXR5IGVuZHBvaW50IG51bWJlciAqLworICAgIGVwaW5kZXggPSAodWludDhfdCkod0lzdHIgJiBVU0JfSVNUUl9FUF9JRCk7CisKKyAgICBpZiAoZXBpbmRleCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEZWNvZGUgYW5kIHNlcnZpY2UgY29udHJvbCBlbmRwb2ludCBpbnRlcnJ1cHQgKi8KKworICAgICAgLyogRElSIGJpdCA9IG9yaWdpbiBvZiB0aGUgaW50ZXJydXB0ICovCisgICAgICBpZiAoKHdJc3RyICYgVVNCX0lTVFJfRElSKSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRElSID0gMCAqLworCisgICAgICAgIC8qIERJUiA9IDAgICAgICA9PiBJTiAgaW50ICovCisgICAgICAgIC8qIERJUiA9IDAgaW1wbGllcyB0aGF0IChFUF9DVFJfVFggPSAxKSBhbHdheXMgICovCisgICAgICAgIFBDRF9DTEVBUl9UWF9FUF9DVFIoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCk7CisgICAgICAgIGVwID0gJmhwY2QtPklOX2VwWzBdOworCisgICAgICAgIGVwLT54ZmVyX2NvdW50ID0gUENEX0dFVF9FUF9UWF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgICBlcC0+eGZlcl9idWZmICs9IGVwLT54ZmVyX2NvdW50OworCisgICAgICAgIC8qIFRYIENPTVBMRVRFICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCAwVSk7CisjZWxzZQorICAgICAgICBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgICAgIGlmICgoaHBjZC0+VVNCX0FkZHJlc3MgPiAwVSkgJiYgKGVwLT54ZmVyX2xlbiA9PSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBocGNkLT5JbnN0YW5jZS0+REFERFIgPSAoKHVpbnQxNl90KWhwY2QtPlVTQl9BZGRyZXNzIHwgVVNCX0RBRERSX0VGKTsKKyAgICAgICAgICBocGNkLT5VU0JfQWRkcmVzcyA9IDBVOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERJUiA9IDEgKi8KKworICAgICAgICAvKiBESVIgPSAxICYgQ1RSX1JYICAgICAgID0+IFNFVFVQIG9yIE9VVCBpbnQgKi8KKyAgICAgICAgLyogRElSID0gMSAmIChDVFJfVFggfCBDVFJfUlgpID0+IDIgaW50IHBlbmRpbmcgKi8KKyAgICAgICAgZXAgPSAmaHBjZC0+T1VUX2VwWzBdOworICAgICAgICB3RVBWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDApOworCisgICAgICAgIGlmICgod0VQVmFsICYgVVNCX0VQX1NFVFVQKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEdldCBTRVRVUCBQYWNrZXQqLworICAgICAgICAgIGVwLT54ZmVyX2NvdW50ID0gUENEX0dFVF9FUF9SWF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgICAgIFVTQl9SZWFkUE1BKGhwY2QtPkluc3RhbmNlLCAodWludDhfdCAqKWhwY2QtPlNldHVwLCBlcC0+cG1hYWRyZXNzLCAodWludDE2X3QpZXAtPnhmZXJfY291bnQpOworICAgICAgICAgIC8qIFNFVFVQIGJpdCBrZXB0IGZyb3plbiB3aGlsZSBDVFJfUlggPSAxKi8KKyAgICAgICAgICBQQ0RfQ0xFQVJfUlhfRVBfQ1RSKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDApOworCisgICAgICAgICAgLyogUHJvY2VzcyBTRVRVUCBQYWNrZXQqLworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgICAgaHBjZC0+U2V0dXBTdGFnZUNhbGxiYWNrKGhwY2QpOworI2Vsc2UKKyAgICAgICAgICBIQUxfUENEX1NldHVwU3RhZ2VDYWxsYmFjayhocGNkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorCisgICAgICAgIGVsc2UgaWYgKCh3RVBWYWwgJiBVU0JfRVBfQ1RSX1JYKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIFBDRF9DTEVBUl9SWF9FUF9DVFIoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCk7CisgICAgICAgICAgLyogR2V0IENvbnRyb2wgRGF0YSBPVVQgUGFja2V0Ki8KKyAgICAgICAgICBlcC0+eGZlcl9jb3VudCA9IFBDRF9HRVRfRVBfUlhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKworICAgICAgICAgIGlmIChlcC0+eGZlcl9jb3VudCAhPSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBVU0JfUmVhZFBNQShocGNkLT5JbnN0YW5jZSwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkcmVzcywgKHVpbnQxNl90KWVwLT54ZmVyX2NvdW50KTsKKyAgICAgICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gZXAtPnhmZXJfY291bnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogUHJvY2VzcyBDb250cm9sIERhdGEgT1VUIFBhY2tldCovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgICBocGNkLT5EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCAwVSk7CisjZWxzZQorICAgICAgICAgIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgICAgICAgUENEX1NFVF9FUF9SWF9DTlQoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCwgZXAtPm1heHBhY2tldCk7CisgICAgICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoaHBjZC0+SW5zdGFuY2UsIFBDRF9FTkRQMCwgVVNCX0VQX1JYX1ZBTElEKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRGVjb2RlIGFuZCBzZXJ2aWNlIG5vbiBjb250cm9sIGVuZHBvaW50cyBpbnRlcnJ1cHQgICovCisKKyAgICAgIC8qIHByb2Nlc3MgcmVsYXRlZCBlbmRwb2ludCByZWdpc3RlciAqLworICAgICAgd0VQVmFsID0gUENEX0dFVF9FTkRQT0lOVChocGNkLT5JbnN0YW5jZSwgZXBpbmRleCk7CisgICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9DVFJfUlgpICE9IDBVKQorICAgICAgeworICAgICAgICAvKiBjbGVhciBpbnQgZmxhZyAqLworICAgICAgICBQQ0RfQ0xFQVJfUlhfRVBfQ1RSKGhwY2QtPkluc3RhbmNlLCBlcGluZGV4KTsKKyAgICAgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwaW5kZXhdOworCisgICAgICAgIC8qIE9VVCBkb3VibGUgQnVmZmVyaW5nKi8KKyAgICAgICAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBjb3VudCA9ICh1aW50MTZfdClQQ0RfR0VUX0VQX1JYX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgICAgaWYgKGNvdW50ICE9IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFVTQl9SZWFkUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRyZXNzLCBjb3VudCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICgoUENEX0dFVF9FTkRQT0lOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSkgJiBVU0JfRVBfRFRPR19SWCkgIT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgLypyZWFkIGZyb20gZW5kcG9pbnQgQlVGMEFkZHIgYnVmZmVyKi8KKyAgICAgICAgICAgIGNvdW50ID0gKHVpbnQxNl90KVBDRF9HRVRfRVBfREJVRjBfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKyAgICAgICAgICAgIGlmIChjb3VudCAhPSAwVSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZGRyMCwgY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLypyZWFkIGZyb20gZW5kcG9pbnQgQlVGMUFkZHIgYnVmZmVyKi8KKyAgICAgICAgICAgIGNvdW50ID0gKHVpbnQxNl90KVBDRF9HRVRfRVBfREJVRjFfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKyAgICAgICAgICAgIGlmIChjb3VudCAhPSAwVSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZGRyMSwgY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAvKiBmcmVlIEVQIE9VVCBCdWZmZXIgKi8KKyAgICAgICAgICBQQ0RfRnJlZVVzZXJCdWZmZXIoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0sIDBVKTsKKyAgICAgICAgfQorICAgICAgICAvKm11bHRpLXBhY2tldCBvbiB0aGUgTk9OIGNvbnRyb2wgT1VUIGVuZHBvaW50Ki8KKyAgICAgICAgZXAtPnhmZXJfY291bnQgKz0gY291bnQ7CisgICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gY291bnQ7CisKKyAgICAgICAgaWYgKChlcC0+eGZlcl9sZW4gPT0gMFUpIHx8IChjb3VudCA8IGVwLT5tYXhwYWNrZXQpKQorICAgICAgICB7CisgICAgICAgICAgLyogUlggQ09NUExFVEUgKi8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrKGhwY2QsIGVwLT5udW0pOworI2Vsc2UKKyAgICAgICAgICBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKGhwY2QsIGVwLT5udW0pOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICh2b2lkKUhBTF9QQ0RfRVBfUmVjZWl2ZShocGNkLCBlcC0+bnVtLCBlcC0+eGZlcl9idWZmLCBlcC0+eGZlcl9sZW4pOworICAgICAgICB9CisKKyAgICAgIH0gLyogaWYoKHdFUFZhbCAmIEVQX0NUUl9SWCkgKi8KKworICAgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfQ1RSX1RYKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgZXAgPSAmaHBjZC0+SU5fZXBbZXBpbmRleF07CisKKyAgICAgICAgLyogY2xlYXIgaW50IGZsYWcgKi8KKyAgICAgICAgUENEX0NMRUFSX1RYX0VQX0NUUihocGNkLT5JbnN0YW5jZSwgZXBpbmRleCk7CisKKyAgICAgICAgLyptdWx0aS1wYWNrZXQgb24gdGhlIE5PTiBjb250cm9sIElOIGVuZHBvaW50Ki8KKyAgICAgICAgZXAtPnhmZXJfY291bnQgPSBQQ0RfR0VUX0VQX1RYX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gZXAtPnhmZXJfY291bnQ7CisKKyAgICAgICAgLyogWmVybyBMZW5ndGggUGFja2V0PyAqLworICAgICAgICBpZiAoZXAtPnhmZXJfbGVuID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogVFggQ09NUExFVEUgKi8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgZXAtPm51bSk7CisjZWxzZQorICAgICAgICAgIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAodm9pZClIQUxfUENEX0VQX1RyYW5zbWl0KGhwY2QsIGVwLT5udW0sIGVwLT54ZmVyX2J1ZmYsIGVwLT54ZmVyX2xlbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8KKyNlbmRpZiAvKiBIQUxfUENEX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9wY2RfZXguYyBiL1NyYy9zdG0zMmwweHhfaGFsX3BjZF9leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3M2ZjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9wY2RfZXguYwpAQCAtMCwwICsxLDMzMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfcGNkX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFBDRCBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyOgorICAqICAgICAgICAgICArIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENERXggUENERXgKKyAgKiBAYnJpZWYgUENEIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQKKworI2lmIGRlZmluZWQgKFVTQikKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBQQ0RFeF9FeHBvcnRlZF9GdW5jdGlvbnMgUENERXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0RFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgUENERXggY29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFVwZGF0ZSBGSUZPIGNvbmZpZ3VyYXRpb24KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUE1BIGZvciBFUAorICAqIEBwYXJhbSAgaHBjZCAgRGV2aWNlIGluc3RhbmNlCisgICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAgKiBAcGFyYW0gIGVwX2tpbmQgZW5kcG9pbnQgS2luZAorICAqICAgICAgICAgICAgICAgICAgVVNCX1NOR19CVUY6IFNpbmdsZSBCdWZmZXIgdXNlZAorICAqICAgICAgICAgICAgICAgICAgVVNCX0RCTF9CVUY6IERvdWJsZSBCdWZmZXIgdXNlZAorICAqIEBwYXJhbSAgcG1hYWRyZXNzOiBFUCBhZGRyZXNzIGluIFRoZSBQTUE6IEluIGNhc2Ugb2Ygc2luZ2xlIGJ1ZmZlciBlbmRwb2ludAorICAqICAgICAgICAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIDE2LWJpdCB2YWx1ZSBwcm92aWRpbmcgdGhlIGFkZHJlc3MKKyAgKiAgICAgICAgICAgICAgICAgICBpbiBQTUEgYWxsb2NhdGVkIHRvIGVuZHBvaW50LgorICAqICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgZG91YmxlIGJ1ZmZlciBlbmRwb2ludCB0aGlzIHBhcmFtZXRlcgorICAqICAgICAgICAgICAgICAgICAgIGlzIGEgMzItYml0IHZhbHVlIHByb3ZpZGluZyB0aGUgZW5kcG9pbnQgYnVmZmVyIDAgYWRkcmVzcworICAqICAgICAgICAgICAgICAgICAgIGluIHRoZSBMU0IgcGFydCBvZiAzMi1iaXQgdmFsdWUgYW5kIGVuZHBvaW50IGJ1ZmZlciAxIGFkZHJlc3MKKyAgKiAgICAgICAgICAgICAgICAgICBpbiB0aGUgTVNCIHBhcnQgb2YgMzItYml0IHZhbHVlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX1BDREV4X1BNQUNvbmZpZyhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVwX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcF9raW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG1hYWRyZXNzKQoreworICBQQ0RfRVBUeXBlRGVmICplcDsKKworICAvKiBpbml0aWFsaXplIGVwIHN0cnVjdHVyZSovCisgIGlmICgoMHg4MFUgJiBlcF9hZGRyKSA9PSAweDgwVSkKKyAgeworICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgIH0KKyAgZWxzZQorICB7CisgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHJdOworICB9CisKKyAgLyogSGVyZSB3ZSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgc2luZ2xlIG9yIGRvdWJsZSBCdWZmZXIqLworICBpZiAoZXBfa2luZCA9PSBQQ0RfU05HX0JVRikKKyAgeworICAgIC8qIFNpbmdsZSBCdWZmZXIgKi8KKyAgICBlcC0+ZG91YmxlYnVmZmVyID0gMFU7CisgICAgLyogQ29uZmlndXJlIHRoZSBQTUEgKi8KKyAgICBlcC0+cG1hYWRyZXNzID0gKHVpbnQxNl90KXBtYWFkcmVzczsKKyAgfQorICBlbHNlIC8qIFVTQl9EQkxfQlVGICovCisgIHsKKyAgICAvKiBEb3VibGUgQnVmZmVyIEVuZHBvaW50ICovCisgICAgZXAtPmRvdWJsZWJ1ZmZlciA9IDFVOworICAgIC8qIENvbmZpZ3VyZSB0aGUgUE1BICovCisgICAgZXAtPnBtYWFkZHIwID0gKHVpbnQxNl90KShwbWFhZHJlc3MgJiAweEZGRkZVKTsKKyAgICBlcC0+cG1hYWRkcjEgPSAodWludDE2X3QpKChwbWFhZHJlc3MgJiAweEZGRkYwMDAwVSkgPj4gMTYpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBY3RpdmF0ZSBCYXR0ZXJ5Q2hhcmdpbmcgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0FjdGl2YXRlQkNEKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBVU0JfVHlwZURlZiAqVVNCeCA9IGhwY2QtPkluc3RhbmNlOworICBocGNkLT5iYXR0ZXJ5X2NoYXJnaW5nX2FjdGl2ZSA9IDFVOworCisgIFVTQngtPkJDRFIgfD0gKFVTQl9CQ0RSX0JDREVOKTsKKyAgLyogRW5hYmxlIERDRCA6IERhdGEgQ29udGFjdCBEZXRlY3QgKi8KKyAgVVNCeC0+QkNEUiB8PSAoVVNCX0JDRFJfRENERU4pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVhY3RpdmF0ZSBCYXR0ZXJ5Q2hhcmdpbmcgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0RlQWN0aXZhdGVCQ0QoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIFVTQl9UeXBlRGVmICpVU0J4ID0gaHBjZC0+SW5zdGFuY2U7CisgIGhwY2QtPmJhdHRlcnlfY2hhcmdpbmdfYWN0aXZlID0gMFU7CisKKyAgVVNCeC0+QkNEUiAmPSB+KFVTQl9CQ0RSX0JDREVOKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBCYXR0ZXJ5Q2hhcmdpbmcgUHJvY2Vzcy4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLwordm9pZCBIQUxfUENERXhfQkNEX1ZCVVNEZXRlY3QoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIFVTQl9UeXBlRGVmICpVU0J4ID0gaHBjZC0+SW5zdGFuY2U7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCBEZXRlY3QgZmxhZyBvciBhIHRpbWVvdXQgaXMgaGFwcGVuKi8KKyAgd2hpbGUgKChVU0J4LT5CQ0RSICYgVVNCX0JDRFJfRENERVQpID09IDBVKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IDEwMDBVKQorICAgIHsKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHBjZC0+QkNEQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9FUlJPUik7CisjZWxzZQorICAgICAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX0VSUk9SKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIEhBTF9EZWxheSgzMDBVKTsKKworICAvKiBEYXRhIFBpbiBDb250YWN0ID8gQ2hlY2sgRGV0ZWN0IGZsYWcgKi8KKyAgaWYgKChVU0J4LT5CQ0RSICYgVVNCX0JDRFJfRENERVQpID09IFVTQl9CQ0RSX0RDREVUKQorICB7CisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBocGNkLT5CQ0RDYWxsYmFjayhocGNkLCBQQ0RfQkNEX0NPTlRBQ1RfREVURUNUSU9OKTsKKyNlbHNlCisgICAgSEFMX1BDREV4X0JDRF9DYWxsYmFjayhocGNkLCBQQ0RfQkNEX0NPTlRBQ1RfREVURUNUSU9OKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICAvKiBQcmltYXJ5IGRldGVjdGlvbjogY2hlY2tzIGlmIGNvbm5lY3RlZCB0byBTdGFuZGFyZCBEb3duc3RyZWFtIFBvcnQKKyAgKHdpdGhvdXQgY2hhcmdpbmcgY2FwYWJpbGl0eSkgKi8KKyAgVVNCeC0+QkNEUiAmPSB+KFVTQl9CQ0RSX0RDREVOKTsKKyAgVVNCeC0+QkNEUiB8PSAoVVNCX0JDRFJfUERFTik7CisgIEhBTF9EZWxheSgzMDBVKTsKKworICAvKiBJZiBDaGFyZ2VyIGRldGVjdCA/ICovCisgIGlmICgoVVNCeC0+QkNEUiAmIFVTQl9CQ0RSX1BERVQpID09IFVTQl9CQ0RSX1BERVQpCisgIHsKKyAgICAvKiBTdGFydCBzZWNvbmRhcnkgZGV0ZWN0aW9uIHRvIGNoZWNrIGNvbm5lY3Rpb24gdG8gQ2hhcmdpbmcgRG93bnN0cmVhbQorICAgIFBvcnQgb3IgRGVkaWNhdGVkIENoYXJnaW5nIFBvcnQgKi8KKyAgICBVU0J4LT5CQ0RSICY9IH4oVVNCX0JDRFJfUERFTik7CisgICAgVVNCeC0+QkNEUiB8PSAoVVNCX0JDRFJfU0RFTik7CisgICAgSEFMX0RlbGF5KDMwMFUpOworCisgICAgLyogSWYgQ0RQID8gKi8KKyAgICBpZiAoKFVTQngtPkJDRFIgJiBVU0JfQkNEUl9TREVUKSA9PSBVU0JfQkNEUl9TREVUKQorICAgIHsKKyAgICAgIC8qIERlZGljYXRlZCBEb3duc3RyZWFtIFBvcnQgRENQICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfREVESUNBVEVEX0NIQVJHSU5HX1BPUlQpOworI2Vsc2UKKyAgICAgIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9ERURJQ0FURURfQ0hBUkdJTkdfUE9SVCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDaGFyZ2luZyBEb3duc3RyZWFtIFBvcnQgQ0RQICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfQ0hBUkdJTkdfRE9XTlNUUkVBTV9QT1JUKTsKKyNlbHNlCisgICAgICBIQUxfUENERXhfQkNEX0NhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfQ0hBUkdJTkdfRE9XTlNUUkVBTV9QT1JUKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgZWxzZSAvKiBOTyAqLworICB7CisgICAgLyogU3RhbmRhcmQgRG93bnN0cmVhbSBQb3J0ICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBocGNkLT5CQ0RDYWxsYmFjayhocGNkLCBQQ0RfQkNEX1NURF9ET1dOU1RSRUFNX1BPUlQpOworI2Vsc2UKKyAgICBIQUxfUENERXhfQkNEX0NhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfU1REX0RPV05TVFJFQU1fUE9SVCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBCYXR0ZXJ5IENoYXJnaW5nIGNhcGFiaWxpdHkgZGlzY292ZXJ5IGZpbmlzaGVkIFN0YXJ0IEVudW1lcmF0aW9uICovCisgICh2b2lkKUhBTF9QQ0RFeF9EZUFjdGl2YXRlQkNEKGhwY2QpOworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfRElTQ09WRVJZX0NPTVBMRVRFRCk7CisjZWxzZQorICBIQUxfUENERXhfQkNEX0NhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfRElTQ09WRVJZX0NPTVBMRVRFRCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKworLyoqCisgICogQGJyaWVmICBBY3RpdmF0ZSBMUE0gZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0FjdGl2YXRlTFBNKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworCisgIFVTQl9UeXBlRGVmICpVU0J4ID0gaHBjZC0+SW5zdGFuY2U7CisgIGhwY2QtPmxwbV9hY3RpdmUgPSAxVTsKKyAgaHBjZC0+TFBNX1N0YXRlID0gTFBNX0wwOworCisgIFVTQngtPkxQTUNTUiB8PSBVU0JfTFBNQ1NSX0xNUEVOOworICBVU0J4LT5MUE1DU1IgfD0gVVNCX0xQTUNTUl9MUE1BQ0s7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIExQTSBmZWF0dXJlLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfRGVBY3RpdmF0ZUxQTShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgVVNCX1R5cGVEZWYgKlVTQnggPSBocGNkLT5JbnN0YW5jZTsKKworICBocGNkLT5scG1fYWN0aXZlID0gMFU7CisKKyAgVVNCeC0+TFBNQ1NSICY9IH4oVVNCX0xQTUNTUl9MTVBFTik7CisgIFVTQngtPkxQTUNTUiAmPSB+KFVTQl9MUE1DU1JfTFBNQUNLKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisKKworLyoqCisgICogQGJyaWVmICBTZW5kIExQTSBtZXNzYWdlIHRvIHVzZXIgbGF5ZXIgY2FsbGJhY2suCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIG1zZyBMUE0gbWVzc2FnZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIHZvaWQgSEFMX1BDREV4X0xQTV9DYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgUENEX0xQTV9Nc2dUeXBlRGVmIG1zZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChtc2cpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENERXhfTFBNX0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBCYXR0ZXJ5Q2hhcmdpbmcgbWVzc2FnZSB0byB1c2VyIGxheWVyIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBtc2cgTFBNIG1lc3NhZ2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIFBDRF9CQ0RfTXNnVHlwZURlZiBtc2cpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworICBVTlVTRUQobXNnKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDREV4X0JDRF9DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8KKyNlbmRpZiAvKiBIQUxfUENEX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9wd3IuYyBiL1NyYy9zdG0zMmwweHhfaGFsX3B3ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmZkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9wd3IuYwpAQCAtMCwwICsxLDcwMyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfcHdyLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFBXUiBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFBvd2VyIENvbnRyb2xsZXIgKFBXUikgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworI2lmZGVmIEhBTF9QV1JfTU9EVUxFX0VOQUJMRUQKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQV1IKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSX1ByaXZhdGUKKyAgKiBAeworICAqLworICAKKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKy8qKiBAZGVmZ3JvdXAgUFdSX1BWRF9Nb2RlX01hc2sgUFdSIFBWRCBNb2RlIE1hc2sKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgUFZEX01PREVfSVQgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDBVKQorI2RlZmluZSBQVkRfTU9ERV9FVlQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMFUpCisjZGVmaW5lIFBWRF9SSVNJTkdfRURHRSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkKKyNkZWZpbmUgUFZEX0ZBTExJTkdfRURHRSAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKQorLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLyAgCisgIAorCisvKiogQGFkZHRvZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEBicmllZiAgICAgIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgRGVpbml0aWFsaXplcyB0aGUgSEFMIFBXUiBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EZUluaXQodm9pZCkKK3sKKyAgX19IQUxfUkNDX1BXUl9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfUFdSX1JFTEVBU0VfUkVTRVQoKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQGJyaWVmICAgICAgTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAKKyAgICAqKiogQmFja3VwIGRvbWFpbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgQWZ0ZXIgcmVzZXQsIHRoZSBiYWNrdXAgZG9tYWluIChSVEMgcmVnaXN0ZXJzLCBSVEMgYmFja3VwIGRhdGEKKyAgICAgIHJlZ2lzdGVycykgaXMgcHJvdGVjdGVkIGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQKKyAgICAgIHdyaXRlIGFjY2Vzc2VzLgorICAgICAgVG8gZW5hYmxlIGFjY2VzcyB0byB0aGUgUlRDIERvbWFpbiBhbmQgUlRDIHJlZ2lzdGVycywgcHJvY2VlZCBhcyBmb2xsb3dzOgorICAgICAgICAoKykgRW5hYmxlIHRoZSBQb3dlciBDb250cm9sbGVyIChQV1IpIEFQQjEgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIHRoZQorICAgICAgICAgICAgX19IQUxfUkNDX1BXUl9DTEtfRU5BQkxFKCkgbWFjcm8uCisgICAgICAgICgrKSBFbmFibGUgYWNjZXNzIHRvIFJUQyBkb21haW4gdXNpbmcgdGhlIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2VzcygpIGZ1bmN0aW9uLgorCisgICAgKioqIFBWRCBjb25maWd1cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgVGhlIFBWRCBpcyB1c2VkIHRvIG1vbml0b3IgdGhlIFZERCBwb3dlciBzdXBwbHkgYnkgY29tcGFyaW5nIGl0IHRvIGEKKyAgICAgICAgICB0aHJlc2hvbGQgc2VsZWN0ZWQgYnkgdGhlIFBWRCBMZXZlbCAoUExTWzI6MF0gYml0cyBpbiB0aGUgUFdSX0NSKS4KKyAgICAgICgrKSBUaGUgUFZEIGNhbiB1c2UgYW4gZXh0ZXJuYWwgaW5wdXQgYW5hbG9nIHZvbHRhZ2UgKFBWRF9JTikgd2hpY2ggaXMgY29tcGFyZWQgCisgICAgICBpbnRlcm5hbGx5IHRvIFZSRUZJTlQuIFRoZSBQVkRfSU4gKFBCNykgaGFzIHRvIGJlIGNvbmZpZ3VyZWQgaW4gQW5hbG9nIG1vZGUgCisgICAgICB3aGVuIFBXUl9QVkRMZXZlbF83IGlzIHNlbGVjdGVkIChQTFNbMjowXSA9IDExMSkuCisKKyAgICAgICgrKSBBIFBWRE8gZmxhZyBpcyBhdmFpbGFibGUgdG8gaW5kaWNhdGUgaWYgVkREL1ZEREEgaXMgaGlnaGVyIG9yIGxvd2VyCisgICAgICAgICAgdGhhbiB0aGUgUFZEIHRocmVzaG9sZC4gVGhpcyBldmVudCBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byB0aGUgRVhUSQorICAgICAgICAgIGxpbmUxNiBhbmQgY2FuIGdlbmVyYXRlIGFuIGludGVycnVwdCBpZiBlbmFibGVkLiBUaGlzIGlzIGRvbmUgdGhyb3VnaAorICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQoKSBtYWNyby4KKyAgICAgICgrKSBUaGUgUFZEIGlzIHN0b3BwZWQgaW4gU3RhbmRieSBtb2RlLgorICAgICAgKCspIFRoZSBQVkQgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIEwwIFZhbHVlIGxpbmUuCisKKyAgICAqKiogV2FrZVVwIHBpbiBjb25maWd1cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFdha2VVcCBwaW4gaXMgdXNlZCB0byB3YWtlIHVwIHRoZSBzeXN0ZW0gZnJvbSBTdGFuZGJ5IG1vZGUuIFRoaXMgcGluIGlzCisgICAgICAgICAgZm9yY2VkIGluIGlucHV0IHB1bGwtZG93biBjb25maWd1cmF0aW9uIGFuZCBpcyBhY3RpdmUgb24gcmlzaW5nIGVkZ2VzLgorICAgICAgKCspIFRoZXJlIGFyZSB0d28gV2FrZVVwIHBpbnM6CisgICAgICAgICAgV2FrZVVwIFBpbiAxIG9uIFBBLjAwLgorICAgICAgICAgIFdha2VVcCBQaW4gMiBvbiBQQy4xMy4KKyAgICAgICAgICBXYWtlVXAgUGluIDMgb24gUEUuMDYgLgorICAgICAgICAgIAorCisgICAgWy4uXQorICAgICoqKiBNYWluIGFuZCBCYWNrdXAgUmVndWxhdG9ycyBjb25maWd1cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAoKykgVGhlIG1haW4gaW50ZXJuYWwgcmVndWxhdG9yIGNhbiBiZSBjb25maWd1cmVkIHRvIGhhdmUgYSB0cmFkZW9mZiBiZXR3ZWVuCisgICAgICAgICAgcGVyZm9ybWFuY2UgYW5kIHBvd2VyIGNvbnN1bXB0aW9uIHdoZW4gdGhlIGRldmljZSBkb2VzIG5vdCBvcGVyYXRlIGF0CisgICAgICAgICAgdGhlIG1heGltdW0gZnJlcXVlbmN5LiBUaGlzIGlzIGRvbmUgdGhyb3VnaCBfX0hBTF9QV1JfVk9MVEFHRVNDQUxJTkdfQ09ORklHKCkKKyAgICAgICAgICBtYWNybyB3aGljaCBjb25maWd1cmVzIHRoZSB0d28gVk9TIGJpdHMgaW4gUFdSX0NSIHJlZ2lzdGVyOgorICAgICAgICAoKyspIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEgKFZPUyBiaXRzID0gMDEpLCB0aGUgcmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IFNjYWxlIDEgbW9kZSBzZWxlY3RlZCBhbmQKKyAgICAgICAgICAgICB0aGUgU3lzdGVtIGZyZXF1ZW5jeSBjYW4gZ28gdXAgdG8gMzIgTUh6LgorICAgICAgICAoKyspIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIgKFZPUyBiaXRzID0gMTApLCB0aGUgcmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IFNjYWxlIDIgbW9kZSBzZWxlY3RlZCBhbmQKKyAgICAgICAgICAgICB0aGUgU3lzdGVtIGZyZXF1ZW5jeSBjYW4gZ28gdXAgdG8gMTYgTUh6LgorICAgICAgICAoKyspIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTMgKFZPUyBiaXRzID0gMTEpLCB0aGUgcmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IFNjYWxlIDMgbW9kZSBzZWxlY3RlZCBhbmQKKyAgICAgICAgICAgICB0aGUgU3lzdGVtIGZyZXF1ZW5jeSBjYW4gZ28gdXAgdG8gNC4yIE1Iei4KKyAgICAgICAgICAgICAgCisgICAgICAgIFJlZmVyIHRvIHRoZSBkYXRhc2hlZXRzIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAqKiogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICBUaGUgZGV2aWNlIGZlYXR1cmVzIDUgbG93LXBvd2VyIG1vZGVzOgorICAgICAgKCspIExvdyBwb3dlciBydW4gbW9kZTogcmVndWxhdG9yIGluIGxvdyBwb3dlciBtb2RlLCBsaW1pdGVkIGNsb2NrIGZyZXF1ZW5jeSwgCisgICAgICAgIGxpbWl0ZWQgbnVtYmVyIG9mIHBlcmlwaGVyYWxzIHJ1bm5pbmcuCisgICAgICAoKykgU2xlZXAgbW9kZTogQ29ydGV4LU0wKyBjb3JlIHN0b3BwZWQsIHBlcmlwaGVyYWxzIGtlcHQgcnVubmluZy4KKyAgICAgICgrKSBMb3cgcG93ZXIgc2xlZXAgbW9kZTogQ29ydGV4LU0wKyBjb3JlIHN0b3BwZWQsIGxpbWl0ZWQgY2xvY2sgZnJlcXVlbmN5LCAKKyAgICAgICAgIGxpbWl0ZWQgbnVtYmVyIG9mIHBlcmlwaGVyYWxzIHJ1bm5pbmcsIHJlZ3VsYXRvciBpbiBsb3cgcG93ZXIgbW9kZS4KKyAgICAgICgrKSBTdG9wIG1vZGU6IEFsbCBjbG9ja3MgYXJlIHN0b3BwZWQsIHJlZ3VsYXRvciBydW5uaW5nLCByZWd1bGF0b3IgaW4gbG93IHBvd2VyIG1vZGUuCisgICAgICAoKykgU3RhbmRieSBtb2RlOiBWQ09SRSBkb21haW4gcG93ZXJlZCBvZmYKKyAgCisgICAqKiogTG93IHBvd2VyIHJ1biBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICBUbyBmdXJ0aGVyIHJlZHVjZSB0aGUgY29uc3VtcHRpb24gd2hlbiB0aGUgc3lzdGVtIGlzIGluIFJ1biBtb2RlLCB0aGUgcmVndWxhdG9yIGNhbiBiZQorICAgICAgICBjb25maWd1cmVkIGluIGxvdyBwb3dlciBtb2RlLiBJbiB0aGlzIG1vZGUsIHRoZSBzeXN0ZW0gZnJlcXVlbmN5IHNob3VsZCBub3QgZXhjZWVkCisgICAgICAgIE1TSSBmcmVxdWVuY3kgcmFuZ2UxLgorICAgICAgICBJbiBMb3cgcG93ZXIgcnVuIG1vZGUsIGFsbCBJL08gcGlucyBrZWVwIHRoZSBzYW1lIHN0YXRlIGFzIGluIFJ1biBtb2RlLgorICAKKyAgICAgICgrKSBFbnRyeToKKyAgICAgICAgKCsrKSBWQ09SRSBpbiByYW5nZTIKKyAgICAgICAgKCsrKSBEZWNyZWFzZSB0aGUgc3lzdGVtIGZyZXF1ZW5jeSBub3QgdG8gZXhjZWVkIHRoZSBmcmVxdWVuY3kgb2YgTVNJIGZyZXF1ZW5jeSByYW5nZTEuCisgICAgICAgICgrKykgVGhlIHJlZ3VsYXRvciBpcyBmb3JjZWQgaW4gbG93IHBvd2VyIG1vZGUgdXNpbmcgdGhlIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUoKQorICAgICAgICAgICAgIGZ1bmN0aW9uLgorICAgICAgKCspIEV4aXQ6CisgICAgICAgICgrKykgVGhlIHJlZ3VsYXRvciBpcyBmb3JjZWQgaW4gTWFpbiByZWd1bGF0b3IgbW9kZSB1c2luZyB0aGUgSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUoKQorICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAgICAgICAgKCsrKSBJbmNyZWFzZSB0aGUgc3lzdGVtIGZyZXF1ZW5jeSBpZiBuZWVkZWQuCisgIAorICAgKioqIFNsZWVwIG1vZGUgKioqCisgICA9PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgRW50cnk6CisgICAgICAgICAgVGhlIFNsZWVwIG1vZGUgaXMgZW50ZXJlZCBieSB1c2luZyB0aGUgSEFMX1BXUl9FbnRlclNMRUVQTW9kZShQV1JfTUFJTlJFR1VMQVRPUl9PTiwgUFdSX1NMRUVQRU5UUllfV0Z4KQorICAgICAgICAgICAgICBmdW5jdGlvbnMgd2l0aAorICAgICAgICAgICgrKykgUFdSX1NMRUVQRU5UUllfV0ZJOiBlbnRlciBTTEVFUCBtb2RlIHdpdGggV0ZJIGluc3RydWN0aW9uCisgICAgICAgICAgKCsrKSBQV1JfU0xFRVBFTlRSWV9XRkU6IGVudGVyIFNMRUVQIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24KKyAgICAgCisgICAgICAoKykgRXhpdDoKKyAgICAgICAgKCsrKSBBbnkgcGVyaXBoZXJhbCBpbnRlcnJ1cHQgYWNrbm93bGVkZ2VkIGJ5IHRoZSBuZXN0ZWQgdmVjdG9yZWQgaW50ZXJydXB0CisgICAgICAgICAgICAgIGNvbnRyb2xsZXIgKE5WSUMpIGNhbiB3YWtlIHVwIHRoZSBkZXZpY2UgZnJvbSBTbGVlcCBtb2RlLiBJZiB0aGUgV0ZFIGluc3RydWN0aW9uIHdhcyB1c2VkIHRvIGVudGVyIHNsZWVwIG1vZGUsCisgICAgICAgICAgICAgIHRoZSBNQ1UgZXhpdHMgU2xlZXAgbW9kZSBhcyBzb29uIGFzIGFuIGV2ZW50IG9jY3Vycy4gCisKKyAgICoqKiBMb3cgcG93ZXIgc2xlZXAgbW9kZSAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgRW50cnk6CisgICAgICAgICAgVGhlIExvdyBwb3dlciBzbGVlcCBtb2RlIGlzIGVudGVyZWQgYnkgdXNpbmcgdGhlIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUoUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OLCBQV1JfU0xFRVBFTlRSWV9XRngpCisgICAgICAgICAgICAgIGZ1bmN0aW9ucyB3aXRoCisgICAgICAgICAgKCsrKSBQV1JfU0xFRVBFTlRSWV9XRkk6IGVudGVyIFNMRUVQIG1vZGUgd2l0aCBXRkkgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAoKyspIFBXUl9TTEVFUEVOVFJZX1dGRTogZW50ZXIgU0xFRVAgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbgorICAgICAgICgrKSBUaGUgRmxhc2ggbWVtb3J5IGNhbiBiZSBzd2l0Y2hlZCBvZmYgYnkgdXNpbmcgdGhlIGNvbnRyb2wgYml0cyAoU0xFRVBfUEQgaW4gdGhlIEZMQVNIX0FDUiByZWdpc3Rlci4gCisgICAgICAgICAgICAgVGhpcyByZWR1Y2VzIHBvd2VyIGNvbnN1bXB0aW9uIGJ1dCBpbmNyZWFzZXMgdGhlIHdha2UtdXAgdGltZS4KKyAgICAgICAgIAorICAgICAgKCspIEV4aXQ6CisgICAgICAgICgrKykgSWYgdGhlIFdGSSBpbnN0cnVjdGlvbiB3YXMgdXNlZCB0byBlbnRlciBMb3cgcG93ZXIgc2xlZXAgbW9kZSwgYW55IHBlcmlwaGVyYWwgaW50ZXJydXB0CisgICAgICAgICAgICAgIGFja25vd2xlZGdlZCBieSB0aGUgbmVzdGVkIHZlY3RvcmVkIGludGVycnVwdCBjb250cm9sbGVyIChOVklDKSBjYW4gd2FrZSB1cCB0aGUgZGV2aWNlCisgICAgICAgICAgICAgIGZyb20gTG93IHBvd2VyIHNsZWVwIG1vZGUuIElmIHRoZSBXRkUgaW5zdHJ1Y3Rpb24gd2FzIHVzZWQgdG8gZW50ZXIgTG93IHBvd2VyIHNsZWVwIG1vZGUsCisgICAgICAgICAgICAgIHRoZSBNQ1UgZXhpdHMgU2xlZXAgbW9kZSBhcyBzb29uIGFzIGFuIGV2ZW50IG9jY3Vycy4gCisgICAgICAgICAgICAgICAgCisgICAqKiogU3RvcCBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGUgU3RvcCBtb2RlIGlzIGJhc2VkIG9uIHRoZSBDb3J0ZXgtTTArIGRlZXBzbGVlcCBtb2RlIGNvbWJpbmVkIHdpdGggcGVyaXBoZXJhbAorICAgICAgY2xvY2sgZ2F0aW5nLiBUaGUgdm9sdGFnZSByZWd1bGF0b3IgY2FuIGJlIGNvbmZpZ3VyZWQgZWl0aGVyIGluIG5vcm1hbCBvciBsb3ctcG93ZXIgbW9kZS4KKyAgICAgIEluIFN0b3AgbW9kZSwgYWxsIGNsb2NrcyBpbiB0aGUgVkNPUkUgZG9tYWluIGFyZSBzdG9wcGVkLCB0aGUgUExMLCB0aGUgTVNJLCB0aGUgSFNJIGFuZAorICAgICAgdGhlIEhTRSBSQyBvc2NpbGxhdG9ycyBhcmUgZGlzYWJsZWQuIEludGVybmFsIFNSQU0gYW5kIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBwcmVzZXJ2ZWQuCisgICAgICBUbyBnZXQgdGhlIGxvd2VzdCBjb25zdW1wdGlvbiBpbiBTdG9wIG1vZGUsIHRoZSBpbnRlcm5hbCBGbGFzaCBtZW1vcnkgYWxzbyBlbnRlcnMgbG93CisgICAgICBwb3dlciBtb2RlLiBXaGVuIHRoZSBGbGFzaCBtZW1vcnkgaXMgaW4gcG93ZXItZG93biBtb2RlLCBhbiBhZGRpdGlvbmFsIHN0YXJ0dXAgZGVsYXkgaXMKKyAgICAgIGluY3VycmVkIHdoZW4gd2FraW5nIHVwIGZyb20gU3RvcCBtb2RlLgorICAgICAgVG8gbWluaW1pemUgdGhlIGNvbnN1bXB0aW9uIEluIFN0b3AgbW9kZSwgVlJFRklOVCwgdGhlIEJPUiwgUFZELCBhbmQgdGVtcGVyYXR1cmUKKyAgICAgIHNlbnNvciBjYW4gYmUgc3dpdGNoZWQgb2ZmIGJlZm9yZSBlbnRlcmluZyBTdG9wIG1vZGUuIFRoZXkgY2FuIGJlIHN3aXRjaGVkIG9uIGFnYWluIGJ5CisgICAgICBzb2Z0d2FyZSBhZnRlciBleGl0aW5nIFN0b3AgbW9kZSB1c2luZyB0aGUgVUxQIGJpdCBpbiB0aGUgUFdSX0NSIHJlZ2lzdGVyLgorICAgICAgSW4gU3RvcCBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4KKworICAgICAgKCspIEVudHJ5OgorICAgICAgICAgICBUaGUgU3RvcCBtb2RlIGlzIGVudGVyZWQgdXNpbmcgdGhlIEhBTF9QV1JfRW50ZXJTVE9QTW9kZQorICAgICAgICAgICAgIGZ1bmN0aW9uIHdpdGg6CisgICAgICAgICAgKCsrKSBNYWluIHJlZ3VsYXRvciBPTi4KKyAgICAgICAgICAoKyspIExvdyBQb3dlciByZWd1bGF0b3IgT04uCisgICAgICAgICAgKCsrKSBQV1JfU0xFRVBFTlRSWV9XRkk6IGVudGVyIFNMRUVQIG1vZGUgd2l0aCBXRkkgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAoKyspIFBXUl9TTEVFUEVOVFJZX1dGRTogZW50ZXIgU0xFRVAgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbgorICAgICAgKCspIEV4aXQ6CisgICAgICAgICgrKykgQnkgaXNzdWluZyBhbiBpbnRlcnJ1cHQgb3IgYSB3YWtldXAgZXZlbnQsIHRoZSBNU0kgb3IgSFNJMTYgUkMKKyAgICAgICAgICAgICBvc2NpbGxhdG9yIGlzIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayBkZXBlbmRpbmcgdGhlIGJpdCBTVE9QV1VDSyBpbiB0aGUgUkNDX0NGR1IKKyAgICAgICAgICAgICByZWdpc3RlcgorCisgICAqKiogU3RhbmRieSBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgVGhlIFN0YW5kYnkgbW9kZSBhbGxvd3MgdG8gYWNoaWV2ZSB0aGUgbG93ZXN0IHBvd2VyIGNvbnN1bXB0aW9uLiBJdCBpcyBiYXNlZCBvbiB0aGUKKyAgICAgIENvcnRleC1NMCsgZGVlcHNsZWVwIG1vZGUsIHdpdGggdGhlIHZvbHRhZ2UgcmVndWxhdG9yIGRpc2FibGVkLiBUaGUgVkNPUkUgZG9tYWluIGlzCisgICAgICBjb25zZXF1ZW50bHkgcG93ZXJlZCBvZmYuIFRoZSBQTEwsIHRoZSBNU0ksIHRoZSBIU0kgb3NjaWxsYXRvciBhbmQgdGhlIEhTRSBvc2NpbGxhdG9yIGFyZQorICAgICAgYWxzbyBzd2l0Y2hlZCBvZmYuIFNSQU0gYW5kIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBsb3N0IGV4Y2VwdCBmb3IgdGhlIFJUQyByZWdpc3RlcnMsIFJUQworICAgICAgYmFja3VwIHJlZ2lzdGVycyBhbmQgU3RhbmRieSBjaXJjdWl0cnkuCisgICAgICAKKyAgICAgIFRvIG1pbmltaXplIHRoZSBjb25zdW1wdGlvbiBJbiBTdGFuZGJ5IG1vZGUsIFZSRUZJTlQsIHRoZSBCT1IsIFBWRCwgYW5kIHRlbXBlcmF0dXJlCisgICAgICAgc2Vuc29yIGNhbiBiZSBzd2l0Y2hlZCBvZmYgYmVmb3JlIGVudGVyaW5nIHRoZSBTdGFuZGJ5IG1vZGUuIFRoZXkgY2FuIGJlIHN3aXRjaGVkIAorICAgICAgIG9uIGFnYWluIGJ5IHNvZnR3YXJlIGFmdGVyIGV4aXRpbmcgdGhlIFN0YW5kYnkgbW9kZS4KKyAgICAgICBmdW5jdGlvbi4KKyAgICAgIAorICAgICAgKCspIEVudHJ5OgorICAgICAgICAoKyspIFRoZSBTdGFuZGJ5IG1vZGUgaXMgZW50ZXJlZCB1c2luZyB0aGUgSEFMX1BXUl9FbnRlclNUQU5EQllNb2RlKCkgZnVuY3Rpb24uCisgICAgICAoKykgRXhpdDoKKyAgICAgICAgKCsrKSBXS1VQIHBpbiByaXNpbmcgZWRnZSwgUlRDIGFsYXJtIChBbGFybSBBIGFuZCBBbGFybSBCKSwgUlRDIHdha2V1cCwKKyAgICAgICAgICAgICB0YW1wZXIgZXZlbnQsIHRpbWUtc3RhbXAgZXZlbnQsIGV4dGVybmFsIHJlc2V0IGluIE5SU1QgcGluLCBJV0RHIHJlc2V0LgorCisgICAqKiogQXV0by13YWtldXAgKEFXVSkgZnJvbSBsb3ctcG93ZXIgbW9kZSAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBNQ1UgY2FuIGJlIHdva2VuIHVwIGZyb20gbG93LXBvd2VyIG1vZGUgYnkgYW4gUlRDIEFsYXJtIGV2ZW50LCBhbiBSVEMgCisgICAgICBXYWtldXAgZXZlbnQsIGEgdGFtcGVyIGV2ZW50LCBhIHRpbWUtc3RhbXAgZXZlbnQsIG9yIGEgY29tcGFyYXRvciBldmVudCwgCisgICAgICB3aXRob3V0IGRlcGVuZGluZyBvbiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgKEF1dG8td2FrZXVwIG1vZGUpLgorCisgICAgKCspIFJUQyBhdXRvLXdha2V1cCAoQVdVKSBmcm9tIHRoZSBTdG9wIG1vZGUKKyAgICAgICAgKCsrKSBUbyB3YWtlIHVwIGZyb20gdGhlIFN0b3AgbW9kZSB3aXRoIGFuIFJUQyBhbGFybSBldmVudCwgaXQgaXMgbmVjZXNzYXJ5IHRvOgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRVhUSSBMaW5lIDE3IHRvIGJlIHNlbnNpdGl2ZSB0byByaXNpbmcgZWRnZXMgKEludGVycnVwdCAKKyAgICAgICAgICAgICAgICAgICBvciBFdmVudCBtb2RlcykgdXNpbmcgdGhlIEVYVElfSW5pdCgpIGZ1bmN0aW9uLgorICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgUlRDIEFsYXJtIEludGVycnVwdCB1c2luZyB0aGUgUlRDX0lUQ29uZmlnKCkgZnVuY3Rpb24KKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFJUQyB0byBnZW5lcmF0ZSB0aGUgUlRDIGFsYXJtIHVzaW5nIHRoZSBSVENfU2V0QWxhcm0oKSAKKyAgICAgICAgICAgICAgICAgICBhbmQgUlRDX0FsYXJtQ21kKCkgZnVuY3Rpb25zLgorICAgICAgICAoKyspIFRvIHdha2UgdXAgZnJvbSB0aGUgU3RvcCBtb2RlIHdpdGggYW4gUlRDIFRhbXBlciBvciB0aW1lIHN0YW1wIGV2ZW50LCBpdCAKKyAgICAgICAgICAgICBpcyBuZWNlc3NhcnkgdG86CisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBFWFRJIExpbmUgMTkgdG8gYmUgc2Vuc2l0aXZlIHRvIHJpc2luZyBlZGdlcyAoSW50ZXJydXB0IAorICAgICAgICAgICAgICAgICAgIG9yIEV2ZW50IG1vZGVzKSB1c2luZyB0aGUgRVhUSV9Jbml0KCkgZnVuY3Rpb24uCisgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBSVEMgVGFtcGVyIG9yIHRpbWUgc3RhbXAgSW50ZXJydXB0IHVzaW5nIHRoZSBSVENfSVRDb25maWcoKSAKKyAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFJUQyB0byBkZXRlY3QgdGhlIHRhbXBlciBvciB0aW1lIHN0YW1wIGV2ZW50IHVzaW5nIHRoZQorICAgICAgICAgICAgICAgICAgIFJUQ19UaW1lU3RhbXBDb25maWcoKSwgUlRDX1RhbXBlclRyaWdnZXJDb25maWcoKSBhbmQgUlRDX1RhbXBlckNtZCgpCisgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLgorICAgICAgICAoKyspIFRvIHdha2UgdXAgZnJvbSB0aGUgU3RvcCBtb2RlIHdpdGggYW4gUlRDIFdha2VVcCBldmVudCwgaXQgaXMgbmVjZXNzYXJ5IHRvOgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRVhUSSBMaW5lIDIwIHRvIGJlIHNlbnNpdGl2ZSB0byByaXNpbmcgZWRnZXMgKEludGVycnVwdCAKKyAgICAgICAgICAgICAgICAgICBvciBFdmVudCBtb2RlcykgdXNpbmcgdGhlIEVYVElfSW5pdCgpIGZ1bmN0aW9uLgorICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgUlRDIFdha2VVcCBJbnRlcnJ1cHQgdXNpbmcgdGhlIFJUQ19JVENvbmZpZygpIGZ1bmN0aW9uLgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgUlRDIHRvIGdlbmVyYXRlIHRoZSBSVEMgV2FrZVVwIGV2ZW50IHVzaW5nIHRoZSBSVENfV2FrZVVwQ2xvY2tDb25maWcoKSwgCisgICAgICAgICAgICAgICAgICAgUlRDX1NldFdha2VVcENvdW50ZXIoKSBhbmQgUlRDX1dha2VVcENtZCgpIGZ1bmN0aW9ucy4KKworICAgICgrKSBSVEMgYXV0by13YWtldXAgKEFXVSkgZnJvbSB0aGUgU3RhbmRieSBtb2RlCisgICAgICAgICgrKykgVG8gd2FrZSB1cCBmcm9tIHRoZSBTdGFuZGJ5IG1vZGUgd2l0aCBhbiBSVEMgYWxhcm0gZXZlbnQsIGl0IGlzIG5lY2Vzc2FyeSB0bzoKKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIFJUQyBBbGFybSBJbnRlcnJ1cHQgdXNpbmcgdGhlIFJUQ19JVENvbmZpZygpIGZ1bmN0aW9uLgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgUlRDIHRvIGdlbmVyYXRlIHRoZSBSVEMgYWxhcm0gdXNpbmcgdGhlIFJUQ19TZXRBbGFybSgpIAorICAgICAgICAgICAgICAgICAgIGFuZCBSVENfQWxhcm1DbWQoKSBmdW5jdGlvbnMuCisgICAgICAgICgrKykgVG8gd2FrZSB1cCBmcm9tIHRoZSBTdGFuZGJ5IG1vZGUgd2l0aCBhbiBSVEMgVGFtcGVyIG9yIHRpbWUgc3RhbXAgZXZlbnQsIGl0IAorICAgICAgICAgICAgIGlzIG5lY2Vzc2FyeSB0bzoKKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIFJUQyBUYW1wZXIgb3IgdGltZSBzdGFtcCBJbnRlcnJ1cHQgdXNpbmcgdGhlIFJUQ19JVENvbmZpZygpIAorICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgUlRDIHRvIGRldGVjdCB0aGUgdGFtcGVyIG9yIHRpbWUgc3RhbXAgZXZlbnQgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgUlRDX1RpbWVTdGFtcENvbmZpZygpLCBSVENfVGFtcGVyVHJpZ2dlckNvbmZpZygpIGFuZCBSVENfVGFtcGVyQ21kKCkKKyAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMuCisgICAgICAgICgrKykgVG8gd2FrZSB1cCBmcm9tIHRoZSBTdGFuZGJ5IG1vZGUgd2l0aCBhbiBSVEMgV2FrZVVwIGV2ZW50LCBpdCBpcyBuZWNlc3NhcnkgdG86CisgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBSVEMgV2FrZVVwIEludGVycnVwdCB1c2luZyB0aGUgUlRDX0lUQ29uZmlnKCkgZnVuY3Rpb24KKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFJUQyB0byBnZW5lcmF0ZSB0aGUgUlRDIFdha2VVcCBldmVudCB1c2luZyB0aGUgUlRDX1dha2VVcENsb2NrQ29uZmlnKCksIAorICAgICAgICAgICAgICAgICAgIFJUQ19TZXRXYWtlVXBDb3VudGVyKCkgYW5kIFJUQ19XYWtlVXBDbWQoKSBmdW5jdGlvbnMuCisKKyAgICAoKykgQ29tcGFyYXRvciBhdXRvLXdha2V1cCAoQVdVKSBmcm9tIHRoZSBTdG9wIG1vZGUKKyAgICAgICAgKCsrKSBUbyB3YWtlIHVwIGZyb20gdGhlIFN0b3AgbW9kZSB3aXRoIGFuIGNvbXBhcmF0b3IgMSBvciBjb21wYXJhdG9yIDIgd2FrZXVwCisgICAgICAgICAgICAgZXZlbnQsIGl0IGlzIG5lY2Vzc2FyeSB0bzoKKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIEVYVEkgTGluZSAyMSBmb3IgY29tcGFyYXRvciAxIG9yIEVYVEkgTGluZSAyMiBmb3IgY29tcGFyYXRvciAyIAorICAgICAgICAgICAgICAgICAgIHRvIGJlIHNlbnNpdGl2ZSB0byB0byB0aGUgc2VsZWN0ZWQgZWRnZXMgKGZhbGxpbmcsIHJpc2luZyBvciBmYWxsaW5nIAorICAgICAgICAgICAgICAgICAgIGFuZCByaXNpbmcpIChJbnRlcnJ1cHQgb3IgRXZlbnQgbW9kZXMpIHVzaW5nIHRoZSBFWFRJX0luaXQoKSBmdW5jdGlvbi4KKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGNvbXBhcmF0b3IgdG8gZ2VuZXJhdGUgdGhlIGV2ZW50LiAgICAgIAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIEVuYWJsZXMgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluIChSVEMgcmVnaXN0ZXJzLCBSVEMKKyAgKiAgICAgICAgIGJhY2t1cCBkYXRhIHJlZ2lzdGVycyApLgorICAqIEBub3RlICAgSWYgdGhlIEhTRSBkaXZpZGVkIGJ5IDIsIDQsIDggb3IgMTYgaXMgdXNlZCBhcyB0aGUgUlRDIGNsb2NrLCB0aGUKKyAgKiAgICAgICAgIEJhY2t1cCBEb21haW4gQWNjZXNzIHNob3VsZCBiZSBrZXB0IGVuYWJsZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2Vzcyh2b2lkKQoreworICAvKiBFbmFibGUgYWNjZXNzIHRvIFJUQyBhbmQgYmFja3VwIHJlZ2lzdGVycyAqLworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9EQlApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIGFjY2VzcyB0byB0aGUgYmFja3VwIGRvbWFpbiAKKyAgKiBAbm90ZSAgIEFwcGxpZXMgdG8gUlRDIHJlZ2lzdGVycywgUlRDIGJhY2t1cCBkYXRhIHJlZ2lzdGVycy4KKyAgKiBAbm90ZSAgIElmIHRoZSBIU0UgZGl2aWRlZCBieSAyLCA0LCA4IG9yIDE2IGlzIHVzZWQgYXMgdGhlIFJUQyBjbG9jaywgdGhlCisgICogICAgICAgICBCYWNrdXAgRG9tYWluIEFjY2VzcyBzaG91bGQgYmUga2VwdCBlbmFibGVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKHZvaWQpCit7CisgIC8qIERpc2FibGUgYWNjZXNzIHRvIFJUQyBhbmQgYmFja3VwIHJlZ2lzdGVycyAqLworICBDTEVBUl9CSVQoUFdSLT5DUiwgUFdSX0NSX0RCUCk7Cit9CisKKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgdm9sdGFnZSB0aHJlc2hvbGQgZGV0ZWN0ZWQgYnkgdGhlIFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3IoUFZEKS4KKyAgKiBAcGFyYW0gIHNDb25maWdQVkQgcG9pbnRlciB0byBhbiBQV1JfUFZEVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBQVkQuCisgICogQG5vdGUgICBSZWZlciB0byB0aGUgZWxlY3RyaWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgeW91ciBkZXZpY2UgZGF0YXNoZWV0IGZvcgorICAqICAgICAgICAgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSB2b2x0YWdlIHRocmVzaG9sZCBjb3JyZXNwb25kaW5nIHRvIGVhY2gKKyAgKiAgICAgICAgIGRldGVjdGlvbiBsZXZlbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9Db25maWdQVkQoUFdSX1BWRFR5cGVEZWYgKnNDb25maWdQVkQpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QV1JfUFZEX0xFVkVMKHNDb25maWdQVkQtPlBWRExldmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfUFZEX01PREUoc0NvbmZpZ1BWRC0+TW9kZSkpOworCisgIC8qIFNldCBQTFNbNzo1XSBiaXRzIGFjY29yZGluZyB0byBQVkRMZXZlbCB2YWx1ZSAqLworICBNT0RJRllfUkVHKFBXUi0+Q1IsIFBXUl9DUl9QTFMsIHNDb25maWdQVkQtPlBWRExldmVsKTsKKyAgCisgIC8qIENsZWFyIGFueSBwcmV2aW91cyBjb25maWcuIEtlZXAgaXQgY2xlYXIgaWYgbm8gZXZlbnQgb3IgSVQgbW9kZSBpcyBzZWxlY3RlZCAqLworICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9FVkVOVCgpOworICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9JVCgpOworICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7CisKKyAgLyogQ29uZmlndXJlIGludGVycnVwdCBtb2RlICovCisgIGlmKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX01PREVfSVQpID09IFBWRF9NT0RFX0lUKQorICB7CisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9JVCgpOworICB9CisgIAorICAvKiBDb25maWd1cmUgZXZlbnQgbW9kZSAqLworICBpZigoc0NvbmZpZ1BWRC0+TW9kZSAmIFBWRF9NT0RFX0VWVCkgPT0gUFZEX01PREVfRVZUKQorICB7CisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9FVkVOVCgpOworICB9CisgIAorICAvKiBDb25maWd1cmUgdGhlIGVkZ2UgKi8KKyAgaWYoKHNDb25maWdQVkQtPk1vZGUgJiBQVkRfUklTSU5HX0VER0UpID09IFBWRF9SSVNJTkdfRURHRSkKKyAgeworICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKKyAgfQorICAKKyAgaWYoKHNDb25maWdQVkQtPk1vZGUgJiBQVkRfRkFMTElOR19FREdFKSA9PSBQVkRfRkFMTElOR19FREdFKQorICB7CisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlcyB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcihQVkQpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VuYWJsZVBWRCh2b2lkKQoreworICAvKiBFbmFibGUgdGhlIHBvd2VyIHZvbHRhZ2UgZGV0ZWN0b3IgKi8KKyAgU0VUX0JJVChQV1ItPkNSLCBQV1JfQ1JfUFZERSk7Cit9CisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlcyB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcihQVkQpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0Rpc2FibGVQVkQodm9pZCkKK3sKKyAgLyogRGlzYWJsZSB0aGUgcG93ZXIgdm9sdGFnZSBkZXRlY3RvciAqLworICBDTEVBUl9CSVQoUFdSLT5DUiwgUFdSX0NSX1BWREUpOworfQorI2VuZGlmIC8qIFBXUl9QVkRfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlcyB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eS4KKyAgKiBAcGFyYW0gV2FrZVVwUGlueDogU3BlY2lmaWVzIHRoZSBQb3dlciBXYWtlLVVwIHBpbiB0byBlbmFibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFBXUl9XQUtFVVBfUElOMQorICAqICAgICAgICAgICBAYXJnIFBXUl9XQUtFVVBfUElOMgorICAqICAgICAgICAgICBAYXJnIFBXUl9XQUtFVVBfUElOMyBmb3Igc3RtMzJsMDd4eHggYW5kIHN0bTMybDA4eHh4IGRldmljZXMgb25seS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbmFibGVXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGlueCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1dBS0VVUF9QSU4oV2FrZVVwUGlueCkpOworICAvKiBFbmFibGUgdGhlIEVXVVB4IHBpbiAqLworICBTRVRfQklUKFBXUi0+Q1NSLCBXYWtlVXBQaW54KTsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGVzIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5LgorICAqIEBwYXJhbSBXYWtlVXBQaW54OiBTcGVjaWZpZXMgdGhlIFBvd2VyIFdha2UtVXAgcGluIHRvIGRpc2FibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFBXUl9XQUtFVVBfUElOMQorICAqICAgICAgICAgICBAYXJnIFBXUl9XQUtFVVBfUElOMiAgCisgICogICAgICAgICAgIEBhcmcgUFdSX1dBS0VVUF9QSU4zICBmb3Igc3RtMzJsMDd4eHggYW5kIHN0bTMybDA4eHh4IGRldmljZXMgb25seS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbngpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9XQUtFVVBfUElOKFdha2VVcFBpbngpKTsKKyAgLyogRGlzYWJsZSB0aGUgRVdVUHggcGluICovCisgIENMRUFSX0JJVChQV1ItPkNTUiwgV2FrZVVwUGlueCk7Cit9CisKKy8qKgorICAqIEBicmllZiBFbnRlcnMgU2xlZXAgbW9kZS4KKyAgKiBAbm90ZSBJbiBTbGVlcCBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4KKyAgKiBAcGFyYW0gUmVndWxhdG9yOiBTcGVjaWZpZXMgdGhlIHJlZ3VsYXRvciBzdGF0ZSBpbiBTTEVFUCBtb2RlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFBXUl9NQUlOUkVHVUxBVE9SX09OOiBTTEVFUCBtb2RlIHdpdGggcmVndWxhdG9yIE9OCisgICogICAgICAgICAgICBAYXJnIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTjogU0xFRVAgbW9kZSB3aXRoIGxvdyBwb3dlciByZWd1bGF0b3IgT04KKyAgKiBAcGFyYW0gU0xFRVBFbnRyeTogU3BlY2lmaWVzIGlmIFNMRUVQIG1vZGUgaXMgZW50ZXJlZCB3aXRoIFdGSSBvciBXRkUgaW5zdHJ1Y3Rpb24uCisgICogICAgICAgICAgIFdoZW4gV0ZJIGVudHJ5IGlzIHVzZWQsIHRpY2sgaW50ZXJydXB0IGhhdmUgdG8gYmUgZGlzYWJsZWQgaWYgbm90IGRlc2lyZWQgYXMgCisgICogICAgICAgICAgIHRoZSBpbnRlcnJ1cHQgd2FrZSB1cCBzb3VyY2UuCisgICogICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFBXUl9TTEVFUEVOVFJZX1dGSTogZW50ZXIgU0xFRVAgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbgorICAqICAgICAgICAgICAgQGFyZyBQV1JfU0xFRVBFTlRSWV9XRkU6IGVudGVyIFNMRUVQIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbnRlclNMRUVQTW9kZSh1aW50MzJfdCBSZWd1bGF0b3IsIHVpbnQ4X3QgU0xFRVBFbnRyeSkKK3sKKyAgIHVpbnQzMl90IHRtcHJlZyA9IDBVOworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1JFR1VMQVRPUihSZWd1bGF0b3IpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9TTEVFUF9FTlRSWShTTEVFUEVudHJ5KSk7CisKKyAgLyogU2VsZWN0IHRoZSByZWd1bGF0b3Igc3RhdGUgaW4gU2xlZXAgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB0bXByZWcgPSBQV1ItPkNSOworCisgIC8qIENsZWFyIFBERFMgYW5kIExQRFMgYml0cyAqLworICBDTEVBUl9CSVQodG1wcmVnLCAoUFdSX0NSX1BERFMgfCBQV1JfQ1JfTFBTRFNSKSk7CisKKyAvKiBTZXQgTFBTRFNSIGJpdCBhY2NvcmRpbmcgdG8gUFdSX1JlZ3VsYXRvciB2YWx1ZSAqLworICBTRVRfQklUKHRtcHJlZywgUmVndWxhdG9yKTsKKworICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovCisgIFBXUi0+Q1IgPSB0bXByZWc7CisgIAorICAvKiBDbGVhciBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsIFNDQl9TQ1JfU0xFRVBERUVQX01zayk7CisKKyAgLyogU2VsZWN0IFNMRUVQIG1vZGUgZW50cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKFNMRUVQRW50cnkgPT0gUFdSX1NMRUVQRU5UUllfV0ZJKQorICB7CisgICAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8KKyAgICBfX1dGSSgpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgRXZlbnQgKi8KKyAgICBfX1NFVigpOworICAgIF9fV0ZFKCk7CisgICAgX19XRkUoKTsKKyAgfQorCisgIC8qIEFkZGl0aW9uYWwgTk9QIHRvIGVuc3VyZSBhbGwgcGVuZGluZyBpbnN0cnVjdGlvbnMgYXJlIGZsdXNoZWQgYmVmb3JlIGVudGVyaW5nIGxvdyBwb3dlciBtb2RlICovCisgIF9fTk9QKCk7CisKK30KKworLyoqCisgICogQGJyaWVmIEVudGVycyBTdG9wIG1vZGUuIAorICAqIEBub3RlIEluIFN0b3AgbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuIG1vZGUuCisgICogQG5vdGUgV2hlbiBleGl0aW5nIFN0b3AgbW9kZSBieSBpc3N1aW5nIGFuIGludGVycnVwdCBvciBhIHdha2V1cCBldmVudCwKKyAgKiAgICAgICAgTVNJIG9yIEhTSTE2IFJDb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgZGVwZW5kaW5nIAorICAqICAgICAgICB0aGUgYml0IFNUT1BXVUNLIGluIHRoZSBSQ0NfQ0ZHUiByZWdpc3Rlci4KKyAgKiBAbm90ZSBXaGVuIHRoZSB2b2x0YWdlIHJlZ3VsYXRvciBvcGVyYXRlcyBpbiBsb3cgcG93ZXIgbW9kZSwgYW4gYWRkaXRpb25hbAorICAqICAgICAgICAgc3RhcnR1cCBkZWxheSBpcyBpbmN1cnJlZCB3aGVuIHdha2luZyB1cCBmcm9tIFN0b3AgbW9kZS4gCisgICogICAgICAgICBCeSBrZWVwaW5nIHRoZSBpbnRlcm5hbCByZWd1bGF0b3IgT04gZHVyaW5nIFN0b3AgbW9kZSwgdGhlIGNvbnN1bXB0aW9uCisgICogICAgICAgICBpcyBoaWdoZXIgYWx0aG91Z2ggdGhlIHN0YXJ0dXAgdGltZSBpcyByZWR1Y2VkLgorICAqIEBub3RlIEJlZm9yZSBlbnRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uLCBpdCBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIFdVRgorICAqICAgICAgIHdha2V1cCBmbGFnIGlzIGNsZWFyZWQuIFRvIHBlcmZvcm0gdGhpcyBhY3Rpb24sIGl0IGlzIHBvc3NpYmxlIHRvIGNhbGwgdGhlCisgICogICAgICAgZm9sbG93aW5nIG1hY3JvIDogX19IQUxfUFdSX0NMRUFSX0ZMQUcoUFdSX0ZMQUdfV1UpCisgICoKKyAgKiBAcGFyYW0gUmVndWxhdG9yOiBTcGVjaWZpZXMgdGhlIHJlZ3VsYXRvciBzdGF0ZSBpbiBTdG9wIG1vZGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX01BSU5SRUdVTEFUT1JfT046IFN0b3AgbW9kZSB3aXRoIHJlZ3VsYXRvciBPTgorICAqICAgICAgICAgICAgQGFyZyBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT046IFN0b3AgbW9kZSB3aXRoIGxvdyBwb3dlciByZWd1bGF0b3IgT04KKyAgKiBAcGFyYW0gU1RPUEVudHJ5OiBTcGVjaWZpZXMgaWYgU3RvcCBtb2RlIGluIGVudGVyZWQgd2l0aCBXRkkgb3IgV0ZFIGluc3RydWN0aW9uLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFBXUl9TVE9QRU5UUllfV0ZJOiBFbnRlciBTdG9wIG1vZGUgd2l0aCBXRkkgaW5zdHJ1Y3Rpb24KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX1NUT1BFTlRSWV9XRkU6IEVudGVyIFN0b3AgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbiAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VudGVyU1RPUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNUT1BFbnRyeSkKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9SRUdVTEFUT1IoUmVndWxhdG9yKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfU1RPUF9FTlRSWShTVE9QRW50cnkpKTsKKworICAvKiBTZWxlY3QgdGhlIHJlZ3VsYXRvciBzdGF0ZSBpbiBTdG9wIG1vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdG1wcmVnID0gUFdSLT5DUjsKKyAgCisgIC8qIENsZWFyIFBERFMgYW5kIExQRFMgYml0cyAqLworICBDTEVBUl9CSVQodG1wcmVnLCAoUFdSX0NSX1BERFMgfCBQV1JfQ1JfTFBTRFNSKSk7CisKKyAvKiBTZXQgTFBTRFNSIGJpdCBhY2NvcmRpbmcgdG8gUFdSX1JlZ3VsYXRvciB2YWx1ZSAqLworICBTRVRfQklUKHRtcHJlZywgUmVndWxhdG9yKTsKKworICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovCisgIFBXUi0+Q1IgPSB0bXByZWc7CisKKyAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsIFNDQl9TQ1JfU0xFRVBERUVQX01zayk7CisKKyAgLyogU2VsZWN0IFN0b3AgbW9kZSBlbnRyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKFNUT1BFbnRyeSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkKKyAgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgSW50ZXJydXB0ICovCisgICAgX19XRkkoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEV2ZW50ICovCisgICAgX19TRVYoKTsKKyAgICBfX1dGRSgpOworICAgIF9fV0ZFKCk7CisgIH0KKyAKKyAgLyogUmVzZXQgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCBTQ0JfU0NSX1NMRUVQREVFUF9Nc2spOworCit9CisKKy8qKgorICAqIEBicmllZiBFbnRlcnMgU3RhbmRieSBtb2RlLgorICAqIEBub3RlIEluIFN0YW5kYnkgbW9kZSwgYWxsIEkvTyBwaW5zIGFyZSBoaWdoIGltcGVkYW5jZSBleGNlcHQgZm9yOgorICAqICAgICAgICAgIC0gUmVzZXQgcGFkIChzdGlsbCBhdmFpbGFibGUpIAorICAqICAgICAgICAgIC0gUlRDX0FGMSBwaW4gKFBDMTMpIGlmIGNvbmZpZ3VyZWQgZm9yIHRhbXBlciwgdGltZS1zdGFtcCwgUlRDCisgICogICAgICAgICAgICBBbGFybSBvdXQsIG9yIFJUQyBjbG9jayBjYWxpYnJhdGlvbiBvdXQuCisgICogICAgICAgICAgLSBSVENfQUYyIHBpbiAoUEMxMykgaWYgY29uZmlndXJlZCBmb3IgdGFtcGVyLgorICAqICAgICAgICAgIC0gV0tVUCBwaW4gMSAoUEEwMCkgaWYgZW5hYmxlZC4KKyAgKiAgICAgICAgICAtIFdLVVAgcGluIDIgKFBDMTMpIGlmIGVuYWJsZWQuCisgICogICAgICAgICAgLSBXS1VQIHBpbiAzIChQRTA2KSBpZiBlbmFibGVkLCBmb3Igc3RtMzJsMDd4eHggYW5kIHN0bTMybDA4eHh4IGRldmljZXMgb25seS4KKyAgKiAgICAgICAgICAtIFdLVVAgcGluIDMgKFBBMDIpIGlmIGVuYWJsZWQsIGZvciBzdG0zMmwwMzF4eCBkZXZpY2VzIG9ubHkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW50ZXJTVEFOREJZTW9kZSh2b2lkKQoreworICAvKiBTZWxlY3QgU3RhbmRieSBtb2RlICovCisgIFNFVF9CSVQoUFdSLT5DUiwgUFdSX0NSX1BERFMpOworCisgIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCBTQ0JfU0NSX1NMRUVQREVFUF9Nc2spOworCisgIC8qIFRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgc3RvcmUgb3BlcmF0aW9ucyBhcmUgY29tcGxldGVkICovCisjaWYgZGVmaW5lZCAoIF9fQ0NfQVJNKQorICBfX2ZvcmNlX3N0b3JlcygpOworI2VuZGlmCisgIC8qIFJlcXVlc3QgV2FpdCBGb3IgSW50ZXJydXB0ICovCisgIF9fV0ZJKCk7Cit9CisKKy8qKgorICAqIEBicmllZiBJbmRpY2F0ZXMgU2xlZXAtT24tRXhpdCB3aGVuIHJldHVybmluZyBmcm9tIEhhbmRsZXIgbW9kZSB0byBUaHJlYWQgbW9kZS4gCisgICogQG5vdGUgU2V0IFNMRUVQT05FWElUIGJpdCBvZiBTQ1IgcmVnaXN0ZXIuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGUgcHJvY2Vzc29yIAorICAqICAgICAgIHJlLWVudGVycyBTTEVFUCBtb2RlIHdoZW4gYW4gaW50ZXJydXB0aW9uIGhhbmRsaW5nIGlzIG92ZXIuCisgICogICAgICAgU2V0dGluZyB0aGlzIGJpdCBpcyB1c2VmdWwgd2hlbiB0aGUgcHJvY2Vzc29yIGlzIGV4cGVjdGVkIHRvIHJ1biBvbmx5IG9uCisgICogICAgICAgaW50ZXJydXB0aW9ucyBoYW5kbGluZy4gICAgICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKQoreworICAvKiBTZXQgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBPTkVYSVRfTXNrKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIERpc2FibGVzIFNsZWVwLU9uLUV4aXQgZmVhdHVyZSB3aGVuIHJldHVybmluZyBmcm9tIEhhbmRsZXIgbW9kZSB0byBUaHJlYWQgbW9kZS4gCisgICogQG5vdGUgQ2xlYXJzIFNMRUVQT05FWElUIGJpdCBvZiBTQ1IgcmVnaXN0ZXIuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGUgcHJvY2Vzc29yIAorICAqICAgICAgIHJlLWVudGVycyBTTEVFUCBtb2RlIHdoZW4gYW4gaW50ZXJydXB0aW9uIGhhbmRsaW5nIGlzIG92ZXIuICAgICAgICAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0Rpc2FibGVTbGVlcE9uRXhpdCh2b2lkKQoreworICAvKiBDbGVhciBTTEVFUE9ORVhJVCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOworfQorCisKKy8qKgorICAqIEBicmllZiBFbmFibGVzIENPUlRFWCBNMCsgU0VWT05QRU5EIGJpdC4gCisgICogQG5vdGUgU2V0cyBTRVZPTlBFTkQgYml0IG9mIFNDUiByZWdpc3Rlci4gV2hlbiB0aGlzIGJpdCBpcyBzZXQsIHRoaXMgY2F1c2VzIAorICAqICAgICAgIFdGRSB0byB3YWtlIHVwIHdoZW4gYW4gaW50ZXJydXB0IG1vdmVzIGZyb20gaW5hY3RpdmUgdG8gcGVuZGVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VuYWJsZVNFVk9uUGVuZCh2b2lkKQoreworICAvKiBTZXQgU0VWT05QRU5EIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NFVk9OUEVORF9Nc2spKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZXMgQ09SVEVYIE0wKyBTRVZPTlBFTkQgYml0LiAKKyAgKiBAbm90ZSBDbGVhcnMgU0VWT05QRU5EIGJpdCBvZiBTQ1IgcmVnaXN0ZXIuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGlzIGNhdXNlcyAKKyAgKiAgICAgICBXRkUgdG8gd2FrZSB1cCB3aGVuIGFuIGludGVycnVwdCBtb3ZlcyBmcm9tIGluYWN0aXZlIHRvIHBlbmRlZC4gICAgICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlU0VWT25QZW5kKHZvaWQpCit7CisgIC8qIENsZWFyIFNFVk9OUEVORCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NFVk9OUEVORF9Nc2spKTsKK30KKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgUFdSIFBWRCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAbm90ZSBUaGlzIEFQSSBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIHRoZSBQVkRfSVJRSGFuZGxlcigpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX1BWRF9JUlFIYW5kbGVyKHZvaWQpCit7CisgIC8qIENoZWNrIFBXUiBleHRpIGZsYWcgKi8KKyAgaWYoX19IQUxfUFdSX1BWRF9FWFRJX0dFVF9GTEFHKCkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBQV1IgUFZEIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1BXUl9QVkRDYWxsYmFjaygpOworCisgICAgLyogQ2xlYXIgUFdSIEV4dGkgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRkxBRygpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUFdSIFBWRCBpbnRlcnJ1cHQgY2FsbGJhY2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QV1JfUFZEQ2FsbGJhY2sodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QV1JfUFZEQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisjZW5kaWYgLyogUFdSX1BWRF9TVVBQT1JUICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUFdSX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9wd3JfZXguYyBiL1NyYy9zdG0zMmwweHhfaGFsX3B3cl9leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMWU1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9wd3JfZXguYwpAQCAtMCwwICsxLDE4NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfcHdyX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIFBXUiBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBQb3dlciBDb250cm9sbGVyIChQV1IpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgIAorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKyNpZmRlZiBIQUxfUFdSX01PRFVMRV9FTkFCTEVECisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSRXggCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUkV4X1ByaXZhdGUKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHRlbmRlZF9UaW1lT3V0X1ZhbHVlIFBXUkV4IEZsYWcgU2V0dGluZyBUaW1lIE91dCBWYWx1ZQorICAqIEB7CisgICovIAorI2RlZmluZSBQV1JfRkxBR19TRVRUSU5HX0RFTEFZX1VTIDUwVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQGJyaWVmICAgICAgTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorICAqCitAdmVyYmF0aW0KKworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBleHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIFZvbHRhZ2UgU2NhbGluZyBSYW5nZS4gICAKKyAgKiBAcmV0dmFsIFZPUyBiaXQgZmllbGQgKFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEsIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIgb3IgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMykKKyAgKi8gIAordWludDMyX3QgSEFMX1BXUkV4X0dldFZvbHRhZ2VSYW5nZSh2b2lkKQoreworICByZXR1cm4gIChQV1ItPkNSICYgUFdSX0NSX1ZPUyk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBGYXN0IFdha2VVcCBmcm9tIFVsdHJhIExvdyBQb3dlciBtb2RlLgorICAqIEBub3RlIFRoaXMgYml0IHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggVUxQIGJpdC4gCisgICogICAgICAgIE1lYW5zLCB3aGVuIFVMUCA9IDEgYW5kIEZXVSA9IDEgOlZSRUZJTlQgc3RhcnR1cCB0aW1lIGlzIGlnbm9yZWQgd2hlbiAKKyAgKiAgICAgICAgZXhpdGluZyBmcm9tIGxvdyBwb3dlciBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlRmFzdFdha2VVcCh2b2lkKQoreworICAvKiBFbmFibGUgdGhlIGZhc3Qgd2FrZSB1cCAqLworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9GV1UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBGYXN0IFdha2VVcCBmcm9tIFVsdHJhIExvdyBQb3dlciBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZUZhc3RXYWtlVXAodm9pZCkKK3sKKyAgLyogRGlzYWJsZSB0aGUgZmFzdCB3YWtlIHVwICovCisgIENMRUFSX0JJVChQV1ItPkNSLCBQV1JfQ1JfRldVKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBVbHRyYSBMb3cgUG93ZXIgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlVWx0cmFMb3dQb3dlcih2b2lkKQoreworICAvKiBFbmFibGUgdGhlIFVsdHJhIExvdyBQb3dlciBtb2RlICovCisgIFNFVF9CSVQoUFdSLT5DUiwgUFdSX0NSX1VMUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIFVsdHJhIExvdyBQb3dlciBtb2RlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlVWx0cmFMb3dQb3dlcih2b2lkKQoreworICAvKiBEaXNhYmxlIHRoZSBVbHRyYSBMb3cgUG93ZXIgbW9kZSAqLworICBDTEVBUl9CSVQoUFdSLT5DUiwgUFdSX0NSX1VMUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBMb3cgUG93ZXIgUnVuIG1vZGUuCisgICogQG5vdGUgICBMb3cgcG93ZXIgcnVuIG1vZGUgY2FuIG9ubHkgYmUgZW50ZXJlZCB3aGVuIFZDT1JFIGlzIGluIHJhbmdlIDIuCisgICogICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIGR5bmFtaWMgdm9sdGFnZSBzY2FsaW5nIG11c3Qgbm90IGJlIHVzZWQgd2hlbiBMb3cKKyAgKiAgICAgICAgIHBvd2VyIHJ1biBtb2RlIGlzIHNlbGVjdGVkLiBPbmx5IFN0b3AgYW5kIFNsZWVwIG1vZGVzIHdpdGggcmVndWxhdG9yCisgICogICAgICAgICBjb25maWd1cmVkIGluIExvdyBwb3dlciBtb2RlIGlzIGFsbG93ZWQgd2hlbiBMb3cgcG93ZXIgcnVuIG1vZGUgaXMgCisgICogICAgICAgICBzZWxlY3RlZC4KKyAgKiBAbm90ZSAgIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHN5c3RlbSBjbG9jayBtdXN0IGJlIGRlY3JlYXNlZCB0byBub3QgZXhjZWVkIHRoZQorICAqICAgICAgICAgZnJlcXVlbmN5IG9mIFJDQ19NU0lSQU5HRV8xLgorICAqIEBub3RlICAgSW4gTG93IHBvd2VyIHJ1biBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSh2b2lkKQoreworICAvKiBFbnRlcnMgdGhlIExvdyBQb3dlciBSdW4gbW9kZSAqLworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9MUFNEU1IpOworICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9MUFJVTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgTG93IFBvd2VyIFJ1biBtb2RlLgorICAqIEBub3RlICBCZWZvcmUgSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUoKSBjb21wbGV0aW9uLCB0aGUgZnVuY3Rpb24gY2hlY2tzIHRoYXQgCisgICogICAgICAgIFJFR0xQRiBoYXMgYmVlbiBwcm9wZXJseSByZXNldCAob3RoZXJ3aXNlLCBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSAKKyAgKiAgICAgICAgcmV0dXJucyBIQUxfVElNRU9VVCBzdGF0dXMpLiBUaGUgc3lzdGVtIGNsb2NrIGZyZXF1ZW5jeSBjYW4gdGhlbiBiZQorICAqICAgICAgICBpbmNyZWFzZWQgYWJvdmUgMiBNSHouICAgCisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUodm9pZCkKK3sKKyAgdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFU7CisgIAorICAvKiBFeGl0IHRoZSBMb3cgUG93ZXIgUnVuIG1vZGUgKi8KKyAgQ0xFQVJfQklUKFBXUi0+Q1IsIFBXUl9DUl9MUFJVTik7CisgIENMRUFSX0JJVChQV1ItPkNSLCBQV1JfQ1JfTFBTRFNSKTsKKyAgCisgIC8qIFdhaXQgdW50aWwgUkVHTFBGIGlzIHJlc2V0ICovCisgIHdhaXRfbG9vcF9pbmRleCA9IChQV1JfRkxBR19TRVRUSU5HX0RFTEFZX1VTICogKFN5c3RlbUNvcmVDbG9jayAvIDEwMDAwMDBVKSk7CisKKyAgd2hpbGUgKCh3YWl0X2xvb3BfaW5kZXggIT0gMFUpICYmIChIQUxfSVNfQklUX1NFVChQV1ItPkNTUiwgUFdSX0NTUl9SRUdMUEYpKSkKKyAgeworICAgIHdhaXRfbG9vcF9pbmRleC0tOworICB9CisKKyAgaWYgKEhBTF9JU19CSVRfU0VUKFBXUi0+Q1NSLCBQV1JfQ1NSX1JFR0xQRikpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIEhBTF9QV1JfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfcmNjLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9yY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWI0NTVkCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfcmNjLmMKQEAgLTAsMCArMSwxNDkwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9yY2MuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgUkNDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFJlc2V0IGFuZCBDbG9jayBDb250cm9sIChSQ0MpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUkNDIHNwZWNpZmljIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIEFmdGVyIHJlc2V0IHRoZSBkZXZpY2UgaXMgcnVubmluZyBmcm9tIG11bHRpc3BlZWQgaW50ZXJuYWwgb3NjaWxsYXRvciBjbG9jaworICAgICAgKE1TSSAyLjA5N01Ieikgd2l0aCBGbGFzaCAwIHdhaXQgc3RhdGUgYW5kIEZsYXNoIHByZWZldGNoIGJ1ZmZlciBpcyBkaXNhYmxlZCwKKyAgICAgIGFuZCBhbGwgcGVyaXBoZXJhbHMgYXJlIG9mZiBleGNlcHQgaW50ZXJuYWwgU1JBTSwgRmxhc2ggYW5kIEpUQUcuCisgICAgICAoKykgVGhlcmUgaXMgbm8gcHJlc2NhbGVyIG9uIEhpZ2ggc3BlZWQgKEFIQikgYW5kIExvdyBzcGVlZCAoQVBCKSBidXNlczsKKyAgICAgICAgICBhbGwgcGVyaXBoZXJhbHMgbWFwcGVkIG9uIHRoZXNlIGJ1c2VzIGFyZSBydW5uaW5nIGF0IE1TSSBzcGVlZC4KKyAgICAgICgrKSBUaGUgY2xvY2sgZm9yIGFsbCBwZXJpcGhlcmFscyBpcyBzd2l0Y2hlZCBvZmYsIGV4Y2VwdCB0aGUgU1JBTSBhbmQgRkxBU0guCisgICAgICAoKykgQWxsIEdQSU9zIGFyZSBpbiBpbnB1dCBmbG9hdGluZyBzdGF0ZSwgZXhjZXB0IHRoZSBKVEFHIHBpbnMgd2hpY2gKKyAgICAgICAgICBhcmUgYXNzaWduZWQgdG8gYmUgdXNlZCBmb3IgZGVidWcgcHVycG9zZS4KKyAgICBbLi5dIE9uY2UgdGhlIGRldmljZSBzdGFydGVkIGZyb20gcmVzZXQsIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGhhcyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSB0byBiZSB1c2VkIHRvIGRyaXZlIHRoZSBTeXN0ZW0gY2xvY2sKKyAgICAgICAgICAoaWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIGhpZ2hlciBmcmVxdWVuY3kvcGVyZm9ybWFuY2UpCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBTeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGFuZCBGbGFzaCBzZXR0aW5ncworICAgICAgKCspIENvbmZpZ3VyZSB0aGUgQUhCIGFuZCBBUEIgYnVzZXMgcHJlc2NhbGVycworICAgICAgKCspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBwZXJpcGhlcmFsKHMpIHRvIGJlIHVzZWQKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZShzKSBmb3IgcGVyaXBoZXJhbHMgd2hvc2UgY2xvY2tzIGFyZSBub3QKKyAgICAgICAgICBkZXJpdmVkIGZyb20gdGhlIFN5c3RlbSBjbG9jayAoSTJTLCBSVEMsIEFEQywgVVNCIE9URyBGUy9TRElPL1JORykKKyAgICAgICAgICAoKikgU0RJTyBvbmx5IGZvciBTVE0zMkwweHh4RCBkZXZpY2VzCisKKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBSQ0MgTGltaXRhdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgQSBkZWxheSBiZXR3ZWVuIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsZSBhbmQgdGhlIGVmZmVjdGl2ZSBwZXJpcGhlcmFsCisgICAgICBlbmFibGluZyBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IGluIG9yZGVyIHRvIG1hbmFnZSB0aGUgcGVyaXBoZXJhbCByZWFkL3dyaXRlCisgICAgICBmcm9tL3RvIHJlZ2lzdGVycy4KKyAgICAgICgrKSBUaGlzIGRlbGF5IGRlcGVuZHMgb24gdGhlIHBlcmlwaGVyYWwgbWFwcGluZy4KKyAgICAgICAgKCsrKSBBSEIgJiBBUEIgcGVyaXBoZXJhbHMsIDEgZHVtbXkgcmVhZCBpcyBuZWNlc3NhcnkKKworICAgIFsuLl0KKyAgICAgIFdvcmthcm91bmRzOgorICAgICAgKCMpIEZvciBBSEIgJiBBUEIgcGVyaXBoZXJhbHMsIGEgZHVtbXkgcmVhZCB0byB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciBoYXMgYmVlbgorICAgICAgICAgIGluc2VydGVkIGluIGVhY2ggX19IQUxfUkNDX1BQUF9DTEtfRU5BQkxFKCkgbWFjcm8uCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDIFJDQworKiBAYnJpZWYgUkNDIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfUHJpdmF0ZV9NYWNyb3MgUkNDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBNQ08xX0NMS19FTkFCTEUoKSAgICAgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKQorI2RlZmluZSBNQ08xX0dQSU9fUE9SVCAgICAgICAgR1BJT0EKKyNkZWZpbmUgTUNPMV9QSU4gICAgICAgICAgICAgIEdQSU9fUElOXzgKKworI2RlZmluZSBNQ08yX0NMS19FTkFCTEUoKSAgICAgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKQorI2RlZmluZSBNQ08yX0dQSU9fUE9SVCAgICAgICAgR1BJT0EKKyNkZWZpbmUgTUNPMl9QSU4gICAgICAgICAgICAgIEdQSU9fUElOXzkKKworI2lmICBkZWZpbmVkKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KSBcCisgIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgxeHgpCisjZGVmaW5lIE1DTzNfQ0xLX0VOQUJMRSgpICAgICBfX0hBTF9SQ0NfR1BJT0JfQ0xLX0VOQUJMRSgpCisjZGVmaW5lIE1DTzNfR1BJT19QT1JUICAgICAgICBHUElPQgorI2RlZmluZSBNQ08zX1BJTiAgICAgICAgICAgICAgR1BJT19QSU5fMTMKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnMgUkNDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgdGhlIGludGVybmFsL2V4dGVybmFsIG9zY2lsbGF0b3JzCisgICAgICAoTVNJLCBIU0UsIEhTSSwgTFNFLCBMU0ksIFBMTCwgQ1NTIGFuZCBNQ08pIGFuZCB0aGUgU3lzdGVtIGJ1c2VzIGNsb2NrcyAoU1lTQ0xLLCBBSEIsIEFQQjEKKyAgICAgIGFuZCBBUEIyKS4KKworICAgIFsuLl0gSW50ZXJuYWwvZXh0ZXJuYWwgY2xvY2sgYW5kIFBMTCBjb25maWd1cmF0aW9uCisgICAgICAoIykgTVNJIChNdWx0aXNwZWVkIGludGVybmFsKSwgU2V2ZW4gZnJlcXVlbmN5IHJhbmdlcyBhcmUgYXZhaWxhYmxlOiA2NS41MzYga0h6LAorICAgICAgICAgIDEzMS4wNzIga0h6LCAyNjIuMTQ0IGtIeiwgNTI0LjI4OCBrSHosIDEuMDQ4IE1IeiwgMi4wOTcgTUh6IChkZWZhdWx0IHZhbHVlKSBhbmQgNC4xOTQgTUh6LgorCisgICAgICAoIykgSFNJIChoaWdoLXNwZWVkIGludGVybmFsKSwgMTYgTUh6IGZhY3RvcnktdHJpbW1lZCBSQyB1c2VkIGRpcmVjdGx5IG9yIHRocm91Z2gKKyAgICAgICAgICB0aGUgUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UuCisgICAgICAoIykgTFNJIChsb3ctc3BlZWQgaW50ZXJuYWwpLCB+MzcgS0h6IGxvdyBjb25zdW1wdGlvbiBSQyB1c2VkIGFzIElXREcgYW5kL29yIFJUQworICAgICAgICAgIGNsb2NrIHNvdXJjZS4KKworICAgICAgKCMpIEhTRSAoaGlnaC1zcGVlZCBleHRlcm5hbCksIDEgdG8gMjQgTUh6IGNyeXN0YWwgb3NjaWxsYXRvciB1c2VkIGRpcmVjdGx5IG9yCisgICAgICAgICAgdGhyb3VnaCB0aGUgUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UuIENhbiBiZSB1c2VkIGFsc28gYXMgUlRDIGNsb2NrIHNvdXJjZS4KKworICAgICAgKCMpIExTRSAobG93LXNwZWVkIGV4dGVybmFsKSwgMzIgS0h6IG9zY2lsbGF0b3IgdXNlZCBhcyBSVEMgY2xvY2sgc291cmNlLgorCisgICAgICAoIykgUExMIChjbG9ja2VkIGJ5IEhTSSBvciBIU0UpLCBmZWF0dXJpbmcgZGlmZmVyZW50IG91dHB1dCBjbG9ja3M6CisgICAgICAgICgrKykgVGhlIGZpcnN0IG91dHB1dCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaWdoIHNwZWVkIHN5c3RlbSBjbG9jayAodXAgdG8gMzIgTUh6KQorICAgICAgICAoKyspIFRoZSBzZWNvbmQgb3V0cHV0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgVVNCIE9URyBGUyAoNDggTUh6KQorCisgICAgICAoIykgQ1NTIChDbG9jayBzZWN1cml0eSBzeXN0ZW0pLCBvbmNlIGVuYWJsZSB1c2luZyB0aGUgbWFjcm8gX19IQUxfUkNDX0NTU19FTkFCTEUoKQorICAgICAgICAgIGFuZCBpZiBhIEhTRSBjbG9jayBmYWlsdXJlIG9jY3VycyhIU0UgdXNlZCBkaXJlY3RseSBvciB0aHJvdWdoIFBMTCBhcyBTeXN0ZW0KKyAgICAgICAgICBjbG9jayBzb3VyY2UpLCB0aGUgU3lzdGVtIGNsb2NrcyBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIE1TSSBhbmQgYW4gaW50ZXJydXB0CisgICAgICAgICAgaXMgZ2VuZXJhdGVkIGlmIGVuYWJsZWQuIFRoZSBpbnRlcnJ1cHQgaXMgbGlua2VkIHRvIHRoZSBDb3J0ZXgtTTArIE5NSQorICAgICAgICAgIChOb24tTWFza2FibGUgSW50ZXJydXB0KSBleGNlcHRpb24gdmVjdG9yLgorCisgICAgICAoIykgTUNPMS9NQ08yL01DTzMgKG1pY3JvY29udHJvbGxlciBjbG9jayBvdXRwdXQpLCB1c2VkIHRvIG91dHB1dCBTWVNDTEssIEhTSSwgTFNJLCBNU0ksIExTRSwKKyAgICAgICAgICBIU0UsIEhTSTQ4IG9yIFBMTCBjbG9jayAodGhyb3VnaCBhIGNvbmZpZ3VyYWJsZSBwcmVzY2FsZXIpIG9uIFBBOC9QQTkvUEIxMyBwaW5zLgorCisgICAgWy4uXSBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c2VzIGNsb2NrcyBjb25maWd1cmF0aW9uCisgICAgICAoIykgU2V2ZXJhbCBjbG9jayBzb3VyY2VzIGNhbiBiZSB1c2VkIHRvIGRyaXZlIHRoZSBTeXN0ZW0gY2xvY2sgKFNZU0NMSyk6IE1TSSwgSFNJLAorICAgICAgICAgIEhTRSBhbmQgUExMLgorICAgICAgICAgIFRoZSBBSEIgY2xvY2sgKEhDTEspIGlzIGRlcml2ZWQgZnJvbSBTeXN0ZW0gY2xvY2sgdGhyb3VnaCBjb25maWd1cmFibGUKKyAgICAgICAgICBwcmVzY2FsZXIgYW5kIHVzZWQgdG8gY2xvY2sgdGhlIENQVSwgbWVtb3J5IGFuZCBwZXJpcGhlcmFscyBtYXBwZWQKKyAgICAgICAgICBvbiBBSEIgYnVzIChETUEsIEdQSU8uLi4pLiBBUEIxIChQQ0xLMSkgYW5kIEFQQjIgKFBDTEsyKSBjbG9ja3MgYXJlIGRlcml2ZWQKKyAgICAgICAgICBmcm9tIEFIQiBjbG9jayB0aHJvdWdoIGNvbmZpZ3VyYWJsZSBwcmVzY2FsZXJzIGFuZCB1c2VkIHRvIGNsb2NrCisgICAgICAgICAgdGhlIHBlcmlwaGVyYWxzIG1hcHBlZCBvbiB0aGVzZSBidXNlcy4gWW91IGNhbiB1c2UKKyAgICAgICAgICAiQHJlZiBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpIiBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlc2UgY2xvY2tzLgorCisgICAgICAtQC0gQWxsIHRoZSBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBTeXN0ZW0gY2xvY2sgKFNZU0NMSykgZXhjZXB0OgorICAgICAgICAgICgrQCkgUlRDOiBSVEMgY2xvY2sgY2FuIGJlIGRlcml2ZWQgZWl0aGVyIGZyb20gdGhlIExTSSwgTFNFIG9yIEhTRSBjbG9jaworICAgICAgICAgICAgICBkaXZpZGVkIGJ5IDIgdG8gMTYuIFlvdSBoYXZlIHRvIHVzZSBAcmVmIF9fSEFMX1JDQ19SVENfQ09ORklHKCkgYW5kIEByZWYgX19IQUxfUkNDX1JUQ19FTkFCTEUoKQorICAgICAgICAgICAgICBtYWNyb3MgdG8gY29uZmlndXJlIHRoaXMgY2xvY2suCisgICAgICAgICAgKCtAKSBMQ0Q6IExDRCBjbG9jayBjYW4gYmUgZGVyaXZlZCBlaXRoZXIgZnJvbSB0aGUgTFNJLCBMU0Ugb3IgSFNFIGNsb2NrCisgICAgICAgICAgICAgIGRpdmlkZWQgYnkgMiB0byAxNi4gWW91IGhhdmUgdG8gdXNlIEByZWYgX19IQUxfUkNDX0xDRF9DT05GSUcoKQorICAgICAgICAgICAgICBtYWNyb3MgdG8gY29uZmlndXJlIHRoaXMgY2xvY2suCisgICAgICAgICAgKCtAKSBVU0IgRlMgYW5kIFJORzogVVNCIEZTIHJlcXVpcmUgYSBmcmVxdWVuY3kgZXF1YWwgdG8gNDggTUh6IHRvIHdvcmsgY29ycmVjdGx5LgorICAgICAgICAgICAgICAgVGhpcyBjbG9jayBpcyBkZXJpdmVkIG9mIHRoZSBtYWluIFBMTCB0aHJvdWdoIFBMTCBNdWx0aXBsaWVyIG9yIEhTSTQ4IFJDIG9zY2lsbGF0b3IuCisKKyAgICAgICAgICAoK0ApIElXREcgY2xvY2sgd2hpY2ggaXMgYWx3YXlzIHRoZSBMU0kgY2xvY2suCisKKyAgICAgICgjKSBUaGUgbWF4aW11bSBmcmVxdWVuY3kgb2YgdGhlIFNZU0NMSyBhbmQgSENMSyBpcyAzMiBNSHosIFBDTEsyIDMyIE1IegorICAgICAgICAgIGFuZCBQQ0xLMSAzMiBNSHouIERlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHZvbHRhZ2UgcmFuZ2UsIHRoZSBtYXhpbXVtCisgICAgICAgICAgZnJlcXVlbmN5IHNob3VsZCBiZSBhZGFwdGVkIGFjY29yZGluZ2x5LgorICBAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKgorICBBZGRpdGlvbmFsIGNvbnNpZGVyYXRpb24gb24gdGhlIEhDTEsgYmFzZWQgb24gTGF0ZW5jeSBzZXR0aW5nczoKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgTGF0ZW5jeSAgICAgICB8ICAgICAgICAgICAgICAgIEhDTEsgY2xvY2sgZnJlcXVlbmN5IChNSHopICAgICAgICAgICAgfAorICB8ICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgfCAgICAgICAgICAgICAgIHwgdm9sdGFnZSByYW5nZSAxICB8IHZvbHRhZ2UgcmFuZ2UgMiB8IHZvbHRhZ2UgcmFuZ2UgMyB8CisgIHwgICAgICAgICAgICAgICB8ICAgICAgMS44IFYgICAgICAgfCAgICAgMS41IFYgICAgICAgfCAgICAgIDEuMiBWICAgICAgfAorICB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgfDBXUygxQ1BVIGN5Y2xlKXwgMCA8IEhDTEsgPD0gMTYgICB8IDAgPCBIQ0xLIDw9IDggICB8IDAgPCBIQ0xLIDw9IDQuMiB8CisgIHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfAorICB8MVdTKDJDUFUgY3ljbGUpfCAxNiA8IEhDTEsgPD0gMzIgIHwgOCA8IEhDTEsgPD0gMTYgIHwgICAgICAgICAgICAgICAgIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgVGhlIGZvbGxvd2luZyB0YWJsZSBnaXZlcyB0aGUgZGlmZmVyZW50IGNsb2NrIHNvdXJjZSBmcmVxdWVuY2llcyBkZXBlbmRpbmcgb24gdGhlIHByb2R1Y3QKKyAgdm9sdGFnZSByYW5nZToKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBQcm9kdWN0IHZvbHRhZ2UgfCAgICAgICAgICAgICAgICAgICAgQ2xvY2sgZnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgfCAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgfCAgICAgIHJhbmdlICAgICAgfCAgIE1TSSAgIHwgICBIU0kgIHwgICAgICAgICAgICAgIEhTRSAgICAgICAgICAgIHwgICAgICAgICAgUExMICAgICAgICAgIHwKKyAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgfCBSYW5nZSAxICgxLjggVikgfCA0LjIgTUh6IHwgMTYgTUh6IHwgSFNFIDMyIE1IeiAoZXh0ZXJuYWwgY2xvY2spIHwgICAgICAgICAzMiBNSHogICAgICAgIHwKKyAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgIHwgICAgICBvciAyNCBNSHogKGNyeXN0YWwpICAgIHwgKFBMTFZDTyBtYXggPSA5NiBNSHopIHwKKyAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgfCBSYW5nZSAyICgxLjUgVikgfCA0LjIgTUh6IHwgMTYgTUh6IHwgICAgICAgICAxNiBNSHogICAgICAgICAgICAgIHwgICAgICAgICAxNiBNSHogICAgICAgIHwKKyAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKFBMTFZDTyBtYXggPSA0OCBNSHopIHwKKyAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgfCBSYW5nZSAzICgxLjIgVikgfCA0LjIgTUh6IHwgICBOQSAgIHwgICAgICAgICA4IE1IeiAgICAgICAgICAgICAgIHwgICAgICAgICAgIDQgTUh6ICAgICAgIHwKKyAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKFBMTFZDTyBtYXggPSAyNCBNSHopIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXNldHMgdGhlIFJDQyBjbG9jayBjb25maWd1cmF0aW9uIHRvIHRoZSBkZWZhdWx0IHJlc2V0IHN0YXRlLgorICAqIEBub3RlICAgVGhlIGRlZmF1bHQgcmVzZXQgc3RhdGUgb2YgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4gYmVsb3c6CisgICogICAgICAgICAgICAtIE1TSSBPTiBhbmQgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlCisgICogICAgICAgICAgICAtIEhTSSwgSFNFIGFuZCBQTEwgIE9GRgorICAqICAgICAgICAgICAgLSBBSEIsIEFQQjEgYW5kIEFQQjIgcHJlc2NhbGVyIHNldCB0byAxLgorICAqICAgICAgICAgICAgLSBDU1MgYW5kIE1DTzEvTUNPMi9NQ08zIE9GRgorICAqICAgICAgICAgICAgLSBBbGwgaW50ZXJydXB0cyBkaXNhYmxlZAorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlCisgICogICAgICAgICAgICAtIFBlcmlwaGVyYWwgY2xvY2tzCisgICogICAgICAgICAgICAtIExTSSwgTFNFIGFuZCBSVEMgY2xvY2tzCisgICogICAgICAgICAgICAtIEhTSTQ4IGNsb2NrCisgICogQHJldHZhbCBOb25lCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX0RlSW5pdCh2b2lkKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB2bF9tYXNrOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogU2V0IE1TSUNsb2NrUmFuZ2UsIEhTSVRSSU0gYW5kIE1TSVRSSU0gYml0cyB0byB0aGUgcmVzZXQgdmFsdWVzICovCisgIE1PRElGWV9SRUcoUkNDLT5JQ1NDUiwgKFJDQ19JQ1NDUl9NU0lUUklNIHwgUkNDX0lDU0NSX0hTSVRSSU0gfCBSQ0NfSUNTQ1JfTVNJUkFOR0UpLCBcCisgICAgICAgICAgICAoKFJDQ19NU0lDQUxJQlJBVElPTl9ERUZBVUxUIDw8IFJDQ19JQ1NDUl9NU0lUUklNX1BvcykgfCAoUkNDX0hTSUNBTElCUkFUSU9OX0RFRkFVTFQgPDwgUkNDX0lDU0NSX0hTSVRSSU1fUG9zKSB8IFJDQ19JQ1NDUl9NU0lSQU5HRV81KSk7CisKKyAgLyogU2V0IE1TSU9OIGJpdCAqLworICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9NU0lPTik7CisKKyAgLyogR2V0IFN0YXJ0IFRpY2sqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdGlsbCBNU0kgaXMgcmVhZHkgKi8KKyAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9NU0lSRFkpID09IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IE1TSV9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBTd2l0Y2ggU1lTQ0xLIHRvIE1TSSovCisgIENMRUFSX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXKTsKKworICAvKiBXYWl0IHRpbGwgTVNJIGFzIFNZU0NMSyBzdGF0dXMgaXMgcmVhZHkgKi8KKyAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU1dTKSAhPSAwVSkKKyAgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBDTE9DS1NXSVRDSF9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBVcGRhdGUgdGhlIFN5c3RlbUNvcmVDbG9jayBnbG9iYWwgdmFyaWFibGUgZm9yIE1TSSBhcyBzeXN0ZW0gY2xvY2sgc291cmNlICovCisgIFN5c3RlbUNvcmVDbG9jayA9IE1TSV9WQUxVRTsKKworICAvKiBDb25maWd1cmUgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UgY29uc2lkZXJpbmcgbmV3IHN5c3RlbSBjbG9jayBzZXR0aW5ncyAgKi8KKyAgc3RhdHVzID0gSEFMX0luaXRUaWNrKFRJQ0tfSU5UX1BSSU9SSVRZKTsKKyAgaWYoc3RhdHVzICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBzdGF0dXM7CisgIH0KKworICAvKiBSZXNldCBIU0UsIEhTSSwgQ1NTLCBQTEwgKi8KKyNpZiBkZWZpbmVkKFJDQ19DUl9DU1NIU0VPTikgJiYgZGVmaW5lZChSQ0NfQ1JfSFNJT1VURU4pCisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT058IFJDQ19DUl9IU0lLRVJPTnwgUkNDX0NSX0hTSURJVkVOIHwgUkNDX0NSX0hTSU9VVEVOIHwgXAorICAgICAgICAgICAgICAgICAgICAgUkNDX0NSX0hTRU9OIHwgUkNDX0NSX0NTU0hTRU9OIHwgUkNDX0NSX1BMTE9OKTsKKyNlbGlmICFkZWZpbmVkKFJDQ19DUl9DU1NIU0VPTikgJiYgZGVmaW5lZChSQ0NfQ1JfSFNJT1VURU4pCisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT058IFJDQ19DUl9IU0lLRVJPTnwgUkNDX0NSX0hTSURJVkVOIHwgUkNDX0NSX0hTSU9VVEVOIHwgXAorICAgICAgICAgICAgICAgICAgICAgUkNDX0NSX0hTRU9OIHwgUkNDX0NSX1BMTE9OKTsKKyNlbGlmIGRlZmluZWQoUkNDX0NSX0NTU0hTRU9OKSAmJiAhZGVmaW5lZChSQ0NfQ1JfSFNJT1VURU4pCisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT058IFJDQ19DUl9IU0lLRVJPTnwgUkNDX0NSX0hTSURJVkVOIHwgXAorICAgICAgICAgICAgICAgICAgICAgUkNDX0NSX0hTRU9OIHwgUkNDX0NSX0NTU0hTRU9OIHwgUkNDX0NSX1BMTE9OKTsKKyNlbmRpZgorCisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrICovIFwKKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRU9OKTsgICAgICBcCisgIFVOVVNFRCh0bXByZWcpOworCisgIC8qIFJlc2V0IEhTRUJZUCBiaXQgKi8KKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VCWVApOworCisgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHRpbGwgUExMIGlzIG5vdCByZWFkeSAqLworICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkgIT0gMFUpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IENGR1IgcmVnaXN0ZXIgKi8KKyAgQ0xFQVJfUkVHKFJDQy0+Q0ZHUik7CisKKyAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworICBDTEVBUl9SRUcoUkNDLT5DSUVSKTsKKworICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgdmxfbWFzayA9IFJDQ19DSUNSX0xTSVJEWUMgfCBSQ0NfQ0lDUl9MU0VSRFlDIHwgUkNDX0NJQ1JfSFNJUkRZQyB8IFJDQ19DSUNSX0hTRVJEWUMgfCBSQ0NfQ0lDUl9QTExSRFlDIHwgUkNDX0NJQ1JfTVNJUkRZQyB8IFJDQ19DSUNSX0NTU0xTRUM7CisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKyAgdmxfbWFzayB8PSBSQ0NfQ0lDUl9IU0k0OFJEWUM7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFJDQ19IU0VDU1NfU1VQUE9SVCkKKyAgdmxfbWFzayB8PSBSQ0NfQ0lDUl9DU1NIU0VDOworI2VuZGlmCisgIFdSSVRFX1JFRyhSQ0MtPkNJQ1IsIHZsX21hc2spOworCisgIC8qIENsZWFyIGFsbCByZXNldCBmbGFncyAqLworICBTRVRfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX1JNVkYpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFJDQyBPc2NpbGxhdG9ycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZQorICAqICAgICAgICAgUkNDX09zY0luaXRUeXBlRGVmLgorICAqIEBwYXJhbSAgUkNDX09zY0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhbiBSQ0NfT3NjSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUkNDIE9zY2lsbGF0b3JzLgorICAqIEBub3RlICAgVGhlIFBMTCBpcyBub3QgZGlzYWJsZWQgd2hlbiB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAgKiBAbm90ZSAgIFRyYW5zaXRpb25zIExTRSBCeXBhc3MgdG8gTFNFIE9uIGFuZCBMU0UgT24gdG8gTFNFIEJ5cGFzcyBhcmUgbm90CisgICogICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBtYWNyby4gVXNlciBzaG91bGQgcmVxdWVzdCBhIHRyYW5zaXRpb24gdG8gTFNFIE9mZgorICAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gTFNFIE9uIG9yIExTRSBCeXBhc3MuCisgICogQG5vdGUgICBUcmFuc2l0aW9uIEhTRSBCeXBhc3MgdG8gSFNFIE9uIGFuZCBIU0UgT24gdG8gSFNFIEJ5cGFzcyBhcmUgbm90CisgICogICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBtYWNyby4gVXNlciBzaG91bGQgcmVxdWVzdCBhIHRyYW5zaXRpb24gdG8gSFNFIE9mZgorICAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gSFNFIE9uIG9yIEhTRSBCeXBhc3MuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX09zY0NvbmZpZyhSQ0NfT3NjSW5pdFR5cGVEZWYgICpSQ0NfT3NjSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCBoc2lfc3RhdGU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3Qgc3lzY2xrX3NvdXJjZSwgcGxsX2NvbmZpZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBpZihSQ0NfT3NjSW5pdFN0cnVjdCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19SQ0NfT1NDSUxMQVRPUlRZUEUoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSk7CisKKyAgc3lzY2xrX3NvdXJjZSA9IF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpOworICBwbGxfY29uZmlnID0gX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhTRSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0UpID09IFJDQ19PU0NJTExBVE9SVFlQRV9IU0UpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSFNFKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSkpOworCisgICAgLyogV2hlbiB0aGUgSFNFIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIG9yIGNsb2NrIHNvdXJjZSBmb3IgUExMIGluIHRoZXNlIGNhc2VzIGl0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIGRpc2FibGVkICovCisgICAgaWYoKHN5c2Nsa19zb3VyY2UgPT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNFKQorICAgICAgIHx8ICgoc3lzY2xrX3NvdXJjZSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEspICYmIChwbGxfY29uZmlnID09IFJDQ19QTExTT1VSQ0VfSFNFKSkpCisgICAgeworICAgICAgaWYoKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0VSRFkpICE9IDBVKSAmJiAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID09IFJDQ19IU0VfT0ZGKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgbmV3IEhTRSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBfX0hBTF9SQ0NfSFNFX0NPTkZJRyhSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUpOworCisgICAgICAvKiBDaGVjayB0aGUgSFNFIFN0YXRlICovCisgICAgICBpZihSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgIT0gUkNDX0hTRV9PRkYpCisgICAgICB7CisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTRSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNFUkRZKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBIU0VfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTRSBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNFUkRZKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gSFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhTSSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0koUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DQUxJQlJBVElPTl9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSkpOworCisgICAgaHNpX3N0YXRlID0gUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlOworCisjaWYgZGVmaW5lZChSQ0NfQ1JfSFNJT1VURU4pCisgICAgaWYoKGhzaV9zdGF0ZSAmIFJDQ19IU0lfT1VURU4pICE9IDBVKQorICAgIHsKKyAgICAgIC8qIEhTSSBPdXRwdXQgZW5hYmxlIGZvciB0aW1lciByZXF1ZXN0ZWQgKi8KKyAgICAgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9VVEVOKTsKKworICAgICAgaHNpX3N0YXRlICY9IH5SQ0NfQ1JfSFNJT1VURU47CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBDaGVjayBpZiBIU0kgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgb3IgYXMgUExMIHNvdXJjZSB3aGVuIFBMTCBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyAgICBpZigoc3lzY2xrX3NvdXJjZSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0kpCisgICAgICAgfHwgKChzeXNjbGtfc291cmNlID09IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSykgJiYgKHBsbF9jb25maWcgPT0gUkNDX1BMTFNPVVJDRV9IU0kpKSkKKyAgICB7CisgICAgICAvKiBXaGVuIEhTSSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBpdCB3aWxsIG5vdCBkaXNhYmxlZCAqLworICAgICAgaWYoKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0lSRFkpICE9IDBVKSAmJiAoaHNpX3N0YXRlID09IFJDQ19IU0lfT0ZGKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIE90aGVyd2lzZSwganVzdCB0aGUgY2FsaWJyYXRpb24gYW5kIEhTSSBvciBIU0lkaXY0IGFyZSBhbGxvd2VkICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEFkanVzdHMgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKSBjYWxpYnJhdGlvbiB2YWx1ZS4qLworICAgICAgICBfX0hBTF9SQ0NfSFNJX0NBTElCUkFUSU9OVkFMVUVfQURKVVNUKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lDYWxpYnJhdGlvblZhbHVlKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJIG9yIEhTSWRpdjQpICovCisgICAgICAgIF9fSEFMX1JDQ19IU0lfQ09ORklHKGhzaV9zdGF0ZSk7CisgICAgICB9CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgU3lzdGVtQ29yZUNsb2NrIGdsb2JhbCB2YXJpYWJsZSAqLworICAgICAgU3lzdGVtQ29yZUNsb2NrID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSA+PiBBSEJQcmVzY1RhYmxlWyhSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9IUFJFKT4+IFJDQ19DRkdSX0hQUkVfUG9zXTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBzb3VyY2Ugb2YgdGltZSBiYXNlIGNvbnNpZGVyaW5nIG5ldyBzeXN0ZW0gY2xvY2tzIHNldHRpbmdzKi8KKyAgICAgIHN0YXR1cyA9IEhBTF9Jbml0VGljayAoVElDS19JTlRfUFJJT1JJVFkpOworICAgICAgaWYoc3RhdHVzICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBIU0kgU3RhdGUgKi8KKyAgICAgIGlmKGhzaV9zdGF0ZSAhPSBSQ0NfSFNJX09GRikKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSBvciBIU0lkaXY0KSAqLworICAgICAgICBfX0hBTF9SQ0NfSFNJX0NPTkZJRyhoc2lfc3RhdGUpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTSSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNJUkRZKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBIU0lfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWRqdXN0cyB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLiovCisgICAgICAgIF9fSEFMX1JDQ19IU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSUNhbGlicmF0aW9uVmFsdWUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkuICovCisgICAgICAgIF9fSEFMX1JDQ19IU0lfRElTQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTSSBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNJUkRZKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBIU0lfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTVNJIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTVNJKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTVNJKQorICB7CisgICAgLyogV2hlbiB0aGUgTVNJIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIGl0IHdpbGwgbm90IGJlIGRpc2FibGVkICovCisgICAgaWYoKHN5c2Nsa19zb3VyY2UgPT0gUkNDX0NGR1JfU1dTX01TSSkgKQorICAgIHsKKyAgICAgIGlmKChfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfTVNJUkRZKSAhPSAwVSkgJiYgKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lTdGF0ZSA9PSBSQ0NfTVNJX09GRikpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBPdGhlcndpc2UsIGp1c3QgdGhlIGNhbGlicmF0aW9uIGFuZCBNU0kgcmFuZ2UgY2hhbmdlIGFyZSBhbGxvd2VkICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENoZWNrIE1TSUNhbGlicmF0aW9uVmFsdWUgYW5kIE1TSUNsb2NrUmFuZ2UgaW5wdXQgcGFyYW1ldGVycyAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX01TSUNBTElCUkFUSU9OX1ZBTFVFKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lDYWxpYnJhdGlvblZhbHVlKSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTVNJX0NMT0NLX1JBTkdFKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lDbG9ja1JhbmdlKSk7CisKKyAgICAgICAgLyogU2VsZWN0cyB0aGUgTXVsdGlwbGUgU3BlZWQgb3NjaWxsYXRvciAoTVNJKSBjbG9jayByYW5nZSAuKi8KKyAgICAgICAgX19IQUxfUkNDX01TSV9SQU5HRV9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPk1TSUNsb2NrUmFuZ2UpOworICAgICAgICAvKiBBZGp1c3RzIHRoZSBNdWx0aXBsZSBTcGVlZCBvc2NpbGxhdG9yIChNU0kpIGNhbGlicmF0aW9uIHZhbHVlLiovCisgICAgICAgIF9fSEFMX1JDQ19NU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoUkNDX09zY0luaXRTdHJ1Y3QtPk1TSUNhbGlicmF0aW9uVmFsdWUpOworCisKKyAgICAgICAgLyogVXBkYXRlIHRoZSBTeXN0ZW1Db3JlQ2xvY2sgZ2xvYmFsIHZhcmlhYmxlICovCisgICAgICAgIFN5c3RlbUNvcmVDbG9jayA9ICAoMzI3NjhVICogKDFVTCA8PCAoKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lDbG9ja1JhbmdlID4+IFJDQ19JQ1NDUl9NU0lSQU5HRV9Qb3MpICsgMVUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IEFIQlByZXNjVGFibGVbKChSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9IUFJFKSA+PiBSQ0NfQ0ZHUl9IUFJFX1BvcyldOworCisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlIG9mIHRpbWUgYmFzZSBjb25zaWRlcmluZyBuZXcgc3lzdGVtIGNsb2NrcyBzZXR0aW5ncyovCisgICAgICAgIHN0YXR1cyA9IEhBTF9Jbml0VGljayAoVElDS19JTlRfUFJJT1JJVFkpOworICAgICAgICBpZihzdGF0dXMgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2hlY2sgTVNJIFN0YXRlICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX01TSShSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJU3RhdGUpKTsKKworICAgICAgLyogQ2hlY2sgdGhlIE1TSSBTdGF0ZSAqLworICAgICAgaWYoUkNDX09zY0luaXRTdHJ1Y3QtPk1TSVN0YXRlICE9IFJDQ19NU0lfT0ZGKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIE11bHRpIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkuICovCisgICAgICAgIF9fSEFMX1JDQ19NU0lfRU5BQkxFKCk7CisKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgTVNJIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19NU0lSRFkpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTVNJX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBDaGVjayBNU0lDYWxpYnJhdGlvblZhbHVlIGFuZCBNU0lDbG9ja1JhbmdlIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NU0lDQUxJQlJBVElPTl9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJQ2FsaWJyYXRpb25WYWx1ZSkpOworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX01TSV9DTE9DS19SQU5HRShSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJQ2xvY2tSYW5nZSkpOworCisgICAgICAgIC8qIFNlbGVjdHMgdGhlIE11bHRpcGxlIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkgY2xvY2sgcmFuZ2UgLiovCisgICAgICAgIF9fSEFMX1JDQ19NU0lfUkFOR0VfQ09ORklHKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lDbG9ja1JhbmdlKTsKKyAgICAgICAgIC8qIEFkanVzdHMgdGhlIE11bHRpcGxlIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkgY2FsaWJyYXRpb24gdmFsdWUuKi8KKyAgICAgICAgX19IQUxfUkNDX01TSV9DQUxJQlJBVElPTlZBTFVFX0FESlVTVChSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJQ2FsaWJyYXRpb25WYWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE11bHRpIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkuICovCisgICAgICAgIF9fSEFMX1JDQ19NU0lfRElTQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIE1TSSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfTVNJUkRZKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IE1TSV9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFNJIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9MU0kpID09IFJDQ19PU0NJTExBVE9SVFlQRV9MU0kpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNJKFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSkpOworCisgICAgLyogQ2hlY2sgdGhlIExTSSBTdGF0ZSAqLworICAgIGlmKFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSAhPSBSQ0NfTFNJX09GRikKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kpLiAqLworICAgICAgX19IQUxfUkNDX0xTSV9FTkFCTEUoKTsKKworICAgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgIC8qIFdhaXQgdGlsbCBMU0kgaXMgcmVhZHkgKi8KKyAgICAgIHdoaWxlKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19MU0lSRFkpID09IDBVKQorICAgICAgeworICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gTFNJX1RJTUVPVVRfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kpLiAqLworICAgICAgX19IQUxfUkNDX0xTSV9ESVNBQkxFKCk7CisKKyAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAvKiBXYWl0IHRpbGwgTFNJIGlzIGRpc2FibGVkICovCisgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfTFNJUkRZKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IExTSV9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExTRSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKQorICB7CisgICAgRmxhZ1N0YXR1cyAgICAgICBwd3JjbGtjaGFuZ2VkID0gUkVTRVQ7CisKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNFKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSkpOworCisgICAgLyogVXBkYXRlIExTRSBjb25maWd1cmF0aW9uIGluIEJhY2t1cCBEb21haW4gY29udHJvbCByZWdpc3RlciAgICAqLworICAgIC8qIFJlcXVpcmVzIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIERvbWFpbiBvZiBuZWNlc3NhcnkgKi8KKyAgICBpZihfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpKQorICAgIHsKKyAgICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpOworICAgICAgcHdyY2xrY2hhbmdlZCA9IFNFVDsKKyAgICB9CisKKyAgICBpZihIQUxfSVNfQklUX0NMUihQV1ItPkNSLCBQV1JfQ1JfREJQKSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIEJhY2t1cCBkb21haW4gKi8KKyAgICAgIFNFVF9CSVQoUFdSLT5DUiwgUFdSX0NSX0RCUCk7CisKKyAgICAgIC8qIFdhaXQgZm9yIEJhY2t1cCBkb21haW4gV3JpdGUgcHJvdGVjdGlvbiBkaXNhYmxlICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICB3aGlsZShIQUxfSVNfQklUX0NMUihQV1ItPkNSLCBQV1JfQ1JfREJQKSkKKyAgICAgIHsKKyAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUkNDX0RCUF9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHRoZSBuZXcgTFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIF9fSEFMX1JDQ19MU0VfQ09ORklHKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSk7CisgICAgLyogQ2hlY2sgdGhlIExTRSBTdGF0ZSAqLworICAgIGlmKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSAhPSBSQ0NfTFNFX09GRikKKyAgICB7CisgICAgICAvKiBHZXQgU3RhcnQgVGljayAqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLworICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTRVJEWSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAvKiBXYWl0IHRpbGwgTFNFIGlzIGRpc2FibGVkICovCisgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfTFNFUkRZKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJDQ19MU0VfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIFJlcXVpcmUgdG8gZGlzYWJsZSBwb3dlciBjbG9jayBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZihwd3JjbGtjaGFuZ2VkID09IFNFVCkKKyAgICB7CisgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFKCk7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkKFJDQ19IU0k0OF9TVVBQT1JUKQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhTSTQ4IENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJNDgpID09IFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0OCkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0k0OChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJNDhTdGF0ZSkpOworCisgICAgICAvKiBDaGVjayB0aGUgSFNJNDggU3RhdGUgKi8KKyAgICAgIGlmKFJDQ19Pc2NJbml0U3RydWN0LT5IU0k0OFN0YXRlICE9IFJDQ19IU0k0OF9PRkYpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0k0OCkuICovCisgICAgICAgIF9fSEFMX1JDQ19IU0k0OF9FTkFCTEUoKTsKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAgIC8qIFdhaXQgdGlsbCBIU0k0OCBpcyByZWFkeSAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNJNDhSRFkpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSFNJNDhfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJNDgpLiAqLworICAgICAgICBfX0hBTF9SQ0NfSFNJNDhfRElTQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTSTQ4IGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0k0OFJEWSkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0k0OF9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorI2VuZGlmIC8qIFJDQ19IU0k0OF9TVVBQT1JUICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQTEwgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUpKTsKKyAgaWYgKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSAhPSBSQ0NfUExMX05PTkUpCisgIHsKKyAgICAvKiBDaGVjayBpZiB0aGUgUExMIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIG9yIG5vdCAqLworICAgIGlmKHN5c2Nsa19zb3VyY2UgIT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKQorICAgIHsKKyAgICAgIGlmKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSA9PSBSQ0NfUExMX09OKQorICAgICAgeworICAgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFNPVVJDRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSkpOworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTF9NVUwoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNVUwpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExfRElWKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMRElWKSk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgbWFpbiBQTEwuICovCisgICAgICAgIF9fSEFMX1JDQ19QTExfRElTQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrICovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfUExMUkRZKSAgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUExMX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgbWFpbiBQTEwgY2xvY2sgc291cmNlLCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gZmFjdG9ycy4gKi8KKyAgICAgICAgX19IQUxfUkNDX1BMTF9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTVVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTERJVik7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBQTEwuICovCisgICAgICAgIF9fSEFMX1JDQ19QTExfRU5BQkxFKCk7CisKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgUExMIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19QTExSRFkpICA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBQTExfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIG1haW4gUExMLiAqLworICAgICAgICBfX0hBTF9SQ0NfUExMX0RJU0FCTEUoKTsKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAgIC8qIFdhaXQgdGlsbCBQTEwgaXMgZGlzYWJsZWQgKi8KKyAgICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX1BMTFJEWSkgICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFBMTF9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgcmVxdWVzdCB0byBkaXNhYmxlIHRoZSBQTEwgdXNlZCBhcyBTeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgICBpZigoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTdGF0ZSkgPT0gUkNDX1BMTF9PRkYpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERvIG5vdCByZXR1cm4gSEFMX0VSUk9SIGlmIHJlcXVlc3QgcmVwZWF0cyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uICovCisgICAgICAgIHBsbF9jb25maWcgPSBSQ0MtPkNGR1I7CisgICAgICAgIGlmKChSRUFEX0JJVChwbGxfY29uZmlnLCBSQ0NfQ0ZHUl9QTExTUkMpICE9IFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU291cmNlKSB8fAorICAgICAgICAgICAoUkVBRF9CSVQocGxsX2NvbmZpZywgUkNDX0NGR1JfUExMTVVMKSAhPSBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE1VTCkgfHwKKyAgICAgICAgICAgKFJFQURfQklUKHBsbF9jb25maWcsIFJDQ19DRkdSX1BMTERJVikgIT0gUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExESVYpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENQVSwgQUhCIGFuZCBBUEIgYnVzZXMgY2xvY2tzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBSQ0NfQ2xrSW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIFJDQ19DbGtJbml0U3RydWN0IHBvaW50ZXIgdG8gYW4gUkNDX09zY0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFJDQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgRkxhdGVuY3kgRkxBU0ggTGF0ZW5jeQorICAqICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBkZXBlbmQgb24gZGV2aWNlIHVzZWQgd2l0aGluIHRoZSBzYW1lIHNlcmllcworICAqIEBub3RlICAgVGhlIFN5c3RlbUNvcmVDbG9jayBDTVNJUyB2YXJpYWJsZSBpcyB1c2VkIHRvIHN0b3JlIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kKKyAgKiAgICAgICAgIGFuZCB1cGRhdGVkIGJ5IEByZWYgSEFMX1JDQ19HZXRIQ0xLRnJlcSgpIGZ1bmN0aW9uIGNhbGxlZCB3aXRoaW4gdGhpcyBmdW5jdGlvbgorICAqCisgICogQG5vdGUgICBUaGUgTVNJIGlzIHVzZWQgKGVuYWJsZWQgYnkgaGFyZHdhcmUpIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgYWZ0ZXIKKyAgKiAgICAgICAgIHN0YXJ0LXVwIGZyb20gUmVzZXQsIHdha2UtdXAgZnJvbSBTVE9QIGFuZCBTVEFOREJZIG1vZGUsIG9yIGluIGNhc2UKKyAgKiAgICAgICAgIG9mIGZhaWx1cmUgb2YgdGhlIEhTRSB1c2VkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYXMgc3lzdGVtIGNsb2NrCisgICogICAgICAgICAoaWYgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBDU1MgaXMgZW5hYmxlZCkuCisgICoKKyAgKiBAbm90ZSAgIEEgc3dpdGNoIGZyb20gb25lIGNsb2NrIHNvdXJjZSB0byBhbm90aGVyIG9jY3VycyBvbmx5IGlmIHRoZSB0YXJnZXQKKyAgKiAgICAgICAgIGNsb2NrIHNvdXJjZSBpcyByZWFkeSAoY2xvY2sgc3RhYmxlIGFmdGVyIHN0YXJ0LXVwIGRlbGF5IG9yIFBMTCBsb2NrZWQpLgorICAqICAgICAgICAgSWYgYSBjbG9jayBzb3VyY2Ugd2hpY2ggaXMgbm90IHlldCByZWFkeSBpcyBzZWxlY3RlZCwgdGhlIHN3aXRjaCB3aWxsCisgICogICAgICAgICBvY2N1ciB3aGVuIHRoZSBjbG9jayBzb3VyY2Ugd2lsbCBiZSByZWFkeS4KKyAgKiAgICAgICAgIFlvdSBjYW4gdXNlIEByZWYgSEFMX1JDQ19HZXRDbG9ja0NvbmZpZygpIGZ1bmN0aW9uIHRvIGtub3cgd2hpY2ggY2xvY2sgaXMKKyAgKiAgICAgICAgIGN1cnJlbnRseSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gdGhlIGRldmljZSB2b2x0YWdlIHJhbmdlLCB0aGUgc29mdHdhcmUgaGFzIHRvIHNldCBjb3JyZWN0bHkKKyAgKiAgICAgICAgIEhQUkVbMzowXSBiaXRzIHRvIGVuc3VyZSB0aGF0IEhDTEsgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvd2VkIGZyZXF1ZW5jeQorICAqICAgICAgICAgKGZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8gc2VjdGlvbiBhYm92ZSAiSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIikKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfQ2xvY2tDb25maWcoUkNDX0Nsa0luaXRUeXBlRGVmICAqUkNDX0Nsa0luaXRTdHJ1Y3QsIHVpbnQzMl90IEZMYXRlbmN5KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBpZihSQ0NfQ2xrSW5pdFN0cnVjdCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19SQ0NfQ0xPQ0tUWVBFKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0xBVEVOQ1koRkxhdGVuY3kpKTsKKworICAvKiBUbyBjb3JyZWN0bHkgcmVhZCBkYXRhIGZyb20gRkxBU0ggbWVtb3J5LCB0aGUgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIChMQVRFTkNZKQorICBtdXN0IGJlIGNvcnJlY3RseSBwcm9ncmFtbWVkIGFjY29yZGluZyB0byB0aGUgZnJlcXVlbmN5IG9mIHRoZSBDUFUgY2xvY2sKKyAgKEhDTEspIGFuZCB0aGUgc3VwcGx5IHZvbHRhZ2Ugb2YgdGhlIGRldmljZS4gKi8KKworICAvKiBJbmNyZWFzaW5nIHRoZSBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgYmVjYXVzZSBvZiBoaWdoZXIgQ1BVIGZyZXF1ZW5jeSAqLworICBpZihGTGF0ZW5jeSA+IF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkpCisgIHsKKyAgICAvKiBQcm9ncmFtIHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIHRvIHRoZSBMQVRFTkNZIGJpdHMgaW4gdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLworICAgIF9fSEFMX0ZMQVNIX1NFVF9MQVRFTkNZKEZMYXRlbmN5KTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIG5ldyBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgaXMgdGFrZW4gaW50byBhY2NvdW50IHRvIGFjY2VzcyB0aGUgRmxhc2gKKyAgICBtZW1vcnkgYnkgcmVhZGluZyB0aGUgRkxBU0hfQUNSIHJlZ2lzdGVyICovCisgICAgaWYoX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSAhPSBGTGF0ZW5jeSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSENMSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfSENMSykgPT0gUkNDX0NMT0NLVFlQRV9IQ0xLKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IQ0xLKFJDQ19DbGtJbml0U3RydWN0LT5BSEJDTEtEaXZpZGVyKSk7CisgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX0hQUkUsIFJDQ19DbGtJbml0U3RydWN0LT5BSEJDTEtEaXZpZGVyKTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTWVNDTEsgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9TWVNDTEspID09IFJDQ19DTE9DS1RZUEVfU1lTQ0xLKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19TWVNDTEtTT1VSQ0UoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSkpOworCisgICAgLyogSFNFIGlzIHNlbGVjdGVkIGFzIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8KKyAgICBpZihSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNFKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBIU0UgcmVhZHkgZmxhZyAqLworICAgICAgaWYoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTRVJEWSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIFBMTCBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisgICAgZWxzZSBpZihSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlID09IFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBQTEwgcmVhZHkgZmxhZyAqLworICAgICAgaWYoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX1BMTFJEWSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIEhTSSBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisgICAgZWxzZSBpZihSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNJKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBIU0kgcmVhZHkgZmxhZyAqLworICAgICAgaWYoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSVJEWSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIE1TSSBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBNU0kgcmVhZHkgZmxhZyAqLworICAgICAgaWYoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX01TSVJEWSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIF9fSEFMX1JDQ19TWVNDTEtfQ09ORklHKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UpOworCisgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaWYoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9PSBSQ0NfU1lTQ0xLU09VUkNFX0hTRSkKKyAgICB7CisgICAgICB3aGlsZSAoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgIT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNFKQorICAgICAgeworICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gQ0xPQ0tTV0lUQ0hfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPT0gUkNDX1NZU0NMS1NPVVJDRV9QTExDTEspCisgICAgeworICAgICAgd2hpbGUgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpICE9IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSykKKyAgICAgIHsKKyAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNJKQorICAgIHsKKyAgICAgIHdoaWxlIChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSAhPSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0kpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBDTE9DS1NXSVRDSF9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSAhPSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19NU0kpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBDTE9DS1NXSVRDSF9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qIERlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyBiZWNhdXNlIG9mIGxvd2VyIENQVSBmcmVxdWVuY3kgKi8KKyAgaWYoRkxhdGVuY3kgPCBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpKQorICB7CisgICAgLyogUHJvZ3JhbSB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyB0byB0aGUgTEFURU5DWSBiaXRzIGluIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9GTEFTSF9TRVRfTEFURU5DWShGTGF0ZW5jeSk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGlzIHRha2VuIGludG8gYWNjb3VudCB0byBhY2Nlc3MgdGhlIEZsYXNoCisgICAgbWVtb3J5IGJ5IHJlYWRpbmcgdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLworICAgIGlmKF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkgIT0gRkxhdGVuY3kpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBDTEsxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfUENMSzEpID09IFJDQ19DTE9DS1RZUEVfUENMSzEpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BDTEsoUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjFDTEtEaXZpZGVyKSk7CisgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUxLCBSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQQ0xLMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKSA9PSBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QQ0xLKFJDQ19DbGtJbml0U3RydWN0LT5BUEIyQ0xLRGl2aWRlcikpOworICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMiwgKChSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMkNMS0RpdmlkZXIpIDw8IDMpKTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgU3lzdGVtQ29yZUNsb2NrIGdsb2JhbCB2YXJpYWJsZSAqLworICBTeXN0ZW1Db3JlQ2xvY2sgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpID4+IEFIQlByZXNjVGFibGVbKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX0hQUkUpPj4gUkNDX0NGR1JfSFBSRV9Qb3NdOworCisgIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlIG9mIHRpbWUgYmFzZSBjb25zaWRlcmluZyBuZXcgc3lzdGVtIGNsb2NrcyBzZXR0aW5ncyovCisgIHN0YXR1cyA9IEhBTF9Jbml0VGljayhUSUNLX0lOVF9QUklPUklUWSk7CisgIGlmKHN0YXR1cyAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFJDQyBjbG9ja3MgY29udHJvbCBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgUkNDIENsb2NrcworICAgIGZyZXF1ZW5jaWVzLgorCisgIEBlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0cyB0aGUgY2xvY2sgc291cmNlIHRvIG91dHB1dCBvbiBNQ08gcGluLgorICAqIEBub3RlICAgTUNPIHBpbiBzaG91bGQgYmUgY29uZmlndXJlZCBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZS4KKyAgKiBAcGFyYW0gIFJDQ19NQ094IHNwZWNpZmllcyB0aGUgb3V0cHV0IGRpcmVjdGlvbiBmb3IgdGhlIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMSBwaW4oUEE4KS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMiBDbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIE1DTzIgcGluKFBBOSkuCisgIEBpZiBTVE0zMkwwMzF4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08zIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMyBwaW4oUEIxMykKKyAgQGVsc2VpZiBTVE0zMkwwNDF4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08zIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMyBwaW4oUEIxMykKKyAgQGVsc2VpZiBTVE0zMkwwNzN4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08zIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMyBwaW4oUEIxMykKKyAgQGVsc2VpZiBTVE0zMkwwODN4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08zIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMyBwaW4oUEIxMykKKyAgQGVsc2VpZiBTVE0zMkwwNzJ4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08zIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMyBwaW4oUEIxMykKKyAgQGVsc2VpZiBTVE0zMkwwODJ4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08zIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMyBwaW4oUEIxMykKKyAgQGVsc2VpZiBTVE0zMkwwNzF4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08zIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMyBwaW4oUEIxMykKKyAgQGVsc2VpZiBTVE0zMkwwODF4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08zIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMyBwaW4oUEIxMykKKyAgQGVuZGlmCisgICogQHBhcmFtICBSQ0NfTUNPU291cmNlIHNwZWNpZmllcyB0aGUgY2xvY2sgc291cmNlIHRvIG91dHB1dC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sgICAgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1NZU0NMSyAgICAgIFN5c3RlbSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0kgICAgICAgICBIU0kgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNFICAgICAgICAgSFNFIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX01TSSAgICAgICAgIE1TSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1BMTENMSyAgICAgIFBMTCBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0kgICAgICAgICBMU0kgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTFNFICAgICAgICAgTFNFIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICBAaWYgU1RNMzJMMDUyeHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0k0OCAgICAgICBIU0k0OCBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgQGVsc2VpZiBTVE0zMkwwNTN4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTSTQ4ICAgICAgIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICBAZWxzZWlmIFNUTTMyTDA2Mnh4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJNDggICAgICAgSFNJNDggY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgIEBlbHNlaWYgU1RNMzJMMDYzeHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0k0OCAgICAgICBIU0k0OCBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgQGVsc2VpZiBTVE0zMkwwNzJ4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTSTQ4ICAgICAgIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICBAZWxzZWlmIFNUTTMyTDA3M3h4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJNDggICAgICAgSFNJNDggY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIGNsb2NrCisgIEBlbHNlaWYgU1RNMzJMMDgyeHgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0k0OCAgICAgICBIU0k0OCBjbG9jayBzZWxlY3RlZCBhcyBNQ08gY2xvY2sKKyAgQGVsc2VpZiBTVE0zMkwwODN4eAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTSTQ4ICAgICAgIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBjbG9jaworICBAZW5kaWYKKyAgKiBAcGFyYW0gIFJDQ19NQ09EaXYgc3BlY2lmaWVzIHRoZSBNQ08gRElWLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xIG5vIGRpdmlzaW9uIGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8yICBkaXZpc2lvbiBieSAyIGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl80ICBkaXZpc2lvbiBieSA0IGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl84ICBkaXZpc2lvbiBieSA4IGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xNiBkaXZpc2lvbiBieSAxNiBhcHBsaWVkIHRvIE1DTyBjbG9jaworICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDX01DT0NvbmZpZyh1aW50MzJfdCBSQ0NfTUNPeCwgdWludDMyX3QgUkNDX01DT1NvdXJjZSwgdWludDMyX3QgUkNDX01DT0RpdikKK3sKKyAgR1BJT19Jbml0VHlwZURlZiBncGlvID0gezB9OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfTUNPKFJDQ19NQ094KSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfTUNPRElWKFJDQ19NQ09EaXYpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ08xU09VUkNFKFJDQ19NQ09Tb3VyY2UpKTsKKworICAvKiBDb25maWd1cmUgdGhlIE1DTzEgcGluIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlICovCisgIGdwaW8uTW9kZSAgICAgID0gR1BJT19NT0RFX0FGX1BQOworICBncGlvLlNwZWVkICAgICA9IEdQSU9fU1BFRURfRlJFUV9ISUdIOworICBncGlvLlB1bGwgICAgICA9IEdQSU9fTk9QVUxMOworICBpZihSQ0NfTUNPeCA9PSBSQ0NfTUNPMSkKKyAgeworICAgIGdwaW8uUGluICAgICAgID0gTUNPMV9QSU47CisgICAgZ3Bpby5BbHRlcm5hdGUgPSBHUElPX0FGMF9NQ087CisKKyAgICAvKiBNQ08xIENsb2NrIEVuYWJsZSAqLworICAgIE1DTzFfQ0xLX0VOQUJMRSgpOworICAgIEhBTF9HUElPX0luaXQoTUNPMV9HUElPX1BPUlQsICZncGlvKTsKKyAgfQorI2lmICBkZWZpbmVkKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDA3M3h4KSB8fCBkZWZpbmVkKFNUTTMyTDA4M3h4KSBcCisgIHx8IGRlZmluZWQoU1RNMzJMMDcyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQoU1RNMzJMMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJMMDgxeHgpCisgIGVsc2UgaWYgKFJDQ19NQ094ID09IFJDQ19NQ08zKQorICB7CisgICAgZ3Bpby5QaW4gICAgICAgPSBNQ08zX1BJTjsKKyAgICBncGlvLkFsdGVybmF0ZSA9IEdQSU9fQUYyX01DTzsKKworICAgIC8qIE1DTzMgQ2xvY2sgRW5hYmxlICovCisgICAgTUNPM19DTEtfRU5BQkxFKCk7CisgICAgSEFMX0dQSU9fSW5pdChNQ08zX0dQSU9fUE9SVCwgJmdwaW8pOworICB9CisjZW5kaWYKKyAgZWxzZQorICB7CisgICAgZ3Bpby5QaW4gICAgICAgPSBNQ08yX1BJTjsKKyAgICBncGlvLkFsdGVybmF0ZSA9IEdQSU9fQUYwX01DTzsKKworICAgIC8qIE1DTzIgQ2xvY2sgRW5hYmxlICovCisgICAgTUNPMl9DTEtfRU5BQkxFKCk7CisgICAgSEFMX0dQSU9fSW5pdChNQ08yX0dQSU9fUE9SVCwgJmdwaW8pOworICB9CisKKyAgLyogQ29uZmlndXJlIHRoZSBNQ08gY2xvY2sgc291cmNlICovCisgIF9fSEFMX1JDQ19NQ08xX0NPTkZJRyhSQ0NfTUNPU291cmNlLCBSQ0NfTUNPRGl2KTsKK30KKworI2lmIGRlZmluZWQoUkNDX0hTRUNTU19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uCisgICogQG5vdGUgICBJZiBhIGZhaWx1cmUgaXMgZGV0ZWN0ZWQgb24gdGhlIEhTRSBvc2NpbGxhdG9yIGNsb2NrLCB0aGlzIG9zY2lsbGF0b3IKKyAgKiAgICAgICAgIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgYW5kIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgdG8gaW5mb3JtIHRoZQorICAqICAgICAgICAgc29mdHdhcmUgYWJvdXQgdGhlIGZhaWx1cmUgKENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQsIENTU0kpLAorICAqICAgICAgICAgYWxsb3dpbmcgdGhlIE1DVSB0byBwZXJmb3JtIHJlc2N1ZSBvcGVyYXRpb25zLiBUaGUgQ1NTSSBpcyBsaW5rZWQgdG8KKyAgKiAgICAgICAgIHRoZSBDb3J0ZXgtTTArIE5NSSAoTm9uLU1hc2thYmxlIEludGVycnVwdCkgZXhjZXB0aW9uIHZlY3Rvci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ19FbmFibGVDU1Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfQ1NTT04pIDsKK30KKworI2VuZGlmIC8qIFJDQ19IU0VDU1NfU1VQUE9SVCAqLworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBTWVNDTEsgZnJlcXVlbmN5CisgICogQG5vdGUgICBUaGUgc3lzdGVtIGZyZXF1ZW5jeSBjb21wdXRlZCBieSB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aGUgcmVhbAorICAqICAgICAgICAgZnJlcXVlbmN5IGluIHRoZSBjaGlwLiBJdCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBwcmVkZWZpbmVkCisgICogICAgICAgICBjb25zdGFudCBhbmQgdGhlIHNlbGVjdGVkIGNsb2NrIHNvdXJjZToKKyAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBNU0ksIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBiYXNlZCBvbiBNU0kKKyAgKiAgICAgICAgICAgICBWYWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSBNU0kgcmFuZ2UuCisgICogQG5vdGUgICAgIElmIFNZU0NMSyBzb3VyY2UgaXMgSFNJLCBmdW5jdGlvbiByZXR1cm5zIHZhbHVlcyBiYXNlZCBvbiBIU0lfVkFMVUUoKikKKyAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0UsIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBiYXNlZCBvbiBIU0VfVkFMVUUoKiopCisgICogQG5vdGUgICAgIElmIFNZU0NMSyBzb3VyY2UgaXMgUExMLCBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgYmFzZWQgb24gSFNFX1ZBTFVFKCoqKQorICAqICAgICAgICAgICBvciBIU0lfVkFMVUUoKikgbXVsdGlwbGllZC9kaXZpZGVkIGJ5IHRoZSBQTEwgZmFjdG9ycy4KKyAgKiBAbm90ZSAgICAgKCopIEhTSV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gc3RtMzJsMHh4X2hhbF9jb25mLmggZmlsZSAoZGVmYXVsdCB2YWx1ZQorICAqICAgICAgICAgICAgICAgMTYgTUh6KSBidXQgdGhlIHJlYWwgdmFsdWUgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYXRpb25zCisgICogICAgICAgICAgICAgICBpbiB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZS4KKyAgKiBAbm90ZSAgICAgKCoqKSBIU0VfVkFMVUUgaXMgYSBjb25zdGFudCBkZWZpbmVkIGluIHN0bTMybDB4eF9oYWxfY29uZi5oIGZpbGUgKGRlZmF1bHQgdmFsdWUKKyAgKiAgICAgICAgICAgICAgICA4IE1IeiksIHVzZXIgaGFzIHRvIGVuc3VyZSB0aGF0IEhTRV9WQUxVRSBpcyBzYW1lIGFzIHRoZSByZWFsCisgICogICAgICAgICAgICAgICAgZnJlcXVlbmN5IG9mIHRoZSBjcnlzdGFsIHVzZWQuIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiBtYXkKKyAgKiAgICAgICAgICAgICAgICBoYXZlIHdyb25nIHJlc3VsdC4KKyAgKgorICAqIEBub3RlICAgVGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG5vdCBjb3JyZWN0IHdoZW4gdXNpbmcgZnJhY3Rpb25hbAorICAqICAgICAgICAgdmFsdWUgZm9yIEhTRSBjcnlzdGFsLgorICAqCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIGNvbXB1dGUgdGhlCisgICogICAgICAgICBiYXVkLXJhdGUgZm9yIHRoZSBjb21tdW5pY2F0aW9uIHBlcmlwaGVyYWxzIG9yIGNvbmZpZ3VyZSBvdGhlciBwYXJhbWV0ZXJzLgorICAqCisgICogQG5vdGUgICBFYWNoIHRpbWUgU1lTQ0xLIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZQorICAqICAgICAgICAgcmlnaHQgU1lTQ0xLIHZhbHVlLiBPdGhlcndpc2UsIGFueSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbmNvcnJlY3QuCisgICoKKyAgKiBAcmV0dmFsIFNZU0NMSyBmcmVxdWVuY3kKKyAgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKHZvaWQpCit7CisgIHVpbnQzMl90IHRtcHJlZywgcGxsbSwgcGxsZCwgcGxsdmNvLCBtc2ljbGtyYW5nZTsgICAgLyogbm8gaW5pdCBuZWVkZWQgKi8KKyAgdWludDMyX3Qgc3lzY2xvY2tmcmVxOworCisgIHRtcHJlZyA9IFJDQy0+Q0ZHUjsKKworICAvKiBHZXQgU1lTQ0xLIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgc3dpdGNoICh0bXByZWcgJiBSQ0NfQ0ZHUl9TV1MpCisgIHsKKyAgICBjYXNlIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSTogIC8qIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgKi8KKyAgICB7CisgICAgICBpZiAoKFJDQy0+Q1IgJiBSQ0NfQ1JfSFNJRElWRikgIT0gMFUpCisgICAgICB7CisgICAgICAgIHN5c2Nsb2NrZnJlcSA9ICAoSFNJX1ZBTFVFID4+IDIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzeXNjbG9ja2ZyZXEgPSAgSFNJX1ZBTFVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNFOiAgLyogSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisgICAgeworICAgICAgc3lzY2xvY2tmcmVxID0gSFNFX1ZBTFVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLOiAgLyogUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisgICAgeworICAgICAgcGxsbSA9IFBMTE11bFRhYmxlWyh1aW50MzJfdCkodG1wcmVnICYgUkNDX0NGR1JfUExMTVVMKSA+PiBSQ0NfQ0ZHUl9QTExNVUxfUG9zXTsKKyAgICAgIHBsbGQgPSAoKHVpbnQzMl90KSh0bXByZWcgJiBSQ0NfQ0ZHUl9QTExESVYpID4+IFJDQ19DRkdSX1BMTERJVl9Qb3MpICsgMVU7CisgICAgICBpZiAoX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCkgIT0gUkNDX1BMTFNPVVJDRV9IU0kpCisgICAgICB7CisgICAgICAgIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgICAgcGxsdmNvID0gKEhTRV9WQUxVRSAqIHBsbG0pIC8gcGxsZDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKChSQ0MtPkNSICYgUkNDX0NSX0hTSURJVkYpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgcGxsdmNvID0gKChIU0lfVkFMVUUgPj4gMikgKiBwbGxtKSAvIHBsbGQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICBwbGx2Y28gPSAoSFNJX1ZBTFVFICogcGxsbSkgLyBwbGxkOworICAgICAgICB9CisgICAgICB9CisgICAgICBzeXNjbG9ja2ZyZXEgPSBwbGx2Y287CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19NU0k6ICAvKiBNU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgZGVmYXVsdDogLyogTVNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisgICAgeworICAgICAgbXNpY2xrcmFuZ2UgPSAoUkNDLT5JQ1NDUiAmIFJDQ19JQ1NDUl9NU0lSQU5HRSApID4+IFJDQ19JQ1NDUl9NU0lSQU5HRV9Qb3M7CisgICAgICBzeXNjbG9ja2ZyZXEgPSAoMzI3NjhVICogKDFVTCA8PCAobXNpY2xrcmFuZ2UgKyAxVSkpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc3lzY2xvY2tmcmVxOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEhDTEsgZnJlcXVlbmN5CisgICogQG5vdGUgICBFYWNoIHRpbWUgSENMSyBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUKKyAgKiAgICAgICAgIHJpZ2h0IEhDTEsgdmFsdWUuIE90aGVyd2lzZSwgYW55IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4KKyAgKgorICAqIEBub3RlICAgVGhlIFN5c3RlbUNvcmVDbG9jayBDTVNJUyB2YXJpYWJsZSBpcyB1c2VkIHRvIHN0b3JlIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kKKyAgKiAgICAgICAgIGFuZCB1cGRhdGVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQ0xLIGZyZXF1ZW5jeQorICAqLwordWludDMyX3QgSEFMX1JDQ19HZXRIQ0xLRnJlcSh2b2lkKQoreworICByZXR1cm4gU3lzdGVtQ29yZUNsb2NrOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIFBDTEsxIGZyZXF1ZW5jeQorICAqIEBub3RlICAgRWFjaCB0aW1lIFBDTEsxIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZQorICAqICAgICAgICAgcmlnaHQgUENMSzEgdmFsdWUuIE90aGVyd2lzZSwgYW55IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4KKyAgKiBAcmV0dmFsIFBDTEsxIGZyZXF1ZW5jeQorICAqLwordWludDMyX3QgSEFMX1JDQ19HZXRQQ0xLMUZyZXEodm9pZCkKK3sKKyAgLyogR2V0IEhDTEsgc291cmNlIGFuZCBDb21wdXRlIFBDTEsxIGZyZXF1ZW5jeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gKEhBTF9SQ0NfR2V0SENMS0ZyZXEoKSA+PiBBUEJQcmVzY1RhYmxlWyhSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QUFJFMSkgPj4gUkNDX0NGR1JfUFBSRTFfUG9zXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgUENMSzIgZnJlcXVlbmN5CisgICogQG5vdGUgICBFYWNoIHRpbWUgUENMSzIgY2hhbmdlcywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0byB1cGRhdGUgdGhlCisgICogICAgICAgICByaWdodCBQQ0xLMiB2YWx1ZS4gT3RoZXJ3aXNlLCBhbnkgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW5jb3JyZWN0LgorICAqIEByZXR2YWwgUENMSzIgZnJlcXVlbmN5CisgICovCit1aW50MzJfdCBIQUxfUkNDX0dldFBDTEsyRnJlcSh2b2lkKQoreworICAvKiBHZXQgSENMSyBzb3VyY2UgYW5kIENvbXB1dGUgUENMSzIgZnJlcXVlbmN5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAoSEFMX1JDQ19HZXRIQ0xLRnJlcSgpPj4gQVBCUHJlc2NUYWJsZVsoUkNDLT5DRkdSICYgUkNDX0NGR1JfUFBSRTIpID4+IFJDQ19DRkdSX1BQUkUyX1Bvc10pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFJDQ19Pc2NJbml0U3RydWN0IGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwKKyAgKiBSQ0MgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICogQHBhcmFtICBSQ0NfT3NjSW5pdFN0cnVjdCBwb2ludGVyIHRvIGFuIFJDQ19Pc2NJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqIHdpbGwgYmUgY29uZmlndXJlZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ19HZXRPc2NDb25maWcoUkNDX09zY0luaXRUeXBlRGVmICAqUkNDX09zY0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShSQ0NfT3NjSW5pdFN0cnVjdCAhPSAodm9pZCAqKU5VTEwpOworCisgIC8qIFNldCBhbGwgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgT3NjaWxsYXRvciB0eXBlIHBhcmFtZXRlciAtLS0tLS0tLS0tLS0tLS0qLworICBSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFIHwgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSAgXAorICAgICAgICAgICAgICAgICAgfCBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFIHwgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSB8IFJDQ19PU0NJTExBVE9SVFlQRV9NU0k7CisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlIHw9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0ODsKKyNlbmRpZiAvKiBSQ0NfSFNJNDhfU1VQUE9SVCAqLworCisKKyAgLyogR2V0IHRoZSBIU0UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNSICZSQ0NfQ1JfSFNFQllQKSA9PSBSQ0NfQ1JfSFNFQllQKQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID0gUkNDX0hTRV9CWVBBU1M7CisgIH0KKyAgZWxzZSBpZigoUkNDLT5DUiAmUkNDX0NSX0hTRU9OKSA9PSBSQ0NfQ1JfSFNFT04pCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPSBSQ0NfSFNFX09OOworICB9CisgIGVsc2UKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSA9IFJDQ19IU0VfT0ZGOworICB9CisKKyAgLyogR2V0IHRoZSBIU0kgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNSICZSQ0NfQ1JfSFNJT04pID09IFJDQ19DUl9IU0lPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSA9IFJDQ19IU0lfT047CisgIH0KKyAgZWxzZQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlID0gUkNDX0hTSV9PRkY7CisgIH0KKworICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSA9ICh1aW50MzJfdCkoKFJDQy0+SUNTQ1IgJiBSQ0NfSUNTQ1JfSFNJVFJJTSkgPj4gOCk7CisKKyAgLyogR2V0IHRoZSBNU0kgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNSICZSQ0NfQ1JfTVNJT04pID09IFJDQ19DUl9NU0lPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5NU0lTdGF0ZSA9IFJDQ19NU0lfT047CisgIH0KKyAgZWxzZQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPk1TSVN0YXRlID0gUkNDX01TSV9PRkY7CisgIH0KKworICBSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJQ2FsaWJyYXRpb25WYWx1ZSA9ICh1aW50MzJfdCkoKFJDQy0+SUNTQ1IgJiBSQ0NfSUNTQ1JfTVNJVFJJTSkgPj4gUkNDX0lDU0NSX01TSVRSSU1fUG9zKTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPk1TSUNsb2NrUmFuZ2UgPSAodWludDMyX3QpKChSQ0MtPklDU0NSICYgUkNDX0lDU0NSX01TSVJBTkdFKSk7CisKKyAgLyogR2V0IHRoZSBMU0UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNTUiAmUkNDX0NTUl9MU0VCWVApID09IFJDQ19DU1JfTFNFQllQKQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlID0gUkNDX0xTRV9CWVBBU1M7CisgIH0KKyAgZWxzZSBpZigoUkNDLT5DU1IgJlJDQ19DU1JfTFNFT04pID09IFJDQ19DU1JfTFNFT04pCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUgPSBSQ0NfTFNFX09OOworICB9CisgIGVsc2UKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSA9IFJDQ19MU0VfT0ZGOworICB9CisKKyAgLyogR2V0IHRoZSBMU0kgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNTUiAmUkNDX0NTUl9MU0lPTikgPT0gUkNDX0NTUl9MU0lPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CisgIH0KKyAgZWxzZQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlID0gUkNDX0xTSV9PRkY7CisgIH0KKworI2lmIGRlZmluZWQoUkNDX0hTSTQ4X1NVUFBPUlQpCisgIC8qIEdldCB0aGUgSFNJNDggY29uZmlndXJhdGlvbiBpZiBhbnktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0k0OFN0YXRlID0gX19IQUxfUkNDX0dFVF9IU0k0OF9TVEFURSgpOworI2VuZGlmIC8qIFJDQ19IU0k0OF9TVVBQT1JUICovCisKKyAgLyogR2V0IHRoZSBQTEwgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKChSQ0MtPkNSICZSQ0NfQ1JfUExMT04pID09IFJDQ19DUl9QTExPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX09OOworICB9CisgIGVsc2UKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX09GRjsKKyAgfQorICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSA9ICh1aW50MzJfdCkoUkNDLT5DRkdSICYgUkNDX0NGR1JfUExMU1JDKTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNVUwgPSAodWludDMyX3QpKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1BMTE1VTCk7CisgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMRElWID0gKHVpbnQzMl90KShSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QTExESVYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgUkNDX0Nsa0luaXRTdHJ1Y3QgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcm5hbAorICAqIFJDQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIFJDQ19DbGtJbml0U3RydWN0IHBvaW50ZXIgdG8gYW4gUkNDX0Nsa0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogY29udGFpbnMgdGhlIGN1cnJlbnQgY2xvY2sgY29uZmlndXJhdGlvbi4KKyAgKiBAcGFyYW0gIHBGTGF0ZW5jeSBQb2ludGVyIG9uIHRoZSBGbGFzaCBMYXRlbmN5LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDX0dldENsb2NrQ29uZmlnKFJDQ19DbGtJbml0VHlwZURlZiAgKlJDQ19DbGtJbml0U3RydWN0LCB1aW50MzJfdCAqcEZMYXRlbmN5KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oUkNDX0Nsa0luaXRTdHJ1Y3QgIT0gKHZvaWQgKilOVUxMKTsKKyAgYXNzZXJ0X3BhcmFtKHBGTGF0ZW5jeSAhPSAodm9pZCAqKU5VTEwpOworCisgIC8qIFNldCBhbGwgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgQ2xvY2sgdHlwZSBwYXJhbWV0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlID0gUkNDX0NMT0NLVFlQRV9TWVNDTEsgfCBSQ0NfQ0xPQ0tUWVBFX0hDTEsgfCBSQ0NfQ0xPQ0tUWVBFX1BDTEsxIHwgUkNDX0NMT0NLVFlQRV9QQ0xLMjsKKworICAvKiBHZXQgdGhlIFNZU0NMSyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9ICh1aW50MzJfdCkoUkNDLT5DRkdSICYgUkNDX0NGR1JfU1cpOworCisgIC8qIEdldCB0aGUgSENMSyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlciA9ICh1aW50MzJfdCkoUkNDLT5DRkdSICYgUkNDX0NGR1JfSFBSRSk7CisKKyAgLyogR2V0IHRoZSBBUEIxIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19DbGtJbml0U3RydWN0LT5BUEIxQ0xLRGl2aWRlciA9ICh1aW50MzJfdCkoUkNDLT5DRkdSICYgUkNDX0NGR1JfUFBSRTEpOworCisgIC8qIEdldCB0aGUgQVBCMiBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMkNMS0RpdmlkZXIgPSAodWludDMyX3QpKChSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QUFJFMikgPj4gMyk7CisKKyAgLyogR2V0IHRoZSBGbGFzaCBXYWl0IFN0YXRlIChMYXRlbmN5KSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICpwRkxhdGVuY3kgPSBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpOworfQorCisjaWYgZGVmaW5lZChSQ0NfSFNFQ1NTX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBSQ0MgQ1NTIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBub3RlIFRoaXMgQVBJIHNob3VsZCBiZSBjYWxsZWQgdW5kZXIgdGhlIE5NSV9IYW5kbGVyKCkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NfTk1JX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgLyogQ2hlY2sgUkNDIENTU0YgZmxhZyAgKi8KKyAgaWYoX19IQUxfUkNDX0dFVF9JVChSQ0NfSVRfQ1NTKSkKKyAgeworICAgIC8qIFJDQyBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0IHVzZXIgY2FsbGJhY2sgKi8KKyAgICBIQUxfUkNDX0NTU0NhbGxiYWNrKCk7CisKKyAgICAvKiBDbGVhciBSQ0MgQ1NTIHBlbmRpbmcgYml0ICovCisgICAgX19IQUxfUkNDX0NMRUFSX0lUKFJDQ19JVF9DU1MpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUkNDIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgY2FsbGJhY2sKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SQ0NfQ1NTQ2FsbGJhY2sodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgIHRoZSBIQUxfUkNDX0NTU0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICAqLworfQorCisjZW5kaWYgLyogUkNDX0hTRUNTU19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ19Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUkNDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfcmNjX2V4LmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9yY2NfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBmM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfcmNjX2V4LmMKQEAgLTAsMCArMSwxMjE1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9yY2NfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgUkNDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgUkNDIGV4dGVuc2lvbiBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUkNDX01PRFVMRV9FTkFCTEVECisKKy8qKiBAZGVmZ3JvdXAgUkNDRXggUkNDRXgKKyAgKiBAYnJpZWYgUkNDIEV4dGVuc2lvbiBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NFeF9Qcml2YXRlX0NvbnN0YW50cyBSQ0NFeCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjaWYgZGVmaW5lZChVU0IpCitleHRlcm4gY29uc3QgdWludDhfdCBQTExNdWxUYWJsZVtdOworI2VuZGlmIC8qIFVTQiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDRXhfUHJpdmF0ZV9NYWNyb3MgUkNDRXggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBSQ0NFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBSQ0MgQ2xvY2tzCisgICAgZnJlcXVlbmNpZXMuCisgICAgWy4uXQorICAgIChAKSBJbXBvcnRhbnQgbm90ZTogQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygpIGlzIHVzZWQgdG8KKyAgICAgICAgc2VsZWN0IHRoZSBSVEMgY2xvY2sgc291cmNlOyBpbiB0aGlzIGNhc2UgdGhlIEJhY2t1cCBkb21haW4gd2lsbCBiZSByZXNldCBpbgorICAgICAgICBvcmRlciB0byBtb2RpZnkgdGhlIFJUQyBDbG9jayBzb3VyY2UsIGFzIGNvbnNlcXVlbmNlIFJUQyByZWdpc3RlcnMgKGluY2x1ZGluZworICAgICAgICB0aGUgYmFja3VwIHJlZ2lzdGVycykgYXJlIHNldCB0byB0aGVpciByZXNldCB2YWx1ZXMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFJDQyBleHRlbmRlZCBwZXJpcGhlcmFscyBjbG9ja3MgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZi4KKyAgKiBAcGFyYW0gIFBlcmlwaENsa0luaXQgcG9pbnRlciB0byBhbiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRXh0ZW5kZWQgUGVyaXBoZXJhbHMgY2xvY2tzKFVTQVJUMSxVU0FSVDIsIExQVUFSVDEsCisgICogICAgICAgICBJMkMxLCBJMkMzLCBSVEMsIFVTQi9STkcgIGFuZCBMUFRJTTEgY2xvY2tzKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiBAbm90ZSAgIElmIEhBTF9FUlJPUiByZXR1cm5lZCwgZmlyc3Qgc3dpdGNoLU9GRiBIU0UgY2xvY2sgb3NjaWxsYXRvciB3aXRoIEByZWYgSEFMX1JDQ19Pc2NDb25maWcoKQorICAqICAgICAgICAgdG8gcG9zc2libHkgdXBkYXRlIEhTRSBkaXZpZGVyLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZyhSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgICpQZXJpcGhDbGtJbml0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHRlbXBfcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfUEVSSVBIQ0xPQ0soUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUlRDL0xDRCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1JUQykgPT0gUkNDX1BFUklQSENMS19SVEMpCisjaWYgZGVmaW5lZChMQ0QpCisgICB8fCAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0xDRCkgPT0gUkNDX1BFUklQSENMS19MQ0QpCisjZW5kaWYgLyogTENEICovCisgICAgICkKKyAgeworICAgIC8qIGNoZWNrIGZvciBSVEMgUGFyYW1ldGVycyB1c2VkIHRvIG91dHB1dCBSVENDTEsgKi8KKyAgICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1JUQ0NMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5SVENDbG9ja1NlbGVjdGlvbikpOworICAgIH0KKworI2lmIGRlZmluZWQoTENEKQorICAgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19MQ0QpID09IFJDQ19QRVJJUEhDTEtfTENEKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUlRDQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkxDRENsb2NrU2VsZWN0aW9uKSk7CisgICAgfQorI2VuZGlmIC8qIExDRCAqLworCisgICAgRmxhZ1N0YXR1cyAgICAgICBwd3JjbGtjaGFuZ2VkID0gUkVTRVQ7CisKKyAgICAvKiBBcyBzb29uIGFzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGFuZ2UgUlRDIGNsb2NrIHNvdXJjZSwgYWN0aXZhdGlvbiBvZiB0aGUKKyAgICAgICBwb3dlciBkb21haW4gaXMgZG9uZS4gKi8KKyAgICAvKiBSZXF1aXJlcyB0byBlbmFibGUgd3JpdGUgYWNjZXNzIHRvIEJhY2t1cCBEb21haW4gb2YgbmVjZXNzYXJ5ICovCisgICAgaWYoX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQoKSkKKyAgICB7CisgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKTsKKyAgICAgIHB3cmNsa2NoYW5nZWQgPSBTRVQ7CisgICAgfQorCisgICAgaWYoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUiwgUFdSX0NSX0RCUCkpCisgICAgeworICAgICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBCYWNrdXAgZG9tYWluICovCisgICAgICBTRVRfQklUKFBXUi0+Q1IsIFBXUl9DUl9EQlApOworCisgICAgICAvKiBXYWl0IGZvciBCYWNrdXAgZG9tYWluIFdyaXRlIHByb3RlY3Rpb24gZGlzYWJsZSAqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUiwgUFdSX0NSX0RCUCkpCisgICAgICB7CisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19EQlBfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIGlmIHVzZXIgd2FudHMgdG8gY2hhbmdlIEhTRSBSVEMgcHJlc2NhbGVyIHdoZXJlYXMgSFNFIGlzIGVuYWJsZWQgKi8KKyAgICB0ZW1wX3JlZyA9IChSQ0MtPkNSICYgUkNDX0NSX1JUQ1BSRSk7CisgICAgaWYgKCh0ZW1wX3JlZyAhPSAoUGVyaXBoQ2xrSW5pdC0+UlRDQ2xvY2tTZWxlY3Rpb24gJiBSQ0NfQ1JfUlRDUFJFKSkKKyNpZiBkZWZpbmVkIChMQ0QpCisgICAgIHx8ICh0ZW1wX3JlZyAhPSAoUGVyaXBoQ2xrSW5pdC0+TENEQ2xvY2tTZWxlY3Rpb24gJiBSQ0NfQ1JfUlRDUFJFKSkKKyNlbmRpZiAvKiBMQ0QgKi8KKyAgICAgICApCisgICAgeyAvKiBDaGVjayBIU0UgU3RhdGUgKi8KKyAgICAgIGlmICgoUGVyaXBoQ2xrSW5pdC0+UlRDQ2xvY2tTZWxlY3Rpb24gJiBSQ0NfQ1NSX1JUQ1NFTCkgPT0gUkNDX0NTUl9SVENTRUxfSFNFKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUbyB1cGRhdGUgSFNFIGRpdmlkZXIsIGZpcnN0IHN3aXRjaC1PRkYgSFNFIGNsb2NrIG9zY2lsbGF0b3IqLworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNldCB0aGUgQmFja3VwIGRvbWFpbiBvbmx5IGlmIHRoZSBSVEMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiBpcyBtb2RpZmllZCBmcm9tIHJlc2V0IHZhbHVlICovCisgICAgdGVtcF9yZWcgPSAoUkNDLT5DU1IgJiBSQ0NfQ1NSX1JUQ1NFTCk7CisKKyAgICBpZigodGVtcF9yZWcgIT0gMHgwMDAwMDAwMFUpICYmICgoKHRlbXBfcmVnICE9IChQZXJpcGhDbGtJbml0LT5SVENDbG9ja1NlbGVjdGlvbiAmIFJDQ19DU1JfUlRDU0VMKSkgXAorICAgICAgJiYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19SVEMpID09IFJDQ19QRVJJUEhDTEtfUlRDKSkKKyNpZiBkZWZpbmVkKExDRCkKKyAgICAgIHx8ICgodGVtcF9yZWcgIT0gKFBlcmlwaENsa0luaXQtPkxDRENsb2NrU2VsZWN0aW9uICYgUkNDX0NTUl9SVENTRUwpKSBcCisgICAgICAgJiYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19MQ0QpID09IFJDQ19QRVJJUEhDTEtfTENEKSkKKyNlbmRpZiAvKiBMQ0QgKi8KKyAgICAgKSkKKyAgICB7CisgICAgICAvKiBTdG9yZSB0aGUgY29udGVudCBvZiBDU1IgcmVnaXN0ZXIgYmVmb3JlIHRoZSByZXNldCBvZiBCYWNrdXAgRG9tYWluICovCisgICAgICB0ZW1wX3JlZyA9IChSQ0MtPkNTUiAmIH4oUkNDX0NTUl9SVENTRUwpKTsKKworICAgICAgLyogUlRDIENsb2NrIHNlbGVjdGlvbiBjYW4gYmUgY2hhbmdlZCBvbmx5IGlmIHRoZSBCYWNrdXAgRG9tYWluIGlzIHJlc2V0ICovCisgICAgICBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UoKTsKKyAgICAgIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9SRUxFQVNFKCk7CisKKyAgICAgIC8qIFJlc3RvcmUgdGhlIENvbnRlbnQgb2YgQ1NSIHJlZ2lzdGVyICovCisgICAgICBSQ0MtPkNTUiA9IHRlbXBfcmVnOworCisgICAgICAgLyogV2FpdCBmb3IgTFNFUkRZIGlmIExTRSB3YXMgZW5hYmxlZCAqLworICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKHRlbXBfcmVnLCBSQ0NfQ1NSX0xTRU9OKSkKKyAgICAgIHsKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sgKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgTFNFIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19MU0VSRFkpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJDQ19MU0VfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIF9fSEFMX1JDQ19SVENfQ09ORklHKFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uKTsKKworICAgIC8qIFJlcXVpcmUgdG8gZGlzYWJsZSBwb3dlciBjbG9jayBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZihwd3JjbGtjaGFuZ2VkID09IFNFVCkKKyAgICB7CisgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFKCk7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkIChSQ0NfQ0NJUFJfVVNBUlQxU0VMKQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVVNBUlQxQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVzYXJ0MUNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVVNBUlQxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2FydDFDbG9ja1NlbGVjdGlvbik7CisgIH0KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQxU0VMICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVDIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19VU0FSVDIpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VTQVJUMkNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5Vc2FydDJDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBVU0FSVDIgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX1VTQVJUMl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VXNhcnQyQ2xvY2tTZWxlY3Rpb24pOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBVQVJUMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFBVQVJUMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5McHVhcnQxQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgTFBVQVIxIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19MUFVBUlQxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5McHVhcnQxQ2xvY2tTZWxlY3Rpb24pOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJDMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMmMxQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJDMSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfSTJDMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJjMUNsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisjaWYgZGVmaW5lZCAoUkNDX0NDSVBSX0kyQzNTRUwpCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMkMzKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzMpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJDM0NMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMmMzQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJDMyBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfSTJDM19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJjM0Nsb2NrU2VsZWN0aW9uKTsKKyAgfQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9JMkMzU0VMICovCisKKyNpZiBkZWZpbmVkKFVTQikKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNCIGFuZCBSTkcgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19VU0IpID09IChSQ0NfUEVSSVBIQ0xLX1VTQikpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VTQkNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbikpOworICAgIF9fSEFMX1JDQ19VU0JfQ09ORklHKFBlcmlwaENsa0luaXQtPlVzYkNsb2NrU2VsZWN0aW9uKTsKKyAgfQorI2VuZGlmIC8qIFVTQiAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMUFRJTTEgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0xKSA9PSAoUkNDX1BFUklQSENMS19MUFRJTTEpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MUFRJTUNMSyhQZXJpcGhDbGtJbml0LT5McHRpbUNsb2NrU2VsZWN0aW9uKSk7CisgICAgX19IQUxfUkNDX0xQVElNMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+THB0aW1DbG9ja1NlbGVjdGlvbik7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgUGVyaXBoQ2xrSW5pdCBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsIFJDQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIFBlcmlwaENsa0luaXQgcG9pbnRlciB0byBhbiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIHJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBFeHRlbmRlZCBQZXJpcGhlcmFscyBjbG9ja3MoVVNBUlQxLFVTQVJUMiwgTFBVQVJUMSwKKyAgKiAgICAgICAgIEkyQzEsIEkyQzMsIFJUQywgVVNCL1JORyAgYW5kIExQVElNMSBjbG9ja3MpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgKlBlcmlwaENsa0luaXQpCit7CisgIHVpbnQzMl90IHNyY2NsazsKKworICAgLyogU2V0IGFsbCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBleHRlbmRlZCBjbG9jayB0eXBlIHBhcmFtZXRlciAtLS0tLS0tLS0tLSovCisgIC8qIENvbW1vbiBwYXJ0IGZpcnN0ICovCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19VU0FSVDIgfCBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19MUFRJTTE7CisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQxU0VMKQorICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMTsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQxU0VMICovCisjaWYgIGRlZmluZWQoUkNDX0NDSVBSX0kyQzNTRUwpCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uIHw9IFJDQ19QRVJJUEhDTEtfSTJDMzsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfSTJDM1NFTCAqLworI2lmIGRlZmluZWQoVVNCKQorICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSBSQ0NfUEVSSVBIQ0xLX1VTQjsKKyNlbmRpZiAvKiBVU0IgKi8KKyNpZiBkZWZpbmVkKExDRCkKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gUkNDX1BFUklQSENMS19MQ0Q7CisjZW5kaWYgLyogTENEICovCisKKyAgLyogR2V0IHRoZSBSVEMvTENEIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1JUQ19TT1VSQ0UoKTsKKyAgaWYgKHNyY2NsayAhPSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYyKQorICB7CisgICAgLyogU291cmNlIGNsb2NrIGlzIExTRSBvciBMU0kqLworICAgIFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uID0gc3JjY2xrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNvdXJjZSBjbG9jayBpcyBIU0UuIE5lZWQgdG8gZ2V0IHRoZSBwcmVzY2FsZXIgdmFsdWUqLworICAgIFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uID0gc3JjY2xrIHwgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9SVENQUkUpKTsKKyAgfQorI2lmIGRlZmluZWQoTENEKQorICBQZXJpcGhDbGtJbml0LT5MQ0RDbG9ja1NlbGVjdGlvbiA9IFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uOworI2VuZGlmIC8qIExDRCAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1VTQVJUMVNFTCkKKyAgLyogR2V0IHRoZSBVU0FSVDEgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlVzYXJ0MUNsb2NrU2VsZWN0aW9uICA9IF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpOworI2VuZGlmIC8qIFJDQ19DQ0lQUl9VU0FSVDFTRUwgKi8KKyAgLyogR2V0IHRoZSBVU0FSVDIgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlVzYXJ0MkNsb2NrU2VsZWN0aW9uICA9IF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpOworICAvKiBHZXQgdGhlIExQVUFSVDEgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkxwdWFydDFDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKTsKKyAgLyogR2V0IHRoZSBJMkMxIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkkyYzFDbG9ja1NlbGVjdGlvbiAgICA9IF9fSEFMX1JDQ19HRVRfSTJDMV9TT1VSQ0UoKTsKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9JMkMzU0VMKQorLyogR2V0IHRoZSBJMkMzIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkkyYzNDbG9ja1NlbGVjdGlvbiAgICA9IF9fSEFMX1JDQ19HRVRfSTJDM19TT1VSQ0UoKTsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfSTJDM1NFTCAqLworICAvKiBHZXQgdGhlIExQVElNMSBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5McHRpbUNsb2NrU2VsZWN0aW9uICAgPSBfX0hBTF9SQ0NfR0VUX0xQVElNMV9TT1VSQ0UoKTsKKyAgLyogR2V0IHRoZSBSVEMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+UlRDQ2xvY2tTZWxlY3Rpb24gICAgID0gX19IQUxfUkNDX0dFVF9SVENfU09VUkNFKCk7CisjaWYgZGVmaW5lZChVU0IpCisgIC8qIEdldCB0aGUgVVNCL1JORyBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbiAgICAgPSBfX0hBTF9SQ0NfR0VUX1VTQl9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBVU0IgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIHBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5CisgICogQG5vdGUgICBSZXR1cm4gMCBpZiBwZXJpcGhlcmFsIGNsb2NrIGlzIHVua25vd24KKyAgKiBAcGFyYW0gIFBlcmlwaENsayBQZXJpcGhlcmFsIGNsb2NrIGlkZW50aWZpZXIKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19SVEMgICAgICBSVEMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTENEICAgICAgTENEIHBlcmlwaGVyYWwgY2xvY2sgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0IgICAgICBVU0Igb3IgUk5HIHBlcmlwaGVyYWwgY2xvY2sgKCopCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDEgICBVU0FSVDEgcGVyaXBoZXJhbCBjbG9jayAoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiAgIFVTQVJUMiBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19MUFVBUlQxICBMUFVBUlQxIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzEgICAgIEkyQzEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMiAgICAgSTJDMiBwZXJpcGhlcmFsIGNsb2NrICgqKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMyAgICAgSTJDMyBwZXJpcGhlcmFsIGNsb2NrICgqKQorICAqIEBub3RlICAgKCopIG1lYW5zIHRoYXQgdGhpcyBwZXJpcGhlcmFsIGlzIG5vdCBwcmVzZW50IG9uIGFsbCB0aGUgZGV2aWNlcworICAqIEByZXR2YWwgRnJlcXVlbmN5IGluIEh6ICgwOiBtZWFucyB0aGF0IG5vIGF2YWlsYWJsZSBmcmVxdWVuY3kgZm9yIHRoZSBwZXJpcGhlcmFsKQorICAqLwordWludDMyX3QgSEFMX1JDQ0V4X0dldFBlcmlwaENMS0ZyZXEodWludDMyX3QgUGVyaXBoQ2xrKQoreworICB1aW50MzJfdCBmcmVxdWVuY3kgPSAwVTsKKyAgdWludDMyX3QgdGVtcF9yZWcsIGNsa3ByZWRpdiwgc3JjY2xrOyAgICAvKiBubyBpbml0IG5lZWRlZCAqLworI2lmIGRlZmluZWQoVVNCKQorICB1aW50MzJfdCBwbGxtdWwsIHBsbGRpdiwgcGxsdmNvOyAgICAvKiBubyBpbml0IG5lZWRlZCAqLworI2VuZGlmIC8qIFVTQiAqLworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfUEVSSVBIQ0xPQ0soUGVyaXBoQ2xrKSk7CisKKyAgc3dpdGNoIChQZXJpcGhDbGspCisgIHsKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1JUQzoKKyNpZiBkZWZpbmVkKExDRCkKKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0xDRDoKKyNlbmRpZiAvKiBMQ0QgKi8KKyAgICB7CisgICAgICAvKiBHZXQgUkNDIENTUiBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICB0ZW1wX3JlZyA9IFJDQy0+Q1NSOworCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgUlRDIHNvdXJjZSAqLworICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9SVENfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIExTRSBpcyByZWFkeSBpZiBSVEMgY2xvY2sgc2VsZWN0aW9uIGlzIExTRSAqLworICAgICAgaWYgKChzcmNjbGsgPT0gUkNDX1JUQ0NMS1NPVVJDRV9MU0UpICYmIChIQUxfSVNfQklUX1NFVCh0ZW1wX3JlZywgUkNDX0NTUl9MU0VSRFkpKSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgTFNJIGlzIHJlYWR5IGlmIFJUQyBjbG9jayBzZWxlY3Rpb24gaXMgTFNJICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1JUQ0NMS1NPVVJDRV9MU0kpCisgICAgICB7CisgICAgICAgIGlmIChIQUxfSVNfQklUX1NFVCh0ZW1wX3JlZywgUkNDX0NTUl9MU0lSRFkpKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gTFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBIU0UgaXMgcmVhZHkgYW5kIGlmIFJUQyBjbG9jayBzZWxlY3Rpb24gaXMgSFNFICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWWCkKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0VSRFkpKQorICAgICAgICB7CisgICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEhTRSBjbG9jayBkaXZpZGVyICovCisgICAgICAgICAgY2xrcHJlZGl2ID0gX19IQUxfUkNDX0dFVF9SVENfSFNFX1BSRVNDQUxFUigpOworCisgICAgICAgICAgc3dpdGNoIChjbGtwcmVkaXYpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBSQ0NfUlRDX0hTRV9ESVZfMTY6ICAvKiBIU0UgRElWMTYgaGFzIGJlZW4gc2VsZWN0ZWQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gSFNFX1ZBTFVFIC8gMTZVOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUkNDX1JUQ19IU0VfRElWXzg6ICAgLyogSFNFIERJVjggaGFzIGJlZW4gc2VsZWN0ZWQgICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTRV9WQUxVRSAvIDhVOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUkNDX1JUQ19IU0VfRElWXzQ6ICAgLyogSFNFIERJVjQgaGFzIGJlZW4gc2VsZWN0ZWQgICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTRV9WQUxVRSAvIDRVOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgLyogSFNFIERJVjIgaGFzIGJlZW4gc2VsZWN0ZWQgICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTRV9WQUxVRSAvIDJVOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBSVEMgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjaWYgZGVmaW5lZChVU0IpCisgIGNhc2UgUkNDX1BFUklQSENMS19VU0I6CisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFVTQiBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVVNCX1NPVVJDRSgpOworCisgICAgICBpZiAoc3JjY2xrID09IFJDQ19VU0JDTEtTT1VSQ0VfUExMKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBHZXQgUExMIGNsb2NrIHNvdXJjZSBhbmQgbXVsdGlwbGljYXRpb24gZmFjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAgIHBsbG11bCA9IFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1BMTE1VTDsKKyAgICAgICAgICBwbGxkaXYgPSBSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QTExESVY7CisgICAgICAgICAgcGxsbXVsID0gUExMTXVsVGFibGVbKHBsbG11bCA+PiBSQ0NfQ0ZHUl9QTExNVUxfUG9zKV07CisgICAgICAgICAgcGxsZGl2ID0gKHBsbGRpdiA+PiBSQ0NfQ0ZHUl9QTExESVZfUG9zKSArIDFVOworCisgICAgICAgICAgLyogQ29tcHV0ZSBQTEwgY2xvY2sgaW5wdXQgKi8KKyAgICAgICAgICBpZihfX0hBTF9SQ0NfR0VUX1BMTF9PU0NTT1VSQ0UoKSA9PSBSQ0NfUExMU09VUkNFX0hTSSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSURJVkYpICE9IDBVKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwbGx2Y28gPSAgKEhTSV9WQUxVRSA+PiAyVSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBsbHZjbyA9ICBIU0lfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgLyogSFNFIHNvdXJjZSAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIHBsbHZjbyA9IEhTRV9WQUxVRTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogcGxsdmNvICogcGxsbXVsIC8gcGxsZGl2ICovCisgICAgICAgICAgcGxsdmNvID0gKHBsbHZjbyAqIHBsbG11bCk7CisgICAgICAgICAgZnJlcXVlbmN5ID0gKHBsbHZjby8gcGxsZGl2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VU0JDTEtTT1VSQ0VfSFNJNDgpCisgICAgICB7CisgICAgICAgIGlmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhSRFkpKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSFNJNDhfVkFMVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgLyogUkNDX1VTQkNMS1NPVVJDRV9OT05FICovCisgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogVVNCICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQxU0VMKQorICBjYXNlIFJDQ19QRVJJUEhDTEtfVVNBUlQxOgorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBVU0FSVDEgc291cmNlICovCisgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKTsKKworICAgICAgLyogQ2hlY2sgaWYgVVNBUlQxIGNsb2NrIHNlbGVjdGlvbiBpcyBQQ0xLMiAqLworICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsyRnJlcSgpOworICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgSFNJIGlzIHJlYWR5IGFuZCBpZiBVU0FSVDEgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSURJVkYpICE9IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZyZXF1ZW5jeSA9ICAoSFNJX1ZBTFVFID4+IDJVKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZyZXF1ZW5jeSA9ICBIU0lfVkFMVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBVU0FSVDEgY2xvY2sgc2VsZWN0aW9uIGlzIFNZU0NMSyAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgTFNFIGlzIHJlYWR5ICBhbmQgaWYgVVNBUlQxIGNsb2NrIHNlbGVjdGlvbiBpcyBMU0UgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTRVJEWSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBVU0FSVDEqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQxU0VMICovCisgIGNhc2UgUkNDX1BFUklQSENMS19VU0FSVDI6CisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFVTQVJUMiBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpOworCisgICAgICAvKiBDaGVjayBpZiBVU0FSVDIgY2xvY2sgc2VsZWN0aW9uIGlzIFBDTEsxICovCisgICAgICBpZiAoc3JjY2xrID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzEpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBIU0kgaXMgcmVhZHkgYW5kIGlmIFVTQVJUMiBjbG9jayBzZWxlY3Rpb24gaXMgSFNJICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0kpCisgICAgICB7CisgICAgICAgIGlmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJRElWRikgIT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgZnJlcXVlbmN5ID0gIChIU0lfVkFMVUUgPj4gMlUpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgZnJlcXVlbmN5ID0gIEhTSV9WQUxVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIFVTQVJUMiBjbG9jayBzZWxlY3Rpb24gaXMgU1lTQ0xLICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEspCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBMU0UgaXMgcmVhZHkgIGFuZCBpZiBVU0FSVDIgY2xvY2sgc2VsZWN0aW9uIGlzIExTRSAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNFUkRZKSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIFVTQVJUMiovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IDBVOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICBjYXNlIFJDQ19QRVJJUEhDTEtfTFBVQVJUMToKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgTFBVQVJUMSBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKTsKKworICAgICAgLyogQ2hlY2sgaWYgTFBVQVJUMSBjbG9jayBzZWxlY3Rpb24gaXMgUENMSzEgKi8KKyAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzEpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBIU0kgaXMgcmVhZHkgYW5kIGlmIExQVUFSVDEgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSkKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lESVZGKSAhPSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgPSAgKEhTSV9WQUxVRSA+PiAyVSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgPSAgSFNJX1ZBTFVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgTFBVQVJUMSBjbG9jayBzZWxlY3Rpb24gaXMgU1lTQ0xLICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgTFNFIGlzIHJlYWR5ICBhbmQgaWYgTFBVQVJUMSBjbG9jayBzZWxlY3Rpb24gaXMgTFNFICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNFUkRZKSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIExQVUFSVDEqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0kyQzE6CisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEkyQzEgc291cmNlICovCisgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0kyQzFfU09VUkNFKCk7CisKKyAgICAgIC8qIENoZWNrIGlmIEkyQzEgY2xvY2sgc2VsZWN0aW9uIGlzIFBDTEsxICovCisgICAgICBpZiAoc3JjY2xrID09IFJDQ19JMkMxQ0xLU09VUkNFX1BDTEsxKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgSFNJIGlzIHJlYWR5IGFuZCBpZiBJMkMxIGNsb2NrIHNlbGVjdGlvbiBpcyBIU0kgKi8KKyAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kpCisgICAgICB7CisgICAgICAgIGlmIChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJRElWRikgIT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgZnJlcXVlbmN5ID0gIChIU0lfVkFMVUUgPj4gMlUpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgZnJlcXVlbmN5ID0gIEhTSV9WQUxVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIEkyQzEgY2xvY2sgc2VsZWN0aW9uIGlzIFNZU0NMSyAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSykKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgIH0KKyAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBJMkMxKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjaWYgZGVmaW5lZChJMkMyKQorICBjYXNlIFJDQ19QRVJJUEhDTEtfSTJDMjoKKyAgICB7CisKKyAgICAgIC8qIENoZWNrIGlmIEkyQzIgb24gQVBCMSBjbG9jayBlbmFibGVkKi8KKyAgICAgIGlmIChSRUFEX0JJVChSQ0MtPkFQQjFFTlIsIChSQ0NfQVBCMUVOUl9JMkMyRU4pKT09UkNDX0FQQjFFTlJfSTJDMkVOKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBJMkMyICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9JMkMzU0VMKQorICBjYXNlIFJDQ19QRVJJUEhDTEtfSTJDMzoKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgSTJDMyBzb3VyY2UgKi8KKyAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfSTJDM19TT1VSQ0UoKTsKKworICAgICAgLyogQ2hlY2sgaWYgSTJDMyBjbG9jayBzZWxlY3Rpb24gaXMgUENMSzEgKi8KKyAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfUENMSzEpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICB9CisgICAgICAvKiBDaGVjayBpZiBIU0kgaXMgcmVhZHkgYW5kIGlmIEkyQzMgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSAqLworICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMkMzQ0xLU09VUkNFX0hTSSkKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lESVZGKSAhPSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgPSAgKEhTSV9WQUxVRSA+PiAyVSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgPSAgSFNJX1ZBTFVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogQ2hlY2sgaWYgSTJDMyBjbG9jayBzZWxlY3Rpb24gaXMgU1lTQ0xLICovCisgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgfQorICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIEkyQzMqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfSTJDM1NFTCAqLworICBkZWZhdWx0OgorICAgIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4oZnJlcXVlbmN5KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfRW5hYmxlTFNFQ1NTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNFQ1NTT04pIDsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyB0aGUgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4KKyAgKiBAbm90ZSAgIE9uY2UgZW5hYmxlZCB0aGlzIGJpdCBjYW5ub3QgYmUgZGlzYWJsZWQsIGV4Y2VwdCBhZnRlciBhbiBMU0UgZmFpbHVyZSBkZXRlY3Rpb24KKyAgKiAgICAgICAgIChMU0VDU1NEPTEpLiBJbiB0aGF0IGNhc2UgdGhlIHNvZnR3YXJlIE1VU1QgZGlzYWJsZSB0aGUgTFNFQ1NTT04gYml0LgorICAqICAgICAgICAgUmVzZXQgYnkgcG93ZXIgb24gcmVzZXQgYW5kIFJUQyBzb2Z0d2FyZSByZXNldCAoUlRDUlNUIGJpdCkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NFeF9EaXNhYmxlTFNFQ1NTKHZvaWQpCit7CisgIC8qIERpc2FibGUgTFNFIENTUyAqLworICAgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTRUNTU09OKSA7CisKKyAgLyogRGlzYWJsZSBMU0UgQ1NTIElUICovCisgIF9fSEFMX1JDQ19ESVNBQkxFX0lUKFJDQ19JVF9MU0VDU1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJVCAmIGNvcnJlc3BvbmRpbmcgRVhUSSBsaW5lLgorICAqIEBub3RlICAgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJVCBpcyBtYXBwZWQgb24gUlRDIEVYVEkgbGluZSAxOQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfRW5hYmxlTFNFQ1NTX0lUKHZvaWQpCit7CisgIC8qIEVuYWJsZSBMU0UgQ1NTICovCisgICBTRVRfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTRUNTU09OKSA7CisKKyAgLyogRW5hYmxlIExTRSBDU1MgSVQgKi8KKyAgX19IQUxfUkNDX0VOQUJMRV9JVChSQ0NfSVRfTFNFQ1NTKTsKKworICAvKiBFbmFibGUgSVQgb24gRVhUSSBMaW5lIDE5ICovCisgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfSVQoKTsKKyAgX19IQUxfUkNDX0xTRUNTU19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOworfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIHRoZSBSQ0MgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X0xTRUNTU19JUlFIYW5kbGVyKHZvaWQpCit7CisgIC8qIENoZWNrIFJDQyBMU0UgQ1NTRiBmbGFnICAqLworICBpZihfX0hBTF9SQ0NfR0VUX0lUKFJDQ19JVF9MU0VDU1MpKQorICB7CisgICAgLyogUkNDIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0IHVzZXIgY2FsbGJhY2sgKi8KKyAgICBIQUxfUkNDRXhfTFNFQ1NTX0NhbGxiYWNrKCk7CisKKyAgICAvKiBDbGVhciBSQ0MgTFNFIENTUyBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX1JDQ19DTEVBUl9JVChSQ0NfSVRfTFNFQ1NTKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJDQ0V4IExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0IGNhbGxiYWNrLgorICAqIEByZXR2YWwgbm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JDQ0V4X0xTRUNTU19DYWxsYmFjayh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgQHJlZiBIQUxfUkNDRXhfTFNFQ1NTX0NhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjNfRU5SRUZfSFNJNDgpCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlcyBWcmVmaW50IGZvciB0aGUgSFNJNDguCisgICogQG5vdGUgIFRoaXMgaXMgZnVuY3Rpb25hbCBvbmx5IGlmIHRoZSBMT0NLIGlzIG5vdCBzZXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X0VuYWJsZUhTSTQ4X1ZSRUZJTlQodm9pZCkKK3sKKyAgLyogRW5hYmxlIHRoZSBCdWZmZXIgZm9yIHRoZSBBREMgYnkgc2V0dGluZyBTWVNDRkdfQ0ZHUjNfRU5SRUZfSFNJNDggYml0IGluIFNZU0NGR19DRkdSMyByZWdpc3RlciAgICovCisgIFNFVF9CSVQgKFNZU0NGRy0+Q0ZHUjMsIFNZU0NGR19DRkdSM19FTlJFRl9IU0k0OCk7Cit9CisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlcyB0aGUgVnJlZmludCBmb3IgdGhlIEhTSTQ4LgorICAqIEBub3RlICBUaGlzIGlzIGZ1bmN0aW9uYWwgb25seSBpZiB0aGUgTE9DSyBpcyBub3Qgc2V0CisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NFeF9EaXNhYmxlSFNJNDhfVlJFRklOVCh2b2lkKQoreworICAvKiBEaXNhYmxlIHRoZSBWcmVmaW50IGJ5IHJlc2V0dGluZyBTWVNDRkdfQ0ZHUjNfRU5SRUZfSFNJNDggYml0IGluIFNZU0NGR19DRkdSMyByZWdpc3RlciAqLworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMywgU1lTQ0ZHX0NGR1IzX0VOUkVGX0hTSTQ4KTsKK30KKworI2VuZGlmIC8qIFNZU0NGR19DRkdSM19FTlJFRl9IU0k0OCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZCAoQ1JTKQorCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICBFeHRlbmRlZCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIENvbnRyb2wgZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBGb3IgZGV2aWNlcyB3aXRoIENsb2NrIFJlY292ZXJ5IFN5c3RlbSBmZWF0dXJlIChDUlMpLCBSQ0MgRXh0ZW50aW9uIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAgKCMpIEluIFN5c3RlbSBjbG9jayBjb25maWcsIEhTSTQ4IG5lZWRzIHRvIGJlIGVuYWJsZWQKKworICAgICAgKCMpIEVuYWJsZSBDUlMgY2xvY2sgaW4gSVAgTVNQIGluaXQgd2hpY2ggd2lsbCB1c2UgQ1JTIGZ1bmN0aW9ucworCisgICAgICAoIykgQ2FsbCBDUlMgZnVuY3Rpb25zIGFzIGZvbGxvd3M6CisgICAgICAgICAgKCMjKSBQcmVwYXJlIHN5bmNocm9uaXphdGlvbiBjb25maWd1cmF0aW9uIG5lY2Vzc2FyeSBmb3IgSFNJNDggY2FsaWJyYXRpb24KKyAgICAgICAgICAgICAgKCsrKykgRGVmYXVsdCB2YWx1ZXMgY2FuIGJlIHNldCBmb3IgZnJlcXVlbmN5IEVycm9yIE1lYXN1cmVtZW50IChyZWxvYWQgYW5kIGVycm9yIGxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gSFNJNDggb3NjaWxsYXRvciBzbW9vdGggdHJpbW1pbmcuCisgICAgICAgICAgICAgICgrKyspIE1hY3JvIEByZWYgX19IQUxfUkNDX0NSU19SRUxPQURWQUxVRV9DQUxDVUxBVEUgY2FuIGJlIGFsc28gdXNlZCB0byBjYWxjdWxhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5IHJlbG9hZCB2YWx1ZSB3aXRoIHRhcmdldCBhbmQgc3luY2hyb25pemF0aW9uIGZyZXF1ZW5jaWVzIHZhbHVlcworICAgICAgICAgICgjIykgQ2FsbCBmdW5jdGlvbiBAcmVmIEhBTF9SQ0NFeF9DUlNDb25maWcgd2hpY2gKKyAgICAgICAgICAgICAgKCsrKykgUmVzZXQgQ1JTIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIENSUyByZWdpc3RlcnMgd2l0aCBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAoKysrKSBFbmFibGUgYXV0b21hdGljIGNhbGlicmF0aW9uIGFuZCBmcmVxdWVuY3kgZXJyb3IgY291bnRlciBmZWF0dXJlCisgICAgICAgICAgIE5vdGU6IFdoZW4gdXNpbmcgVVNCIExQTSAoTGluayBQb3dlciBNYW5hZ2VtZW50KSBhbmQgdGhlIGRldmljZSBpcyBpbiBTbGVlcCBtb2RlLCB0aGUKKyAgICAgICAgICAgcGVyaW9kaWMgVVNCIFNPRiB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGhvc3QuIE5vIFNZTkMgc2lnbmFsIHdpbGwgdGhlcmVmb3JlIGJlCisgICAgICAgICAgIHByb3ZpZGVkIHRvIHRoZSBDUlMgdG8gY2FsaWJyYXRlIHRoZSBIU0k0OCBvbiB0aGUgcnVuLiBUbyBndWFyYW50ZWUgdGhlIHJlcXVpcmVkIGNsb2NrCisgICAgICAgICAgIHByZWNpc2lvbiBhZnRlciB3YWtpbmcgdXAgZnJvbSBTbGVlcCBtb2RlLCB0aGUgTFNFIG9yIHJlZmVyZW5jZSBjbG9jayBvbiB0aGUgR1BJT3MKKyAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQgYXMgU1lOQyBzaWduYWwuCisKKyAgICAgICAgICAoIyMpIEEgcG9sbGluZyBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byB3YWl0IGZvciBjb21wbGV0ZSBzeW5jaHJvbml6YXRpb24KKyAgICAgICAgICAgICAgKCsrKykgQ2FsbCBmdW5jdGlvbiBAcmVmIEhBTF9SQ0NFeF9DUlNXYWl0U3luY2hyb25pemF0aW9uKCkKKyAgICAgICAgICAgICAgKCsrKykgQWNjb3JkaW5nIHRvIENSUyBzdGF0dXMsIHVzZXIgY2FuIGRlY2lkZSB0byBhZGp1c3QgYWdhaW4gdGhlIGNhbGlicmF0aW9uIG9yIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBpZiBzeW5jaHJvbml6YXRpb24gaXMgT0sKKworICAgICAgKCMpIFVzZXIgY2FuIHJldHJpZXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gc3luY2hyb25pemF0aW9uIGluIGNhbGxpbmcgZnVuY3Rpb24KKyAgICAgICAgICAgIEByZWYgSEFMX1JDQ0V4X0NSU0dldFN5bmNocm9uaXphdGlvbkluZm8oKQorCisgICAgICAoIykgUmVnYXJkaW5nIHN5bmNocm9uaXphdGlvbiBzdGF0dXMgYW5kIHN5bmNocm9uaXphdGlvbiBpbmZvcm1hdGlvbiwgdXNlciBjYW4gdHJ5IGEgbmV3IGNhbGlicmF0aW9uCisgICAgICAgICAgIGluIGNoYW5naW5nIHN5bmNocm9uaXphdGlvbiBjb25maWd1cmF0aW9uIGFuZCBjYWxsIGFnYWluIEhBTF9SQ0NFeF9DUlNDb25maWcuCisgICAgICAgICAgIE5vdGU6IFdoZW4gdGhlIFNZTkMgZXZlbnQgaXMgZGV0ZWN0ZWQgZHVyaW5nIHRoZSBkb3duY291bnRpbmcgcGhhc2UgKGJlZm9yZSByZWFjaGluZyB0aGUgemVybyB2YWx1ZSksCisgICAgICAgICAgIGl0IG1lYW5zIHRoYXQgdGhlIGFjdHVhbCBmcmVxdWVuY3kgaXMgbG93ZXIgdGhhbiB0aGUgdGFyZ2V0IChhbmQgc28sIHRoYXQgdGhlIFRSSU0gdmFsdWUgc2hvdWxkIGJlCisgICAgICAgICAgIGluY3JlbWVudGVkKSwgd2hpbGUgd2hlbiBpdCBpcyBkZXRlY3RlZCBkdXJpbmcgdGhlIHVwY291bnRpbmcgcGhhc2UgaXQgbWVhbnMgdGhhdCB0aGUgYWN0dWFsIGZyZXF1ZW5jeQorICAgICAgICAgICBpcyBoaWdoZXIgKGFuZCB0aGF0IHRoZSBUUklNIHZhbHVlIHNob3VsZCBiZSBkZWNyZW1lbnRlZCkuCisKKyAgICAgICgjKSBJbiBpbnRlcnJ1cHQgbW9kZSwgdXNlciBjYW4gcmVzb3J0IHRvIHRoZSBhdmFpbGFibGUgbWFjcm9zIChfX0hBTF9SQ0NfQ1JTX1hYWF9JVCkuIEludGVycnVwdHMgd2lsbCBnbworICAgICAgICAgIHRocm91Z2ggQ1JTIEhhbmRsZXIgKFJDQ19JUlFuL1JDQ19JUlFIYW5kbGVyKQorICAgICAgICAgICAgICAoKyspIENhbGwgZnVuY3Rpb24gQHJlZiBIQUxfUkNDRXhfQ1JTQ29uZmlnKCkKKyAgICAgICAgICAgICAgKCsrKSBFbmFibGUgUkNDX0lSUW4gKHRoYW5rcyB0byBOVklDIGZ1bmN0aW9ucykKKyAgICAgICAgICAgICAgKCsrKSBFbmFibGUgQ1JTIGludGVycnVwdCAoQHJlZiBfX0hBTF9SQ0NfQ1JTX0VOQUJMRV9JVCkKKyAgICAgICAgICAgICAgKCsrKSBJbXBsZW1lbnQgQ1JTIHN0YXR1cyBtYW5hZ2VtZW50IGluIHRoZSBmb2xsb3dpbmcgdXNlciBjYWxsYmFja3MgY2FsbGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICBIQUxfUkNDRXhfQ1JTX0lSUUhhbmRsZXIoKToKKyAgICAgICAgICAgICAgICAgICAoKysrKSBAcmVmIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2soKQorICAgICAgICAgICAgICAgICAgICgrKyspIEByZWYgSEFMX1JDQ0V4X0NSU19TeW5jV2FybkNhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAgICAoKysrKSBAcmVmIEhBTF9SQ0NFeF9DUlNfRXhwZWN0ZWRTeW5jQ2FsbGJhY2soKQorICAgICAgICAgICAgICAgICAgICgrKyspIEByZWYgSEFMX1JDQ0V4X0NSU19FcnJvckNhbGxiYWNrKCkKKworICAgICAgKCMpIFRvIGZvcmNlIGEgU1lOQyBFVkVOVCwgdXNlciBjYW4gdXNlIHRoZSBmdW5jdGlvbiBAcmVmIEhBTF9SQ0NFeF9DUlNTb2Z0d2FyZVN5bmNocm9uaXphdGlvbkdlbmVyYXRlKCkuCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1JDQ0V4X0NSU0NvbmZpZyAoZm9yIGluc3RhbmNlIGluIFN5c3RpY2sgaGFuZGxlcikKKworQGVuZHZlcmJhdGltCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgYXV0b21hdGljIHN5bmNocm9uaXphdGlvbiBmb3IgcG9sbGluZyBtb2RlCisgICogQHBhcmFtICBwSW5pdCBQb2ludGVyIG9uIFJDQ19DUlNJbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X0NSU0NvbmZpZyhSQ0NfQ1JTSW5pdFR5cGVEZWYgKnBJbml0KQoreworICB1aW50MzJfdCB2YWx1ZTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NSU19TWU5DX0RJVihwSW5pdC0+UHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfQ1JTX1NZTkNfU09VUkNFKHBJbml0LT5Tb3VyY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfU1lOQ19QT0xBUklUWShwSW5pdC0+UG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfUkVMT0FEVkFMVUUocEluaXQtPlJlbG9hZFZhbHVlKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfQ1JTX0VSUk9STElNSVQocEluaXQtPkVycm9yTGltaXRWYWx1ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NSU19IU0k0OENBTElCUkFUSU9OKHBJbml0LT5IU0k0OENhbGlicmF0aW9uVmFsdWUpKTsKKworICAvKiBDT05GSUdVUkFUSU9OICovCisKKyAgLyogQmVmb3JlIGNvbmZpZ3VyYXRpb24sIHJlc2V0IENSUyByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMqLworICBfX0hBTF9SQ0NfQ1JTX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19DUlNfUkVMRUFTRV9SRVNFVCgpOworCisgIC8qIFNldCB0aGUgU1lOQ0RJVlsyOjBdIGJpdHMgYWNjb3JkaW5nIHRvIFByZXNjYWxlciB2YWx1ZSAqLworICAvKiBTZXQgdGhlIFNZTkNTUkNbMTowXSBiaXRzIGFjY29yZGluZyB0byBTb3VyY2UgdmFsdWUgKi8KKyAgLyogU2V0IHRoZSBTWU5DU1BPTCBiaXQgYWNjb3JkaW5nIHRvIFBvbGFyaXR5IHZhbHVlICovCisgIHZhbHVlID0gKHBJbml0LT5QcmVzY2FsZXIgfCBwSW5pdC0+U291cmNlIHwgcEluaXQtPlBvbGFyaXR5KTsKKyAgLyogU2V0IHRoZSBSRUxPQURbMTU6MF0gYml0cyBhY2NvcmRpbmcgdG8gUmVsb2FkVmFsdWUgdmFsdWUgKi8KKyAgdmFsdWUgfD0gcEluaXQtPlJlbG9hZFZhbHVlOworICAvKiBTZXQgdGhlIEZFTElNWzc6MF0gYml0cyBhY2NvcmRpbmcgdG8gRXJyb3JMaW1pdFZhbHVlIHZhbHVlICovCisgIHZhbHVlIHw9IChwSW5pdC0+RXJyb3JMaW1pdFZhbHVlIDw8IENSU19DRkdSX0ZFTElNX1Bvcyk7CisgIFdSSVRFX1JFRyhDUlMtPkNGR1IsIHZhbHVlKTsKKworICAvKiBBZGp1c3QgSFNJNDggb3NjaWxsYXRvciBzbW9vdGggdHJpbW1pbmcgKi8KKyAgLyogU2V0IHRoZSBUUklNWzU6MF0gYml0cyBhY2NvcmRpbmcgdG8gUkNDX0NSU19IU0k0OENhbGlicmF0aW9uVmFsdWUgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhDUlMtPkNSLCBDUlNfQ1JfVFJJTSwgKHBJbml0LT5IU0k0OENhbGlicmF0aW9uVmFsdWUgPDwgQ1JTX0NSX1RSSU1fUG9zKSk7CisKKyAgLyogU1RBUlQgQVVUT01BVElDIFNZTkNIUk9OSVpBVElPTiovCisKKyAgLyogRW5hYmxlIEF1dG9tYXRpYyB0cmltbWluZyAmIEZyZXF1ZW5jeSBlcnJvciBjb3VudGVyICovCisgIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0FVVE9UUklNRU4gfCBDUlNfQ1JfQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSB0aGUgc29mdHdhcmUgc3luY2hyb25pemF0aW9uIGV2ZW50CisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NFeF9DUlNTb2Z0d2FyZVN5bmNocm9uaXphdGlvbkdlbmVyYXRlKHZvaWQpCit7CisgIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NXU1lOQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHN5bmNocm9uaXphdGlvbiBpbmZvCisgICogQHBhcmFtICBwU3luY2hyb0luZm8gUG9pbnRlciBvbiBSQ0NfQ1JTU3luY2hyb0luZm9UeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfQ1JTR2V0U3luY2hyb25pemF0aW9uSW5mbyhSQ0NfQ1JTU3luY2hyb0luZm9UeXBlRGVmICpwU3luY2hyb0luZm8pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKHBTeW5jaHJvSW5mbyAhPSAodm9pZCAqKU5VTEwpOworCisgIC8qIEdldCB0aGUgcmVsb2FkIHZhbHVlICovCisgIHBTeW5jaHJvSW5mby0+UmVsb2FkVmFsdWUgPSAodWludDMyX3QpKFJFQURfQklUKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfUkVMT0FEKSk7CisKKyAgLyogR2V0IEhTSTQ4IG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nICovCisgIHBTeW5jaHJvSW5mby0+SFNJNDhDYWxpYnJhdGlvblZhbHVlID0gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNSLCBDUlNfQ1JfVFJJTSkgPj4gQ1JTX0NSX1RSSU1fUG9zKTsKKworICAvKiBHZXQgRnJlcXVlbmN5IGVycm9yIGNhcHR1cmUgKi8KKyAgcFN5bmNocm9JbmZvLT5GcmVxRXJyb3JDYXB0dXJlID0gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9GRUNBUCkgPj4gQ1JTX0lTUl9GRUNBUF9Qb3MpOworCisgIC8qIEdldCBGcmVxdWVuY3kgZXJyb3IgZGlyZWN0aW9uICovCisgIHBTeW5jaHJvSW5mby0+RnJlcUVycm9yRGlyZWN0aW9uID0gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9GRURJUikpOworfQorCisvKioKKyogQGJyaWVmIFdhaXQgZm9yIENSUyBTeW5jaHJvbml6YXRpb24gc3RhdHVzLgorKiBAcGFyYW0gVGltZW91dCAgRHVyYXRpb24gb2YgdGhlIHRpbWVvdXQKKyogQG5vdGUgIFRpbWVvdXQgaXMgYmFzZWQgb24gdGhlIG1heGltdW0gdGltZSB0byByZWNlaXZlIGEgU1lOQyBldmVudCBiYXNlZCBvbiBzeW5jaHJvbml6YXRpb24KKyogICAgICAgIGZyZXF1ZW5jeS4KKyogQG5vdGUgICAgSWYgVGltZW91dCBzZXQgdG8gSEFMX01BWF9ERUxBWSwgSEFMX1RJTUVPVVQgd2lsbCBiZSBuZXZlciByZXR1cm5lZC4KKyogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBTeW5jaHJvbml6YXRpb24gc3RhdHVzCisqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1RJTUVPVVQKKyogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19TWU5DT0sKKyogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19TWU5DV0FSTgorKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1NZTkNFUlIKKyogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19TWU5DTUlTUworKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1RSSU1PVkYKKyovCit1aW50MzJfdCBIQUxfUkNDRXhfQ1JTV2FpdFN5bmNocm9uaXphdGlvbih1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCBjcnNzdGF0dXMgPSBSQ0NfQ1JTX05PTkU7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBHZXQgdGltZW91dCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgZm9yIENSUyBmbGFnIG9yIHRpbWVvdXQgZGV0ZWN0aW9uICovCisgIGRvCisgIHsKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgY3Jzc3RhdHVzID0gUkNDX0NSU19USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgICAvKiBDaGVjayBDUlMgU1lOQ09LIGZsYWcgICovCisgICAgaWYoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ09LKSkKKyAgICB7CisgICAgICAvKiBDUlMgU1lOQyBldmVudCBPSyAqLworICAgICAgY3Jzc3RhdHVzIHw9IFJDQ19DUlNfU1lOQ09LOworCisgICAgICAvKiBDbGVhciBDUlMgU1lOQyBldmVudCBPSyBiaXQgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ09LKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBDUlMgU1lOQ1dBUk4gZmxhZyAgKi8KKyAgICBpZihfX0hBTF9SQ0NfQ1JTX0dFVF9GTEFHKFJDQ19DUlNfRkxBR19TWU5DV0FSTikpCisgICAgeworICAgICAgLyogQ1JTIFNZTkMgd2FybmluZyAqLworICAgICAgY3Jzc3RhdHVzIHw9IFJDQ19DUlNfU1lOQ1dBUk47CisKKyAgICAgIC8qIENsZWFyIENSUyBTWU5DV0FSTiBiaXQgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4pOworICAgIH0KKworICAgIC8qIENoZWNrIENSUyBUUklNIG92ZXJmbG93IGZsYWcgICovCisgICAgaWYoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfVFJJTU9WRikpCisgICAgeworICAgICAgLyogQ1JTIFNZTkMgRXJyb3IgKi8KKyAgICAgIGNyc3N0YXR1cyB8PSBSQ0NfQ1JTX1RSSU1PVkY7CisKKyAgICAgIC8qIENsZWFyIENSUyBFcnJvciBiaXQgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfVFJJTU9WRik7CisgICAgfQorCisgICAgLyogQ2hlY2sgQ1JTIEVycm9yIGZsYWcgICovCisgICAgaWYoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ0VSUikpCisgICAgeworICAgICAgLyogQ1JTIFNZTkMgRXJyb3IgKi8KKyAgICAgIGNyc3N0YXR1cyB8PSBSQ0NfQ1JTX1NZTkNFUlI7CisKKyAgICAgIC8qIENsZWFyIENSUyBFcnJvciBiaXQgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ0VSUik7CisgICAgfQorCisgICAgLyogQ2hlY2sgQ1JTIFNZTkMgTWlzc2VkIGZsYWcgICovCisgICAgaWYoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ01JU1MpKQorICAgIHsKKyAgICAgIC8qIENSUyBTWU5DIE1pc3NlZCAqLworICAgICAgY3Jzc3RhdHVzIHw9IFJDQ19DUlNfU1lOQ01JU1M7CisKKyAgICAgIC8qIENsZWFyIENSUyBTWU5DIE1pc3NlZCBiaXQgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ01JU1MpOworICAgIH0KKworICAgIC8qIENoZWNrIENSUyBFeHBlY3RlZCBTWU5DIGZsYWcgICovCisgICAgaWYoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfRVNZTkMpKQorICAgIHsKKyAgICAgIC8qIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyIHJlYWNoZWQgYSB6ZXJvIHZhbHVlICovCisgICAgICBfX0hBTF9SQ0NfQ1JTX0NMRUFSX0ZMQUcoUkNDX0NSU19GTEFHX0VTWU5DKTsKKyAgICB9CisgIH0gd2hpbGUoUkNDX0NSU19OT05FID09IGNyc3N0YXR1cyk7CisKKyAgcmV0dXJuIGNyc3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIEhhbmRsZSB0aGUgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIGludGVycnVwdCByZXF1ZXN0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfQ1JTX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgdWludDMyX3QgY3JzZXJyb3IgPSBSQ0NfQ1JTX05PTkU7CisgIC8qIEdldCBjdXJyZW50IElUIGZsYWdzIGFuZCBJVCBzb3VyY2VzIHZhbHVlcyAqLworICB1aW50MzJfdCBpdGZsYWdzID0gUkVBRF9SRUcoQ1JTLT5JU1IpOworICB1aW50MzJfdCBpdHNvdXJjZXMgPSBSRUFEX1JFRyhDUlMtPkNSKTsKKworICAvKiBDaGVjayBDUlMgU1lOQ09LIGZsYWcgICovCisgIGlmKCgoaXRmbGFncyAmIFJDQ19DUlNfRkxBR19TWU5DT0spICE9IDBVKSAmJiAoKGl0c291cmNlcyAmIFJDQ19DUlNfSVRfU1lOQ09LKSAhPSAwVSkpCisgIHsKKyAgICAvKiBDbGVhciBDUlMgU1lOQyBldmVudCBPSyBmbGFnICovCisgICAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX1NZTkNPS0MpOworCisgICAgLyogdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2soKTsKKyAgfQorICAvKiBDaGVjayBDUlMgU1lOQ1dBUk4gZmxhZyAgKi8KKyAgZWxzZSBpZigoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4pICE9IDBVKSAmJiAoKGl0c291cmNlcyAmIFJDQ19DUlNfSVRfU1lOQ1dBUk4pICE9IDBVKSkKKyAgeworICAgIC8qIENsZWFyIENSUyBTWU5DV0FSTiBmbGFnICovCisgICAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX1NZTkNXQVJOQyk7CisKKyAgICAvKiB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1JDQ0V4X0NSU19TeW5jV2FybkNhbGxiYWNrKCk7CisgIH0KKyAgLyogQ2hlY2sgQ1JTIEV4cGVjdGVkIFNZTkMgZmxhZyAgKi8KKyAgZWxzZSBpZigoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfRVNZTkMpICE9IDBVKSAmJiAoKGl0c291cmNlcyAmIFJDQ19DUlNfSVRfRVNZTkMpICE9IDBVKSkKKyAgeworICAgIC8qIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyIHJlYWNoZWQgYSB6ZXJvIHZhbHVlICovCisgICAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX0VTWU5DQyk7CisKKyAgICAvKiB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1JDQ0V4X0NSU19FeHBlY3RlZFN5bmNDYWxsYmFjaygpOworICB9CisgIC8qIENoZWNrIENSUyBFcnJvciBmbGFncyAgKi8KKyAgZWxzZQorICB7CisgICAgaWYoKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX0VSUikgIT0gMFUpICYmICgoaXRzb3VyY2VzICYgUkNDX0NSU19JVF9FUlIpICE9IDBVKSkKKyAgICB7CisgICAgICBpZigoaXRmbGFncyAmIFJDQ19DUlNfRkxBR19TWU5DRVJSKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgY3JzZXJyb3IgfD0gUkNDX0NSU19TWU5DRVJSOworICAgICAgfQorICAgICAgaWYoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfU1lOQ01JU1MpICE9IDBVKQorICAgICAgeworICAgICAgICBjcnNlcnJvciB8PSBSQ0NfQ1JTX1NZTkNNSVNTOworICAgICAgfQorICAgICAgaWYoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfVFJJTU9WRikgIT0gMFUpCisgICAgICB7CisgICAgICAgIGNyc2Vycm9yIHw9IFJDQ19DUlNfVFJJTU9WRjsKKyAgICAgIH0KKworICAgICAgLyogQ2xlYXIgQ1JTIEVycm9yIGZsYWdzICovCisgICAgICBXUklURV9SRUcoQ1JTLT5JQ1IsIENSU19JQ1JfRVJSQyk7CisKKyAgICAgIC8qIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9SQ0NFeF9DUlNfRXJyb3JDYWxsYmFjayhjcnNlcnJvcik7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUkNDRXggQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIFNZTkNPSyBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICogQHJldHZhbCBub25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUkNDRXhfQ1JTX1N5bmNPa0NhbGxiYWNrKHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUkNDRXggQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIFNZTkNXQVJOIGludGVycnVwdCBjYWxsYmFjay4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SQ0NFeF9DUlNfU3luY1dhcm5DYWxsYmFjayh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgQHJlZiBIQUxfUkNDRXhfQ1JTX1N5bmNXYXJuQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUkNDRXggQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0IGNhbGxiYWNrLgorICAqIEByZXR2YWwgbm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JDQ0V4X0NSU19FeHBlY3RlZFN5bmNDYWxsYmFjayh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgQHJlZiBIQUxfUkNDRXhfQ1JTX0V4cGVjdGVkU3luY0NhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJDQ0V4IENsb2NrIFJlY292ZXJ5IFN5c3RlbSBFcnJvciBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICogQHBhcmFtICBFcnJvciBDb21iaW5hdGlvbiBvZiBFcnJvciBzdGF0dXMuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ0VSUgorICAqICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19TWU5DTUlTUworICAqICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19UUklNT1ZGCisgICogQHJldHZhbCBub25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUkNDRXhfQ1JTX0Vycm9yQ2FsbGJhY2sodWludDMyX3QgRXJyb3IpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKEVycm9yKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgQHJlZiBIQUxfUkNDRXhfQ1JTX0Vycm9yQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBDUlMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUkNDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfcm5nLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9ybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY2ODhkCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfcm5nLmMKQEAgLTAsMCArMSw4NTQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3JuZy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBSTkcgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgICBUaGUgUk5HIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAgKCMpIEVuYWJsZSB0aGUgUk5HIGNvbnRyb2xsZXIgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1JOR19DTEtfRU5BQkxFKCkgbWFjcm8KKyAgICAgICAgICBpbiBIQUxfUk5HX01zcEluaXQoKS4KKyAgICAgICgjKSBBY3RpdmF0ZSB0aGUgUk5HIHBlcmlwaGVyYWwgdXNpbmcgSEFMX1JOR19Jbml0KCkgZnVuY3Rpb24uCisgICAgICAoIykgV2FpdCB1bnRpbCB0aGUgMzIgYml0IFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIGNvbnRhaW5zIGEgdmFsaWQKKyAgICAgICAgICByYW5kb20gZGF0YSB1c2luZyAocG9sbGluZy9pbnRlcnJ1cHQpIG1vZGUuCisgICAgICAoIykgR2V0IHRoZSAzMiBiaXQgcmFuZG9tIG51bWJlciB1c2luZyBIQUxfUk5HX0dlbmVyYXRlUmFuZG9tTnVtYmVyKCkgZnVuY3Rpb24uCisKKyAgICAjIyMjIyBDYWxsYmFjayByZWdpc3RyYXRpb24gIyMjIyMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBbLi5dCisgICAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgICBbLi5dCisgICAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX1JOR19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIEZ1bmN0aW9uIEByZWYgSEFMX1JOR19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBSTkcgRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBSTkcgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFJORyBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1JOR19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCisgICAgQHJlZiBIQUxfUk5HX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBSTkcgRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBSTkcgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFJORyBNc3BEZUluaXQuCisKKyAgICBbLi5dCisgICAgRm9yIHNwZWNpZmljIGNhbGxiYWNrIFJlYWR5RGF0YUNhbGxiYWNrLCB1c2UgZGVkaWNhdGVkIHJlZ2lzdGVyIGNhbGxiYWNrczoKKyAgICByZXNwZWN0aXZlbHkgQHJlZiBIQUxfUk5HX1JlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soKSAsIEByZWYgSEFMX1JOR19VblJlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soKS4KKworICAgIFsuLl0KKyAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfUk5HX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX1JOR19TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZSBAcmVmIEhBTF9STkdfRXJyb3JDYWxsYmFjaygpLgorICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQorICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9STkdfSW5pdCgpCisgICAgYW5kIEByZWYgSEFMX1JOR19EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1JOR19Jbml0KCkgYW5kIEByZWYgSEFMX1JOR19EZUluaXQoKQorICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisKKyAgICBbLi5dCisgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfUk5HX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICBpbiBIQUxfUk5HX1NUQVRFX1JFQURZIG9yIEhBTF9STkdfU1RBVEVfUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikKKyAgICBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgdXNpbmcgQHJlZiBIQUxfUk5HX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9STkdfRGVJbml0KCkKKyAgICBvciBAcmVmIEhBTF9STkdfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChSTkcpCisKKy8qKiBAYWRkdG9ncm91cCBSTkcKKyAgKiBAYnJpZWYgUk5HIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUk5HX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19Qcml2YXRlX0NvbnN0YW50cyBSTkcgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBSTkdfVElNRU9VVF9WQUxVRSAgICAgMlUKKy8qKgorICAqIEB9CisgICovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSTkdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgIEluaXRpYWxpemF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBSTkcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgICAgICAgIGluIHRoZSBSTkdfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUKKyAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIFJORyBwZXJpcGhlcmFsCisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgUk5HIE1TUAorICAgICAgKCspIERlSW5pdGlhbGl6ZSBSTkcgTVNQCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFJORyBwZXJpcGhlcmFsIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfSW5pdChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgLyogQ2hlY2sgdGhlIFJORyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHJuZyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUk5HX0FMTF9JTlNUQU5DRShocm5nLT5JbnN0YW5jZSkpOworCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHJuZy0+U3RhdGUgPT0gSEFMX1JOR19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBocm5nLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgaHJuZy0+UmVhZHlEYXRhQ2FsbGJhY2sgID0gSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIFJlYWR5RGF0YUNhbGxiYWNrICAqLworICAgIGhybmctPkVycm9yQ2FsbGJhY2sgICAgICA9IEhBTF9STkdfRXJyb3JDYWxsYmFjazsgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgKi8KKworICAgIGlmIChocm5nLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBocm5nLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUk5HX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHJuZy0+TXNwSW5pdENhbGxiYWNrKGhybmcpOworICB9CisjZWxzZQorICBpZiAoaHJuZy0+U3RhdGUgPT0gSEFMX1JOR19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBocm5nLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX1JOR19Nc3BJbml0KGhybmcpOworICB9CisjZW5kaWYgLyogVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIFJORyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhybmctPlN0YXRlID0gSEFMX1JOR19TVEFURV9CVVNZOworCisKKyAgLyogRW5hYmxlIHRoZSBSTkcgUGVyaXBoZXJhbCAqLworICBfX0hBTF9STkdfRU5BQkxFKGhybmcpOworCisgIC8qIEluaXRpYWxpemUgdGhlIFJORyBzdGF0ZSAqLworICBocm5nLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfUkVBRFk7CisKKyAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgY29kZSAqLworICBocm5nLT5FcnJvckNvZGUgPSBIQUxfUk5HX0VSUk9SX05PTkU7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFJORyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19EZUluaXQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIC8qIENoZWNrIHRoZSBSTkcgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhybmcgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogRGlzYWJsZSB0aGUgUk5HIFBlcmlwaGVyYWwgKi8KKyAgQ0xFQVJfQklUKGhybmctPkluc3RhbmNlLT5DUiwgUk5HX0NSX0lFIHwgUk5HX0NSX1JOR0VOKTsKKworICAvKiBDbGVhciBSTkcgaW50ZXJydXB0IHN0YXR1cyBmbGFncyAqLworICBDTEVBUl9CSVQoaHJuZy0+SW5zdGFuY2UtPlNSLCBSTkdfU1JfQ0VJUyB8IFJOR19TUl9TRUlTKTsKKworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGhybmctPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBocm5nLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9STkdfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBocm5nLT5Nc3BEZUluaXRDYWxsYmFjayhocm5nKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9STkdfTXNwRGVJbml0KGhybmcpOworI2VuZGlmIC8qIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIFVwZGF0ZSB0aGUgUk5HIHN0YXRlICovCisgIGhybmctPlN0YXRlID0gSEFMX1JOR19TVEFURV9SRVNFVDsKKworICAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciBjb2RlICovCisgIGhybmctPkVycm9yQ29kZSA9IEhBTF9STkdfRVJST1JfTk9ORTsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhybmcpOworCisgIC8qIFJldHVybiB0aGUgZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFJORyBNU1AuCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUk5HX01zcEluaXQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhybmcpOworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfUk5HX01zcEluaXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBSTkcgTVNQLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JOR19Nc3BEZUluaXQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhybmcpOworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfUk5HX01zcERlSW5pdCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgUk5HIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHJuZyBSTkcgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUk5HX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9STkdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9STkdfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX1JlZ2lzdGVyQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIEhBTF9STkdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFJOR19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHJuZy0+RXJyb3JDb2RlIHw9IEhBTF9STkdfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJuZyk7CisKKyAgaWYgKEhBTF9STkdfU1RBVEVfUkVBRFkgPT0gaHJuZy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1JOR19FUlJPUl9DQl9JRCA6CisgICAgICBocm5nLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9STkdfTVNQSU5JVF9DQl9JRCA6CisgICAgICBocm5nLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JOR19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHJuZy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9STkdfU1RBVEVfUkVTRVQgPT0gaHJuZy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1JOR19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGhybmctPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUk5HX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBocm5nLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHJuZy0+RXJyb3JDb2RlIHw9IEhBTF9STkdfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHJuZyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBSTkcgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFJORyBjYWxsYWJjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhybmcgUk5HIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUk5HX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9STkdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9STkdfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19VblJlZ2lzdGVyQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIEhBTF9STkdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJuZyk7CisKKyAgaWYgKEhBTF9STkdfU1RBVEVfUkVBRFkgPT0gaHJuZy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1JOR19FUlJPUl9DQl9JRCA6CisgICAgICBocm5nLT5FcnJvckNhbGxiYWNrID0gSEFMX1JOR19FcnJvckNhbGxiYWNrOyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9STkdfTVNQSU5JVF9DQl9JRCA6CisgICAgICBocm5nLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUk5HX01zcEluaXQ7ICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9STkdfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGhybmctPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1JOR19Nc3BEZUluaXQ7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1JOR19TVEFURV9SRVNFVCA9PSBocm5nLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgY2FzZSBIQUxfUk5HX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHJuZy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1JOR19Nc3BJbml0OyAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUk5HX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBocm5nLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9STkdfTXNwRGVJbml0OyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgaHJuZy0+RXJyb3JDb2RlIHw9IEhBTF9STkdfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocm5nKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBEYXRhIFJlYWR5IFJORyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9STkdfUmVhZHlEYXRhQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocm5nIFJORyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBEYXRhIFJlYWR5IENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX1JlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIHBSTkdfUmVhZHlEYXRhQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhybmcpOworCisgIGlmIChIQUxfUk5HX1NUQVRFX1JFQURZID09IGhybmctPlN0YXRlKQorICB7CisgICAgaHJuZy0+UmVhZHlEYXRhQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHJuZy0+RXJyb3JDb2RlIHw9IEhBTF9STkdfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHJuZyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgRGF0YSBSZWFkeSBSTkcgQ2FsbGJhY2sKKyAgKiAgICAgICAgIERhdGEgUmVhZHkgUk5HIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhybmcgUk5HIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19VblJlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhybmcpOworCisgIGlmIChIQUxfUk5HX1NUQVRFX1JFQURZID09IGhybmctPlN0YXRlKQorICB7CisgICAgaHJuZy0+UmVhZHlEYXRhQ2FsbGJhY2sgPSBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSZWFkeURhdGFDYWxsYmFjayAgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocm5nKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBHZXQgdGhlIDMyIGJpdCBSYW5kb20gbnVtYmVyCisgICAgICAoKykgR2V0IHRoZSAzMiBiaXQgUmFuZG9tIG51bWJlciB3aXRoIGludGVycnVwdCBlbmFibGVkCisgICAgICAoKykgSGFuZGxlIFJORyBpbnRlcnJ1cHQgcmVxdWVzdAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlcyBhIDMyLWJpdCByYW5kb20gbnVtYmVyLgorICAqIEBub3RlICAgRWFjaCB0aW1lIHRoZSByYW5kb20gbnVtYmVyIGRhdGEgaXMgcmVhZCB0aGUgUk5HX0ZMQUdfRFJEWSBmbGFnCisgICogICAgICAgICBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQuCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHBhcmFtICByYW5kb20zMmJpdCBwb2ludGVyIHRvIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHZhcmlhYmxlIGlmIHN1Y2Nlc3NmdWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfR2VuZXJhdGVSYW5kb21OdW1iZXIoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIHVpbnQzMl90ICpyYW5kb20zMmJpdCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OyAgICAKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJuZyk7CisKKyAgLyogQ2hlY2sgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaWYgKGhybmctPlN0YXRlID09IEhBTF9STkdfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2UgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBocm5nLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfQlVTWTsKKworICAgIC8qIEdldCB0aWNrICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIENoZWNrIGlmIGRhdGEgcmVnaXN0ZXIgY29udGFpbnMgdmFsaWQgcmFuZG9tIGRhdGEgKi8KKyAgICB3aGlsZSAoX19IQUxfUk5HX0dFVF9GTEFHKGhybmcsIFJOR19GTEFHX0RSRFkpID09IFJFU0VUKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSTkdfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX1JFQURZOworICAgICAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9USU1FT1VUOworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocm5nKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgYSAzMmJpdCBSYW5kb20gbnVtYmVyICovCisgICAgaHJuZy0+UmFuZG9tTnVtYmVyID0gaHJuZy0+SW5zdGFuY2UtPkRSOworICAgICpyYW5kb20zMmJpdCA9IGhybmctPlJhbmRvbU51bWJlcjsKKworICAgIGhybmctPlN0YXRlID0gSEFMX1JOR19TVEFURV9SRUFEWTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocm5nKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlcyBhIDMyLWJpdCByYW5kb20gbnVtYmVyIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19HZW5lcmF0ZVJhbmRvbU51bWJlcl9JVChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJuZyk7CisKKyAgLyogQ2hlY2sgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaWYgKGhybmctPlN0YXRlID09IEhBTF9STkdfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2UgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBocm5nLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfQlVTWTsKKworICAgIC8qIEVuYWJsZSB0aGUgUk5HIEludGVycnVwdHM6IERhdGEgUmVhZHksIENsb2NrIGVycm9yLCBTZWVkIGVycm9yICovCisgICAgX19IQUxfUk5HX0VOQUJMRV9JVChocm5nKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhybmcpOworCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIGluIHBvbGxpbmcgbW9kZSAoT2Jzb2xldGUpCisgICogICAgICAgICBVc2UgSEFMX1JOR19HZW5lcmF0ZVJhbmRvbU51bWJlcigpIEFQSSBpbnN0ZWFkLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgUmFuZG9tIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfUk5HX0dldFJhbmRvbU51bWJlcihSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgaWYoSEFMX1JOR19HZW5lcmF0ZVJhbmRvbU51bWJlcihocm5nLCAmKGhybmctPlJhbmRvbU51bWJlcikpID09IEhBTF9PSykKKyAgeworICAgIHJldHVybiBocm5nLT5SYW5kb21OdW1iZXI7IAorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiAwVTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgYSAzMi1iaXQgcmFuZG9tIG51bWJlciB3aXRoIGludGVycnVwdCBlbmFibGVkIChPYnNvbGV0ZSksCisgICogICAgICAgICBVc2UgSEFMX1JOR19HZW5lcmF0ZVJhbmRvbU51bWJlcl9JVCgpIEFQSSBpbnN0ZWFkLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgMzItYml0IHJhbmRvbSBudW1iZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9STkdfR2V0UmFuZG9tTnVtYmVyX0lUKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKQoreworICB1aW50MzJfdCByYW5kb20zMmJpdCA9IDBVOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocm5nKTsKKyAgCisgIC8qIENoYW5nZSBSTkcgcGVyaXBoZXJhbCBzdGF0ZSAqLyAgCisgIGhybmctPlN0YXRlID0gSEFMX1JOR19TVEFURV9CVVNZOyAgCisgIAorICAvKiBHZXQgYSAzMmJpdCBSYW5kb20gbnVtYmVyICovIAorICByYW5kb20zMmJpdCA9IGhybmctPkluc3RhbmNlLT5EUjsKKyAgCisgIC8qIEVuYWJsZSB0aGUgUk5HIEludGVycnVwdHM6IERhdGEgUmVhZHksIENsb2NrIGVycm9yLCBTZWVkIGVycm9yICovIAorICBfX0hBTF9STkdfRU5BQkxFX0lUKGhybmcpOyAKKyAgCisgIC8qIFJldHVybiB0aGUgMzIgYml0IHJhbmRvbSBudW1iZXIgKi8gICAKKyAgcmV0dXJuIHJhbmRvbTMyYml0OworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZXMgUk5HIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBub3RlICAgSW4gdGhlIGNhc2Ugb2YgYSBjbG9jayBlcnJvciwgdGhlIFJORyBpcyBubyBtb3JlIGFibGUgdG8gZ2VuZXJhdGUKKyAgKiAgICAgICAgIHJhbmRvbSBudW1iZXJzIGJlY2F1c2UgdGhlIFBMTDQ4Q0xLIGNsb2NrIGlzIG5vdCBjb3JyZWN0LiBVc2VyIGhhcworICAqICAgICAgICAgdG8gY2hlY2sgdGhhdCB0aGUgY2xvY2sgY29udHJvbGxlciBpcyBjb3JyZWN0bHkgY29uZmlndXJlZCB0byBwcm92aWRlCisgICogICAgICAgICB0aGUgUk5HIGNsb2NrIGFuZCBjbGVhciB0aGUgQ0VJUyBiaXQgdXNpbmcgX19IQUxfUk5HX0NMRUFSX0lUKCkuCisgICogICAgICAgICBUaGUgY2xvY2sgZXJyb3IgaGFzIG5vIGltcGFjdCBvbiB0aGUgcHJldmlvdXNseSBnZW5lcmF0ZWQKKyAgKiAgICAgICAgIHJhbmRvbSBudW1iZXJzLCBhbmQgdGhlIFJOR19EUiByZWdpc3RlciBjb250ZW50cyBjYW4gYmUgdXNlZC4KKyAgKiBAbm90ZSAgIEluIHRoZSBjYXNlIG9mIGEgc2VlZCBlcnJvciwgdGhlIGdlbmVyYXRpb24gb2YgcmFuZG9tIG51bWJlcnMgaXMKKyAgKiAgICAgICAgIGludGVycnVwdGVkIGFzIGxvbmcgYXMgdGhlIFNFQ1MgYml0IGlzICcxJy4gSWYgYSBudW1iZXIgaXMKKyAgKiAgICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgUk5HX0RSIHJlZ2lzdGVyLCBpdCBtdXN0IG5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgbWF5CisgICogICAgICAgICBub3QgaGF2ZSBlbm91Z2ggZW50cm9weS4gSW4gdGhpcyBjYXNlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBjbGVhciB0aGUKKyAgKiAgICAgICAgIFNFSVMgYml0IHVzaW5nIF9fSEFMX1JOR19DTEVBUl9JVCgpLCB0aGVuIGRpc2FibGUgYW5kIGVuYWJsZQorICAqICAgICAgICAgdGhlIFJORyBwZXJpcGhlcmFsIHRvIHJlaW5pdGlhbGl6ZSBhbmQgcmVzdGFydCB0aGUgUk5HLgorICAqIEBub3RlICAgVXNlci13cml0dGVuIEhBTF9STkdfRXJyb3JDYWxsYmFjaygpIEFQSSBpcyBjYWxsZWQgb25jZSB3aGV0aGVyIFNFSVMKKyAgKiAgICAgICAgIG9yIENFSVMgYXJlIHNldC4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcmV0dmFsIE5vbmUKKworICAqLwordm9pZCBIQUxfUk5HX0lSUUhhbmRsZXIoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIHVpbnQzMl90IHJuZ2Nsb2NrZXJyb3IgPSAwVTsKKyAgCisgIC8qIFJORyBjbG9jayBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1JOR19HRVRfSVQoaHJuZywgUk5HX0lUX0NFSSkgIT0gUkVTRVQpCisgIHsKKyAgICBybmdjbG9ja2Vycm9yID0gMVU7CisgIH0KKyAgZWxzZSBpZiAoX19IQUxfUk5HX0dFVF9JVChocm5nLCBSTkdfSVRfU0VJKSAhPSBSRVNFVCkKKyAgeworICAgIHJuZ2Nsb2NrZXJyb3IgPSAxVTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKyAgCisgIGlmIChybmdjbG9ja2Vycm9yID09IDFVKSAgICAKKyAgeyAKKyAgICAvKiBDaGFuZ2UgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBocm5nLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfRVJST1I7CisKKyNpZiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEVycm9yIGNhbGxiYWNrICovCisgICAgaHJuZy0+RXJyb3JDYWxsYmFjayhocm5nKTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBFcnJvciBjYWxsYmFjayAqLworICAgIEhBTF9STkdfRXJyb3JDYWxsYmFjayhocm5nKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIC8qIENsZWFyIHRoZSBjbG9jayBlcnJvciBmbGFnICovCisgICAgX19IQUxfUk5HX0NMRUFSX0lUKGhybmcsIFJOR19JVF9DRUkgfCBSTkdfSVRfU0VJKTsKKyAgfQorCisgIC8qIENoZWNrIFJORyBkYXRhIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfUk5HX0dFVF9JVChocm5nLCBSTkdfSVRfRFJEWSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBHZW5lcmF0ZSByYW5kb20gbnVtYmVyIG9uY2UsIHNvIGRpc2FibGUgdGhlIElUICovCisgICAgX19IQUxfUk5HX0RJU0FCTEVfSVQoaHJuZyk7CisKKyAgICAvKiBHZXQgdGhlIDMyYml0IFJhbmRvbSBudW1iZXIgKERSRFkgZmxhZyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQpICovCisgICAgaHJuZy0+UmFuZG9tTnVtYmVyID0gaHJuZy0+SW5zdGFuY2UtPkRSOworCisgICAgaWYgKGhybmctPlN0YXRlICE9IEhBTF9STkdfU1RBVEVfRVJST1IpCisgICAgeworICAgICAgLyogQ2hhbmdlIFJORyBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgICBocm5nLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfUkVBRFk7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHJuZyk7CisgICAgICAKKyNpZiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgRGF0YSBSZWFkeSBjYWxsYmFjayAqLworICAgICAgaHJuZy0+UmVhZHlEYXRhQ2FsbGJhY2soaHJuZywgaHJuZy0+UmFuZG9tTnVtYmVyKTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIERhdGEgUmVhZHkgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9STkdfUmVhZHlEYXRhQ2FsbGJhY2soaHJuZywgaHJuZy0+UmFuZG9tTnVtYmVyKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIGxhdGVzdCBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlci4gCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHJldHZhbCByYW5kb20gdmFsdWUKKyAgKi8KK3VpbnQzMl90IEhBTF9STkdfUmVhZExhc3RSYW5kb21OdW1iZXIoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIHJldHVybiAoaHJuZy0+UmFuZG9tTnVtYmVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBEYXRhIFJlYWR5IGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEBwYXJhbSAgcmFuZG9tMzJiaXQgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCB1aW50MzJfdCByYW5kb20zMmJpdCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJuZyk7CisgIFVOVVNFRChyYW5kb20zMmJpdCk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9STkdfUmVhZHlEYXRhQ2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSTkcgZXJyb3IgY2FsbGJhY2tzLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JOR19FcnJvckNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocm5nKTsKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX1JOR19FcnJvckNhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAYWRkdG9ncm91cCBSTkdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbAorICAgIGFuZCB0aGUgZGF0YSBmbG93LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIFJORyBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1JOR19TdGF0ZVR5cGVEZWYgSEFMX1JOR19HZXRTdGF0ZShSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgcmV0dXJuIGhybmctPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgUk5HIGhhbmRsZSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHJuZzogcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIFJORyBFcnJvciBDb2RlCisqLwordWludDMyX3QgSEFMX1JOR19HZXRFcnJvcihSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgLyogUmV0dXJuIFJORyBFcnJvciBDb2RlICovCisgIHJldHVybiBocm5nLT5FcnJvckNvZGU7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKyNlbmRpZiAvKiBIQUxfUk5HX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogUk5HICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9ydGMuYyBiL1NyYy9zdG0zMmwweHhfaGFsX3J0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NGE2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9ydGMuYwpAQCAtMCwwICsxLDE4NDMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3J0Yy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBSVEMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUmVhbC1UaW1lIENsb2NrIChSVEMpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBDYWxlbmRhciAoVGltZSBhbmQgRGF0ZSkgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIEFsYXJtcyAoQWxhcm0gQSBhbmQgQWxhcm0gQikgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFdha2VVcCBUaW1lciBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVGltZVN0YW1wIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUYW1wZXJzIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBCYWNrdXAgRGF0YSBSZWdpc3RlcnMgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFJUQyBUYW1wZXIgYW5kIFRpbWVTdGFtcCBQaW5zIFNlbGVjdGlvbgorICAqICAgICAgICAgICArIEludGVycnVwdHMgYW5kIGZsYWdzIG1hbmFnZW1lbnQKKyAgKgorICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJUQyBPcGVyYXRpbmcgQ29uZGl0aW9uICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIFRoZSByZWFsLXRpbWUgY2xvY2sgKFJUQykgYW5kIHRoZSBSVEMgYmFja3VwIHJlZ2lzdGVycyBjYW4gYmUgcG93ZXJlZAorICAgICAgIGZyb20gdGhlIFZCQVQgdm9sdGFnZSB3aGVuIHRoZSBtYWluIFZERCBzdXBwbHkgaXMgcG93ZXJlZCBvZmYuCisgICAgICAgVG8gcmV0YWluIHRoZSBjb250ZW50IG9mIHRoZSBSVEMgYmFja3VwIHJlZ2lzdGVycyBhbmQgc3VwcGx5IHRoZSBSVEMKKyAgICAgICB3aGVuIFZERCBpcyB0dXJuZWQgb2ZmLCBWQkFUIHBpbiBjYW4gYmUgY29ubmVjdGVkIHRvIGFuIG9wdGlvbmFsCisgICAgICAgc3RhbmRieSB2b2x0YWdlIHN1cHBsaWVkIGJ5IGEgYmF0dGVyeSBvciBieSBhbm90aGVyIHNvdXJjZS4KKworICAgICAgICAgICAgICAgICAgICMjIyMjIEJhY2t1cCBEb21haW4gUmVzZXQgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhlIGJhY2t1cCBkb21haW4gcmVzZXQgc2V0cyBhbGwgUlRDIHJlZ2lzdGVycyBhbmQgdGhlIFJDQ19CRENSIHJlZ2lzdGVyCisgICAgICAgdG8gdGhlaXIgcmVzZXQgdmFsdWVzLgorICAgICAgIEEgYmFja3VwIGRvbWFpbiByZXNldCBpcyBnZW5lcmF0ZWQgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBldmVudHMgb2NjdXJzOgorICAgICgrKSBTb2Z0d2FyZSByZXNldCwgdHJpZ2dlcmVkIGJ5IHNldHRpbmcgdGhlIEJEUlNUIGJpdCBpbiB0aGUKKyAgICAgICAgUkNDIEJhY2t1cCBkb21haW4gY29udHJvbCByZWdpc3RlciAoUkNDX0JEQ1IpLgorICAgICgrKSBWREQgb3IgVkJBVCBwb3dlciBvbiwgaWYgYm90aCBzdXBwbGllcyBoYXZlIHByZXZpb3VzbHkgYmVlbiBwb3dlcmVkIG9mZi4KKyAgICAoKykgVGFtcGVyIGRldGVjdGlvbiBldmVudCByZXNldHMgYWxsIGRhdGEgYmFja3VwIHJlZ2lzdGVycy4KKworICAgICAgICAgICAgICAgICAgICMjIyMjIEJhY2t1cCBEb21haW4gQWNjZXNzICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIEFmdGVyIHJlc2V0LCB0aGUgYmFja3VwIGRvbWFpbiAoUlRDIHJlZ2lzdGVycywgUlRDIGJhY2t1cCBkYXRhCisgICAgICAgcmVnaXN0ZXJzIGFuZCBiYWNrdXAgU1JBTSkgaXMgcHJvdGVjdGVkIGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgd3JpdGUKKyAgICAgICBhY2Nlc3Nlcy4KKworICBbLi5dIFRvIGVuYWJsZSBhY2Nlc3MgdG8gdGhlIFJUQyBEb21haW4gYW5kIFJUQyByZWdpc3RlcnMsIHByb2NlZWQgYXMgZm9sbG93czoKKyAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZyB3aXRoIFJDQ19QRVJJUEhDTEtfUlRDIGZvcgorICAgICAgICBQZXJpcGhDbG9ja1NlbGVjdGlvbiBhbmQgc2VsZWN0IFJUQ0Nsb2NrU2VsZWN0aW9uIChMU0UsIExTSSBvciBIU0VkaXYzMikKKyAgICAoKykgRW5hYmxlIFJUQyBDbG9jayB1c2luZyB0aGUgX19IQUxfUkNDX1JUQ19FTkFCTEUoKSBtYWNyby4KKworICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSBSVEMgRHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIEVuYWJsZSB0aGUgUlRDIGRvbWFpbiBhY2Nlc3MgKHNlZSBkZXNjcmlwdGlvbiBpbiB0aGUgc2VjdGlvbiBhYm92ZSkuCisgICAgKCspIENvbmZpZ3VyZSB0aGUgUlRDIFByZXNjYWxlciAoQXN5bmNocm9ub3VzIGFuZCBTeW5jaHJvbm91cykgYW5kIFJUQyBob3VyCisgICAgICAgIGZvcm1hdCB1c2luZyB0aGUgSEFMX1JUQ19Jbml0KCkgZnVuY3Rpb24uCisKKyAgKioqIFRpbWUgYW5kIERhdGUgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBUbyBjb25maWd1cmUgdGhlIFJUQyBDYWxlbmRhciAoVGltZSBhbmQgRGF0ZSkgdXNlIHRoZSBIQUxfUlRDX1NldFRpbWUoKQorICAgICAgICBhbmQgSEFMX1JUQ19TZXREYXRlKCkgZnVuY3Rpb25zLgorICAgICgrKSBUbyByZWFkIHRoZSBSVEMgQ2FsZW5kYXIsIHVzZSB0aGUgSEFMX1JUQ19HZXRUaW1lKCkgYW5kIEhBTF9SVENfR2V0RGF0ZSgpIGZ1bmN0aW9ucy4KKworICAqKiogQWxhcm0gY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgVG8gY29uZmlndXJlIHRoZSBSVEMgQWxhcm0gdXNlIHRoZSBIQUxfUlRDX1NldEFsYXJtKCkgZnVuY3Rpb24uCisgICAgICAgICAgICBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBSVEMgQWxhcm0gd2l0aCBpbnRlcnJ1cHQgbW9kZSB1c2luZyB0aGUKKyAgICAgICAgICAgIEhBTF9SVENfU2V0QWxhcm1fSVQoKSBmdW5jdGlvbi4KKyAgICAoKykgVG8gcmVhZCB0aGUgUlRDIEFsYXJtLCB1c2UgdGhlIEhBTF9SVENfR2V0QWxhcm0oKSBmdW5jdGlvbi4KKworICAgICAgICAgICAgICAgICAgIyMjIyMgUlRDIGFuZCBsb3cgcG93ZXIgbW9kZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhlIE1DVSBjYW4gYmUgd29rZW4gdXAgZnJvbSBhIGxvdyBwb3dlciBtb2RlIGJ5IGFuIFJUQyBhbHRlcm5hdGUKKyAgICAgICBmdW5jdGlvbi4KKyAgWy4uXSBUaGUgUlRDIGFsdGVybmF0ZSBmdW5jdGlvbnMgYXJlIHRoZSBSVEMgYWxhcm1zIChBbGFybSBBIGFuZCBBbGFybSBCKSwKKyAgICAgICBSVEMgd2FrZXVwLCBSVEMgdGFtcGVyIGV2ZW50IGRldGVjdGlvbiBhbmQgUlRDIHRpbWUgc3RhbXAgZXZlbnQgZGV0ZWN0aW9uLgorICAgICAgIFRoZXNlIFJUQyBhbHRlcm5hdGUgZnVuY3Rpb25zIGNhbiB3YWtlIHVwIHRoZSBzeXN0ZW0gZnJvbSB0aGUgU3RvcCBhbmQKKyAgICAgICBTdGFuZGJ5IGxvdyBwb3dlciBtb2Rlcy4KKyAgWy4uXSBUaGUgc3lzdGVtIGNhbiBhbHNvIHdha2UgdXAgZnJvbSBsb3cgcG93ZXIgbW9kZXMgd2l0aG91dCBkZXBlbmRpbmcKKyAgICAgICBvbiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgKEF1dG8td2FrZXVwIG1vZGUpLCBieSB1c2luZyB0aGUgUlRDIGFsYXJtCisgICAgICAgb3IgdGhlIFJUQyB3YWtldXAgZXZlbnRzLgorICBbLi5dIFRoZSBSVEMgcHJvdmlkZXMgYSBwcm9ncmFtbWFibGUgdGltZSBiYXNlIGZvciB3YWtpbmcgdXAgZnJvbSB0aGUKKyAgICAgICBTdG9wIG9yIFN0YW5kYnkgbW9kZSBhdCByZWd1bGFyIGludGVydmFscy4KKyAgICAgICBXYWtldXAgZnJvbSBTVE9QIGFuZCBTVEFOREJZIG1vZGVzIGlzIHBvc3NpYmxlIG9ubHkgd2hlbiB0aGUgUlRDIGNsb2NrIHNvdXJjZQorICAgICAgIGlzIExTRSBvciBMU0kuCisKKyAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSAgVVNFX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICBVc2UgRnVuY3Rpb24gQHJlZiBIQUxfUlRDX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisKKyAgRnVuY3Rpb24gQHJlZiBIQUxfUlRDX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgQWxhcm1BRXZlbnRDYWxsYmFjayAgICAgICAgICA6IFJUQyBBbGFybSBBIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBBbGFybUJFdmVudENhbGxiYWNrICAgICAgICAgIDogUlRDIEFsYXJtIEIgRXZlbnQgY2FsbGJhY2suCisgICAgKCspIFRpbWVTdGFtcEV2ZW50Q2FsbGJhY2sgICAgICAgOiBSVEMgVGltZVN0YW1wIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBXYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2sgICAgIDogUlRDIFdha2VVcFRpbWVyIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUYW1wZXIxRXZlbnRDYWxsYmFjayAgICAgICAgIDogUlRDIFRhbXBlciAxIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUYW1wZXIyRXZlbnRDYWxsYmFjayAgICAgICAgIDogUlRDIFRhbXBlciAyIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUYW1wZXIzRXZlbnRDYWxsYmFjayAgICAgICAgIDogUlRDIFRhbXBlciAzIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogUlRDIE1zcEluaXQgY2FsbGJhY2suCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgOiBSVEMgTXNwRGVJbml0IGNhbGxiYWNrLgorICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1JUQ19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgIHdlYWsgZnVuY3Rpb24uCisgIEByZWYgSEFMX1JUQ19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEFsYXJtQUV2ZW50Q2FsbGJhY2sgICAgICAgICAgOiBSVEMgQWxhcm0gQSBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgQWxhcm1CRXZlbnRDYWxsYmFjayAgICAgICAgICA6IFJUQyBBbGFybSBCIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUaW1lU3RhbXBFdmVudENhbGxiYWNrICAgICAgIDogUlRDIFRpbWVTdGFtcCBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgV2FrZVVwVGltZXJFdmVudENhbGxiYWNrICAgICA6IFJUQyBXYWtlVXBUaW1lciBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgVGFtcGVyMUV2ZW50Q2FsbGJhY2sgICAgICAgICA6IFJUQyBUYW1wZXIgMSBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgVGFtcGVyMkV2ZW50Q2FsbGJhY2sgICAgICAgICA6IFJUQyBUYW1wZXIgMiBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgVGFtcGVyM0V2ZW50Q2FsbGJhY2sgICAgICAgICA6IFJUQyBUYW1wZXIgMyBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICA6IFJUQyBNc3BJbml0IGNhbGxiYWNrLgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgIDogUlRDIE1zcERlSW5pdCBjYWxsYmFjay4KKworICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfUlRDX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX1JUQ19TVEFURV9SRVNFVCwKKyAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zIDoKKyAgZXhhbXBsZXMgQHJlZiBBbGFybUFFdmVudENhbGxiYWNrKCksIEByZWYgV2FrZVVwVGltZXJFdmVudENhbGxiYWNrKCkuCisgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgY2FsbGJhY2tzIHRoYXQgYXJlIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbgorICBpbiB0aGUgQHJlZiBIQUxfUlRDX0luaXQoKS9AcmVmIEhBTF9SVENfRGVJbml0KCkgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbAorICAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCBAcmVmIEhBTF9SVENfSW5pdCgpL0ByZWYgSEFMX1JUQ19EZUluaXQoKQorICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCisKKyAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfUlRDX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgIGluIEhBTF9SVENfU1RBVEVfUkVBRFkgb3IgSEFMX1JUQ19TVEFURV9SRVNFVCBzdGF0ZSwKKyAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICB1c2luZyBAcmVmIEhBTF9SVENfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1JUQ19EZUluaXQoKQorICBvciBAcmVmIEhBTF9SVENfSW5pdCgpIGZ1bmN0aW9uLgorCisgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwgY2FsbGJhY2tzCisgIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCisKKyAgIEBlbmR2ZXJiYXRpbQorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIFJUQworICAqIEBicmllZiBSVEMgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlCisgICAgICAgICBSVEMgUHJlc2NhbGVyIChTeW5jaHJvbm91cyBhbmQgQXN5bmNocm9ub3VzKSwgUlRDIEhvdXIgZm9ybWF0LCBkaXNhYmxlCisgICAgICAgICBSVEMgcmVnaXN0ZXJzIFdyaXRlIHByb3RlY3Rpb24sIGVudGVyIGFuZCBleGl0IHRoZSBSVEMgaW5pdGlhbGl6YXRpb24gbW9kZSwKKyAgICAgICAgIFJUQyByZWdpc3RlcnMgc3luY2hyb25pemF0aW9uIGNoZWNrIGFuZCByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uIGVuYWJsZS4KKyAgICAgICAgICgjKSBUaGUgUlRDIFByZXNjYWxlciBpcyBwcm9ncmFtbWVkIHRvIGdlbmVyYXRlIHRoZSBSVEMgMUh6IHRpbWUgYmFzZS4KKyAgICAgICAgICAgICBJdCBpcyBzcGxpdCBpbnRvIDIgcHJvZ3JhbW1hYmxlIHByZXNjYWxlcnMgdG8gbWluaW1pemUgcG93ZXIgY29uc3VtcHRpb24uCisgICAgICAgICAgICAgKCsrKSBBIDctYml0IGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgYW5kIGEgMTUtYml0IHN5bmNocm9ub3VzIHByZXNjYWxlci4KKyAgICAgICAgICAgICAoKyspIFdoZW4gYm90aCBwcmVzY2FsZXJzIGFyZSB1c2VkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBjb25maWd1cmUgdGhlCisgICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgdG8gYSBoaWdoIHZhbHVlIHRvIG1pbmltaXplIHBvd2VyIGNvbnN1bXB0aW9uLgorICAgICAgICAgKCMpIEFsbCBSVEMgcmVnaXN0ZXJzIGFyZSBXcml0ZSBwcm90ZWN0ZWQuIFdyaXRpbmcgdG8gdGhlIFJUQyByZWdpc3RlcnMKKyAgICAgICAgICAgICBpcyBlbmFibGVkIGJ5IHdyaXRpbmcgYSBrZXkgaW50byB0aGUgV3JpdGUgUHJvdGVjdGlvbiByZWdpc3RlciwgUlRDX1dQUi4KKyAgICAgICAgICgjKSBUbyBjb25maWd1cmUgdGhlIFJUQyBDYWxlbmRhciwgdXNlciBhcHBsaWNhdGlvbiBzaG91bGQgZW50ZXIKKyAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBtb2RlLiBJbiB0aGlzIG1vZGUsIHRoZSBjYWxlbmRhciBjb3VudGVyIGlzIHN0b3BwZWQKKyAgICAgICAgICAgICBhbmQgaXRzIHZhbHVlIGNhbiBiZSB1cGRhdGVkLiBXaGVuIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBpcworICAgICAgICAgICAgIGNvbXBsZXRlLCB0aGUgY2FsZW5kYXIgcmVzdGFydHMgY291bnRpbmcgYWZ0ZXIgNCBSVENDTEsgY3ljbGVzLgorICAgICAgICAgKCMpIFRvIHJlYWQgdGhlIGNhbGVuZGFyIHRocm91Z2ggdGhlIHNoYWRvdyByZWdpc3RlcnMgYWZ0ZXIgQ2FsZW5kYXIKKyAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiwgY2FsZW5kYXIgdXBkYXRlIG9yIGFmdGVyIHdha2V1cCBmcm9tIGxvdyBwb3dlciBtb2RlcworICAgICAgICAgICAgIHRoZSBzb2Z0d2FyZSBtdXN0IGZpcnN0IGNsZWFyIHRoZSBSU0YgZmxhZy4gVGhlIHNvZnR3YXJlIG11c3QgdGhlbgorICAgICAgICAgICAgIHdhaXQgdW50aWwgaXQgaXMgc2V0IGFnYWluIGJlZm9yZSByZWFkaW5nIHRoZSBjYWxlbmRhciwgd2hpY2ggbWVhbnMKKyAgICAgICAgICAgICB0aGF0IHRoZSBjYWxlbmRhciByZWdpc3RlcnMgaGF2ZSBiZWVuIGNvcnJlY3RseSBjb3BpZWQgaW50byB0aGUKKyAgICAgICAgICAgICBSVENfVFIgYW5kIFJUQ19EUiBzaGFkb3cgcmVnaXN0ZXJzLlRoZSBIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKCkgZnVuY3Rpb24KKyAgICAgICAgICAgICBpbXBsZW1lbnRzIHRoZSBhYm92ZSBzb2Z0d2FyZSBzZXF1ZW5jZSAoUlNGIGNsZWFyIGFuZCBSU0YgY2hlY2spLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFJUQyBwZXJpcGhlcmFsCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfSW5pdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogQ2hlY2sgdGhlIFJUQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGlmIChocnRjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoaHJ0Yy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSX0ZPUk1BVChocnRjLT5Jbml0LkhvdXJGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BU1lOQ0hfUFJFRElWKGhydGMtPkluaXQuQXN5bmNoUHJlZGl2KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfU1lOQ0hfUFJFRElWKGhydGMtPkluaXQuU3luY2hQcmVkaXYpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19PVVRQVVQoaHJ0Yy0+SW5pdC5PdXRQdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19PVVRQVVRfUkVNQVAoaHJ0Yy0+SW5pdC5PdXRQdXRSZW1hcCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX09VVFBVVF9QT0woaHJ0Yy0+SW5pdC5PdXRQdXRQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX09VVFBVVF9UWVBFKGhydGMtPkluaXQuT3V0UHV0VHlwZSkpOworCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHJ0Yy0+U3RhdGUgPT0gSEFMX1JUQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBocnRjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgaHJ0Yy0+QWxhcm1BRXZlbnRDYWxsYmFjayAgICAgICAgICA9ICBIQUxfUlRDX0FsYXJtQUV2ZW50Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBBbGFybUFFdmVudENhbGxiYWNrICAgICAgKi8KKyAgICBocnRjLT5BbGFybUJFdmVudENhbGxiYWNrICAgICAgICAgID0gIEhBTF9SVENFeF9BbGFybUJFdmVudENhbGxiYWNrOyAgICAgIC8qIExlZ2FjeSB3ZWFrIEFsYXJtQkV2ZW50Q2FsbGJhY2sgICAgICAqLworICAgIGhydGMtPlRpbWVTdGFtcEV2ZW50Q2FsbGJhY2sgICAgICAgPSAgSEFMX1JUQ0V4X1RpbWVTdGFtcEV2ZW50Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgVGltZVN0YW1wRXZlbnRDYWxsYmFjayAgICovCisgICAgaHJ0Yy0+V2FrZVVwVGltZXJFdmVudENhbGxiYWNrICAgICA9ICBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBXYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2sgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisgICAgaHJ0Yy0+VGFtcGVyMUV2ZW50Q2FsbGJhY2sgICAgICAgICA9ICBIQUxfUlRDRXhfVGFtcGVyMUV2ZW50Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBUYW1wZXIxRXZlbnRDYWxsYmFjayAgICAgKi8KKyNlbmRpZgorICAgIGhydGMtPlRhbXBlcjJFdmVudENhbGxiYWNrICAgICAgICAgPSAgSEFMX1JUQ0V4X1RhbXBlcjJFdmVudENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgVGFtcGVyMkV2ZW50Q2FsbGJhY2sgICAgICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorICAgIGhydGMtPlRhbXBlcjNFdmVudENhbGxiYWNrICAgICAgICAgPSAgSEFMX1JUQ0V4X1RhbXBlcjNFdmVudENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgVGFtcGVyM0V2ZW50Q2FsbGJhY2sgICAgICovCisjZW5kaWYKKworICAgIGlmIChocnRjLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBocnRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUlRDX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGhydGMtPk1zcEluaXRDYWxsYmFjayhocnRjKTsKKworICAgIGlmIChocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhydGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1JUQ19Nc3BEZUluaXQ7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoaHJ0Yy0+U3RhdGUgPT0gSEFMX1JUQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBocnRjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdGlhbGl6ZSBSVEMgTVNQICovCisgICAgSEFMX1JUQ19Nc3BJbml0KGhydGMpOworICB9CisjZW5kaWYgLyogKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKworICAvKiBTZXQgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmIChSVENfRW50ZXJJbml0TW9kZShocnRjKSAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgIC8qIFNldCBSVEMgc3RhdGUgKi8KKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJUQ19DUiBGTVQsIE9TRUwgYW5kIFBPTCBCaXRzICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkNSICY9ICgodWludDMyX3QpfihSVENfQ1JfRk1UIHwgUlRDX0NSX09TRUwgfCBSVENfQ1JfUE9MKSk7CisgICAgLyogU2V0IFJUQ19DUiByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpKGhydGMtPkluaXQuSG91ckZvcm1hdCB8IGhydGMtPkluaXQuT3V0UHV0IHwgaHJ0Yy0+SW5pdC5PdXRQdXRQb2xhcml0eSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFJUQyBQUkVSICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPlBSRVIgPSAodWludDMyX3QpKGhydGMtPkluaXQuU3luY2hQcmVkaXYpOworICAgIGhydGMtPkluc3RhbmNlLT5QUkVSIHw9ICh1aW50MzJfdCkoaHJ0Yy0+SW5pdC5Bc3luY2hQcmVkaXYgPDwgMTZVKTsKKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKCh1aW50MzJfdCl+UlRDX0lTUl9JTklUKTsKKworICAgIGhydGMtPkluc3RhbmNlLT5PUiAmPSAodWludDMyX3QpfihSVENfT1JfQUxBUk1PVVRUWVBFIHwgUlRDX09SX09VVF9STVApOworICAgIGhydGMtPkluc3RhbmNlLT5PUiB8PSAodWludDMyX3QpKGhydGMtPkluaXQuT3V0UHV0VHlwZSB8IGhydGMtPkluaXQuT3V0UHV0UmVtYXApOworCisgICAgLyogSWYgQ1JfQllQU0hBRCBiaXQgPSAwLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYgKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfQllQU0hBRCkgPT0gMFUpCisgICAgeworICAgICAgaWYgKEhBTF9SVENfV2FpdEZvclN5bmNocm8oaHJ0YykgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAvKiBTZXQgUlRDIHN0YXRlICovCisgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgUlRDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZXNldCB0aGUgUlRDIEJhY2t1cCBEYXRhIHJlZ2lzdGVycy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfRGVJbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoaHJ0Yy0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmIChSVENfRW50ZXJJbml0TW9kZShocnRjKSAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgIC8qIFNldCBSVEMgc3RhdGUgKi8KKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFRSLCBEUiBhbmQgQ1IgcmVnaXN0ZXJzICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPlRSID0gKHVpbnQzMl90KTB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5EUiA9ICgodWludDMyX3QpKFJUQ19EUl9XRFVfMCB8IFJUQ19EUl9NVV8wIHwgUlRDX0RSX0RVXzApKTsKKyAgICAvKiBSZXNldCBBbGwgQ1IgYml0cyBleGNlcHQgQ1JbMjowXSAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiAmPSBSVENfQ1JfV1VDS1NFTDsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBXYWl0IHRpbGwgV1VUV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlICgoKGhydGMtPkluc3RhbmNlLT5JU1IpICYgUlRDX0lTUl9XVVRXRikgPT0gMFUpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgLyogU2V0IFJUQyBzdGF0ZSAqLworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogUmVzZXQgYWxsIFJUQyBDUiByZWdpc3RlciBiaXRzICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCkweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+V1VUUiA9IFJUQ19XVVRSX1dVVDsKKyAgICBocnRjLT5JbnN0YW5jZS0+UFJFUiA9ICgodWludDMyX3QpKFJUQ19QUkVSX1BSRURJVl9BIHwgMHgwMDAwMDBGRlUpKTsKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFSID0gKHVpbnQzMl90KTB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlIgPSAodWludDMyX3QpMHgwMDAwMDAwMFU7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPlNISUZUUiA9ICh1aW50MzJfdCkweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+Q0FMUiA9ICh1aW50MzJfdCkweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFTU1IgPSAodWludDMyX3QpMHgwMDAwMDAwMFU7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1CU1NSID0gKHVpbnQzMl90KTB4MDAwMDAwMDBVOworCisgICAgLyogUmVzZXQgSVNSIHJlZ2lzdGVyIGFuZCBleGl0IGluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+SVNSID0gKHVpbnQzMl90KTB4MDAwMDAwMDBVOworCisgICAgLyogUmVzZXQgVGFtcGVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+VEFNUENSID0gMHgwMDAwMDAwMFU7CisKKyAgICAvKiBSZXNldCBPcHRpb24gcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+T1IgPSAweDAwMDAwMDAwVTsKKworICAgIC8qIElmICBSVENfQ1JfQllQU0hBRCBiaXQgPSAwLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYgKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfQllQU0hBRCkgPT0gMFUpCisgICAgeworICAgICAgaWYgKEhBTF9SVENfV2FpdEZvclN5bmNocm8oaHJ0YykgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHJ0Yy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGhydGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1JUQ19Nc3BEZUluaXQ7CisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMuKi8KKyAgaHJ0Yy0+TXNwRGVJbml0Q2FsbGJhY2soaHJ0Yyk7CisKKyNlbHNlCisgIC8qIERlLUluaXRpYWxpemUgUlRDIE1TUCAqLworICBIQUxfUlRDX01zcERlSW5pdChocnRjKTsKKyNlbmRpZiAvKiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKyNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBSVEMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfQUxBUk1fQV9FVkVOVF9DQl9JRCAgICAgICAgICBBbGFybSBBIEV2ZW50IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfQUxBUk1fQl9FVkVOVF9DQl9JRCAgICAgICAgICBBbGFybSBCIEV2ZW50IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfVElNRVNUQU1QX0VWRU5UX0NCX0lEICAgICAgICBUaW1lU3RhbXAgRXZlbnQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19XQUtFVVBUSU1FUl9FVkVOVF9DQl9JRCAgICAgIFdha2VVcCBUaW1lciBFdmVudCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX1RBTVBFUjFfRVZFTlRfQ0JfSUQgICAgICAgICAgVGFtcGVyIDEgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19UQU1QRVIyX0VWRU5UX0NCX0lEICAgICAgICAgIFRhbXBlciAyIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfVEFNUEVSM19FVkVOVF9DQl9JRCAgICAgICAgICBUYW1wZXIgMyBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgTXNwIEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19SZWdpc3RlckNhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBIQUxfUlRDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBSVENfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGlmIChIQUxfUlRDX1NUQVRFX1JFQURZID09IGhydGMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1JUQ19BTEFSTV9BX0VWRU5UX0NCX0lEIDoKKyAgICAgICAgaHJ0Yy0+QWxhcm1BRXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1JUQ19BTEFSTV9CX0VWRU5UX0NCX0lEIDoKKyAgICAgICAgaHJ0Yy0+QWxhcm1CRXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1JUQ19USU1FU1RBTVBfRVZFTlRfQ0JfSUQgOgorICAgICAgICBocnRjLT5UaW1lU3RhbXBFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUlRDX1dBS0VVUFRJTUVSX0VWRU5UX0NCX0lEIDoKKyAgICAgICAgaHJ0Yy0+V2FrZVVwVGltZXJFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUlRDX1RBTVBFUjFfRVZFTlRfQ0JfSUQgOgorICAgICAgICBocnRjLT5UYW1wZXIxRXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1JUQ19UQU1QRVIyX0VWRU5UX0NCX0lEIDoKKyAgICAgICAgaHJ0Yy0+VGFtcGVyMkV2ZW50Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9SVENfVEFNUEVSM19FVkVOVF9DQl9JRCA6CisgICAgICAgIGhydGMtPlRhbXBlcjNFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUlRDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocnRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9SVENfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHJ0Yy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1JUQ19TVEFURV9SRVNFVCA9PSBocnRjLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9SVENfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhydGMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1JUQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIFJUQyBDYWxsYmFjaworICAqICAgICAgICAgUlRDIGNhbGxhYmNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfQUxBUk1fQV9FVkVOVF9DQl9JRCAgICAgICAgICBBbGFybSBBIEV2ZW50IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfQUxBUk1fQl9FVkVOVF9DQl9JRCAgICAgICAgICBBbGFybSBCIEV2ZW50IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfVElNRVNUQU1QX0VWRU5UX0NCX0lEICAgICAgICBUaW1lU3RhbXAgRXZlbnQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19XQUtFVVBUSU1FUl9FVkVOVF9DQl9JRCAgICAgIFdha2VVcCBUaW1lciBFdmVudCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX1RBTVBFUjFfRVZFTlRfQ0JfSUQgICAgICAgICAgVGFtcGVyIDEgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19UQU1QRVIyX0VWRU5UX0NCX0lEICAgICAgICAgIFRhbXBlciAyIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfVEFNUEVSM19FVkVOVF9DQl9JRCAgICAgICAgICBUYW1wZXIgMyBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX01TUElOSVRfQ0JfSUQgTXNwIEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19NU1BERUlOSVRfQ0JfSUQgTXNwIERlSW5pdCBjYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19VblJlZ2lzdGVyQ2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIEhBTF9SVENfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaWYgKEhBTF9SVENfU1RBVEVfUkVBRFkgPT0gaHJ0Yy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfUlRDX0FMQVJNX0FfRVZFTlRfQ0JfSUQgOgorICAgICAgICBocnRjLT5BbGFybUFFdmVudENhbGxiYWNrID0gSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFsYXJtQUV2ZW50Q2FsbGJhY2sgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1JUQ19BTEFSTV9CX0VWRU5UX0NCX0lEIDoKKyAgICAgICAgaHJ0Yy0+QWxhcm1CRXZlbnRDYWxsYmFjayA9IEhBTF9SVENFeF9BbGFybUJFdmVudENhbGxiYWNrOyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBBbGFybUJFdmVudENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9SVENfVElNRVNUQU1QX0VWRU5UX0NCX0lEIDoKKyAgICAgICAgaHJ0Yy0+VGltZVN0YW1wRXZlbnRDYWxsYmFjayA9IEhBTF9SVENFeF9UaW1lU3RhbXBFdmVudENhbGxiYWNrOyAgICAvKiBMZWdhY3kgd2VhayBUaW1lU3RhbXBFdmVudENhbGxiYWNrICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9SVENfV0FLRVVQVElNRVJfRVZFTlRfQ0JfSUQgOgorICAgICAgICBocnRjLT5XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2sgPSBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBXYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1JUQ19UQU1QRVIxX0VWRU5UX0NCX0lEIDoKKyAgICAgICAgaHJ0Yy0+VGFtcGVyMUV2ZW50Q2FsbGJhY2sgPSBIQUxfUlRDRXhfVGFtcGVyMUV2ZW50Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgVGFtcGVyMUV2ZW50Q2FsbGJhY2sgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUlRDX1RBTVBFUjJfRVZFTlRfQ0JfSUQgOgorICAgICAgICBocnRjLT5UYW1wZXIyRXZlbnRDYWxsYmFjayA9IEhBTF9SVENFeF9UYW1wZXIyRXZlbnRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBUYW1wZXIyRXZlbnRDYWxsYmFjayAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9SVENfVEFNUEVSM19FVkVOVF9DQl9JRCA6CisgICAgICAgIGhydGMtPlRhbXBlcjNFdmVudENhbGxiYWNrID0gSEFMX1JUQ0V4X1RhbXBlcjNFdmVudENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRhbXBlcjNFdmVudENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1JUQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHJ0Yy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1JUQ19Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUlRDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhydGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1JUQ19Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1JUQ19TVEFURV9SRVNFVCA9PSBocnRjLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9SVENfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhydGMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9SVENfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1JUQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9SVENfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFJUQyBNU1AuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENfTXNwSW5pdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgUlRDIE1TUC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ19Nc3BEZUluaXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhydGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUlRDX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgICBSVEMgVGltZSBhbmQgRGF0ZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIFJUQyBUaW1lIGFuZCBEYXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgVGltZSBhbmQgRGF0ZSBmZWF0dXJlcworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBSVEMgY3VycmVudCB0aW1lLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzVGltZSBQb2ludGVyIHRvIFRpbWUgc3RydWN0dXJlCisgICogQHBhcmFtICBGb3JtYXQgU3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0CisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQkNEOiBCQ0QgZGF0YSBmb3JtYXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfU2V0VGltZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RpbWVUeXBlRGVmICpzVGltZSwgdWludDMyX3QgRm9ybWF0KQoreworICB1aW50MzJfdCB0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfREFZTElHSFRfU0FWSU5HKHNUaW1lLT5EYXlMaWdodFNhdmluZykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NUT1JFX09QRVJBVElPTihzVGltZS0+U3RvcmVPcGVyYXRpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIGlmIChGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBpZiAoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9GTVQpICE9IDBVKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjEyKHNUaW1lLT5Ib3VycykpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSRk9STUFUMTIoc1RpbWUtPlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNUaW1lLT5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIyNChzVGltZS0+SG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NSU5VVEVTKHNUaW1lLT5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TRUNPTkRTKHNUaW1lLT5TZWNvbmRzKSk7CisKKyAgICB0bXByZWcgPSAodWludDMyX3QpKCgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc1RpbWUtPkhvdXJzKSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzVGltZS0+TWludXRlcykgPDwgOFUpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzVGltZS0+U2Vjb25kcykpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3Qpc1RpbWUtPlRpbWVGb3JtYXQpIDw8IDE2VSkpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmICgoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gMFUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMTIoUlRDX0JjZDJUb0J5dGUoc1RpbWUtPkhvdXJzKSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSRk9STUFUMTIoc1RpbWUtPlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNUaW1lLT5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIyNChSVENfQmNkMlRvQnl0ZShzVGltZS0+SG91cnMpKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19SVENfTUlOVVRFUyhSVENfQmNkMlRvQnl0ZShzVGltZS0+TWludXRlcykpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NFQ09ORFMoUlRDX0JjZDJUb0J5dGUoc1RpbWUtPlNlY29uZHMpKSk7CisgICAgdG1wcmVnID0gKCgodWludDMyX3QpKHNUaW1lLT5Ib3VycykgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc1RpbWUtPk1pbnV0ZXMpIDw8IDhVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzVGltZS0+U2Vjb25kcykgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNUaW1lLT5UaW1lRm9ybWF0KSA8PCAxNlUpKTsKKyAgfQorICBVTlVTRUQodG1wcmVnKTsKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYgKFJUQ19FbnRlckluaXRNb2RlKGhydGMpICE9IEhBTF9PSykKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgLyogU2V0IFJUQyBzdGF0ZSAqLworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCB0aGUgUlRDX1RSIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPlRSID0gKHVpbnQzMl90KSh0bXByZWcgJiBSVENfVFJfUkVTRVJWRURfTUFTSyk7CisKKyAgICAvKiBDbGVhciB0aGUgYml0cyB0byBiZSBjb25maWd1cmVkICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkNSICY9ICgodWludDMyX3QpflJUQ19DUl9CS1ApOworCisgICAgLyogQ29uZmlndXJlIHRoZSBSVENfQ1IgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KShzVGltZS0+RGF5TGlnaHRTYXZpbmcgfCBzVGltZS0+U3RvcmVPcGVyYXRpb24pOworCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAoKHVpbnQzMl90KX5SVENfSVNSX0lOSVQpOworCisgICAgLyogSWYgIENSX0JZUFNIQUQgYml0ID0gMCwgd2FpdCBmb3Igc3luY2hybyBlbHNlIHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZCAqLworICAgIGlmICgoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0JZUFNIQUQpID09IDBVKQorICAgIHsKKyAgICAgIGlmIChIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKGhydGMpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVEMgY3VycmVudCB0aW1lLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzVGltZSBQb2ludGVyIHRvIFRpbWUgc3RydWN0dXJlIHdpdGggSG91cnMsIE1pbnV0ZXMgYW5kIFNlY29uZHMgZmllbGRzIHJldHVybmVkCisgICogICAgICAgICAgICAgICAgd2l0aCBpbnB1dCBmb3JtYXQgKEJJTiBvciBCQ0QpLCBhbHNvIFN1YlNlY29uZHMgZmllbGQgcmV0dXJuaW5nIHRoZQorICAqICAgICAgICAgICAgICAgIFJUQ19TU1IgcmVnaXN0ZXIgY29udGVudCBhbmQgU2Vjb25kRnJhY3Rpb24gZmllbGQgdGhlIFN5bmNocm9ub3VzIHByZS1zY2FsZXIKKyAgKiAgICAgICAgICAgICAgICBmYWN0b3IgdG8gYmUgdXNlZCBmb3Igc2Vjb25kIGZyYWN0aW9uIHJhdGlvIGNvbXB1dGF0aW9uLgorICAqIEBwYXJhbSAgRm9ybWF0IFNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBlbnRlcmVkIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdAorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQG5vdGUgIFlvdSBjYW4gdXNlIFN1YlNlY29uZHMgYW5kIFNlY29uZEZyYWN0aW9uIChzVGltZSBzdHJ1Y3R1cmUgZmllbGRzIHJldHVybmVkKSB0byBjb252ZXJ0IFN1YlNlY29uZHMKKyAgKiAgICAgICAgdmFsdWUgaW4gc2Vjb25kIGZyYWN0aW9uIHJhdGlvIHdpdGggdGltZSB1bml0IGZvbGxvd2luZyBnZW5lcmljIGZvcm11bGE6CisgICogICAgICAgIFNlY29uZCBmcmFjdGlvbiByYXRpbyAqIHRpbWVfdW5pdD0gWyhTZWNvbmRGcmFjdGlvbi1TdWJTZWNvbmRzKS8oU2Vjb25kRnJhY3Rpb24rMSldICogdGltZV91bml0CisgICogICAgICAgIFRoaXMgY29udmVyc2lvbiBjYW4gYmUgcGVyZm9ybWVkIG9ubHkgaWYgbm8gc2hpZnQgb3BlcmF0aW9uIGlzIHBlbmRpbmcgKGllLiBTSEZQPTApIHdoZW4gUFJFRElWX1MgPj0gU1MKKyAgKiBAbm90ZSAgWW91IG11c3QgY2FsbCBIQUxfUlRDX0dldERhdGUoKSBhZnRlciBIQUxfUlRDX0dldFRpbWUoKSB0byB1bmxvY2sgdGhlIHZhbHVlcworICAqICAgICAgICBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyIHNoYWRvdyByZWdpc3RlcnMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGJldHdlZW4gdGhlIHRpbWUgYW5kIGRhdGUgdmFsdWVzLgorICAqICAgICAgICBSZWFkaW5nIFJUQyBjdXJyZW50IHRpbWUgbG9ja3MgdGhlIHZhbHVlcyBpbiBjYWxlbmRhciBzaGFkb3cgcmVnaXN0ZXJzIHVudGlsIEN1cnJlbnQgZGF0ZSBpcyByZWFkCisgICogICAgICAgIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSB0aW1lIGFuZCBkYXRlIHZhbHVlcy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfR2V0VGltZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RpbWVUeXBlRGVmICpzVGltZSwgdWludDMyX3QgRm9ybWF0KQoreworICB1aW50MzJfdCB0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisKKyAgLyogR2V0IHN1YnNlY29uZHMgc3RydWN0dXJlIGZpZWxkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIqLworICBzVGltZS0+U3ViU2Vjb25kcyA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPlNTUik7CisKKyAgLyogR2V0IFNlY29uZEZyYWN0aW9uIHN0cnVjdHVyZSBmaWVsZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIGZpZWxkKi8KKyAgc1RpbWUtPlNlY29uZEZyYWN0aW9uID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+UFJFUiAmIFJUQ19QUkVSX1BSRURJVl9TKTsKKworICAvKiBHZXQgdGhlIFRSIHJlZ2lzdGVyICovCisgIHRtcHJlZyA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPlRSICYgUlRDX1RSX1JFU0VSVkVEX01BU0spOworCisgIC8qIEZpbGwgdGhlIHN0cnVjdHVyZSBmaWVsZHMgd2l0aCB0aGUgcmVhZCBwYXJhbWV0ZXJzICovCisgIHNUaW1lLT5Ib3VycyA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19UUl9IVCB8IFJUQ19UUl9IVSkpID4+IDE2VSk7CisgIHNUaW1lLT5NaW51dGVzID0gKHVpbnQ4X3QpKCh0bXByZWcgJiAoUlRDX1RSX01OVCB8IFJUQ19UUl9NTlUpKSA+PiA4VSk7CisgIHNUaW1lLT5TZWNvbmRzID0gKHVpbnQ4X3QpKHRtcHJlZyAmIChSVENfVFJfU1QgfCBSVENfVFJfU1UpKTsKKyAgc1RpbWUtPlRpbWVGb3JtYXQgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfVFJfUE0pKSA+PiAxNlUpOworCisgIC8qIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvcm1hdCAqLworICBpZiAoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgLyogQ29udmVydCB0aGUgdGltZSBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB0byBCaW5hcnkgZm9ybWF0ICovCisgICAgc1RpbWUtPkhvdXJzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWUtPkhvdXJzKTsKKyAgICBzVGltZS0+TWludXRlcyA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNUaW1lLT5NaW51dGVzKTsKKyAgICBzVGltZS0+U2Vjb25kcyA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNUaW1lLT5TZWNvbmRzKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFJUQyBjdXJyZW50IGRhdGUuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNEYXRlIFBvaW50ZXIgdG8gZGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEZvcm1hdCBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQklOOiBCaW5hcnkgZGF0YSBmb3JtYXQKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXREYXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfRGF0ZVR5cGVEZWYgKnNEYXRlLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IGRhdGV0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICBpZiAoKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikgJiYgKChzRGF0ZS0+TW9udGggJiAweDEwVSkgPT0gMHgxMFUpKQorICB7CisgICAgc0RhdGUtPk1vbnRoID0gKHVpbnQ4X3QpKChzRGF0ZS0+TW9udGggJiAodWludDhfdCl+KDB4MTBVKSkgKyAodWludDhfdCkweDBBVSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dFRUtEQVkoc0RhdGUtPldlZWtEYXkpKTsKKworICBpZiAoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19ZRUFSKHNEYXRlLT5ZZWFyKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NT05USChzRGF0ZS0+TW9udGgpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0RBVEUoc0RhdGUtPkRhdGUpKTsKKworICAgIGRhdGV0bXByZWcgPSAoKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzRGF0ZS0+WWVhcikgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0RhdGUtPk1vbnRoKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNEYXRlLT5EYXRlKSkgfCBcCisgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXNEYXRlLT5XZWVrRGF5IDw8IDEzVSkpOworICB9CisgIGVsc2UKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19SVENfWUVBUihSVENfQmNkMlRvQnl0ZShzRGF0ZS0+WWVhcikpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01PTlRIKFJUQ19CY2QyVG9CeXRlKHNEYXRlLT5Nb250aCkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0RBVEUoUlRDX0JjZDJUb0J5dGUoc0RhdGUtPkRhdGUpKSk7CisKKyAgICBkYXRldG1wcmVnID0gKCgoKHVpbnQzMl90KXNEYXRlLT5ZZWFyKSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAgICAgKCgodWludDMyX3Qpc0RhdGUtPk1vbnRoKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXNEYXRlLT5EYXRlKSB8IFwKKyAgICAgICAgICAgICAgICAgICgoKHVpbnQzMl90KXNEYXRlLT5XZWVrRGF5KSA8PCAxM1UpKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmIChSVENfRW50ZXJJbml0TW9kZShocnRjKSAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgIC8qIFNldCBSVEMgc3RhdGUqLworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCB0aGUgUlRDX0RSIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkRSID0gKHVpbnQzMl90KShkYXRldG1wcmVnICYgUlRDX0RSX1JFU0VSVkVEX01BU0spOworCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAoKHVpbnQzMl90KX5SVENfSVNSX0lOSVQpOworCisgICAgLyogSWYgIENSX0JZUFNIQUQgYml0ID0gMCwgd2FpdCBmb3Igc3luY2hybyBlbHNlIHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZCAqLworICAgIGlmICgoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0JZUFNIQUQpID09IDBVKQorICAgIHsKKyAgICAgIGlmIChIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKGhydGMpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZIDsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJUQyBjdXJyZW50IGRhdGUuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNEYXRlIFBvaW50ZXIgdG8gRGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEZvcm1hdCBTcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQklOOiAgQmluYXJ5IGRhdGEgZm9ybWF0CisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQkNEOiAgQkNEIGRhdGEgZm9ybWF0CisgICogQG5vdGUgIFlvdSBtdXN0IGNhbGwgSEFMX1JUQ19HZXREYXRlKCkgYWZ0ZXIgSEFMX1JUQ19HZXRUaW1lKCkgdG8gdW5sb2NrIHRoZSB2YWx1ZXMKKyAgKiAgICAgICAgaW4gdGhlIGhpZ2hlci1vcmRlciBjYWxlbmRhciBzaGFkb3cgcmVnaXN0ZXJzIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSB0aW1lIGFuZCBkYXRlIHZhbHVlcy4KKyAgKiAgICAgICAgUmVhZGluZyBSVEMgY3VycmVudCB0aW1lIGxvY2tzIHRoZSB2YWx1ZXMgaW4gY2FsZW5kYXIgc2hhZG93IHJlZ2lzdGVycyB1bnRpbCBDdXJyZW50IGRhdGUgaXMgcmVhZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfR2V0RGF0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0RhdGVUeXBlRGVmICpzRGF0ZSwgdWludDMyX3QgRm9ybWF0KQoreworICB1aW50MzJfdCBkYXRldG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfRk9STUFUKEZvcm1hdCkpOworCisgIC8qIEdldCB0aGUgRFIgcmVnaXN0ZXIgKi8KKyAgZGF0ZXRtcHJlZyA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPkRSICYgUlRDX0RSX1JFU0VSVkVEX01BU0spOworCisgIC8qIEZpbGwgdGhlIHN0cnVjdHVyZSBmaWVsZHMgd2l0aCB0aGUgcmVhZCBwYXJhbWV0ZXJzICovCisgIHNEYXRlLT5ZZWFyID0gKHVpbnQ4X3QpKChkYXRldG1wcmVnICYgKFJUQ19EUl9ZVCB8IFJUQ19EUl9ZVSkpID4+IDE2VSk7CisgIHNEYXRlLT5Nb250aCA9ICh1aW50OF90KSgoZGF0ZXRtcHJlZyAmIChSVENfRFJfTVQgfCBSVENfRFJfTVUpKSA+PiA4VSk7CisgIHNEYXRlLT5EYXRlID0gKHVpbnQ4X3QpKGRhdGV0bXByZWcgJiAoUlRDX0RSX0RUIHwgUlRDX0RSX0RVKSk7CisgIHNEYXRlLT5XZWVrRGF5ID0gKHVpbnQ4X3QpKChkYXRldG1wcmVnICYgKFJUQ19EUl9XRFUpKSA+PiAxM1UpOworCisgIC8qIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvcm1hdCAqLworICBpZiAoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgLyogQ29udmVydCB0aGUgZGF0ZSBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB0byBCaW5hcnkgZm9ybWF0ICovCisgICAgc0RhdGUtPlllYXIgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzRGF0ZS0+WWVhcik7CisgICAgc0RhdGUtPk1vbnRoID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc0RhdGUtPk1vbnRoKTsKKyAgICBzRGF0ZS0+RGF0ZSA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNEYXRlLT5EYXRlKTsKKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAqICBAYnJpZWYgICBSVEMgQWxhcm0gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBSVEMgQWxhcm0gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgWy4uXSBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBBbGFybSBmZWF0dXJlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIFJUQyBBbGFybS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc0FsYXJtIFBvaW50ZXIgdG8gQWxhcm0gc3RydWN0dXJlCisgICogQHBhcmFtICBGb3JtYXQgU3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXRBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0FsYXJtVHlwZURlZiAqc0FsYXJtLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgdG1wcmVnLCBzdWJzZWNvbmR0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk0oc0FsYXJtLT5BbGFybSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX01BU0soc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfU0VMKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfVkFMVUUoc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfTUFTSyhzQWxhcm0tPkFsYXJtU3ViU2Vjb25kTWFzaykpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgaWYgKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikKKyAgeworICAgIGlmICgoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gMFUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMTIoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUkZPUk1BVDEyKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjI0KHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19SVENfTUlOVVRFUyhzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TRUNPTkRTKHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpKTsKKworICAgIGlmIChzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gUlRDX0FMQVJNREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9EQVRFKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisKKyAgICB0bXByZWcgPSAoKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkgPDwgMjRVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1NYXNrKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfRk1UKSAhPSAwVSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIxMihSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUkZPUk1BVDEyKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjI0KFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSkpOworICAgIH0KKworICAgIGFzc2VydF9wYXJhbShJU19SVENfTUlOVVRFUyhSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSkpOworICAgIGFzc2VydF9wYXJhbShJU19SVENfU0VDT05EUyhSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSkpOworCisgICAgaWYgKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fREFURV9XRUVLREFZX0RBVEUoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWShSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorCisgICAgdG1wcmVnID0gKCgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpIHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpIDw8IDI0VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtTWFzaykpOworICB9CisKKyAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBBIG9yIEFsYXJtIEIgU3ViIFNlY29uZCByZWdpc3RlcnMgKi8KKyAgc3Vic2Vjb25kdG1wcmVnID0gKHVpbnQzMl90KSgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLlN1YlNlY29uZHMpIHwgKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtU3ViU2Vjb25kTWFzaykpOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gcmVnaXN0ZXIgKi8KKyAgaWYgKHNBbGFybS0+QWxhcm0gPT0gUlRDX0FMQVJNX0EpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBBIGludGVycnVwdCAqLworICAgIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRShocnRjKTsKKworICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9BTFJBKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJBV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlIChfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQVdGKSA9PSAwVSkKKyAgICB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BUiA9ICh1aW50MzJfdCl0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBBIFN1YiBTZWNvbmQgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFTU1IgPSBzdWJzZWNvbmR0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovCisgICAgX19IQUxfUlRDX0FMQVJNQV9FTkFCTEUoaHJ0Yyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgQWxhcm0gQiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1CX0RJU0FCTEUoaHJ0Yyk7CisKKyAgICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVChocnRjLCBSVENfSVRfQUxSQik7CisKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSQldGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB3aGlsZSAoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJXRikgPT0gMFUpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlIgPSAodWludDMyX3QpdG1wcmVnOworICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gQiBTdWIgU2Vjb25kIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1CU1NSID0gc3Vic2Vjb25kdG1wcmVnOworICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gc3RhdGU6IEVuYWJsZSBBbGFybSAqLworICAgIF9fSEFMX1JUQ19BTEFSTUJfRU5BQkxFKGhydGMpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgUlRDIEFsYXJtIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzQWxhcm0gUG9pbnRlciB0byBBbGFybSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEZvcm1hdCBTcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQG5vdGUgICBUaGUgQWxhcm0gcmVnaXN0ZXIgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIEFsYXJtCisgICogICAgICAgICBpcyBkaXNhYmxlZCAoVXNlIHRoZSBIQUxfUlRDX0RlYWN0aXZhdGVBbGFybSgpKS4KKyAgKiBAbm90ZSAgIFRoZSBIQUxfUlRDX1NldFRpbWUoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZW5hYmxpbmcgdGhlIEFsYXJtIGZlYXR1cmUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldEFsYXJtX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB0bXByZWcsIHN1YnNlY29uZHRtcHJlZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTShzQWxhcm0tPkFsYXJtKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fTUFTSyhzQWxhcm0tPkFsYXJtTWFzaykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9TRUwoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fU1VCX1NFQ09ORF9WQUxVRShzQWxhcm0tPkFsYXJtVGltZS5TdWJTZWNvbmRzKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fU1VCX1NFQ09ORF9NQVNLKHNBbGFybS0+QWxhcm1TdWJTZWNvbmRNYXNrKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICBpZiAoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYgKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfRk1UKSAhPSAwVSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIxMihzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSRk9STUFUMTIoc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMjQoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NSU5VVEVTKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NFQ09ORFMoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykpOworCisgICAgaWYgKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fREFURV9XRUVLREFZX0RBVEUoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9XRUVLREFZKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgICB0bXByZWcgPSAoKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkgPDwgMjRVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1NYXNrKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfRk1UKSAhPSAwVSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIxMihSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUkZPUk1BVDEyKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjI0KFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSkpOworICAgIH0KKworICAgIGFzc2VydF9wYXJhbShJU19SVENfTUlOVVRFUyhSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSkpOworICAgIGFzc2VydF9wYXJhbShJU19SVENfU0VDT05EUyhSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSkpOworCisgICAgaWYgKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fREFURV9XRUVLREFZX0RBVEUoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWShSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorICAgIHRtcHJlZyA9ICgoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcykgPDwgOFUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KSBzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCkgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSA8PCAyNFUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgfQorICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIEEgb3IgQWxhcm0gQiBTdWIgU2Vjb25kIHJlZ2lzdGVycyAqLworICBzdWJzZWNvbmR0bXByZWcgPSAodWludDMyX3QpKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcykgfCAodWludDMyX3QpKHNBbGFybS0+QWxhcm1TdWJTZWNvbmRNYXNrKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBBbGFybSByZWdpc3RlciAqLworICBpZiAoc0FsYXJtLT5BbGFybSA9PSBSVENfQUxBUk1fQSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEEgaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNQV9ESVNBQkxFKGhydGMpOworCisgICAgLyogQ2xlYXIgZmxhZyBhbGFybSBBICovCisgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQUYpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkFXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUgKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFSID0gKHVpbnQzMl90KXRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIEEgU3ViIFNlY29uZCByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQVNTUiA9IHN1YnNlY29uZHRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHN0YXRlOiBFbmFibGUgQWxhcm0gKi8KKyAgICBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRShocnRjKTsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoaHJ0YywgUlRDX0lUX0FMUkEpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEIgaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNQl9ESVNBQkxFKGhydGMpOworCisgICAgLyogQ2xlYXIgZmxhZyBhbGFybSBCICovCisgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQkYpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkJXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUgKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUJSID0gKHVpbnQzMl90KXRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIEIgU3ViIFNlY29uZCByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlNTUiA9IHN1YnNlY29uZHRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHN0YXRlOiBFbmFibGUgQWxhcm0gKi8KKyAgICBfX0hBTF9SVENfQUxBUk1CX0VOQUJMRShocnRjKTsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoaHJ0YywgUlRDX0lUX0FMUkIpOworICB9CisKKyAgLyogUlRDIEFsYXJtIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KKyAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCk7CisKKyAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgdGhlIHNwZWNpZmllZCBSVEMgQWxhcm0uCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIEFsYXJtIFNwZWNpZmllcyB0aGUgQWxhcm0uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0FMQVJNX0E6ICBBbGFybUEKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0FMQVJNX0I6ICBBbGFybUIKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfRGVhY3RpdmF0ZUFsYXJtKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBBbGFybSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk0oQWxhcm0pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIGlmIChBbGFybSA9PSBSVENfQUxBUk1fQSkKKyAgeworICAgIC8qIEFsYXJtQSAqLworICAgIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRShocnRjKTsKKworICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9BTFJBKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUnhXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUgKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAgLSB0aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEFsYXJtQiAqLworICAgIF9fSEFMX1JUQ19BTEFSTUJfRElTQUJMRShocnRjKTsKKworICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9BTFJCKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUnhXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUgKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgUlRDIEFsYXJtIHZhbHVlIGFuZCBtYXNrcy4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc0FsYXJtIFBvaW50ZXIgdG8gRGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEFsYXJtIFNwZWNpZmllcyB0aGUgQWxhcm0uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19BTEFSTV9BOiBBbGFybUEKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19BTEFSTV9COiBBbGFybUIKKyAgKiBAcGFyYW0gIEZvcm1hdCBTcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0dldEFsYXJtKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEFsYXJtLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IHRtcHJlZywgc3Vic2Vjb25kdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfRk9STUFUKEZvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNKEFsYXJtKSk7CisKKyAgaWYgKEFsYXJtID09IFJUQ19BTEFSTV9BKQorICB7CisgICAgLyogQWxhcm1BICovCisgICAgc0FsYXJtLT5BbGFybSA9IFJUQ19BTEFSTV9BOworCisgICAgdG1wcmVnID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+QUxSTUFSKTsKKyAgICBzdWJzZWNvbmR0bXByZWcgPSAodWludDMyX3QpKChocnRjLT5JbnN0YW5jZS0+QUxSTUFTU1IpICYgUlRDX0FMUk1BU1NSX1NTKTsKKworICAgIC8qIEZpbGwgdGhlIHN0cnVjdHVyZSB3aXRoIHRoZSByZWFkIHBhcmFtZXRlcnMgKi8KKyAgICBzQWxhcm0tPkFsYXJtVGltZS5Ib3VycyA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19BTFJNQVJfSFQgfCBSVENfQUxSTUFSX0hVKSkgPj4gMTZVKTsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzID0gKHVpbnQ4X3QpKCh0bXByZWcgJiAoUlRDX0FMUk1BUl9NTlQgfCBSVENfQUxSTUFSX01OVSkpID4+IDhVKTsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzID0gKHVpbnQ4X3QpKHRtcHJlZyAmIChSVENfQUxSTUFSX1NUIHwgUlRDX0FMUk1BUl9TVSkpOworICAgIHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAodWludDhfdCkoKHRtcHJlZyAmIFJUQ19BTFJNQVJfUE0pID4+IDE2VSk7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcyA9ICh1aW50MzJfdCkgc3Vic2Vjb25kdG1wcmVnOworICAgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19BTFJNQVJfRFQgfCBSVENfQUxSTUFSX0RVKSkgPj4gMjRVKTsKKyAgICBzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPSAodWludDMyX3QpKHRtcHJlZyAmIFJUQ19BTFJNQVJfV0RTRUwpOworICAgIHNBbGFybS0+QWxhcm1NYXNrID0gKHVpbnQzMl90KSh0bXByZWcgJiBSVENfQUxBUk1NQVNLX0FMTCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc0FsYXJtLT5BbGFybSA9IFJUQ19BTEFSTV9COworCisgICAgdG1wcmVnID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+QUxSTUJSKTsKKyAgICBzdWJzZWNvbmR0bXByZWcgPSAodWludDMyX3QpKChocnRjLT5JbnN0YW5jZS0+QUxSTUJTU1IpICYgUlRDX0FMUk1CU1NSX1NTKTsKKworICAgIC8qIEZpbGwgdGhlIHN0cnVjdHVyZSB3aXRoIHRoZSByZWFkIHBhcmFtZXRlcnMgKi8KKyAgICBzQWxhcm0tPkFsYXJtVGltZS5Ib3VycyA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19BTFJNQlJfSFQgfCBSVENfQUxSTUJSX0hVKSkgPj4gMTZVKTsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzID0gKHVpbnQ4X3QpKCh0bXByZWcgJiAoUlRDX0FMUk1CUl9NTlQgfCBSVENfQUxSTUJSX01OVSkpID4+IDhVKTsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzID0gKHVpbnQ4X3QpKHRtcHJlZyAmIChSVENfQUxSTUJSX1NUIHwgUlRDX0FMUk1CUl9TVSkpOworICAgIHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAodWludDhfdCkoKHRtcHJlZyAmIFJUQ19BTFJNQlJfUE0pID4+IDE2VSk7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcyA9ICh1aW50MzJfdCkgc3Vic2Vjb25kdG1wcmVnOworICAgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19BTFJNQlJfRFQgfCBSVENfQUxSTUJSX0RVKSkgPj4gMjRVKTsKKyAgICBzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPSAodWludDMyX3QpKHRtcHJlZyAmIFJUQ19BTFJNQlJfV0RTRUwpOworICAgIHNBbGFybS0+QWxhcm1NYXNrID0gKHVpbnQzMl90KSh0bXByZWcgJiBSVENfQUxBUk1NQVNLX0FMTCk7CisgIH0KKworICBpZiAoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuSG91cnMgPSBSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5Ib3Vycyk7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcyA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpOworICAgIHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMgPSBSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKTsKKyAgICBzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkgPSBSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgQWxhcm0gaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JUQ19BbGFybUlSUUhhbmRsZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIEdldCB0aGUgQWxhcm1BIGludGVycnVwdCBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZiAoX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX0FMUkEpICE9IDBVKQorICB7CisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgQWxhcm1BIEludGVycnVwdCAqLworICAgIGlmIChfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQUYpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIEFsYXJtQSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhydGMtPkFsYXJtQUV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgICAgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKGhydGMpOworI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgICAvKiBDbGVhciB0aGUgQWxhcm1BIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworICAgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQUYpOworICAgIH0KKyAgfQorCisgIC8qIEdldCB0aGUgQWxhcm1CIGludGVycnVwdCBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZiAoX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX0FMUkIpICE9IDBVKQorICB7CisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgQWxhcm1CIEludGVycnVwdCAqLworICAgIGlmIChfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQkYpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIEFsYXJtQiBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhydGMtPkFsYXJtQkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgICAgSEFMX1JUQ0V4X0FsYXJtQkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAgIC8qIENsZWFyIHRoZSBBbGFybUIgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCRik7CisgICAgfQorICB9CisgIC8qIENsZWFyIHRoZSBFWFRJJ3MgbGluZSBGbGFnIGZvciBSVEMgQWxhcm0gKi8KKyAgX19IQUxfUlRDX0FMQVJNX0VYVElfQ0xFQVJfRkxBRygpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFsYXJtIEEgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBBbGFybUEgUG9sbGluZyByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfUG9sbEZvckFsYXJtQUV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworCisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgd2hpbGUgKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBRikgPT0gMFUpCisgIHsKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENsZWFyIHRoZSBBbGFybSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQUYpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNAorICogIEBicmllZiAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvCisgICAgICAoKykgV2FpdCBmb3IgUlRDIFRpbWUgYW5kIERhdGUgU3luY2hyb25pemF0aW9uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV2FpdCB1bnRpbCB0aGUgUlRDIFRpbWUgYW5kIERhdGUgcmVnaXN0ZXJzIChSVENfVFIgYW5kIFJUQ19EUikgYXJlCisgICogICAgICAgICBzeW5jaHJvbml6ZWQgd2l0aCBSVEMgQVBCIGNsb2NrLgorICAqIEBub3RlICAgVGhlIFJUQyBSZXN5bmNocm9uaXphdGlvbiBtb2RlIGlzIHdyaXRlIHByb3RlY3RlZCwgdXNlIHRoZQorICAqICAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgIFRvIHJlYWQgdGhlIGNhbGVuZGFyIHRocm91Z2ggdGhlIHNoYWRvdyByZWdpc3RlcnMgYWZ0ZXIgQ2FsZW5kYXIKKyAgKiAgICAgICAgIGluaXRpYWxpemF0aW9uLCBjYWxlbmRhciB1cGRhdGUgb3IgYWZ0ZXIgd2FrZXVwIGZyb20gbG93IHBvd2VyIG1vZGVzCisgICogICAgICAgICB0aGUgc29mdHdhcmUgbXVzdCBmaXJzdCBjbGVhciB0aGUgUlNGIGZsYWcuCisgICogICAgICAgICBUaGUgc29mdHdhcmUgbXVzdCB0aGVuIHdhaXQgdW50aWwgaXQgaXMgc2V0IGFnYWluIGJlZm9yZSByZWFkaW5nCisgICogICAgICAgICB0aGUgY2FsZW5kYXIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNhbGVuZGFyIHJlZ2lzdGVycyBoYXZlIGJlZW4KKyAgKiAgICAgICAgIGNvcnJlY3RseSBjb3BpZWQgaW50byB0aGUgUlRDX1RSIGFuZCBSVENfRFIgc2hhZG93IHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19XYWl0Rm9yU3luY2hybyhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENsZWFyIFJTRiBmbGFnICovCisgIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KVJUQ19SU0ZfTUFTSzsKKworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdGhlIHJlZ2lzdGVycyB0byBiZSBzeW5jaHJvbmlzZWQgKi8KKyAgd2hpbGUgKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9SU0YpID09IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvCisgICAgICAoKykgR2V0IFJUQyBzdGF0ZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFJUQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1JUQ1N0YXRlVHlwZURlZiBIQUxfUlRDX0dldFN0YXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBSZXR1cm4gUlRDIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaHJ0Yy0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW50ZXIgdGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBub3RlICAgVGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHdyaXRlIHByb3RlY3RlZCwgdXNlIHRoZQorICAqICAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgUlRDX0VudGVySW5pdE1vZGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayBpZiB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyBzZXQgKi8KKyAgaWYgKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gMFUpCisgIHsKKyAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+SVNSID0gKHVpbnQzMl90KVJUQ19JTklUX01BU0s7CisKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIC8qIFdhaXQgdGlsbCBSVEMgaXMgaW4gSU5JVCBzdGF0ZSBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUgKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gMFUpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpICAtIHRpY2tzdGFydCkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IGEgMiBkaWdpdCBkZWNpbWFsIHRvIEJDRCBmb3JtYXQuCisgICogQHBhcmFtICBWYWx1ZSBCeXRlIHRvIGJlIGNvbnZlcnRlZAorICAqIEByZXR2YWwgQ29udmVydGVkIGJ5dGUKKyAgKi8KK3VpbnQ4X3QgUlRDX0J5dGVUb0JjZDIodWludDhfdCBWYWx1ZSkKK3sKKyAgdWludDMyX3QgYmNkaGlnaCA9IDBVOworICB1aW50OF90IFBhcmFtID0gVmFsdWU7CisKKyAgd2hpbGUgKFBhcmFtID49IDEwVSkKKyAgeworICAgIGJjZGhpZ2grKzsKKyAgICBQYXJhbSAtPSAxMFU7CisgIH0KKworICByZXR1cm4gKCh1aW50OF90KShiY2RoaWdoIDw8IDRVKSB8IFBhcmFtKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IGZyb20gMiBkaWdpdCBCQ0QgdG8gQmluYXJ5LgorICAqIEBwYXJhbSAgVmFsdWUgQkNEIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAqIEByZXR2YWwgQ29udmVydGVkIHdvcmQKKyAgKi8KK3VpbnQ4X3QgUlRDX0JjZDJUb0J5dGUodWludDhfdCBWYWx1ZSkKK3sKKyAgdWludDMyX3QgdG1wOworICB0bXAgPSAoKCh1aW50MzJfdClWYWx1ZSAmIDB4RjBVKSA+PiA0VSkgKiAxMFU7CisgIHJldHVybiAodWludDhfdCkodG1wICsgKCh1aW50MzJfdClWYWx1ZSAmIDB4MEZVKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUlRDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfcnRjX2V4LmMgYi9TcmMvc3RtMzJsMHh4X2hhbF9ydGNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZkNzFjCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfcnRjX2V4LmMKQEAgLTAsMCArMSwxODMzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9ydGNfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgUlRDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFJlYWwgVGltZSBDbG9jayAoUlRDKSBFeHRlbmRlZCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIFJUQyBUaW1lIFN0YW1wIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFJUQyBUYW1wZXIgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUlRDIFdha2UtdXAgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgRXh0ZW5kZWQgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBSVEMgZmVhdHVyZXMgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBFbmFibGUgdGhlIFJUQyBkb21haW4gYWNjZXNzLgorICAgICgrKSBDb25maWd1cmUgdGhlIFJUQyBQcmVzY2FsZXIgKEFzeW5jaHJvbm91cyBhbmQgU3luY2hyb25vdXMpIGFuZCBSVEMgaG91cgorICAgICAgICBmb3JtYXQgdXNpbmcgdGhlIEhBTF9SVENfSW5pdCgpIGZ1bmN0aW9uLgorCisgICoqKiBSVEMgV2FrZXVwIGNvbmZpZ3VyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgVG8gY29uZmlndXJlIHRoZSBSVEMgV2FrZXVwIENsb2NrIHNvdXJjZSBhbmQgQ291bnRlciB1c2UgdGhlIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcigpCisgICAgICAgIGZ1bmN0aW9uLiBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBSVEMgV2FrZXVwIHRpbWVyIHdpdGggaW50ZXJydXB0IG1vZGUKKyAgICAgICAgdXNpbmcgdGhlIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcl9JVCgpIGZ1bmN0aW9uLgorICAgICgrKSBUbyByZWFkIHRoZSBSVEMgV2FrZVVwIENvdW50ZXIgcmVnaXN0ZXIsIHVzZSB0aGUgSEFMX1JUQ0V4X0dldFdha2VVcFRpbWVyKCkKKyAgICAgICAgZnVuY3Rpb24uCisKKyAgKioqIE91dHB1dHMgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBUaGUgUlRDIGhhcyAyIGRpZmZlcmVudCBvdXRwdXRzOgorICAgICgrKSBSVENfQUxBUk06IHRoaXMgb3V0cHV0IGlzIHVzZWQgdG8gbWFuYWdlIHRoZSBSVEMgQWxhcm0gQSwgQWxhcm0gQgorICAgICAgICBhbmQgV2FLZVVwIHNpZ25hbHMuCisgICAgICAgIFRvIG91dHB1dCB0aGUgc2VsZWN0ZWQgUlRDIHNpZ25hbCwgdXNlIHRoZSBIQUxfUlRDX0luaXQoKSBmdW5jdGlvbi4KKyAgICAoKykgUlRDX0NBTElCOiB0aGlzIG91dHB1dCBpcyA1MTJIeiBzaWduYWwgb3IgMUh6LgorICAgICAgICBUbyBlbmFibGUgdGhlIFJUQ19DQUxJQiwgdXNlIHRoZSBIQUxfUlRDRXhfU2V0Q2FsaWJyYXRpb25PdXRQdXQoKSBmdW5jdGlvbi4KKyAgICAoKykgVHdvIHBpbnMgY2FuIGJlIHVzZWQgYXMgUlRDX0FMQVJNIG9yIFJUQ19DQUxJQiAoUEMxMywgUEIxNCkgZm9yIFNUTTMyTDA1eC82eC83eC84eAorICAgICAgYW5kIChQQTIsIFBCMTQpIGZvciBTVE0zMkwwM3gvNHggbWFuYWdlZCBvbiB0aGUgUlRDX09SIHJlZ2lzdGVyLgorICAgICgrKSBXaGVuIHRoZSBSVENfQ0FMSUIgb3IgUlRDX0FMQVJNIG91dHB1dCBpcyBzZWxlY3RlZCwgdGhlIFJUQ19PVVQgcGluIGlzCisgICAgICAgIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlZCBpbiBvdXRwdXQgYWx0ZXJuYXRlIGZ1bmN0aW9uLgorCisgICoqKiBTbW9vdGggZGlnaXRhbCBDYWxpYnJhdGlvbiBjb25maWd1cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBDb25maWd1cmUgdGhlIFJUQyBPcmlnaW5hbCBEaWdpdGFsIENhbGlicmF0aW9uIFZhbHVlIGFuZCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBjYWxpYnJhdGlvbiBjeWNsZSBwZXJpb2QgKDMycywxNnMgYW5kIDhzKSB1c2luZyB0aGUgSEFMX1JUQ0V4X1NldFNtb290aENhbGliKCkKKyAgICAgICAgZnVuY3Rpb24uCisKKyAgKioqIFRpbWVTdGFtcCBjb25maWd1cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgQ29uZmlndXJlIHRoZSBSVENfQUYgdHJpZ2dlciBhbmQgZW5hYmxlIHRoZSBSVEMgVGltZVN0YW1wIHVzaW5nIHRoZQorICAgICAgICBIQUxfUlRDRXhfU2V0VGltZVN0YW1wKCkgZnVuY3Rpb24uIFlvdSBjYW4gYWxzbyBjb25maWd1cmUgdGhlIFJUQyBUaW1lU3RhbXAgd2l0aAorICAgICAgICBpbnRlcnJ1cHQgbW9kZSB1c2luZyB0aGUgSEFMX1JUQ0V4X1NldFRpbWVTdGFtcF9JVCgpIGZ1bmN0aW9uLgorICAgICgrKSBUbyByZWFkIHRoZSBSVEMgVGltZVN0YW1wIFRpbWUgYW5kIERhdGUgcmVnaXN0ZXIsIHVzZSB0aGUgSEFMX1JUQ0V4X0dldFRpbWVTdGFtcCgpCisgICAgICAgIGZ1bmN0aW9uLgorCisgICoqKiBUYW1wZXIgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgICAgICgrKSBFbmFibGUgdGhlIFJUQyBUYW1wZXIgYW5kIGNvbmZpZ3VyZSB0aGUgVGFtcGVyIGZpbHRlciBjb3VudCwgdHJpZ2dlciBFZGdlCisgICAgICAgIG9yIExldmVsIGFjY29yZGluZyB0byB0aGUgVGFtcGVyIGZpbHRlciAoaWYgZXF1YWwgdG8gMCBFZGdlIGVsc2UgTGV2ZWwpCisgICAgICAgIHZhbHVlLCBzYW1wbGluZyBmcmVxdWVuY3ksIE5vRXJhc2UsIE1hc2tGbGFnLCAgcHJlY2hhcmdlIG9yIGRpc2NoYXJnZSBhbmQKKyAgICAgICAgUHVsbC1VUCB1c2luZyB0aGUgSEFMX1JUQ0V4X1NldFRhbXBlcigpIGZ1bmN0aW9uLiBZb3UgY2FuIGNvbmZpZ3VyZSBSVEMgVGFtcGVyCisgICAgICAgIHdpdGggaW50ZXJydXB0IG1vZGUgdXNpbmcgSEFMX1JUQ0V4X1NldFRhbXBlcl9JVCgpIGZ1bmN0aW9uLgorICAgICgrKSBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBUYW1wZXIgZXJhc2VzIHRoZSBiYWNrdXAgcmVnaXN0ZXJzLiBUbyBhdm9pZAorICAgICAgICBlcmFzZSwgZW5hYmxlIHRoZSBOb0VyYXNlIGZpZWxkIG9uIHRoZSBSVENfVEFNUENSIHJlZ2lzdGVyLgorCisgICoqKiBCYWNrdXAgRGF0YSBSZWdpc3RlcnMgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIFRvIHdyaXRlIHRvIHRoZSBSVEMgQmFja3VwIERhdGEgcmVnaXN0ZXJzLCB1c2UgdGhlIEhBTF9SVENFeF9CS1VQV3JpdGUoKQorICAgICAgICBmdW5jdGlvbi4KKyAgICAoKykgVG8gcmVhZCB0aGUgUlRDIEJhY2t1cCBEYXRhIHJlZ2lzdGVycywgdXNlIHRoZSBIQUxfUlRDRXhfQktVUFJlYWQoKQorICAgICAgICBmdW5jdGlvbi4KKworICAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSVENFeAorICAqIEBicmllZiBSVEMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9Qcml2YXRlX0NvbnN0YW50cyBSVENFeCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKSAmJiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19UQU1QQ1JfTUFTSyAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QVFMgICAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBGUkVRICB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBGTFQgICAgICB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBQUkNIIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QUFVESVMgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDFJRSAgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDFOT0VSQVNFIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDFNRiAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAySUUgICB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAyTk9FUkFTRSB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAyTUYgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QM0lFICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QM05PRVJBU0UgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QM01GKQorI2VsaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorI2RlZmluZSBSVENfVEFNUENSX01BU0sgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUFRTICAgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QRlJFUSAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QRkxUICAgICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QUFJDSCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUFBVRElTIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUElFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAxSUUgICB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAxTk9FUkFTRSB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAxTUYgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMklFICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMk5PRVJBU0UgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMk1GKQorI2VsaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorI2RlZmluZSBSVENfVEFNUENSX01BU0sgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUFRTICAgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QRlJFUSAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QRkxUICAgICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QUFJDSCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUFBVRElTIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUElFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAySUUgICB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAyTk9FUkFTRSB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAyTUYgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QM0lFICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QM05PRVJBU0UgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QM01GKQorI2Vsc2UKKyNkZWZpbmUgUlRDX1RBTVBDUl9NQVNLICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfVEFNUENSX1RBTVBUUyAgICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUEZSRVEgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUEZMVCAgICAgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUFBSQ0ggfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBQVURJUyB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMklFICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMk5PRVJBU0UgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMk1GKQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgJiYgUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqICBAYnJpZWYgICBSVEMgVGltZVN0YW1wIGFuZCBUYW1wZXIgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgUlRDIFRpbWVTdGFtcCBhbmQgVGFtcGVyIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgVGltZVN0YW1wIGZlYXR1cmUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgVGltZVN0YW1wLgorICAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGVuYWJsaW5nIHRoZSBUaW1lU3RhbXAgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZVN0YW1wRWRnZSBTcGVjaWZpZXMgdGhlIHBpbiBlZGdlIG9uIHdoaWNoIHRoZSBUaW1lU3RhbXAgaXMKKyAgKiAgICAgICAgIGFjdGl2YXRlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1RJTUVTVEFNUEVER0VfUklTSU5HOiB0aGUgVGltZSBzdGFtcCBldmVudCBvY2N1cnMgb24gdGhlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2Ugb2YgdGhlIHJlbGF0ZWQgcGluLgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1RJTUVTVEFNUEVER0VfRkFMTElORzogdGhlIFRpbWUgc3RhbXAgZXZlbnQgb2NjdXJzIG9uIHRoZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsaW5nIGVkZ2Ugb2YgdGhlIHJlbGF0ZWQgcGluLgorICAqIEBwYXJhbSAgUlRDX1RpbWVTdGFtcFBpbiBzcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgUGluLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QUElOX0RFRkFVTFQ6IFBDMTMgaXMgc2VsZWN0ZWQgYXMgUlRDIFRpbWVTdGFtcCBQaW4gb24gU1RNMzJMMDV4LzZ4Lzd4Lzh4CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBQQTIgb24gU1RNMzJMMDN4LzR4LzJ4LzF4LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZVN0YW1wRWRnZSwgdWludDMyX3QgUlRDX1RpbWVTdGFtcFBpbikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1FU1RBTVBfRURHRShUaW1lU3RhbXBFZGdlKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVElNRVNUQU1QX1BJTihSVENfVGltZVN0YW1wUGluKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIFJUQ19DUiByZWdpc3RlciBhbmQgY2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5DUiAmICh1aW50MzJfdCl+KFJUQ19DUl9UU0VER0UgfCBSVENfQ1JfVFNFKSk7CisKKyAgdG1wcmVnIHw9IFRpbWVTdGFtcEVkZ2U7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ2xlYXIgdGhlIFRpbWVzdGFtcCBGbGFnICovCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UU0YpOworCisgIC8qIENsZWFyIHRoZSBUaW1lc3RhbXAgb3ZlcnJ1biBGbGFnICovCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UU09WRik7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIFN0YW1wIFRTRURHRSBhbmQgRW5hYmxlIGJpdHMgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSID0gKHVpbnQzMl90KXRtcHJlZzsKKworICBfX0hBTF9SVENfVElNRVNUQU1QX0VOQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgVGltZVN0YW1wIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZW5hYmxpbmcgdGhlIFRpbWVTdGFtcCBmZWF0dXJlLgorICAqIEBwYXJhbSAgVGltZVN0YW1wRWRnZSBTcGVjaWZpZXMgdGhlIHBpbiBlZGdlIG9uIHdoaWNoIHRoZSBUaW1lU3RhbXAgaXMKKyAgKiAgICAgICAgIGFjdGl2YXRlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1RJTUVTVEFNUEVER0VfUklTSU5HOiB0aGUgVGltZSBzdGFtcCBldmVudCBvY2N1cnMgb24gdGhlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2Ugb2YgdGhlIHJlbGF0ZWQgcGluLgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1RJTUVTVEFNUEVER0VfRkFMTElORzogdGhlIFRpbWUgc3RhbXAgZXZlbnQgb2NjdXJzIG9uIHRoZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsaW5nIGVkZ2Ugb2YgdGhlIHJlbGF0ZWQgcGluLgorICAqIEBwYXJhbSAgUlRDX1RpbWVTdGFtcFBpbiBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgUGluLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QUElOX0RFRkFVTFQ6IFBDMTMgaXMgc2VsZWN0ZWQgYXMgUlRDIFRpbWVTdGFtcCBQaW4gb24gU1RNMzJMMDV4LzZ4Lzd4Lzh4CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBQQTIgb24gU1RNMzJMMDN4LzR4LzJ4LzF4LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRpbWVTdGFtcF9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZVN0YW1wRWRnZSwgdWludDMyX3QgUlRDX1RpbWVTdGFtcFBpbikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1FU1RBTVBfRURHRShUaW1lU3RhbXBFZGdlKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVElNRVNUQU1QX1BJTihSVENfVGltZVN0YW1wUGluKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIFJUQ19DUiByZWdpc3RlciBhbmQgY2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5DUiAmICh1aW50MzJfdCl+KFJUQ19DUl9UU0VER0UgfCBSVENfQ1JfVFNFKSk7CisKKyAgdG1wcmVnIHw9IFRpbWVTdGFtcEVkZ2U7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ2xlYXIgdGhlIFRpbWVzdGFtcCBGbGFnICovCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UU0YpOworCisgIC8qIENsZWFyIHRoZSBUaW1lc3RhbXAgb3ZlcnJ1biBGbGFnICovCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UU09WRik7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIFN0YW1wIFRTRURHRSBhbmQgRW5hYmxlIGJpdHMgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSID0gKHVpbnQzMl90KXRtcHJlZzsKKworICBfX0hBTF9SVENfVElNRVNUQU1QX0VOQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgSVQgdGltZXN0YW1wICovCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFX0lUKGhydGMsIFJUQ19JVF9UUyk7CisKKyAgLyogUlRDIHRpbWVzdGFtcCBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCisgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0lUKCk7CisKKyAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVhY3RpdmF0ZSBUaW1lU3RhbXAuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlVGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICB1aW50MzJfdCB0bXByZWc7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8KKyAgX19IQUxfUlRDX1RJTUVTVEFNUF9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9UUyk7CisKKyAgLyogR2V0IHRoZSBSVENfQ1IgcmVnaXN0ZXIgYW5kIGNsZWFyIHRoZSBiaXRzIHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+Q1IgJiAodWludDMyX3QpfihSVENfQ1JfVFNFREdFIHwgUlRDX0NSX1RTRSkpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgVGltZSBTdGFtcCBUU0VER0UgYW5kIEVuYWJsZSBiaXRzICovCisgIGhydGMtPkluc3RhbmNlLT5DUiA9ICh1aW50MzJfdCl0bXByZWc7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgUlRDIFRpbWVTdGFtcCB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc1RpbWVTdGFtcCBQb2ludGVyIHRvIFRpbWUgc3RydWN0dXJlCisgICogQHBhcmFtICBzVGltZVN0YW1wRGF0ZSBQb2ludGVyIHRvIERhdGUgc3RydWN0dXJlCisgICogQHBhcmFtICBGb3JtYXQgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0dldFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RpbWVUeXBlRGVmICpzVGltZVN0YW1wLCBSVENfRGF0ZVR5cGVEZWYgKnNUaW1lU3RhbXBEYXRlLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IHRtcHRpbWUsIHRtcGRhdGU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisKKyAgLyogR2V0IHRoZSBUaW1lU3RhbXAgdGltZSBhbmQgZGF0ZSByZWdpc3RlcnMgdmFsdWVzICovCisgIHRtcHRpbWUgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5UU1RSICYgUlRDX1RSX1JFU0VSVkVEX01BU0spOworICB0bXBkYXRlID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+VFNEUiAmIFJUQ19EUl9SRVNFUlZFRF9NQVNLKTsKKworICAvKiBGaWxsIHRoZSBUaW1lIHN0cnVjdHVyZSBmaWVsZHMgd2l0aCB0aGUgcmVhZCBwYXJhbWV0ZXJzICovCisgIHNUaW1lU3RhbXAtPkhvdXJzID0gKHVpbnQ4X3QpKCh0bXB0aW1lICYgKFJUQ19UUl9IVCB8IFJUQ19UUl9IVSkpID4+IDE2VSk7CisgIHNUaW1lU3RhbXAtPk1pbnV0ZXMgPSAodWludDhfdCkoKHRtcHRpbWUgJiAoUlRDX1RSX01OVCB8IFJUQ19UUl9NTlUpKSA+PiA4VSk7CisgIHNUaW1lU3RhbXAtPlNlY29uZHMgPSAodWludDhfdCkodG1wdGltZSAmIChSVENfVFJfU1QgfCBSVENfVFJfU1UpKTsKKyAgc1RpbWVTdGFtcC0+VGltZUZvcm1hdCA9ICh1aW50OF90KSgodG1wdGltZSAmIChSVENfVFJfUE0pKSA+PiAxNlUpOworICBzVGltZVN0YW1wLT5TdWJTZWNvbmRzID0gKHVpbnQzMl90KSBocnRjLT5JbnN0YW5jZS0+VFNTU1I7CisKKyAgLyogRmlsbCB0aGUgRGF0ZSBzdHJ1Y3R1cmUgZmllbGRzIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICBzVGltZVN0YW1wRGF0ZS0+WWVhciA9IDBVOworICBzVGltZVN0YW1wRGF0ZS0+TW9udGggPSAodWludDhfdCkoKHRtcGRhdGUgJiAoUlRDX0RSX01UIHwgUlRDX0RSX01VKSkgPj4gOFUpOworICBzVGltZVN0YW1wRGF0ZS0+RGF0ZSA9ICh1aW50OF90KSh0bXBkYXRlICYgKFJUQ19EUl9EVCB8IFJUQ19EUl9EVSkpOworICBzVGltZVN0YW1wRGF0ZS0+V2Vla0RheSA9ICh1aW50OF90KSgodG1wZGF0ZSAmIChSVENfRFJfV0RVKSkgPj4gMTNVKTsKKworICAvKiBDaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3JtYXQgKi8KKyAgaWYgKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikKKyAgeworICAgIC8qIENvbnZlcnQgdGhlIFRpbWVTdGFtcCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB0byBCaW5hcnkgZm9ybWF0ICovCisgICAgc1RpbWVTdGFtcC0+SG91cnMgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wLT5Ib3Vycyk7CisgICAgc1RpbWVTdGFtcC0+TWludXRlcyA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNUaW1lU3RhbXAtPk1pbnV0ZXMpOworICAgIHNUaW1lU3RhbXAtPlNlY29uZHMgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wLT5TZWNvbmRzKTsKKworICAgIC8qIENvbnZlcnQgdGhlIERhdGVUaW1lU3RhbXAgc3RydWN0dXJlIHBhcmFtZXRlcnMgdG8gQmluYXJ5IGZvcm1hdCAqLworICAgIHNUaW1lU3RhbXBEYXRlLT5Nb250aCA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNUaW1lU3RhbXBEYXRlLT5Nb250aCk7CisgICAgc1RpbWVTdGFtcERhdGUtPkRhdGUgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wRGF0ZS0+RGF0ZSk7CisgICAgc1RpbWVTdGFtcERhdGUtPldlZWtEYXkgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wRGF0ZS0+V2Vla0RheSk7CisgIH0KKworICAvKiBDbGVhciB0aGUgVElNRVNUQU1QIEZsYWdzICovCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UU0YpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFRhbXBlcgorICAqIEBub3RlICAgQnkgY2FsbGluZyB0aGlzIEFQSSB3ZSBkaXNhYmxlIHRoZSB0YW1wZXIgaW50ZXJydXB0IGZvciBhbGwgdGFtcGVycy4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc1RhbXBlciBQb2ludGVyIHRvIFRhbXBlciBTdHJ1Y3R1cmUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGFtcGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGFtcGVyVHlwZURlZiAqc1RhbXBlcikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSKHNUYW1wZXItPlRhbXBlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9UUklHR0VSKHNUYW1wZXItPlRyaWdnZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfRVJBU0VfTU9ERShzVGFtcGVyLT5Ob0VyYXNlKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX01BU0tGTEFHX1NUQVRFKHNUYW1wZXItPk1hc2tGbGFnKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX0ZJTFRFUihzVGFtcGVyLT5GaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfU0FNUExJTkdfRlJFUShzVGFtcGVyLT5TYW1wbGluZ0ZyZXF1ZW5jeSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9QUkVDSEFSR0VfRFVSQVRJT04oc1RhbXBlci0+UHJlY2hhcmdlRHVyYXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfUFVMTFVQX1NUQVRFKHNUYW1wZXItPlRhbXBlclB1bGxVcCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04oc1RhbXBlci0+VGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIENvbmZpZ3VyZSB0aGUgdGFtcGVyIHRyaWdnZXIgKi8KKyAgaWYgKHNUYW1wZXItPlRyaWdnZXIgIT0gUlRDX1RBTVBFUlRSSUdHRVJfUklTSU5HRURHRSkKKyAgeworICAgIHNUYW1wZXItPlRyaWdnZXIgPSAodWludDMyX3QpKHNUYW1wZXItPlRhbXBlciA8PCAxVSk7CisgIH0KKworICBpZiAoc1RhbXBlci0+Tm9FcmFzZSAhPSBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9FTkFCTEUpCisgIHsKKyAgICBzVGFtcGVyLT5Ob0VyYXNlID0gMFU7CisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorICAgIGlmICgoc1RhbXBlci0+VGFtcGVyICYgUlRDX1RBTVBFUl8xKSAhPSAwVSkKKyAgICB7CisgICAgICBzVGFtcGVyLT5Ob0VyYXNlIHw9IFJUQ19UQU1QQ1JfVEFNUDFOT0VSQVNFOworICAgIH0KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisgICAgaWYgKChzVGFtcGVyLT5UYW1wZXIgJiBSVENfVEFNUEVSXzIpICE9IDBVKQorICAgIHsKKyAgICAgIHNUYW1wZXItPk5vRXJhc2UgfD0gUlRDX1RBTVBDUl9UQU1QMk5PRVJBU0U7CisgICAgfQorI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyAgICBpZiAoKHNUYW1wZXItPlRhbXBlciAmIFJUQ19UQU1QRVJfMykgIT0gMFUpCisgICAgeworICAgICAgc1RhbXBlci0+Tm9FcmFzZSB8PSBSVENfVEFNUENSX1RBTVAzTk9FUkFTRTsKKyAgICB9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworICB9CisKKyAgaWYgKHNUYW1wZXItPk1hc2tGbGFnICE9IFJUQ19UQU1QRVJNQVNLX0ZMQUdfRElTQUJMRSkKKyAgeworICAgIHNUYW1wZXItPk1hc2tGbGFnID0gMFU7CisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorICAgIGlmICgoc1RhbXBlci0+VGFtcGVyICYgUlRDX1RBTVBFUl8xKSAhPSAwVSkKKyAgICB7CisgICAgICBzVGFtcGVyLT5NYXNrRmxhZyB8PSBSVENfVEFNUENSX1RBTVAxTUY7CisgICAgfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKyAgICBpZiAoKHNUYW1wZXItPlRhbXBlciAmIFJUQ19UQU1QRVJfMikgIT0gMFUpCisgICAgeworICAgICAgc1RhbXBlci0+TWFza0ZsYWcgfD0gUlRDX1RBTVBDUl9UQU1QMk1GOworICAgIH0KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisgICAgaWYgKChzVGFtcGVyLT5UYW1wZXIgJiBSVENfVEFNUEVSXzMpICE9IDBVKQorICAgIHsKKyAgICAgIHNUYW1wZXItPk1hc2tGbGFnIHw9IFJUQ19UQU1QQ1JfVEFNUDNNRjsKKyAgICB9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworICB9CisKKyAgLyogQ29uZmlndXJlIHRoZSBSVENfVEFNUENSIHJlZ2lzdGVyICovCisgIHRtcHJlZyA9ICh1aW50MzJfdCkoKHVpbnQzMl90KXNUYW1wZXItPlRhbXBlciB8ICh1aW50MzJfdClzVGFtcGVyLT5UcmlnZ2VyICB8ICh1aW50MzJfdClzVGFtcGVyLT5Ob0VyYXNlIHwgXAorICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClzVGFtcGVyLT5NYXNrRmxhZyB8ICh1aW50MzJfdClzVGFtcGVyLT5GaWx0ZXIgfCAodWludDMyX3Qpc1RhbXBlci0+U2FtcGxpbmdGcmVxdWVuY3kgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXNUYW1wZXItPlByZWNoYXJnZUR1cmF0aW9uIHwgKHVpbnQzMl90KXNUYW1wZXItPlRhbXBlclB1bGxVcCB8ICh1aW50MzJfdClzVGFtcGVyLT5UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbik7CisKKyAgaHJ0Yy0+SW5zdGFuY2UtPlRBTVBDUiAmPSAodWludDMyX3QpfigodWludDMyX3Qpc1RhbXBlci0+VGFtcGVyIHwgKHVpbnQzMl90KShzVGFtcGVyLT5UYW1wZXIgPDwgMSkgfCBSVENfVEFNUENSX01BU0spOworCisgIGhydGMtPkluc3RhbmNlLT5UQU1QQ1IgfD0gdG1wcmVnOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBUYW1wZXIgd2l0aCBpbnRlcnJ1cHQuCisgICogQG5vdGUgICBCeSBjYWxsaW5nIHRoaXMgQVBJIHdlIGZvcmNlIHRoZSB0YW1wZXIgaW50ZXJydXB0IGZvciBhbGwgdGFtcGVycy4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc1RhbXBlciBQb2ludGVyIHRvIFJUQyBUYW1wZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGFtcGVyX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGFtcGVyVHlwZURlZiAqc1RhbXBlcikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSKHNUYW1wZXItPlRhbXBlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9JTlRFUlJVUFQoc1RhbXBlci0+SW50ZXJydXB0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1RSSUdHRVIoc1RhbXBlci0+VHJpZ2dlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9FUkFTRV9NT0RFKHNUYW1wZXItPk5vRXJhc2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfTUFTS0ZMQUdfU1RBVEUoc1RhbXBlci0+TWFza0ZsYWcpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfRklMVEVSKHNUYW1wZXItPkZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9TQU1QTElOR19GUkVRKHNUYW1wZXItPlNhbXBsaW5nRnJlcXVlbmN5KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTihzVGFtcGVyLT5QcmVjaGFyZ2VEdXJhdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9QVUxMVVBfU1RBVEUoc1RhbXBlci0+VGFtcGVyUHVsbFVwKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTihzVGFtcGVyLT5UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIHRoZSB0YW1wZXIgdHJpZ2dlciAqLworICBpZiAoc1RhbXBlci0+VHJpZ2dlciAhPSBSVENfVEFNUEVSVFJJR0dFUl9SSVNJTkdFREdFKQorICB7CisgICAgc1RhbXBlci0+VHJpZ2dlciA9ICh1aW50MzJfdCkoc1RhbXBlci0+VGFtcGVyIDw8IDFVKTsKKyAgfQorCisgIGlmIChzVGFtcGVyLT5Ob0VyYXNlICE9IFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0VOQUJMRSkKKyAgeworICAgIHNUYW1wZXItPk5vRXJhc2UgPSAwVTsKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisgICAgaWYgKChzVGFtcGVyLT5UYW1wZXIgJiBSVENfVEFNUEVSXzEpICE9IDBVKQorICAgIHsKKyAgICAgIHNUYW1wZXItPk5vRXJhc2UgfD0gUlRDX1RBTVBDUl9UQU1QMU5PRVJBU0U7CisgICAgfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKyAgICBpZiAoKHNUYW1wZXItPlRhbXBlciAmIFJUQ19UQU1QRVJfMikgIT0gMFUpCisgICAgeworICAgICAgc1RhbXBlci0+Tm9FcmFzZSB8PSBSVENfVEFNUENSX1RBTVAyTk9FUkFTRTsKKyAgICB9CisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorICAgIGlmICgoc1RhbXBlci0+VGFtcGVyICYgUlRDX1RBTVBFUl8zKSAhPSAwVSkKKyAgICB7CisgICAgICBzVGFtcGVyLT5Ob0VyYXNlIHw9IFJUQ19UQU1QQ1JfVEFNUDNOT0VSQVNFOworICAgIH0KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisgIH0KKworICBpZiAoc1RhbXBlci0+TWFza0ZsYWcgIT0gUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFKQorICB7CisgICAgc1RhbXBlci0+TWFza0ZsYWcgPSAwVTsKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisgICAgaWYgKChzVGFtcGVyLT5UYW1wZXIgJiBSVENfVEFNUEVSXzEpICE9IDBVKQorICAgIHsKKyAgICAgIHNUYW1wZXItPk1hc2tGbGFnIHw9IFJUQ19UQU1QQ1JfVEFNUDFNRjsKKyAgICB9CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworICAgIGlmICgoc1RhbXBlci0+VGFtcGVyICYgUlRDX1RBTVBFUl8yKSAhPSAwVSkKKyAgICB7CisgICAgICBzVGFtcGVyLT5NYXNrRmxhZyB8PSBSVENfVEFNUENSX1RBTVAyTUY7CisgICAgfQorI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyAgICBpZiAoKHNUYW1wZXItPlRhbXBlciAmIFJUQ19UQU1QRVJfMykgIT0gMFUpCisgICAgeworICAgICAgc1RhbXBlci0+TWFza0ZsYWcgfD0gUlRDX1RBTVBDUl9UQU1QM01GOworICAgIH0KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIFJUQ19UQU1QQ1IgcmVnaXN0ZXIgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KSgodWludDMyX3Qpc1RhbXBlci0+VGFtcGVyIHwgKHVpbnQzMl90KXNUYW1wZXItPkludGVycnVwdCB8ICh1aW50MzJfdClzVGFtcGVyLT5UcmlnZ2VyICB8ICh1aW50MzJfdClzVGFtcGVyLT5Ob0VyYXNlIHwgXAorICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClzVGFtcGVyLT5NYXNrRmxhZyB8ICh1aW50MzJfdClzVGFtcGVyLT5GaWx0ZXIgfCAodWludDMyX3Qpc1RhbXBlci0+U2FtcGxpbmdGcmVxdWVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClzVGFtcGVyLT5QcmVjaGFyZ2VEdXJhdGlvbiB8ICh1aW50MzJfdClzVGFtcGVyLT5UYW1wZXJQdWxsVXAgfCAodWludDMyX3Qpc1RhbXBlci0+VGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb24pOworCisgIGhydGMtPkluc3RhbmNlLT5UQU1QQ1IgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KXNUYW1wZXItPlRhbXBlciB8ICh1aW50MzJfdCkoc1RhbXBlci0+VGFtcGVyIDw8IDEpIHwgUlRDX1RBTVBDUl9NQVNLKTsKKworICBocnRjLT5JbnN0YW5jZS0+VEFNUENSIHw9IHRtcHJlZzsKKworICAvKiBSVEMgVGFtcGVyIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KKyAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfSVQoKTsKKworICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgVGFtcGVyLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUYW1wZXIgU2VsZWN0ZWQgdGFtcGVyIHBpbi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIFJUQ19UQU1QRVJfMSwgUlRDX1RBTVBFUl8yIGFuZCBSVENfVEFNUEVSXzMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVRhbXBlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGFtcGVyKQoreworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUihUYW1wZXIpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFRhbXBlciBwaW4gKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPlRBTVBDUiAmPSAoKHVpbnQzMl90KX5UYW1wZXIpOworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorICBpZiAoKFRhbXBlciAmIFJUQ19UQU1QRVJfMSkgIT0gMFUpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBUYW1wZXIxIGludGVycnVwdCAqLworICAgIGhydGMtPkluc3RhbmNlLT5UQU1QQ1IgJj0gKCh1aW50MzJfdCl+KFJUQ19JVF9UQU1QIHwgUlRDX0lUX1RBTVAxKSk7CisgIH0KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisgIGlmICgoVGFtcGVyICYgUlRDX1RBTVBFUl8yKSAhPSAwVSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFRhbXBlcjIgaW50ZXJydXB0ICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPlRBTVBDUiAmPSAoKHVpbnQzMl90KX4oUlRDX0lUX1RBTVAgfCBSVENfSVRfVEFNUDIpKTsKKyAgfQorI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyAgaWYgKChUYW1wZXIgJiBSVENfVEFNUEVSXzMpICE9IDBVKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgVGFtcGVyMyBpbnRlcnJ1cHQgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+VEFNUENSICY9ICgodWludDMyX3QpfihSVENfSVRfVEFNUCB8IFJUQ19JVF9UQU1QMykpOworICB9CisKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFRpbWVTdGFtcCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDRXhfVGFtcGVyVGltZVN0YW1wSVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogR2V0IHRoZSBUaW1lU3RhbXAgaW50ZXJydXB0IHNvdXJjZSBlbmFibGUgc3RhdHVzICovCisgIGlmIChfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX1RTKSAhPSAwVSkKKyAgeworICAgIC8qIEdldCB0aGUgcGVuZGluZyBzdGF0dXMgb2YgdGhlIFRJTUVTVEFNUCBJbnRlcnJ1cHQgKi8KKyAgICBpZiAoX19IQUxfUlRDX1RJTUVTVEFNUF9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UU0YpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIFRJTUVTVEFNUCBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhydGMtPlRpbWVTdGFtcEV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgICAgSEFMX1JUQ0V4X1RpbWVTdGFtcEV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAgIC8qIENsZWFyIHRoZSBUSU1FU1RBTVAgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICBfX0hBTF9SVENfVElNRVNUQU1QX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNGKTsKKyAgICB9CisgIH0KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyAgLyogR2V0IHRoZSBUYW1wZXIxIGludGVycnVwdHMgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYgKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0lUX1NPVVJDRShocnRjLCBSVENfSVRfVEFNUCB8IFJUQ19JVF9UQU1QMSkgIT0gMFUpCisgIHsKKyAgICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBUYW1wZXIxIEludGVycnVwdCAqLworICAgIGlmIChfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1RBTVAxRikgIT0gMFUpCisgICAgeworICAgICAgLyogVGFtcGVyMSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhydGMtPlRhbXBlcjFFdmVudENhbGxiYWNrKGhydGMpOworI2Vsc2UKKyAgICAgIEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgICAgLyogQ2xlYXIgdGhlIFRhbXBlcjEgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICBfX0hBTF9SVENfVEFNUEVSX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDFGKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisKKworICAvKiBHZXQgdGhlIFRhbXBlcjIgaW50ZXJydXB0cyBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZiAoX19IQUxfUlRDX1RBTVBFUl9HRVRfSVRfU09VUkNFKGhydGMsIFJUQ19JVF9UQU1QIHwgUlRDX0lUX1RBTVAyKSAhPSAwVSkKKyAgeworICAgIC8qIEdldCB0aGUgcGVuZGluZyBzdGF0dXMgb2YgdGhlIFRhbXBlcjIgSW50ZXJydXB0ICovCisgICAgaWYgKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDJGKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBUYW1wZXIyIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHJ0Yy0+VGFtcGVyMkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgICAgSEFMX1JUQ0V4X1RhbXBlcjJFdmVudENhbGxiYWNrKGhydGMpOworI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgICAvKiBDbGVhciB0aGUgVGFtcGVyMiBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICAgIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QMkYpOworICAgIH0KKyAgfQorCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorICAvKiBHZXQgdGhlIFRhbXBlcjMgaW50ZXJydXB0cyBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZiAoX19IQUxfUlRDX1RBTVBFUl9HRVRfSVRfU09VUkNFKGhydGMsIFJUQ19JVF9UQU1QIHwgUlRDX0lUX1RBTVAzKSAhPSAwVSkKKyAgeworICAgIC8qIEdldCB0aGUgcGVuZGluZyBzdGF0dXMgb2YgdGhlIFRhbXBlcjMgSW50ZXJydXB0ICovCisgICAgaWYgKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDNGKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBUYW1wZXIzIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHJ0Yy0+VGFtcGVyM0V2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgICAgSEFMX1JUQ0V4X1RhbXBlcjNFdmVudENhbGxiYWNrKGhydGMpOworI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgICAvKiBDbGVhciB0aGUgVGFtcGVyMyBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICAgIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QM0YpOworICAgIH0KKyAgfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKworICAvKiBDbGVhciB0aGUgRVhUSSdzIEZsYWcgZm9yIFJUQyBUaW1lU3RhbXAgYW5kIFRhbXBlciAqLworICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0NMRUFSX0ZMQUcoKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lU3RhbXAgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9UaW1lU3RhbXBFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ0V4X1RpbWVTdGFtcEV2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAqLworfQorCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBUYW1wZXIgMSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ0V4X1RhbXBlcjFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ0V4X1RhbXBlcjFFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIFRhbXBlciAyIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDRXhfVGFtcGVyMkV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhydGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUlRDRXhfVGFtcGVyMkV2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgVGFtcGVyIDMgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9UYW1wZXIzRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9UYW1wZXIzRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgVGltZVN0YW1wIHBvbGxpbmcgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRpbWVTdGFtcEV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIHdoaWxlIChfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1RTRikgPT0gMFUpCisgIHsKKyAgICBpZiAoX19IQUxfUlRDX1RJTUVTVEFNUF9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UU09WRikgIT0gMFUpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFRJTUVTVEFNUCBPdmVyUnVuIEZsYWcgKi8KKyAgICAgIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UU09WRik7CisKKyAgICAgIC8qIENoYW5nZSBUSU1FU1RBTVAgc3RhdGUgKi8KKyAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBUYW1wZXIgMSBQb2xsaW5nLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyMUV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KKyAgd2hpbGUgKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDFGKSA9PSAwVSkKKyAgeworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgdGhlIFRhbXBlciBGbGFnICovCisgIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QMUYpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBUYW1wZXIgMiBQb2xsaW5nLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyMkV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KKyAgd2hpbGUgKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDJGKSA9PSAwVSkKKyAgeworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgdGhlIFRhbXBlciBGbGFnICovCisgIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QMkYpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBUYW1wZXIgMyBQb2xsaW5nLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyM0V2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KKyAgd2hpbGUgKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDNGKSA9PSAwVSkKKyAgeworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgdGhlIFRhbXBlciBGbGFnICovCisgIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QM0YpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEBicmllZiAgICBSVEMgV2FrZS11cCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUlRDIFdha2UtdXAgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgWy4uXSBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBXYWtlLXVwIGZlYXR1cmUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgd2FrZSB1cCB0aW1lci4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgV2FrZVVwQ291bnRlciBXYWtlIHVwIGNvdW50ZXIKKyAgKiBAcGFyYW0gIFdha2VVcENsb2NrIFdha2UgdXAgY2xvY2sKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DTE9DSyhXYWtlVXBDbG9jaykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DT1VOVEVSKFdha2VVcENvdW50ZXIpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qQ2hlY2sgUlRDIFdVVFdGIGZsYWcgaXMgcmVzZXQgb25seSB3aGVuIHdha2UgdXAgdGltZXIgZW5hYmxlZCovCisgIGlmICgoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX1dVVEUpICE9IDBVKQorICB7CisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIFdhaXQgdGlsbCBSVEMgV1VUV0YgZmxhZyBpcyByZXNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUgKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRXRikgPT0gMVUpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFKGhydGMpOworCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgIHdoaWxlIChfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VUV0YpID09IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBDbGVhciB0aGUgV2FrZXVwIFRpbWVyIGNsb2NrIHNvdXJjZSBiaXRzIGluIENSIHJlZ2lzdGVyICovCisgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpflJUQ19DUl9XVUNLU0VMOworCisgIC8qIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlICovCisgIGhydGMtPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpV2FrZVVwQ2xvY2s7CisKKyAgLyogQ29uZmlndXJlIHRoZSBXYWtldXAgVGltZXIgY291bnRlciAqLworICBocnRjLT5JbnN0YW5jZS0+V1VUUiA9ICh1aW50MzJfdClXYWtlVXBDb3VudGVyOworCisgIC8qIEVuYWJsZSB0aGUgV2FrZXVwIFRpbWVyICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB3YWtlIHVwIHRpbWVyIHdpdGggaW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBXYWtlVXBDb3VudGVyIFdha2UgdXAgY291bnRlcgorICAqIEBwYXJhbSAgV2FrZVVwQ2xvY2sgV2FrZSB1cCBjbG9jaworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFdha2VVcFRpbWVyX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBXYWtlVXBDb3VudGVyLCB1aW50MzJfdCBXYWtlVXBDbG9jaykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfV0FLRVVQX0NMT0NLKFdha2VVcENsb2NrKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfV0FLRVVQX0NPVU5URVIoV2FrZVVwQ291bnRlcikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLypDaGVjayBSVEMgV1VUV0YgZmxhZyBpcyByZXNldCBvbmx5IHdoZW4gd2FrZSB1cCB0aW1lciBlbmFibGVkKi8KKyAgaWYgKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfV1VURSkgIT0gMFUpCisgIHsKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHJlc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB3aGlsZSAoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVFdGKSA9PSAxVSkKKyAgICB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIERpc2FibGUgdGhlIFdha2UtVXAgdGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ2xlYXIgZmxhZyBXYWtlLVVwICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpOworCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgIHdoaWxlIChfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VUV0YpID09IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIFdha2V1cCBUaW1lciBjb3VudGVyICovCisgIGhydGMtPkluc3RhbmNlLT5XVVRSID0gKHVpbnQzMl90KVdha2VVcENvdW50ZXI7CisKKyAgLyogQ2xlYXIgdGhlIFdha2V1cCBUaW1lciBjbG9jayBzb3VyY2UgYml0cyBpbiBDUiByZWdpc3RlciAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfV1VDS1NFTDsKKworICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KVdha2VVcENsb2NrOworCisgIC8qIFJUQyBXYWtlVXBUaW1lciBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpOworCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgSW50ZXJydXB0IGluIHRoZSBSVENfQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRV9JVChocnRjLCBSVENfSVRfV1VUKTsKKworICAvKiBFbmFibGUgdGhlIFdha2V1cCBUaW1lciAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIHdha2UgdXAgdGltZXIgY291bnRlci4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVXYWtlVXBUaW1lcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogRGlzYWJsZSB0aGUgV2FrZXVwIFRpbWVyICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFKGhydGMpOworCisgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRV9JVChocnRjLCBSVENfSVRfV1VUKTsKKworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAvKiBXYWl0IHRpbGwgUlRDIFdVVFdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgd2hpbGUgKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRXRikgPT0gMFUpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgd2FrZSB1cCB0aW1lciBjb3VudGVyLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBDb3VudGVyIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfUlRDRXhfR2V0V2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIEdldCB0aGUgY291bnRlciB2YWx1ZSAqLworICByZXR1cm4gKCh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPldVVFIgJiBSVENfV1VUUl9XVVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgV2FrZSBVcCBUaW1lciBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDRXhfV2FrZVVwVGltZXJJUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBXQUtFVVBUSU1FUiBJbnRlcnJ1cHQgKi8KKyAgaWYgKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKSAhPSAwVSkKKyAgeworICAgIC8qIFdBS0VVUFRJTUVSIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhydGMtPldha2VVcFRpbWVyRXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbHNlCisgICAgSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIC8qIENsZWFyIHRoZSBXQUtFVVBUSU1FUiBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKTsKKyAgfQorCisgIC8qIENsZWFyIHRoZSBFWFRJJ3MgbGluZSBGbGFnIGZvciBSVEMgV2FrZVVwVGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfQ0xFQVJfRkxBRygpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdha2UgVXAgVGltZXIgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhydGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgV2FrZSBVcCBUaW1lciBQb2xsaW5nLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yV2FrZVVwVGltZXJFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICB3aGlsZSAoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpID09IDBVKQorICB7CisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENsZWFyIHRoZSBXQUtFVVBUSU1FUiBGbGFnICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBXcml0ZSBhIGRhdGEgaW4gYSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIHJlZ2lzdGVyCisgICAgICAoKykgUmVhZCBhIGRhdGEgaW4gYSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIHJlZ2lzdGVyCisgICAgICAoKykgU2V0IHRoZSBDb2Fyc2UgY2FsaWJyYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICgrKSBEZWFjdGl2YXRlIHRoZSBDb2Fyc2UgY2FsaWJyYXRpb24gcGFyYW1ldGVycworICAgICAgKCspIFNldCB0aGUgU21vb3RoIGNhbGlicmF0aW9uIHBhcmFtZXRlcnMuCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBTeW5jaHJvbml6YXRpb24gU2hpZnQgQ29udHJvbCBTZXR0aW5ncy4KKyAgICAgICgrKSBDb25maWd1cmUgdGhlIENhbGlicmF0aW9uIFBpbm91dCAoUlRDX0NBTElCKSBTZWxlY3Rpb24gKDFIeiBvciA1MTJIeikuCisgICAgICAoKykgRGVhY3RpdmF0ZSB0aGUgQ2FsaWJyYXRpb24gUGlub3V0IChSVENfQ0FMSUIpIFNlbGVjdGlvbiAoMUh6IG9yIDUxMkh6KS4KKyAgICAgICgrKSBFbmFibGUgdGhlIFJUQyByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uLgorICAgICAgKCspIERpc2FibGUgdGhlIFJUQyByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uLgorICAgICAgKCspIEVuYWJsZSB0aGUgQnlwYXNzIFNoYWRvdyBmZWF0dXJlLgorICAgICAgKCspIERpc2FibGUgdGhlIEJ5cGFzcyBTaGFkb3cgZmVhdHVyZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIGRhdGEgaW4gYSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBCYWNrdXBSZWdpc3RlciBSVEMgQmFja3VwIGRhdGEgUmVnaXN0ZXIgbnVtYmVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogUlRDX0JLUF9EUnggd2hlcmUgeCBjYW4gYmUgZnJvbSAwIHRvIDE5IHRvCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIERhdGEgRGF0YSB0byBiZSB3cml0dGVuIGluIHRoZSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIHJlZ2lzdGVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDRXhfQktVUFdyaXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBCYWNrdXBSZWdpc3RlciwgdWludDMyX3QgRGF0YSkKK3sKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQktQKEJhY2t1cFJlZ2lzdGVyKSk7CisKKyAgdG1wID0gKHVpbnQzMl90KSAmIChocnRjLT5JbnN0YW5jZS0+QktQMFIpOworICB0bXAgKz0gKEJhY2t1cFJlZ2lzdGVyICogNFUpOworCisgIC8qIFdyaXRlIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgKi8KKyAgKihfX0lPIHVpbnQzMl90ICopdG1wID0gKHVpbnQzMl90KURhdGE7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZHMgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIFJlZ2lzdGVyLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBCYWNrdXBSZWdpc3RlciBSVEMgQmFja3VwIGRhdGEgUmVnaXN0ZXIgbnVtYmVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogUlRDX0JLUF9EUnggd2hlcmUgeCBjYW4gYmUgZnJvbSAwIHRvIDE5IHRvCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSByZWdpc3Rlci4KKyAgKiBAcmV0dmFsIFJlYWQgdmFsdWUKKyAgKi8KK3VpbnQzMl90IEhBTF9SVENFeF9CS1VQUmVhZChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIpCit7CisgIHVpbnQzMl90IHRtcDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0JLUChCYWNrdXBSZWdpc3RlcikpOworCisgIHRtcCA9ICh1aW50MzJfdCkgJiAoaHJ0Yy0+SW5zdGFuY2UtPkJLUDBSKTsKKyAgdG1wICs9IChCYWNrdXBSZWdpc3RlciAqIDRVKTsKKworICAvKiBSZWFkIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgKi8KKyAgcmV0dXJuICgqKF9fSU8gdWludDMyX3QgKil0bXApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgU21vb3RoIGNhbGlicmF0aW9uIHBhcmFtZXRlcnMuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFNtb290aENhbGliUGVyaW9kIFNlbGVjdCB0aGUgU21vb3RoIENhbGlicmF0aW9uIFBlcmlvZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyA6CisgICogICAgICAgICAgICAgQGFyZyBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzMyU0VDOiBUaGUgc21vb3RoIGNhbGlicmF0aW9uIHBlcmlvZCBpcyAzMnMuCisgICogICAgICAgICAgICAgQGFyZyBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzE2U0VDOiBUaGUgc21vb3RoIGNhbGlicmF0aW9uIHBlcmlvZCBpcyAxNnMuCisgICogICAgICAgICAgICAgQGFyZyBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzhTRUM6IFRoZSBzbW9vdGggY2FsaWJyYXRpb24gcGVyaW9kIGlzIDhzLgorICAqIEBwYXJhbSAgU21vb3RoQ2FsaWJQbHVzUHVsc2VzIFNlbGVjdCB0byBTZXQgb3IgcmVzZXQgdGhlIENBTFAgYml0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfU01PT1RIQ0FMSUJfUExVU1BVTFNFU19TRVQ6IEFkZCBvbmUgUlRDQ0xLIHB1bHNlIGV2ZXJ5IDIqMTEgcHVsc2VzLgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfUkVTRVQ6IE5vIFJUQ0NMSyBwdWxzZXMgYXJlIGFkZGVkLgorICAqIEBwYXJhbSAgU21vb3RoQ2FsaWJNaW51c1B1bHNlc1ZhbHVlIFNlbGVjdCB0aGUgdmFsdWUgb2YgQ0FMTVs4OjBdIGJpdHMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBhbnkgdmFsdWUgZnJvbSAwIHRvIDB4MDAwMDAxRkYuCisgICogQG5vdGUgICBUbyBkZWFjdGl2YXRlIHRoZSBzbW9vdGggY2FsaWJyYXRpb24sIHRoZSBmaWVsZCBTbW9vdGhDYWxpYlBsdXNQdWxzZXMKKyAgKiAgICAgICAgIG11c3QgYmUgZXF1YWwgdG8gU01PT1RIQ0FMSUJfUExVU1BVTFNFU19SRVNFVCBhbmQgdGhlIGZpZWxkCisgICogICAgICAgICBTbW9vdGhDYWxpYk1pbnVzUHVsc2VzVmFsdWUgbXV0IGJlIGVxdWFsIHRvIDAuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0U21vb3RoQ2FsaWIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFNtb290aENhbGliUGVyaW9kLCB1aW50MzJfdCBTbW9vdGhDYWxpYlBsdXNQdWxzZXMsIHVpbnQzMl90IFNtb290aENhbGliTWludXNQdWxzZXNWYWx1ZSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfU01PT1RIX0NBTElCX1BFUklPRChTbW9vdGhDYWxpYlBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NNT09USF9DQUxJQl9QTFVTKFNtb290aENhbGliUGx1c1B1bHNlcykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NNT09USF9DQUxJQl9NSU5VUyhTbW9vdGhDYWxpYk1pbnVzUHVsc2VzVmFsdWUpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIGNoZWNrIGlmIGEgY2FsaWJyYXRpb24gaXMgcGVuZGluZyovCisgIGlmICgoaHJ0Yy0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfUkVDQUxQRikgIT0gMFUpCisgIHsKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogY2hlY2sgaWYgYSBjYWxpYnJhdGlvbiBpcyBwZW5kaW5nKi8KKyAgICB3aGlsZSAoKGhydGMtPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX1JFQ0FMUEYpICE9IDBVKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgU21vb3RoIGNhbGlicmF0aW9uIHNldHRpbmdzICovCisgIGhydGMtPkluc3RhbmNlLT5DQUxSID0gKHVpbnQzMl90KSgodWludDMyX3QpU21vb3RoQ2FsaWJQZXJpb2QgfCAodWludDMyX3QpU21vb3RoQ2FsaWJQbHVzUHVsc2VzIHwgKHVpbnQzMl90KVNtb290aENhbGliTWludXNQdWxzZXNWYWx1ZSk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTeW5jaHJvbml6YXRpb24gU2hpZnQgQ29udHJvbCBTZXR0aW5ncy4KKyAgKiBAbm90ZSAgIFdoZW4gUkVGQ0tPTiBpcyBzZXQsIGZpcm13YXJlIG11c3Qgbm90IHdyaXRlIHRvIFNoaWZ0IGNvbnRyb2wgcmVnaXN0ZXIuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFNoaWZ0QWRkMVMgU2VsZWN0IHRvIGFkZCBvciBub3QgMSBzZWNvbmQgdG8gdGhlIHRpbWUgY2FsZW5kYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyA6CisgICogICAgICAgICAgICAgQGFyZyBSVENfU0hJRlRBREQxU19TRVQ6IEFkZCBvbmUgc2Vjb25kIHRvIHRoZSBjbG9jayBjYWxlbmRhci4KKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19TSElGVEFERDFTX1JFU0VUOiBObyBlZmZlY3QuCisgICogQHBhcmFtICBTaGlmdFN1YkZTIFNlbGVjdCB0aGUgbnVtYmVyIG9mIFNlY29uZCBGcmFjdGlvbnMgdG8gc3Vic3RpdHV0ZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIGFueSB2YWx1ZSBmcm9tIDAgdG8gMHg3RkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFN5bmNocm9TaGlmdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgU2hpZnRBZGQxUywgdWludDMyX3QgU2hpZnRTdWJGUykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfU0hJRlRfQUREMVMoU2hpZnRBZGQxUykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NISUZUX1NVQkZTKFNoaWZ0U3ViRlMpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCB0aGUgc2hpZnQgaXMgY29tcGxldGVkKi8KKyAgd2hpbGUgKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9TSFBGKSAhPSAwVSkKKyAgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24gaXMgZGlzYWJsZWQgKi8KKyAgaWYgKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfUkVGQ0tPTikgPT0gMFUpCisgIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIFNoaWZ0IHNldHRpbmdzICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPlNISUZUUiA9ICh1aW50MzJfdCkodWludDMyX3QpKFNoaWZ0U3ViRlMpIHwgKHVpbnQzMl90KShTaGlmdEFkZDFTKTsKKworICAgIC8qIElmICBSVENfQ1JfQllQU0hBRCBiaXQgPSAwLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYgKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfQllQU0hBRCkgPT0gMFUpCisgICAgeworICAgICAgaWYgKEhBTF9SVENfV2FpdEZvclN5bmNocm8oaHJ0YykgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBDYWxpYnJhdGlvbiBQaW5vdXQgKFJUQ19DQUxJQikgU2VsZWN0aW9uICgxSHogb3IgNTEySHopLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBDYWxpYk91dHB1dCA6IFNlbGVjdCB0aGUgQ2FsaWJyYXRpb24gb3V0cHV0IFNlbGVjdGlvbiAuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19DQUxJQk9VVFBVVF81MTJIWjogQSBzaWduYWwgaGFzIGEgcmVndWxhciB3YXZlZm9ybSBhdCA1MTJIei4KKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19DQUxJQk9VVFBVVF8xSFo6IEEgc2lnbmFsIGhhcyBhIHJlZ3VsYXIgd2F2ZWZvcm0gYXQgMUh6LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldENhbGlicmF0aW9uT3V0UHV0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBDYWxpYk91dHB1dCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19DQUxJQl9PVVRQVVQoQ2FsaWJPdXRwdXQpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIENsZWFyIGZsYWdzIGJlZm9yZSBjb25maWcgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCl+UlRDX0NSX0NPU0VMOworCisgIC8qIENvbmZpZ3VyZSB0aGUgUlRDX0NSIHJlZ2lzdGVyICovCisgIGhydGMtPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpQ2FsaWJPdXRwdXQ7CisKKyAgX19IQUxfUlRDX0NBTElCUkFUSU9OX09VVFBVVF9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVhY3RpdmF0ZSB0aGUgQ2FsaWJyYXRpb24gUGlub3V0IChSVENfQ0FMSUIpIFNlbGVjdGlvbiAoMUh6IG9yIDUxMkh6KS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVDYWxpYnJhdGlvbk91dFB1dChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICBfX0hBTF9SVENfQ0FMSUJSQVRJT05fT1VUUFVUX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgcmVmZXJlbmNlIGNsb2NrIGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFJlZkNsb2NrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmIChSVENfRW50ZXJJbml0TW9kZShocnRjKSAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgIC8qIFNldCBSVEMgc3RhdGUqLworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIF9fSEFMX1JUQ19DTE9DS1JFRl9ERVRFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVJlZkNsb2NrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmIChSVENfRW50ZXJJbml0TW9kZShocnRjKSAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgIC8qIFNldCBSVEMgc3RhdGUqLworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIF9fSEFMX1JUQ19DTE9DS1JFRl9ERVRFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7CisgIH0KKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEJ5cGFzcyBTaGFkb3cgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBub3RlICAgV2hlbiB0aGUgQnlwYXNzIFNoYWRvdyBpcyBlbmFibGVkIHRoZSBjYWxlbmRhciB2YWx1ZSBhcmUgdGFrZW4KKyAgKiAgICAgICAgIGRpcmVjdGx5IGZyb20gdGhlIENhbGVuZGFyIGNvdW50ZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRW5hYmxlQnlwYXNzU2hhZG93KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCB0aGUgQllQU0hBRCBiaXQgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSIHw9ICh1aW50OF90KVJUQ19DUl9CWVBTSEFEOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEJ5cGFzcyBTaGFkb3cgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBub3RlICAgV2hlbiB0aGUgQnlwYXNzIFNoYWRvdyBpcyBlbmFibGVkIHRoZSBjYWxlbmRhciB2YWx1ZSBhcmUgdGFrZW4KKyAgKiAgICAgICAgIGRpcmVjdGx5IGZyb20gdGhlIENhbGVuZGFyIGNvdW50ZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGlzYWJsZUJ5cGFzc1NoYWRvdyhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBSZXNldCB0aGUgQllQU0hBRCBiaXQgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSICY9ICgodWludDhfdCl+UlRDX0NSX0JZUFNIQUQpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNAorICAqIEBicmllZiAgICBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBSVEMgQWxyYW0gQiBjYWxsYmFjaworICAgICAgKCspIFJUQyBQb2xsIGZvciBBbGFybSBCIHJlcXVlc3QKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBBbGFybSBCIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDRXhfQWxhcm1CRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9BbGFybUJFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIEFsYXJtIEIgUG9sbGluZyByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yQWxhcm1CRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgd2hpbGUgKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCRikgPT0gMFUpCisgIHsKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENsZWFyIHRoZSBBbGFybSBGbGFnICovCisgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJGKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1JUQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9zbWFydGNhcmQuYyBiL1NyYy9zdG0zMmwweHhfaGFsX3NtYXJ0Y2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWY0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9zbWFydGNhcmQuYwpAQCAtMCwwICsxLDI4NDIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3NtYXJ0Y2FyZC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBTTUFSVENBUkQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgU01BUlRDQVJEIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoZSBTTUFSVENBUkQgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgKCMpIERlY2xhcmUgYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgaHNtYXJ0Y2FyZCkuCisgICAgKCMpIEFzc29jaWF0ZSBhIFVTQVJUIHRvIHRoZSBTTUFSVENBUkQgaGFuZGxlIGhzbWFydGNhcmQuCisgICAgKCMpIEluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1NNQVJUQ0FSRF9Nc3BJbml0KCkgQVBJOgorICAgICAgICAoKyspIEVuYWJsZSB0aGUgVVNBUlR4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgKCsrKSBVU0FSVCBwaW5zIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFVTQVJUIEdQSU9zLgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgVVNBUlQgcGlucyAoVFggYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAsIFJYIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBJbnB1dCkuCisgICAgICAgICgrKykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9JVCgpCisgICAgICAgICAgICAgYW5kIEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9JVCgpIEFQSXMpOgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgVVNBUlR4IGludGVycnVwdCBwcmlvcml0eS4KKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlQgSVJRIGhhbmRsZS4KKyAgICAgICAgKCsrKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgICAgICBhbmQgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0RNQSgpIEFQSXMpOgorICAgICAgICAgICAgICgrKyspIERlY2xhcmUgYSBETUEgaGFuZGxlIHN0cnVjdHVyZSBmb3IgdGhlIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIFNNQVJUQ0FSRCBETUEgVHgvUnggaGFuZGxlLgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisKKyAgICAoIykgUHJvZ3JhbSB0aGUgQmF1ZCBSYXRlLCBQYXJpdHksIE1vZGUoUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpLCBjbG9jayBlbmFibGluZy9kaXNhYmxpbmcgYW5kIGFjY29yZGluZ2x5LAorICAgICAgICB0aGUgY2xvY2sgcGFyYW1ldGVycyAocGFyaXR5LCBwaGFzZSwgbGFzdCBiaXQpLCBwcmVzY2FsZXIgdmFsdWUsIGd1YXJkIHRpbWUgYW5kIE5BQ0sgb24gdHJhbnNtaXNzaW9uCisgICAgICAgIGVycm9yIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpbiB0aGUgaHNtYXJ0Y2FyZCBoYW5kbGUgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSWYgcmVxdWlyZWQsIHByb2dyYW0gU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmVzIChUWC9SWCBwaW5zIHN3YXAsIFRpbWVPdXQsIGF1dG8tcmV0cnkgY291bnRlciwuLi4pCisgICAgICAgIGluIHRoZSBoc21hcnRjYXJkIGhhbmRsZSBBZHZhbmNlZEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCByZWdpc3RlcnMgYnkgY2FsbGluZyB0aGUgSEFMX1NNQVJUQ0FSRF9Jbml0KCkgQVBJOgorICAgICAgICAoKyspIFRoaXMgQVBJIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpCisgICAgICAgICAgICAgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBIQUxfU01BUlRDQVJEX01zcEluaXQoKSBBUEkuCisgICAgICAgIFsuLl0KKyAgICAgICAgKEApIFRoZSBzcGVjaWZpYyBTTUFSVENBUkQgaW50ZXJydXB0cyAoVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCwKKyAgICAgICAgICAgICBSWE5FIGludGVycnVwdCBhbmQgRXJyb3IgSW50ZXJydXB0cykgd2lsbCBiZSBtYW5hZ2VkIHVzaW5nIHRoZSBtYWNyb3MKKyAgICAgICAgICAgICBfX0hBTF9TTUFSVENBUkRfRU5BQkxFX0lUKCkgYW5kIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFX0lUKCkgaW5zaWRlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzLgorCisgICAgWy4uXQorICAgIFsuLl0gVGhyZWUgb3BlcmF0aW9uIG1vZGVzIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyIDoKKworICAgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TTUFSVENBUkRfVHJhbnNtaXQoKQorICAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlKCkKKworICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9JVCgpCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjaygpCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0lUKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKQorCisgICAgICoqKiBETUEgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9ETUEoKQorICAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9ETUEoKQorICAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpCisKKyAgICAgKioqIFNNQVJUQ0FSRCBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIFNNQVJUQ0FSRCBIQUwgZHJpdmVyLgorCisgICAgICAgKCspIF9fSEFMX1NNQVJUQ0FSRF9HRVRfRkxBRyA6IENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIGZsYWcgaXMgc2V0CisgICAgICAgKCspIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHIDogQ2xlYXIgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgcGVuZGluZyBmbGFnCisgICAgICAgKCspIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBpbnRlcnJ1cHQKKyAgICAgICAoKykgX19IQUxfU01BUlRDQVJEX0RJU0FCTEVfSVQ6IERpc2FibGUgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgaW50ZXJydXB0CisgICAgICAgKCspIF9fSEFMX1NNQVJUQ0FSRF9HRVRfSVRfU09VUkNFOiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgaXMgZW5hYmxlZAorCisgICAgIFsuLl0KKyAgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgU01BUlRDQVJEIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgICAgIyMjIyMgQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICMjIyMjCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgWy4uXQorICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorCisgICAgWy4uXQorICAgIFVzZSBGdW5jdGlvbiBAcmVmIEhBTF9TTUFSVENBUkRfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjay4KKyAgICBGdW5jdGlvbiBAcmVmIEhBTF9TTUFSVENBUkRfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogVHggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBTTUFSVENBUkQgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFNNQVJUQ0FSRCBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1NNQVJUQ0FSRF9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCisgICAgQHJlZiBIQUxfU01BUlRDQVJEX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgOiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA6IEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgIDogQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA6IFNNQVJUQ0FSRCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogU01BUlRDQVJEIE1zcERlSW5pdC4KKworICAgIFsuLl0KKyAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfU01BUlRDQVJEX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZXMgQHJlZiBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpLgorICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQorICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9TTUFSVENBUkRfSW5pdCgpCisgICAgYW5kIEByZWYgSEFMX1NNQVJUQ0FSRF9EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1NNQVJUQ0FSRF9Jbml0KCkgYW5kIEByZWYgSEFMX1NNQVJUQ0FSRF9EZUluaXQoKQorICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisKKyAgICBbLi5dCisgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICBpbiBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZIG9yIEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikKKyAgICBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgdXNpbmcgQHJlZiBIQUxfU01BUlRDQVJEX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9TTUFSVENBUkRfRGVJbml0KCkKKyAgICBvciBAcmVmIEhBTF9TTUFSVENBUkRfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworI2lmICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KQorLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEIFNNQVJUQ0FSRAorICAqIEBicmllZiBIQUwgU01BUlRDQVJEIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1ByaXZhdGVfQ29uc3RhbnRzIFNNQVJUQ0FSRCBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworI2RlZmluZSBTTUFSVENBUkRfVEVBQ0tfUkVBQ0tfVElNRU9VVCAgICAgICAgICAgICAgIDEwMDBVICAgICAgLyohPCBTTUFSVENBUkQgVFggb3IgUlggZW5hYmxlIGFja25vd2xlZGdlIHRpbWUtb3V0IHZhbHVlICAqLworCisjZGVmaW5lIFVTQVJUX0NSMV9GSUVMRFMgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9PVkVSOCkpICAgICAgICAgICAgIC8qITwgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBTTUFSVENBUkRfU2V0Q29uZmlnIEFQSSAqLworCisjZGVmaW5lIFVTQVJUX0NSMl9DTEtfRklFTERTICAoKHVpbnQzMl90KShVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfQ1BPTCB8IFVTQVJUX0NSMl9DUEhBIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0xCQ0wpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgY2xvY2stcmVsYXRlZCBVU0FSVCBDUjIgZmllbGRzIG9mIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBVU0FSVF9DUjJfRklFTERTICAgICAgKCh1aW50MzJfdCkoVVNBUlRfQ1IyX1JUT0VOIHwgVVNBUlRfQ1IyX0NMS19GSUVMRFMgfCBVU0FSVF9DUjJfU1RPUCkpICAgLyohPCBVU0FSVCBDUjIgZmllbGRzIG9mIHBhcmFtZXRlcnMgc2V0IGJ5IFNNQVJUQ0FSRF9TZXRDb25maWcgQVBJICovCisKKyNkZWZpbmUgVVNBUlRfQ1IzX0ZJRUxEUyAgICAgICgodWludDMyX3QpKFVTQVJUX0NSM19PTkVCSVQgfCBVU0FSVF9DUjNfTkFDSyB8IFVTQVJUX0NSM19TQ0FSQ05UKSkgICAgIC8qITwgVVNBUlQgQ1IzIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBTTUFSVENBUkRfU2V0Q29uZmlnIEFQSSAqLworCisjZGVmaW5lIFVTQVJUX0JSUl9NSU4gICAgMHgxMFUgICAgICAgIC8qITwgVVNBUlQgQlJSIG1pbmltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworCisjZGVmaW5lIFVTQVJUX0JSUl9NQVggICAgMHgwMDAwRkZGRlUgIC8qITwgVVNBUlQgQlJSIG1heGltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSRF9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordm9pZCBTTUFSVENBUkRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX1NldENvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfQWR2RmVhdHVyZUNvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX0NoZWNrSWRsZVN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kVHhUcmFuc2ZlcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kUnhUcmFuc2ZlcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX1R4SVNSKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9FbmRUcmFuc21pdF9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfUnhJU1IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zIFNNQVJUQ0FSRCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4CisgIGFzc29jaWF0ZWQgdG8gdGhlIFNtYXJ0Q2FyZC4KKyAgKCspIFRoZXNlIHBhcmFtZXRlcnMgY2FuIGJlIGNvbmZpZ3VyZWQ6CisgICAgICAoKyspIEJhdWQgUmF0ZQorICAgICAgKCsrKSBQYXJpdHk6IHBhcml0eSBzaG91bGQgYmUgZW5hYmxlZCwgZnJhbWUgTGVuZ3RoIGlzIGZpeGVkIHRvIDggYml0cyBwbHVzIHBhcml0eQorICAgICAgKCsrKSBSZWNlaXZlci90cmFuc21pdHRlciBtb2RlcworICAgICAgKCsrKSBTeW5jaHJvbm91cyBtb2RlIChhbmQgaWYgZW5hYmxlZCwgcGhhc2UsIHBvbGFyaXR5IGFuZCBsYXN0IGJpdCBwYXJhbWV0ZXJzKQorICAgICAgKCsrKSBQcmVzY2FsZXIgdmFsdWUKKyAgICAgICgrKykgR3VhcmQgYml0IHRpbWUKKyAgICAgICgrKykgTkFDSyBlbmFibGluZyBvciBkaXNhYmxpbmcgb24gdHJhbnNtaXNzaW9uIGVycm9yCisKKyAgKCspIFRoZSBmb2xsb3dpbmcgYWR2YW5jZWQgZmVhdHVyZXMgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgd2VsbDoKKyAgICAgICgrKykgVFggYW5kL29yIFJYIHBpbiBsZXZlbCBpbnZlcnNpb24KKyAgICAgICgrKykgZGF0YSBsb2dpY2FsIGxldmVsIGludmVyc2lvbgorICAgICAgKCsrKSBSWCBhbmQgVFggcGlucyBzd2FwCisgICAgICAoKyspIFJYIG92ZXJydW4gZGV0ZWN0aW9uIGRpc2FibGluZworICAgICAgKCsrKSBETUEgZGlzYWJsaW5nIG9uIFJYIGVycm9yCisgICAgICAoKyspIE1TQiBmaXJzdCBvbiBjb21tdW5pY2F0aW9uIGxpbmUKKyAgICAgICgrKykgVGltZSBvdXQgZW5hYmxpbmcgKGFuZCBpZiBhY3RpdmF0ZWQsIHRpbWVvdXQgdmFsdWUpCisgICAgICAoKyspIEJsb2NrIGxlbmd0aAorICAgICAgKCsrKSBBdXRvLXJldHJ5IGNvdW50ZXIKKyAgWy4uXQorICBUaGUgSEFMX1NNQVJUQ0FSRF9Jbml0KCkgQVBJIGZvbGxvd3MgdGhlIFVTQVJUIHN5bmNocm9ub3VzIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlcworICAoZGV0YWlscyBmb3IgdGhlIHByb2NlZHVyZXMgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgVGhlIFVTQVJUIGZyYW1lIGZvcm1hdCBpcyBnaXZlbiBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCisgICAgVGFibGUgMS4gVVNBUlQgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBNMU0wIGJpdHMgfCAgUENFIGJpdCAgfCAgICAgICAgICAgIFVTQVJUIGZyYW1lICAgICAgICAgICAgICAgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgIDAxICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDggYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogQ2hlY2sgdGhlIFNNQVJUQ0FSRCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHNtYXJ0Y2FyZCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBVU0FSVCBhc3NvY2lhdGVkIHRvIHRoZSBTTUFSVENBUkQgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfSU5TVEFOQ0UoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UpKTsKKworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHNtYXJ0Y2FyZC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgU01BUlRDQVJEX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHNtYXJ0Y2FyZCk7CisKKyAgICBpZiAoaHNtYXJ0Y2FyZC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9Nc3BJbml0OworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGhzbWFydGNhcmQtPk1zcEluaXRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0sgKi8KKyAgICBIQUxfU01BUlRDQVJEX01zcEluaXQoaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCB0byBzZXQgc21hcnRjYXJkIG1vZGUgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgLyogSW4gU21hcnRDYXJkIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIEhEU0VMIGFuZCBJUkVOICBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9MSU5FTik7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKKworICAvKiBzZXQgdGhlIFVTQVJUIGluIFNNQVJUQ0FSRCBtb2RlICovCisgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1NDRU4pOworCisgIC8qIFNldCB0aGUgU01BUlRDQVJEIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoU01BUlRDQVJEX1NldENvbmZpZyhoc21hcnRjYXJkKSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBTTUFSVENBUkQgdHJhbnNtaXNzaW9uIGNvbXBsZXRpb24gaW5kaWNhdGlvbiAqLworICBTTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT05fU0VUVElORyhoc21hcnRjYXJkKTsKKworICBpZiAoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0ICE9IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX05PX0lOSVQpCisgIHsKKyAgICBTTUFSVENBUkRfQWR2RmVhdHVyZUNvbmZpZyhoc21hcnRjYXJkKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHNtYXJ0Y2FyZC0+Z1N0YXRlIGFuZCBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoU01BUlRDQVJEX0NoZWNrSWRsZVN0YXRlKGhzbWFydGNhcmQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfRGVJbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBDaGVjayB0aGUgU01BUlRDQVJEIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc21hcnRjYXJkID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIFVTQVJUL1VBUlQgYXNzb2NpYXRlZCB0byB0aGUgU01BUlRDQVJEIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0lOU1RBTkNFKGhzbWFydGNhcmQtPkluc3RhbmNlKSk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgV1JJVEVfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIDB4MFUpOworICBXUklURV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgMHgwVSk7CisgIFdSSVRFX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCAweDBVKTsKKyAgV1JJVEVfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SVE9SLCAweDBVKTsKKyAgV1JJVEVfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5HVFBSLCAweDBVKTsKKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworI2lmIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgIGlmIChoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHNtYXJ0Y2FyZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIEhBTF9TTUFSVENBUkRfTXNwRGVJbml0KGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICAgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsKKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSAgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsKKworICAvKiBQcm9jZXNzIFVubG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgTVNQLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUFSVENBUkRfTXNwSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBNU1AuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9Nc3BEZUluaXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFNNQVJUQ0FSRCBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgc21hcnRjYXJkIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfUlhfQ09NUExFVEVfQ0JfSUQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfUmVnaXN0ZXJDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgSEFMX1NNQVJUQ0FSRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwU01BUlRDQVJEX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfRVJST1JfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX0FCT1JUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIFNNQVJUQ0FSRCBjYWxsYmFjaworICAqICAgICAgICAgU01BUlRDQVJEIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBzbWFydGNhcmQgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX1RYX0NPTVBMRVRFX0NCX0lEIFR4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX1JYX0NPTVBMRVRFX0NCX0lEIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX0VSUk9SX0NCX0lEIEVycm9yIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9NU1BJTklUX0NCX0lEIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9VblJlZ2lzdGVyQ2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIEhBTF9TTUFSVENBUkRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgaWYgKEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkgPT0gaHNtYXJ0Y2FyZC0+Z1N0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPlR4Q3BsdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPlJ4Q3BsdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9FUlJPUl9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9BQk9SVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPkFib3J0Q3BsdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVCA9PSBoc21hcnRjYXJkLT5nU3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBTTUFSVENBUkQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFNNQVJUQ0FSRCBkYXRhIHRyYW5zZmVycy4KKworICBbLi5dCisgICAgU21hcnRjYXJkIGlzIGEgc2luZ2xlIHdpcmUgaGFsZiBkdXBsZXggY29tbXVuaWNhdGlvbiBwcm90b2NvbC4KKyAgICBUaGUgU21hcnRjYXJkIGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGFzeW5jaHJvbm91cyBwcm90b2NvbCBTbWFydGNhcmRzIGFzCisgICAgZGVmaW5lZCBpbiB0aGUgSVNPIDc4MTYtMyBzdGFuZGFyZC4gVGhlIFVTQVJUIHNob3VsZCBiZSBjb25maWd1cmVkIGFzOgorICAgICgrKSA4IGJpdHMgcGx1cyBwYXJpdHk6IHdoZXJlIE09MSBhbmQgUENFPTEgaW4gdGhlIFVTQVJUX0NSMSByZWdpc3RlcgorICAgICgrKSAxLjUgc3RvcCBiaXRzIHdoZW4gdHJhbnNtaXR0aW5nIGFuZCByZWNlaXZpbmc6IHdoZXJlIFNUT1A9MTEgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3Rlci4KKworICBbLi5dCisgICAgKCspIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CisgICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLgorICAgICAgICAoKyspIE5vbi1CbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cworICAgICAgICAgICAgIG9yIERNQSwgdGhlIHJlbGV2YW50IEFQSSdzIHJldHVybiB0aGUgSEFMIHN0YXR1cy4KKyAgICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgICBkZWRpY2F0ZWQgU01BUlRDQVJEIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgKCsrKSBUaGUgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjaygpLCBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgICB3aWxsIGJlIGV4ZWN1dGVkIHJlc3BlY3RpdmVseSBhdCB0aGUgZW5kIG9mIHRoZSBUcmFuc21pdCBvciBSZWNlaXZlIHByb2Nlc3MKKyAgICAgICAgICAgICBUaGUgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uCisgICAgICAgICAgICAgZXJyb3IgaXMgZGV0ZWN0ZWQuCisKKyAgICAoKykgQmxvY2tpbmcgbW9kZSBBUElzIGFyZSA6CisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdCgpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlKCkKKworICAgICgrKSBOb24gQmxvY2tpbmcgbW9kZSBBUElzIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0lSUUhhbmRsZXIoKQorCisgICAgKCspIE5vbiBCbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKCkKKworICAgICgrKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIG5vbiBCbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpCisKKyAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzIGNvdWxkIGJlIGFib3J0ZWQgdXNpbmcgQWJvcnQgQVBJJ3MgOgorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydCgpCisgICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXQoKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmUoKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydF9JVCgpCisgICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRfSVQoKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVfSVQoKQorCisgICAgKCMpIEZvciBBYm9ydCBzZXJ2aWNlcyBiYXNlZCBvbiBpbnRlcnJ1cHRzIChIQUxfU01BUlRDQVJEX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoKKyAgICAgICAgKCspIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAoKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcworICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgorICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKKyAgICAgICAgICAgYW5kIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuIFRyYW5zZmVyIGlzIGtlcHQgb25nb2luZyBvbiBTTUFSVENBUkQgc2lkZS4KKyAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgorICAgICAgICgrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIEJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgbm90IGJlIGNvbXBsZXRlZCBwcm9wZXJseSBhbmQgaXMgYWJvcnRlZC4KKyAgICAgICAgICAgVGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSB0cmFubWlzc2lvbiwgT3ZlcnJ1biBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gYW5kIGFsbCBlcnJvcnMgaW4gRE1BIG1vZGUuCisgICAgICAgICAgIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwgYW5kIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHBhcmFtICBUaW1lb3V0ICBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDhfdCAgKnB0bXBkYXRhID0gcERhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHB0bXBkYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgZmlyc3QgdG8gdXBkYXRlIG1vZGUgZm9yIFRYIG1hc3RlciAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworCisgICAgLyogRGlzYWJsZSBSeCwgZW5hYmxlIFR4ICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SRSk7CisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlFSLCAodWludDE2X3QpU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9URSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgd2hpbGUgKGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIGlmIChTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBTTUFSVENBUkRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqcHRtcGRhdGEgJiAweEZGVSk7CisgICAgICBwdG1wZGF0YSsrOworICAgIH0KKyAgICBpZiAoU01BUlRDQVJEX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX1RSQU5TTUlTU0lPTl9DT01QTEVUSU9OX0ZMQUcoaHNtYXJ0Y2FyZCksIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICAgIC8qIFJlLWVuYWJsZSBSeCBhdCBlbmQgb2YgdHJhbnNtaXNzaW9uIGlmIGluaXRpYWwgbW9kZSBpcyBSeC9UeCAqLworICAgIGlmIChoc21hcnRjYXJkLT5Jbml0Lk1vZGUgPT0gU01BUlRDQVJEX01PREVfVFhfUlgpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZXMgKi8KKyAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfUmVjZWl2ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDhfdCAgKnB0bXBkYXRhID0gcERhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwdG1wZGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ2hlY2sgdGhlIHJlbWFpbiBkYXRhIHRvIGJlIHJlY2VpdmVkICovCisgICAgd2hpbGUgKGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQtLTsKKworICAgICAgaWYgKFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9GTEFHX1JYTkUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgKnB0bXBkYXRhID0gKHVpbnQ4X3QpKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCkweDAwRkYpOworICAgICAgcHRtcGRhdGErKzsKKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFg7CisKKyAgICBoc21hcnRjYXJkLT5wVHhCdWZmUHRyICA9IHBEYXRhOworICAgIGhzbWFydGNhcmQtPlR4WGZlclNpemUgID0gU2l6ZTsKKyAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+VHhJU1IgICAgICAgPSBOVUxMOworCisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZSBmb3IgVFggbWFzdGVyICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgICAvKiBEaXNhYmxlIFJ4LCBlbmFibGUgVHggKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SUVIsICh1aW50MTZfdClTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAgIC8qIENvbmZpZ3VyZSBUeCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworICAgIC8qIFNldCB0aGUgVHggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICBoc21hcnRjYXJkLT5UeElTUiA9IFNNQVJUQ0FSRF9UeElTUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgICBoc21hcnRjYXJkLT5SeFN0YXRlICAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlg7CisKKyAgICBoc21hcnRjYXJkLT5wUnhCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ29uZmlndXJlIFJ4IGludGVycnVwdCBwcm9jZXNzaW5nICovCisgICAgLyogU2V0IHRoZSBSeCBJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gU01BUlRDQVJEX1J4SVNSOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFBhcml0eSBFcnJvciBhbmQgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0cyAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfUlhORUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0RNQShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFg7CisKKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisgICAgaHNtYXJ0Y2FyZC0+cFR4QnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWFydGNhcmQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgZmlyc3QgdG8gdXBkYXRlIG1vZGUgZm9yIFRYIG1hc3RlciAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworCisgICAgLyogRGlzYWJsZSBSeCwgZW5hYmxlIFR4ICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SRSk7CisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlFSLCAodWludDE2X3QpU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9URSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BVHJhbnNtaXRDcGx0OworCisgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gU01BUlRDQVJEX0RNQUVycm9yOworCisgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIHRyYW5zbWl0IERNQSBjaGFubmVsICovCisgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHNtYXJ0Y2FyZC0+aGRtYXR4LCAodWludDMyX3QpaHNtYXJ0Y2FyZC0+cFR4QnVmZlB0ciwgKHVpbnQzMl90KSZoc21hcnRjYXJkLT5JbnN0YW5jZS0+VERSLCBTaXplKSA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFRDIGZsYWcgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5JQ1IsIFVTQVJUX0lDUl9UQ0NGKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IpICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgICAgICAgaW4gdGhlIFNNQVJUQ0FSRCBhc3NvY2lhdGVkIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfRE1BOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+U3RhdGUgdG8gcmVhZHkgKi8KKyAgICAgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQG5vdGUgICBUaGUgU01BUlRDQVJELWFzc29jaWF0ZWQgVVNBUlQgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpLAorICAqICAgICAgICAgdGhlIHJlY2VpdmVkIGRhdGEgY29udGFpbiB0aGUgcGFyaXR5IGJpdCAoTVNCIHBvc2l0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9ETUEoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgICBoc21hcnRjYXJkLT5SeFN0YXRlICAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlg7CisKKyAgICBoc21hcnRjYXJkLT5wUnhCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyU2l6ZSA9IFNpemU7CisKKyAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BUmVjZWl2ZUNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gU01BUlRDQVJEX0RNQUVycm9yOworCisgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChoc21hcnRjYXJkLT5oZG1hcngsICh1aW50MzJfdCkmaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJEUiwgKHVpbnQzMl90KWhzbWFydGNhcmQtPnBSeEJ1ZmZQdHIsIFNpemUpID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICAgIGluIHRoZSBTTUFSVENBUkQgYXNzb2NpYXRlZCBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPlN0YXRlIHRvIHJlYWR5ICovCisgICAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU01BUlRDQVJEIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIERpc2FibGUgUlRPSUUsIEVPQklFLCBUWEVJRSwgVENJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfUlRPSUUgfCBVU0FSVF9DUjFfRU9CSUUpKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgVHggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNtYXJ0Y2FyZC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhzbWFydGNhcmQtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhzbWFydGNhcmQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhzbWFydGNhcmQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihoc21hcnRjYXJkLT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfRE1BOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmVzZXQgVHggYW5kIFJ4IHRyYW5zZmVyIGNvdW50ZXJzICovCisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSBhbmQgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5nU3RhdGUgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVzZXQgSGFuZGxlIEVycm9yQ29kZSB0byBObyBFcnJvciAqLworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFRyYW5zbWl0IHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChUeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSBhbmQgVENJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKworICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgIGlmIChoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IpICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4KKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoc21hcnRjYXJkLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHNtYXJ0Y2FyZC0+aGRtYXR4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBSZWNlaXZlIHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBSeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFJUT0lFLCBFT0JJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JUT0lFIHwgVVNBUlRfQ1IxX0VPQklFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBDaGVjayBpZiBhIFRyYW5zbWl0IHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QuIElmIG5vdCBkaXNhYmxlIEVSUiBJVCAqLworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IpICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4KKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoc21hcnRjYXJkLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHNtYXJ0Y2FyZC0+aGRtYXJ4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworCisgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTTUFSVENBUkQgSW50ZXJydXB0cyAoVHggYW5kIFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICB1aW50MzJfdCBhYm9ydGNwbHQgPSAxVTsKKworICAvKiBEaXNhYmxlIFJUT0lFLCBFT0JJRSwgVFhFSUUsIFRDSUUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1JUT0lFIHwgVVNBUlRfQ1IxX0VPQklFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBJZiBETUEgVHggYW5kL29yIERNQSBSeCBIYW5kbGVzIGFyZSBhc3NvY2lhdGVkIHRvIFNNQVJUQ0FSRCBIYW5kbGUsIERNQSBBYm9ydCBjb21wbGV0ZSBjYWxsYmFja3Mgc2hvdWxkIGJlIGluaXRpYWxpc2VkCisgICAgIGJlZm9yZSBhbnkgY2FsbCB0byBETUEgQWJvcnQgZnVuY3Rpb25zICovCisgIC8qIERNQSBUeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU01BUlRDQVJEX0RNQVR4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorICAvKiBETUEgUnggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChoc21hcnRjYXJkLT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgU01BUlRDQVJEIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFSeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgVHggYXQgVUFSVCBsZXZlbCAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU01BUlRDQVJEIFR4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzbWFydGNhcmQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU01BUlRDQVJEIFJ4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzbWFydGNhcmQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYWJvcnRjcGx0ID0gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGlmIG5vIERNQSBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24gaXMgcmVxdWlyZWQgPT4gY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGlmIChhYm9ydGNwbHQgPT0gMVUpCisgIHsKKyAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBDbGVhciBJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBoc21hcnRjYXJkLT5SeElTUiA9IE5VTEw7CisgICAgaHNtYXJ0Y2FyZC0+VHhJU1IgPSBOVUxMOworCisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworCisgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKyAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHNtYXJ0Y2FyZC0+QWJvcnRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgVHJhbnNtaXQgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChUeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworCisgIC8qIENoZWNrIGlmIGEgcmVjZWl2ZSBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgaWYgKGhzbWFydGNhcmQtPlJ4U3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU01BUlRDQVJEX0RNQVR4T25seUFib3J0Q2FsbGJhY2s7CisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNtYXJ0Y2FyZC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2soaHNtYXJ0Y2FyZC0+aGRtYXR4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICAgIC8qIENsZWFyIFR4SVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgICBoc21hcnRjYXJkLT5UeElTUiA9IE5VTEw7CisKKyAgICAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBoc21hcnRjYXJkLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENsZWFyIFR4SVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgaHNtYXJ0Y2FyZC0+VHhJU1IgPSBOVUxMOworCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfRkVGKTsKKworICAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaHNtYXJ0Y2FyZC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBSeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlX0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFJUT0lFLCBFT0JJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JUT0lFIHwgVVNBUlRfQ1IxX0VPQklFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBDaGVjayBpZiBhIFRyYW5zbWl0IHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QuIElmIG5vdCBkaXNhYmxlIEVSUiBJVCAqLworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IpICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrOworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzbWFydGNhcmQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGhzbWFydGNhcmQtPmhkbWFyeCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBSeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBoc21hcnRjYXJkLT5SeElTUiA9IE5VTEw7CisKKyAgICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworCisgICAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGhzbWFydGNhcmQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gTlVMTDsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgcmVxdWVzdHMuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU01BUlRDQVJEX0lSUUhhbmRsZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQzMl90IGlzcmZsYWdzICAgPSBSRUFEX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgY3IxaXRzICAgICA9IFJFQURfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCBjcjNpdHMgICAgID0gUkVBRF9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMyk7CisgIHVpbnQzMl90IGVycm9yZmxhZ3M7CisKKyAgLyogSWYgbm8gZXJyb3Igb2NjdXJzICovCisgIGVycm9yZmxhZ3MgPSAoaXNyZmxhZ3MgJiAodWludDMyX3QpKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9PUkUgfCBVU0FSVF9JU1JfTkUgfCBVU0FSVF9JU1JfUlRPRikpOworICBpZiAoZXJyb3JmbGFncyA9PSAwVSkKKyAgeworICAgIC8qIFNNQVJUQ0FSRCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORSkgIT0gMFUpCisgICAgICAgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSAwVSkpCisgICAgeworICAgICAgaWYgKGhzbWFydGNhcmQtPlJ4SVNSICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGhzbWFydGNhcmQtPlJ4SVNSKGhzbWFydGNhcmQpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIElmIHNvbWUgZXJyb3JzIG9jY3VyICovCisgIGlmICgoZXJyb3JmbGFncyAhPSAwVSkKKyAgICAgICYmICgoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKQorICAgICAgICAgIHx8ICgoY3IxaXRzICYgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpICE9IDBVKSkpCisgIHsKKyAgICAvKiBTTUFSVENBUkQgcGFyaXR5IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfSVQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX1BFRik7CisKKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX1BFOworICAgIH0KKworICAgIC8qIFNNQVJUQ0FSRCBmcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0ZFKSAhPSAwVSkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9GRUYpOworCisgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9GRTsKKyAgICB9CisKKyAgICAvKiBTTUFSVENBUkQgbm9pc2UgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9ORSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9JVChoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfTkVGKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfTkU7CisgICAgfQorCisgICAgLyogU01BUlRDQVJEIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfT1JFKSAhPSAwVSkKKyAgICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRSkgIT0gMFUpCisgICAgICAgICAgICB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkpCisgICAgeworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfT1JFOworICAgIH0KKworICAgIC8qIFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlRPRikgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1JUT0lFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9SVE9GKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfUlRPOworICAgIH0KKworICAgIC8qIENhbGwgU01BUlRDQVJEIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlICE9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBTTUFSVENBUkQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORSkgIT0gMFUpCisgICAgICAgICAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGhzbWFydGNhcmQtPlJ4SVNSICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBoc21hcnRjYXJkLT5SeElTUihoc21hcnRjYXJkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBJZiBFcnJvciBpcyB0byBiZSBjb25zaWRlcmVkIGFzIGJsb2NraW5nIDoKKyAgICAgICAgICAtIFJlY2VpdmVyIFRpbWVvdXQgZXJyb3IgaW4gUmVjZXB0aW9uCisgICAgICAgICAgLSBPdmVycnVuIGVycm9yIGluIFJlY2VwdGlvbgorICAgICAgICAgIC0gYW55IGVycm9yIG9jY3VycyBpbiBETUEgbW9kZSByZWNlcHRpb24KKyAgICAgICovCisgICAgICBpZiAoKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICAgICAgICB8fCAoKGhzbWFydGNhcmQtPkVycm9yQ29kZSAmIChIQUxfU01BUlRDQVJEX0VSUk9SX1JUTyB8IEhBTF9TTUFSVENBUkRfRVJST1JfT1JFKSkgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgICAgU2V0IHRoZSBTTUFSVENBUkQgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcywKKyAgICAgICAgICAgRGlzYWJsZSBSeCBJbnRlcnJ1cHRzLCBhbmQgZGlzYWJsZSBSeCBETUEgcmVxdWVzdCwgaWYgb25nb2luZyAqLworICAgICAgICBTTUFSVENBUkRfRW5kUnhUcmFuc2Zlcihoc21hcnRjYXJkKTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgICAgICB7CisgICAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFJ4IGNoYW5uZWwgKi8KKyAgICAgICAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU01BUlRDQVJEX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoc21hcnRjYXJkLT5oZG1hcngpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgICAgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBvdGhlciBlcnJvciB0eXBlIHRvIGJlIGNvbnNpZGVyZWQgYXMgYmxvY2tpbmcgOgorICAgICAgICAgIC0gRnJhbWUgZXJyb3IgaW4gVHJhbnNtaXNzaW9uCisgICAgICAqLworICAgICAgZWxzZSBpZiAoKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFgpCisgICAgICAgICAgICAgICAmJiAoKGhzbWFydGNhcmQtPkVycm9yQ29kZSAmIEhBTF9TTUFSVENBUkRfRVJST1JfRkUpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBpcyBhYm9ydGVkCisgICAgICAgICAgIFNldCB0aGUgU01BUlRDQVJEIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgVHggSW50ZXJydXB0cywgYW5kIGRpc2FibGUgVHggRE1BIHJlcXVlc3QsIGlmIG9uZ29pbmcgKi8KKyAgICAgICAgU01BUlRDQVJEX0VuZFR4VHJhbnNmZXIoaHNtYXJ0Y2FyZCk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICAgICAgeworICAgICAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAgICAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBUeCBjaGFubmVsICovCisgICAgICAgICAgaWYgKGhzbWFydGNhcmQtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFBYm9ydE9uRXJyb3I7CisKKyAgICAgICAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNtYXJ0Y2FyZC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgICAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2soaHNtYXJ0Y2FyZC0+aGRtYXR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb24gQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBjb3VsZCBnbyBvbi4KKyAgICAgICAgICAgRXJyb3IgaXMgbm90aWZpZWQgdG8gdXNlciB0aHJvdWdoIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCisgIH0gLyogRW5kIGlmIHNvbWUgZXJyb3Igb2NjdXJzICovCisKKyAgLyogU01BUlRDQVJEIGluIG1vZGUgUmVjZWl2ZXIsIGVuZCBvZiBibG9jayBpbnRlcnJ1cHRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfRU9CRikgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX0VPQklFKSAhPSAwVSkpCisgIHsKKyAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPlJ4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgIC8qIENsZWFyIEVPQkYgaW50ZXJydXB0IGFmdGVyIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKSBjYWxsIGZvciB0aGUgRW5kIG9mIEJsb2NrIGluZm9ybWF0aW9uCisgICAgICAgdG8gYmUgYXZhaWxhYmxlIGR1cmluZyBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkgcHJvY2Vzc2luZyAqLworICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9JVChoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogU01BUlRDQVJEIGluIG1vZGUgVHJhbnNtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVFhFKSAhPSAwVSkKKyAgICAgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUUpICE9IDBVKSkKKyAgeworICAgIGlmIChoc21hcnRjYXJkLT5UeElTUiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPlR4SVNSKGhzbWFydGNhcmQpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvKiBTTUFSVENBUkQgaW4gbW9kZSBUcmFuc21pdHRlciAodHJhbnNtaXNzaW9uIGVuZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKF9fSEFMX1NNQVJUQ0FSRF9HRVRfSVQoaHNtYXJ0Y2FyZCwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24pICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfU01BUlRDQVJEX0dFVF9JVF9TT1VSQ0UoaHNtYXJ0Y2FyZCwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24pICE9IFJFU0VUKQorICAgIHsKKyAgICAgIFNNQVJUQ0FSRF9FbmRUcmFuc21pdF9JVChoc21hcnRjYXJkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNNQVJUQ0FSRCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNNQVJUQ0FSRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgU01BUlRDQVJEIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIHJldHVybiB0aGUgU3RhdGUgb2YgU21hcnRDYXJkCisgICAgaGFuZGxlIGFuZCBhbHNvIHJldHVybiBQZXJpcGhlcmFsIEVycm9ycyBvY2N1cnJlZCBkdXJpbmcgY29tbXVuaWNhdGlvbiBwcm9jZXNzCisgICAgICgrKSBIQUxfU01BUlRDQVJEX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZQorICAgICAgICAgb2YgdGhlIFNNQVJUQ0FSRCBwZXJpcGhlcmFsLgorICAgICAoKykgSEFMX1NNQVJUQ0FSRF9HZXRFcnJvcigpIGNoZWNrcyBpbiBydW4tdGltZSBlcnJvcnMgdGhhdCBjb3VsZCBvY2N1ciBkdXJpbmcKKyAgICAgICAgIGNvbW11bmljYXRpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBTTUFSVENBUkQgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIFNNQVJUQ0FSRCBoYW5kbGUgc3RhdGUKKyAgKi8KK0hBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmIEhBTF9TTUFSVENBUkRfR2V0U3RhdGUoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFJldHVybiBTTUFSVENBUkQgaGFuZGxlIHN0YXRlICovCisgIHVpbnQzMl90IHRlbXAxLCB0ZW1wMjsKKyAgdGVtcDEgPSAodWludDMyX3QpaHNtYXJ0Y2FyZC0+Z1N0YXRlOworICB0ZW1wMiA9ICh1aW50MzJfdCloc21hcnRjYXJkLT5SeFN0YXRlOworCisgIHJldHVybiAoSEFMX1NNQVJUQ0FSRF9TdGF0ZVR5cGVEZWYpKHRlbXAxIHwgdGVtcDIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgU01BUlRDQVJEIGhhbmRsZSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIFNNQVJUQ0FSRCBoYW5kbGUgRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX1NNQVJUQ0FSRF9HZXRFcnJvcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgcmV0dXJuIGhzbWFydGNhcmQtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUHJpdmF0ZV9GdW5jdGlvbnMgU01BUlRDQVJEIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgY2FsbGJhY2tzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBTTUFSVENBUkQgaGFuZGxlLgorICAqIEByZXR2YWwgbm9uZQorICAqLwordm9pZCBTTUFSVENBUkRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogSW5pdCB0aGUgU01BUlRDQVJEIENhbGxiYWNrIHNldHRpbmdzICovCisgIGhzbWFydGNhcmQtPlR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrICAgICAgICAgICAgID0gSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICovCisgIGhzbWFydGNhcmQtPkFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgPSBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgKi8KKyAgaHNtYXJ0Y2FyZC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgID0gSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgICovCisKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNNQVJUQ0FSRCBhc3NvY2lhdGVkIFVTQVJUIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9TZXRDb25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKyAgU01BUlRDQVJEX0Nsb2NrU291cmNlVHlwZURlZiBjbG9ja3NvdXJjZTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfSU5TVEFOQ0UoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9CQVVEUkFURShoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfV09SRF9MRU5HVEgoaHNtYXJ0Y2FyZC0+SW5pdC5Xb3JkTGVuZ3RoKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfU1RPUEJJVFMoaHNtYXJ0Y2FyZC0+SW5pdC5TdG9wQml0cykpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1BBUklUWShoc21hcnRjYXJkLT5Jbml0LlBhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX01PREUoaHNtYXJ0Y2FyZC0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfUE9MQVJJVFkoaHNtYXJ0Y2FyZC0+SW5pdC5DTEtQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1BIQVNFKGhzbWFydGNhcmQtPkluaXQuQ0xLUGhhc2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9MQVNUQklUKGhzbWFydGNhcmQtPkluaXQuQ0xLTGFzdEJpdCkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX09ORV9CSVRfU0FNUExFKGhzbWFydGNhcmQtPkluaXQuT25lQml0U2FtcGxpbmcpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9OQUNLKGhzbWFydGNhcmQtPkluaXQuTkFDS0VuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1RJTUVPVVQoaHNtYXJ0Y2FyZC0+SW5pdC5UaW1lT3V0RW5hYmxlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQVVUT1JFVFJZX0NPVU5UKGhzbWFydGNhcmQtPkluaXQuQXV0b1JldHJ5Q291bnQpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogSW4gU21hcnRDYXJkIG1vZGUsIE0gYW5kIFBDRSBhcmUgZm9yY2VkIHRvIDEgKDggYml0cyArIHBhcml0eSkuCisgICAqIE92ZXJzYW1wbGluZyBpcyBmb3JjZWQgdG8gMTYgKE9WRVI4ID0gMCkuCisgICAqIENvbmZpZ3VyZSB0aGUgUGFyaXR5IGFuZCBNb2RlOgorICAgKiAgc2V0IFBTIGJpdCBhY2NvcmRpbmcgdG8gaHNtYXJ0Y2FyZC0+SW5pdC5QYXJpdHkgdmFsdWUKKyAgICogIHNldCBURSBhbmQgUkUgYml0cyBhY2NvcmRpbmcgdG8gaHNtYXJ0Y2FyZC0+SW5pdC5Nb2RlIHZhbHVlICovCisgIHRtcHJlZyA9ICh1aW50MzJfdCkgKGhzbWFydGNhcmQtPkluaXQuUGFyaXR5IHwgaHNtYXJ0Y2FyZC0+SW5pdC5Nb2RlIHwgaHNtYXJ0Y2FyZC0+SW5pdC5Xb3JkTGVuZ3RoKTsKKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB0bXByZWcgPSBoc21hcnRjYXJkLT5Jbml0LlN0b3BCaXRzOworICAvKiBTeW5jaHJvbm91cyBtb2RlIGlzIGFjdGl2YXRlZCBieSBkZWZhdWx0ICovCisgIHRtcHJlZyB8PSAodWludDMyX3QpIFVTQVJUX0NSMl9DTEtFTiB8IGhzbWFydGNhcmQtPkluaXQuQ0xLUG9sYXJpdHk7CisgIHRtcHJlZyB8PSAodWludDMyX3QpIGhzbWFydGNhcmQtPkluaXQuQ0xLUGhhc2UgfCBoc21hcnRjYXJkLT5Jbml0LkNMS0xhc3RCaXQ7CisgIHRtcHJlZyB8PSAodWludDMyX3QpIGhzbWFydGNhcmQtPkluaXQuVGltZU91dEVuYWJsZTsKKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUKKyAgICogLSBvbmUtYml0IHNhbXBsaW5nIG1ldGhvZCB2ZXJzdXMgdGhyZWUgc2FtcGxlcycgbWFqb3JpdHkgcnVsZQorICAgKiAgIGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0Lk9uZUJpdFNhbXBsaW5nCisgICAqIC0gTkFDSyB0cmFuc21pc3Npb24gaW4gY2FzZSBvZiBwYXJpdHkgZXJyb3IgYWNjb3JkaW5nCisgICAqICAgdG8gaHNtYXJ0Y2FyZC0+SW5pdC5OQUNLRW5hYmxlCisgICAqIC0gYXV0b3JldHJ5IGNvdW50ZXIgYWNjb3JkaW5nIHRvIGhzbWFydGNhcmQtPkluaXQuQXV0b1JldHJ5Q291bnQgKi8KKworICB0bXByZWcgPSAodWludDMyX3QpIGhzbWFydGNhcmQtPkluaXQuT25lQml0U2FtcGxpbmcgfCBoc21hcnRjYXJkLT5Jbml0Lk5BQ0tFbmFibGU7CisgIHRtcHJlZyB8PSAoKHVpbnQzMl90KWhzbWFydGNhcmQtPkluaXQuQXV0b1JldHJ5Q291bnQgPDwgVVNBUlRfQ1IzX1NDQVJDTlRfUG9zKTsKKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRklFTERTLCB0bXByZWcpOworCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBHVFBSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHRtcHJlZyA9IChoc21hcnRjYXJkLT5Jbml0LlByZXNjYWxlciB8ICgodWludDMyX3QpaHNtYXJ0Y2FyZC0+SW5pdC5HdWFyZFRpbWUgPDwgVVNBUlRfR1RQUl9HVF9Qb3MpKTsKKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+R1RQUiwgKHVpbnQxNl90KShVU0FSVF9HVFBSX0dUIHwgVVNBUlRfR1RQUl9QU0MpLCAodWludDE2X3QpdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIFJUT1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdG1wcmVnID0gKCh1aW50MzJfdCloc21hcnRjYXJkLT5Jbml0LkJsb2NrTGVuZ3RoIDw8IFVTQVJUX1JUT1JfQkxFTl9Qb3MpOworICBpZiAoaHNtYXJ0Y2FyZC0+SW5pdC5UaW1lT3V0RW5hYmxlID09IFNNQVJUQ0FSRF9USU1FT1VUX0VOQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfVElNRU9VVF9WQUxVRShoc21hcnRjYXJkLT5Jbml0LlRpbWVPdXRWYWx1ZSkpOworICAgIHRtcHJlZyB8PSAodWludDMyX3QpIGhzbWFydGNhcmQtPkluaXQuVGltZU91dFZhbHVlOworICB9CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJUT1IsIChVU0FSVF9SVE9SX1JUTyB8IFVTQVJUX1JUT1JfQkxFTiksIHRtcHJlZyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFNNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRShoc21hcnRjYXJkLCBjbG9ja3NvdXJjZSk7CisgIHRtcHJlZyA9ICAgMFU7CisgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCisgIHsKKyAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoKEhBTF9SQ0NfR2V0UENMSzFGcmVxKCkgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSAvIDJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsyOgorICAgICAgdG1wcmVnID0gKHVpbnQxNl90KSgoSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSArIChoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlIC8gMlUpKSAvIGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgdG1wcmVnID0gKHVpbnQxNl90KSgoSFNJX1ZBTFVFICsgKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUgLyAyVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKChIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpICsgKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUgLyAyVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9MU0U6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKChMU0VfVkFMVUUgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSAvIDJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFVTQVJURElWIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBkMTYgKi8KKyAgaWYgKCh0bXByZWcgPj0gVVNBUlRfQlJSX01JTikgJiYgKHRtcHJlZyA8PSBVU0FSVF9CUlJfTUFYKSkKKyAgeworICAgIGhzbWFydGNhcmQtPkluc3RhbmNlLT5CUlIgPSB0bXByZWc7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0ID0gSEFMX0VSUk9SOworICB9CisKKworICAvKiBDbGVhciBJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhJU1IgICA9IE5VTEw7CisgIGhzbWFydGNhcmQtPlR4SVNSICAgPSBOVUxMOworCisgIHJldHVybiByZXQ7Cit9CisKKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgcGVyaXBoZXJhbCBhZHZhbmNlZCBmZWF0dXJlcy4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0FkdkZlYXR1cmVDb25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIHNldCBvZiBhZHZhbmNlZCBmZWF0dXJlcyB0byBjb25maWd1cmUgaXMgcHJvcGVybHkgc2V0ICovCisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9JTklUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCkpOworCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlYoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpKTsKKyAgICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9UWElOViwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9SWElOVkVSVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9SWElOVihoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIGRhdGEgaW52ZXJzaW9uICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfREFUQUlOVihoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuRGF0YUludmVydCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5EYXRhSW52ZXJ0KTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgUlgvVFggcGlucyBzd2FwICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuU3dhcCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NXQVAsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5Td2FwKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgUlggb3ZlcnJ1biBkZXRlY3Rpb24gZGlzYWJsaW5nICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX09WRVJSVU4oaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0Lk92ZXJydW5EaXNhYmxlKSk7CisgICAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuT3ZlcnJ1bkRpc2FibGUpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBETUEgZGlzYWJsaW5nIG9uIHJlY2VwdGlvbiBlcnJvciAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9ETUFPTlJYRVJST1IoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkRNQURpc2FibGVvblJ4RXJyb3IpKTsKKyAgICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ERFJFLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuRE1BRGlzYWJsZW9uUnhFcnJvcik7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIE1TQiBmaXJzdCBvbiBjb21tdW5pY2F0aW9uIGxpbmUgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1QoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0Lk1TQkZpcnN0KSk7CisgICAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5NU0JGaXJzdCk7CisgIH0KKworfQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgdGhlIFNNQVJUQ0FSRCBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX0NoZWNrSWRsZVN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJEIEVycm9yQ29kZSAqLworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIENoZWNrIGlmIHRoZSBUcmFuc21pdHRlciBpcyBlbmFibGVkICovCisgIGlmICgoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmIChTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBVU0FSVF9JU1JfVEVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIFNNQVJUQ0FSRF9URUFDS19SRUFDS19USU1FT1VUKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorICAvKiBDaGVjayBpZiB0aGUgUmVjZWl2ZXIgaXMgZW5hYmxlZCAqLworICBpZiAoKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoU01BUlRDQVJEX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHNtYXJ0Y2FyZCwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBTTUFSVENBUkRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgc3RhdGVzICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTTUFSVENBUkQgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgRmxhZyBTcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgU3RhdHVzIFRoZSBuZXcgRmxhZyBzdGF0dXMgKFNFVCBvciBSRVNFVCkuCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCisgIHdoaWxlICgoX19IQUxfU01BUlRDQVJEX0dFVF9GTEFHKGhzbWFydGNhcmQsIEZsYWcpID8gU0VUIDogUkVTRVQpID09IFN0YXR1cykKKyAgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgVFhFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgZm9yIHRoZSBpbnRlcnJ1cHQgcHJvY2VzcyAqLworICAgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRSkpOworICAgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgICAgICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmQgb25nb2luZyBUeCB0cmFuc2ZlciBvbiBTTUFSVENBUkQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBUcmFuc21pdCBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kVHhUcmFuc2ZlcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmQgb25nb2luZyBSeCB0cmFuc2ZlciBvbiBVQVJUIHBlcmlwaGVyYWwgKGZvbGxvd2luZyBlcnJvciBkZXRlY3Rpb24gb3IgUmVjZXB0aW9uIGNvbXBsZXRpb24pLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9FbmRSeFRyYW5zZmVyKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVQgYml0CisgIGluIHRoZSBTTUFSVENBUkQgYXNzb2NpYXRlZCBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfU01BUlRDQVJEX0VOQUJMRV9JVChoc21hcnRjYXJkLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIERpc2FibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgaW4gdGhlIFNNQVJUQ0FSRCBhc3NvY2lhdGVkIFVTQVJUIENSMyByZWdpc3RlciAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5SeENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgLyogU3RvcCBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworICAgICAgU01BUlRDQVJEX0VuZFR4VHJhbnNmZXIoaHNtYXJ0Y2FyZCk7CisgICAgfQorICB9CisKKyAgLyogU3RvcCBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisgICAgICBTTUFSVENBUkRfRW5kUnhUcmFuc2Zlcihoc21hcnRjYXJkKTsKKyAgICB9CisgIH0KKworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUE7CisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgSEFMIHNlcnZpY2VzIG9uIEVycm9yCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlbmNlKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgUnggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgY2hhbm5lbHMgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSBhbmQgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5nU3RhdGUgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5BYm9ydENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgY2hhbm5lbHMgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSBhbmQgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5nU3RhdGUgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5BYm9ydENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyIGJ5IGEgY2FsbCB0bworICAqICAgICAgICAgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0X0lUIEFQSSAoQWJvcnQgb25seSBUeCB0cmFuc2ZlcikKKyAgKiAgICAgICAgIChUaGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QsCisgICogICAgICAgICBhbmQgbGVhZHMgdG8gdXNlciBUeCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24pLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyIGJ5IGEgY2FsbCB0bworICAqICAgICAgICAgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVfSVQgQVBJIChBYm9ydCBvbmx5IFJ4IHRyYW5zZmVyKQorICAqICAgICAgICAgKFRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCwKKyAgKiAgICAgICAgIGFuZCBsZWFkcyB0byB1c2VyIFJ4IEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbikuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BUnhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQgPSAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfVHhJU1IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZiAoaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgSW50ZXJydXB0ICovCisgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9TTUFSVENBUkRfRU5BQkxFX0lUKGhzbWFydGNhcmQsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKmhzbWFydGNhcmQtPnBUeEJ1ZmZQdHIgJiAweEZGVSk7CisgICAgICBoc21hcnRjYXJkLT5wVHhCdWZmUHRyKys7CisgICAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyYXAgdXAgdHJhbnNtaXNzaW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9FbmRUcmFuc21pdF9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRV9JVChoc21hcnRjYXJkLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbik7CisKKyAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QuIElmIG5vdCBkaXNhYmxlIEVSUiBJVCAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgfQorCisgIC8qIFJlLWVuYWJsZSBSeCBhdCBlbmQgb2YgdHJhbnNtaXNzaW9uIGlmIGluaXRpYWwgbW9kZSBpcyBSeC9UeCAqLworICBpZiAoaHNtYXJ0Y2FyZC0+SW5pdC5Nb2RlID09IFNNQVJUQ0FSRF9NT0RFX1RYX1JYKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZXMgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SRSk7CisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworICB9CisKKyAgLyogVHggcHJvY2VzcyBpcyBlbmRlZCwgcmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgIGhzbWFydGNhcmQtPlR4SVNSID0gTlVMTDsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPlR4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfUnhJU1IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPlJ4U3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1JYKQorICB7CisgICAgKmhzbWFydGNhcmQtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KTB4RkYpOworICAgIGhzbWFydGNhcmQtPnBSeEJ1ZmZQdHIrKzsKKworICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50LS07CisgICAgaWYgKGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFKTsKKworICAgICAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgICAgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gTlVMTDsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfU01BUlRDQVJEX1NFTkRfUkVRKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9TTUFSVENBUkRfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF9zbWFydGNhcmRfZXguYyBiL1NyYy9zdG0zMmwweHhfaGFsX3NtYXJ0Y2FyZF9leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YzY0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF9zbWFydGNhcmRfZXguYwpAQCAtMCwwICsxLDIyMiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfc21hcnRjYXJkX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNNQVJUQ0FSRCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZXh0ZW5kZWQgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTbWFydENhcmQuCisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICMjIyMjIFNNQVJUQ0FSRCBwZXJpcGhlcmFsIGV4dGVuZGVkIGZlYXR1cmVzICAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoZSBFeHRlbmRlZCBTTUFSVENBUkQgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgKCMpIEFmdGVyIGhhdmluZyBjb25maWd1cmVkIHRoZSBTTUFSVENBUkQgYmFzaWMgZmVhdHVyZXMgd2l0aCBIQUxfU01BUlRDQVJEX0luaXQoKSwKKyAgICAgICAgdGhlbiBwcm9ncmFtIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlcyBpZiByZXF1aXJlZCAoVFgvUlggcGlucyBzd2FwLCBUaW1lT3V0LAorICAgICAgICBhdXRvLXJldHJ5IGNvdW50ZXIsLi4uKSBpbiB0aGUgaHNtYXJ0Y2FyZCBBZHZhbmNlZEluaXQgc3RydWN0dXJlLgorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisjaWYgIWRlZmluZWQgKFNUTTMyTDAxMHg0KSAmJiAhZGVmaW5lZCAoU1RNMzJMMDEweDYpCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeCBTTUFSVENBUkRFeAorICAqIEBicmllZiBTTUFSVENBUkQgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworI2lmZGVmIEhBTF9TTUFSVENBUkRfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeF9FeHBvcnRlZF9GdW5jdGlvbnMgIFNNQVJUQ0FSRCBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBjb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJELgorICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X0Jsb2NrTGVuZ3RoX0NvbmZpZygpIEFQSSBhbGxvd3MgdG8gY29uZmlndXJlIHRoZSBCbG9jayBMZW5ndGggb24gdGhlIGZseQorICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X1RpbWVPdXRfQ29uZmlnKCkgQVBJIGFsbG93cyB0byBjb25maWd1cmUgdGhlIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgb24gdGhlIGZseQorICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X0VuYWJsZVJlY2VpdmVyVGltZU91dCgpIEFQSSBlbmFibGVzIHRoZSByZWNlaXZlciB0aW1lb3V0IGZlYXR1cmUKKyAgICAgKCspIEhBTF9TTUFSVENBUkRFeF9EaXNhYmxlUmVjZWl2ZXJUaW1lT3V0KCkgQVBJIGRpc2FibGVzIHRoZSByZWNlaXZlciB0aW1lb3V0IGZlYXR1cmUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBVcGRhdGUgb24gdGhlIGZseSB0aGUgU01BUlRDQVJEIGJsb2NrIGxlbmd0aCBpbiBSVE9SIHJlZ2lzdGVyLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSBCbG9ja0xlbmd0aCBTTUFSVENBUkQgYmxvY2sgbGVuZ3RoICg4LWJpdCBsb25nIGF0IG1vc3QpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TTUFSVENBUkRFeF9CbG9ja0xlbmd0aF9Db25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgQmxvY2tMZW5ndGgpCit7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJUT1IsIFVTQVJUX1JUT1JfQkxFTiwgKCh1aW50MzJfdClCbG9ja0xlbmd0aCA8PCBVU0FSVF9SVE9SX0JMRU5fUG9zKSk7Cit9CisKKy8qKiBAYnJpZWYgVXBkYXRlIG9uIHRoZSBmbHkgdGhlIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgaW4gUlRPUiByZWdpc3Rlci4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gVGltZU91dFZhbHVlIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgaW4gbnVtYmVyIG9mIGJhdWQgYmxvY2tzLiBUaGUgdGltZW91dAorICAqICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbXVzdCBiZSBsZXNzIG9yIGVxdWFsIHRvIDB4MEZGRkZGRkZGLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU01BUlRDQVJERXhfVGltZU91dF9Db25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQzMl90IFRpbWVPdXRWYWx1ZSkKK3sKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9USU1FT1VUX1ZBTFVFKGhzbWFydGNhcmQtPkluaXQuVGltZU91dFZhbHVlKSk7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJUT1IsIFVTQVJUX1JUT1JfUlRPLCBUaW1lT3V0VmFsdWUpOworfQorCisvKiogQGJyaWVmIEVuYWJsZSB0aGUgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZS4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRFeF9FbmFibGVSZWNlaXZlclRpbWVPdXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICAgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWTsKKworICAgIC8qIFNldCB0aGUgVVNBUlQgUlRPRU4gYml0ICovCisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pOworCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKiogQGJyaWVmIERpc2FibGUgdGhlIFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IGZlYXR1cmUuCisgICogQHBhcmFtIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfRGlzYWJsZVJlY2VpdmVyVGltZU91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgICAgLyogQ2xlYXIgdGhlIFVTQVJUIFJUT0VOIGJpdCAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfUlRPRU4pOworCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgRXh0ZW5kZWQgUGVyaXBoZXJhbCBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgU01BUlRDQVJEIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIEV4dGVuZGVkIFBlcmlwaGVyYWwgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBTTUFSVENBUkQgY29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X1ByaXZhdGVfRnVuY3Rpb25zICBTTUFSVENBUkQgRXh0ZW5kZWQgcHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qICFkZWZpbmVkIChTVE0zMkwwMTB4NCkgJiYgIWRlZmluZWQgKFNUTTMyTDAxMHg2KSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfc21idXMuYyBiL1NyYy9zdG0zMmwweHhfaGFsX3NtYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkNjlmZgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX3NtYnVzLmMKQEAgLTAsMCArMSwyNjczIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF9zbWJ1cy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBTTUJVUyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBCdXMgKFNNQnVzKSBwZXJpcGhlcmFsLAorICAqICAgICAgICAgIGJhc2VkIG9uIEkyQyBwcmluY2lwbGVzIG9mIG9wZXJhdGlvbiA6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIFNNQlVTIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICgjKSBEZWNsYXJlIGEgU01CVVNfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLCBmb3IgZXhhbXBsZToKKyAgICAgICAgU01CVVNfSGFuZGxlVHlwZURlZiAgaHNtYnVzOworCisgICAgKCMpSW5pdGlhbGl6ZSB0aGUgU01CVVMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEByZWYgSEFMX1NNQlVTX01zcEluaXQoKSBBUEk6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBTTUJVU3ggaW50ZXJmYWNlIGNsb2NrCisgICAgICAgICgjIykgU01CVVMgcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU01CVVMgR1BJT3MKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSBTTUJVUyBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBvcGVuLWRyYWluCisgICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBTTUJVU3ggaW50ZXJydXB0IHByaW9yaXR5CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgU01CVVMgSVJRIENoYW5uZWwKKworICAgICgjKSBDb25maWd1cmUgdGhlIENvbW11bmljYXRpb24gQ2xvY2sgVGltaW5nLCBCdXMgVGltZW91dCwgT3duIEFkZHJlc3MxLCBNYXN0ZXIgQWRkcmVzc2luZyBtb2RlLAorICAgICAgICBEdWFsIEFkZHJlc3NpbmcgbW9kZSwgT3duIEFkZHJlc3MyLCBPd24gQWRkcmVzczIgTWFzaywgR2VuZXJhbCBjYWxsLCBOb3N0cmV0Y2ggbW9kZSwKKyAgICAgICAgUGVyaXBoZXJhbCBtb2RlIGFuZCBQYWNrZXQgRXJyb3IgQ2hlY2sgbW9kZSBpbiB0aGUgaHNtYnVzIEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIFNNQlVTIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBAcmVmIEhBTF9TTUJVU19Jbml0KCkgQVBJOgorICAgICAgICAoKyspIFRoZXNlIEFQSSdzIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpCisgICAgICAgICAgICAgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBAcmVmIEhBTF9TTUJVU19Nc3BJbml0KCZoc21idXMpIEFQSS4KKworICAgICgjKSBUbyBjaGVjayBpZiB0YXJnZXQgZGV2aWNlIGlzIHJlYWR5IGZvciBjb21tdW5pY2F0aW9uLCB1c2UgdGhlIGZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX0lzRGV2aWNlUmVhZHkoKQorCisgICAgKCMpIEZvciBTTUJVUyBJTyBvcGVyYXRpb25zLCBvbmx5IG9uZSBtb2RlIG9mIG9wZXJhdGlvbnMgaXMgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlcgorCisgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIvaG9zdCBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX1NNQlVTX01hc3Rlcl9UcmFuc21pdF9JVCgpCisgICAgICAoKyspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgQHJlZiBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFJlY2VpdmUgaW4gbWFzdGVyL2hvc3QgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9TTUJVU19NYXN0ZXJfUmVjZWl2ZV9JVCgpCisgICAgICAoKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgQHJlZiBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIEFib3J0IGEgbWFzdGVyL2hvc3QgU01CVVMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggSW50ZXJydXB0IHVzaW5nIEByZWYgSEFMX1NNQlVTX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKyspIFRoZSBhc3NvY2lhdGVkIHByZXZpb3VzIHRyYW5zZmVyIGNhbGxiYWNrIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGFib3J0IHByb2Nlc3MKKyAgICAgICgrKykgbWVhbiBAcmVmIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGluIGNhc2Ugb2YgcHJldmlvdXMgc3RhdGUgd2FzIG1hc3RlciB0cmFuc21pdAorICAgICAgKCsrKSBtZWFuIEByZWYgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkgaW4gY2FzZSBvZiBwcmV2aW91cyBzdGF0ZSB3YXMgbWFzdGVyIHJlY2VpdmUKKyAgICAgICgrKSBFbmFibGUvZGlzYWJsZSB0aGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSBpbiBzbGF2ZS9kZXZpY2Ugb3IgaG9zdC9zbGF2ZSBTTUJVUyBtb2RlCisgICAgICAgICAgIHVzaW5nIEByZWYgSEFMX1NNQlVTX0VuYWJsZUxpc3Rlbl9JVCgpIEByZWYgSEFMX1NNQlVTX0Rpc2FibGVMaXN0ZW5fSVQoKQorICAgICAgKCsrKSBXaGVuIGFkZHJlc3Mgc2xhdmUvZGV2aWNlIFNNQlVTIG1hdGNoLCBAcmVmIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSB0byBjaGVjayB0aGUgQWRkcmVzcyBNYXRjaCBDb2RlIGFuZCB0aGUgdHJhbnNtaXNzaW9uIGRpcmVjdGlvbiByZXF1ZXN0IGJ5IG1hc3Rlci9ob3N0IChXcml0ZS9SZWFkKS4KKyAgICAgICgrKykgQXQgTGlzdGVuIG1vZGUgZW5kIEByZWYgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFRyYW5zbWl0IGluIHNsYXZlL2RldmljZSBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX1NNQlVTX1NsYXZlX1RyYW5zbWl0X0lUKCkKKyAgICAgICgrKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBAcmVmIEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFJlY2VpdmUgaW4gc2xhdmUvZGV2aWNlIFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfU01CVVNfU2xhdmVfUmVjZWl2ZV9JVCgpCisgICAgICAoKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgQHJlZiBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgU01CVVMgYWxlcnQgbW9kZSB1c2luZyBAcmVmIEhBTF9TTUJVU19FbmFibGVBbGVydF9JVCgpIEByZWYgSEFMX1NNQlVTX0Rpc2FibGVBbGVydF9JVCgpCisgICAgICAoKyspIFdoZW4gU01CVVMgQWxlcnQgaXMgZ2VuZXJhdGVkIEByZWYgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICAgIHRvIGNoZWNrIHRoZSBBbGVydCBFcnJvciBDb2RlIHVzaW5nIGZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX0dldEVycm9yKCkKKyAgICAgICgrKSBHZXQgSEFMIHN0YXRlIG1hY2hpbmUgb3IgZXJyb3IgdmFsdWVzIHVzaW5nIEByZWYgSEFMX1NNQlVTX0dldFN0YXRlKCkgb3IgQHJlZiBIQUxfU01CVVNfR2V0RXJyb3IoKQorICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEByZWYgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICAgIHRvIGNoZWNrIHRoZSBFcnJvciBDb2RlIHVzaW5nIGZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX0dldEVycm9yKCkKKworICAgICAqKiogU01CVVMgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBTTUJVUyBIQUwgZHJpdmVyLgorCisgICAgICAoKykgQHJlZiBfX0hBTF9TTUJVU19FTkFCTEU6ICAgICAgRW5hYmxlIHRoZSBTTUJVUyBwZXJpcGhlcmFsCisgICAgICAoKykgQHJlZiBfX0hBTF9TTUJVU19ESVNBQkxFOiAgICAgRGlzYWJsZSB0aGUgU01CVVMgcGVyaXBoZXJhbAorICAgICAgKCspIEByZWYgX19IQUxfU01CVVNfR0VUX0ZMQUc6ICAgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTTUJVUyBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICgrKSBAcmVmIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUc6ICBDbGVhciB0aGUgc3BlY2lmaWVkIFNNQlVTIHBlbmRpbmcgZmxhZworICAgICAgKCspIEByZWYgX19IQUxfU01CVVNfRU5BQkxFX0lUOiAgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNNQlVTIGludGVycnVwdAorICAgICAgKCspIEByZWYgX19IQUxfU01CVVNfRElTQUJMRV9JVDogIERpc2FibGUgdGhlIHNwZWNpZmllZCBTTUJVUyBpbnRlcnJ1cHQKKworICAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICBUaGUgY29tcGlsYXRpb24gZmxhZyBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisgICAgIFVzZSBGdW5jdGlvbnMgQHJlZiBIQUxfU01CVVNfUmVnaXN0ZXJDYWxsYmFjaygpIG9yIEByZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQWRkckNhbGxiYWNrKCkKKyAgICAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorCisgICAgIEZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIE1hc3RlclJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVR4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVJ4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBMaXN0ZW5DcGx0Q2FsbGJhY2sgICA6IGNhbGxiYWNrIGZvciBlbmQgb2YgbGlzdGVuIG1vZGUuCisgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgTXNwIEluaXQuCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1zcCBEZUluaXQuCisgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKworICAgICBGb3Igc3BlY2lmaWMgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2suCisKKyAgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX1VuUmVnaXN0ZXJDYWxsYmFjayB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgIHdlYWsgZnVuY3Rpb24uCisgICAgIEByZWYgSEFMX1NNQlVTX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgKCspIE1hc3RlclR4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBNYXN0ZXJSeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBNYXN0ZXIgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVUeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVSeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgTGlzdGVuQ3BsdENhbGxiYWNrICAgOiBjYWxsYmFjayBmb3IgZW5kIG9mIGxpc3RlbiBtb2RlLgorICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICA6IGNhbGxiYWNrIGZvciBlcnJvciBkZXRlY3Rpb24uCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgorCisgICAgIEZvciBjYWxsYmFjayBBZGRyQ2FsbGJhY2sgdXNlIGRlZGljYXRlZCByZWdpc3RlciBjYWxsYmFja3MgOiBAcmVmIEhBTF9TTUJVU19VblJlZ2lzdGVyQWRkckNhbGxiYWNrLgorCisgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9TTUJVU19Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEByZWYgSEFMX0kyQ19TVEFURV9SRVNFVAorICAgICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CisgICAgIGV4YW1wbGVzIEByZWYgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkuCisgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX1NNQlVTX0luaXQoKS8gQHJlZiBIQUxfU01CVVNfRGVJbml0KCkgb25seSB3aGVuCisgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1NNQlVTX0luaXQoKS8gQHJlZiBIQUxfU01CVVNfRGVJbml0KCkKKyAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKSB3aGF0ZXZlciB0aGUgc3RhdGUuCisKKyAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBAcmVmIEhBTF9JMkNfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgIGluIEByZWYgSEFMX0kyQ19TVEFURV9SRUFEWSBvciBAcmVmIEhBTF9JMkNfU1RBVEVfUkVTRVQgc3RhdGUsCisgICAgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgIFRoZW4sIHRoZSB1c2VyIGZpcnN0IHJlZ2lzdGVycyB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgICAgdXNpbmcgQHJlZiBIQUxfU01CVVNfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1NNQlVTX0RlSW5pdCgpCisgICAgIG9yIEByZWYgSEFMX1NNQlVTX0luaXQoKSBmdW5jdGlvbi4KKworICAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICAgICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgorCisgICAgIFsuLl0KKyAgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgU01CVVMgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVMgU01CVVMKKyAgKiBAYnJpZWYgU01CVVMgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1NNQlVTX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUJVU19Qcml2YXRlX0RlZmluZSBTTUJVUyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFRJTUlOR19DTEVBUl9NQVNLICAgKDB4RjBGRkZGRkZVTCkgICAgIC8qITwgU01CVVMgVElNSU5HIGNsZWFyIHJlZ2lzdGVyIE1hc2sgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfQUREUiAgICAoMTAwMDBVKSAgICAgICAgICAgLyohPCAxMCBzICAqLworI2RlZmluZSBIQUxfVElNRU9VVF9CVVNZICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX0RJUiAgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfUlhORSAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9TVE9QRiAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX1RDICAgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfVENSICAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9UWElTICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIE1BWF9OQllURV9TSVpFICAgICAgMjU1VQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX1ByaXZhdGVfRnVuY3Rpb25zIFNNQlVTIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpbWVvdXQpOworCitzdGF0aWMgdm9pZCBTTUJVU19FbmFibGVfSVJRKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgSW50ZXJydXB0UmVxdWVzdCk7CitzdGF0aWMgdm9pZCBTTUJVU19EaXNhYmxlX0lSUShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEludGVycnVwdFJlcXVlc3QpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQlVTX01hc3Rlcl9JU1Ioc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBTdGF0dXNGbGFncyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01CVVNfU2xhdmVfSVNSKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgU3RhdHVzRmxhZ3MpOworCitzdGF0aWMgdm9pZCBTTUJVU19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworCitzdGF0aWMgdm9pZCBTTUJVU19JVEVycm9ySGFuZGxlcihzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworCitzdGF0aWMgdm9pZCBTTUJVU19UcmFuc2ZlckNvbmZpZyhzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsICB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90IFNpemUsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnMgU01CVVMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSBhbmQKKyAgICAgICAgICBkZWluaXRpYWxpemUgdGhlIFNNQlVTeCBwZXJpcGhlcmFsOgorCisgICAgICAoKykgVXNlciBtdXN0IEltcGxlbWVudCBIQUxfU01CVVNfTXNwSW5pdCgpIGZ1bmN0aW9uIGluIHdoaWNoIGhlIGNvbmZpZ3VyZXMKKyAgICAgICAgICBhbGwgcmVsYXRlZCBwZXJpcGhlcmFscyByZXNvdXJjZXMgKENMT0NLLCBHUElPLCBJVCBhbmQgTlZJQyApLgorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1NNQlVTX0luaXQoKSB0byBjb25maWd1cmUgdGhlIHNlbGVjdGVkIGRldmljZSB3aXRoCisgICAgICAgICAgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb246CisgICAgICAgICgrKykgQ2xvY2sgVGltaW5nCisgICAgICAgICgrKykgQnVzIFRpbWVvdXQKKyAgICAgICAgKCsrKSBBbmFsb2cgRmlsZXIgbW9kZQorICAgICAgICAoKyspIE93biBBZGRyZXNzIDEKKyAgICAgICAgKCsrKSBBZGRyZXNzaW5nIG1vZGUgKE1hc3RlciwgU2xhdmUpCisgICAgICAgICgrKykgRHVhbCBBZGRyZXNzaW5nIG1vZGUKKyAgICAgICAgKCsrKSBPd24gQWRkcmVzcyAyCisgICAgICAgICgrKykgT3duIEFkZHJlc3MgMiBNYXNrCisgICAgICAgICgrKykgR2VuZXJhbCBjYWxsIG1vZGUKKyAgICAgICAgKCsrKSBOb3N0cmV0Y2ggbW9kZQorICAgICAgICAoKyspIFBhY2tldCBFcnJvciBDaGVjayBtb2RlCisgICAgICAgICgrKykgUGVyaXBoZXJhbCBtb2RlCisKKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TTUJVU19EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICBvZiB0aGUgc2VsZWN0ZWQgU01CVVN4IHBlcmlwaGVyYWwuCisKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSBBbmFsb2cvRGlnaXRhbCBmaWx0ZXJzIHdpdGggSEFMX1NNQlVTX0NvbmZpZ0FuYWxvZ0ZpbHRlcigpIGFuZAorICAgICAgICAgIEhBTF9TTUJVU19Db25maWdEaWdpdGFsRmlsdGVyKCkuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU01CVVMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAqICAgICAgICAgaW4gdGhlIFNNQlVTX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0luaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBDaGVjayB0aGUgU01CVVMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhzbWJ1cyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19JTlNUQU5DRShoc21idXMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19BTkFMT0dfRklMVEVSKGhzbWJ1cy0+SW5pdC5BbmFsb2dGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX09XTl9BRERSRVNTMShoc21idXMtPkluaXQuT3duQWRkcmVzczEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FERFJFU1NJTkdfTU9ERShoc21idXMtPkluaXQuQWRkcmVzc2luZ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0RVQUxfQUREUkVTUyhoc21idXMtPkluaXQuRHVhbEFkZHJlc3NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19PV05fQUREUkVTUzIoaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MyKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19PV05fQUREUkVTUzJfTUFTSyhoc21idXMtPkluaXQuT3duQWRkcmVzczJNYXNrcykpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfR0VORVJBTF9DQUxMKGhzbWJ1cy0+SW5pdC5HZW5lcmFsQ2FsbE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX05PX1NUUkVUQ0goaHNtYnVzLT5Jbml0Lk5vU3RyZXRjaE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1BFQyhoc21idXMtPkluaXQuUGFja2V0RXJyb3JDaGVja01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1BFUklQSEVSQUxfTU9ERShoc21idXMtPkluaXQuUGVyaXBoZXJhbE1vZGUpKTsKKworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHNtYnVzLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaHNtYnVzLT5NYXN0ZXJUeENwbHRDYWxsYmFjayA9IEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgKi8KKyAgICBoc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrID0gSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBNYXN0ZXJSeENwbHRDYWxsYmFjayAqLworICAgIGhzbWJ1cy0+U2xhdmVUeENwbHRDYWxsYmFjayAgPSBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIFNsYXZlVHhDcGx0Q2FsbGJhY2sgICovCisgICAgaHNtYnVzLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrICA9IEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgU2xhdmVSeENwbHRDYWxsYmFjayAgKi8KKyAgICBoc21idXMtPkxpc3RlbkNwbHRDYWxsYmFjayAgID0gSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBMaXN0ZW5DcGx0Q2FsbGJhY2sgICAqLworICAgIGhzbWJ1cy0+RXJyb3JDYWxsYmFjayAgICAgICAgPSBIQUxfU01CVVNfRXJyb3JDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgaHNtYnVzLT5BZGRyQ2FsbGJhY2sgICAgICAgICA9IEhBTF9TTUJVU19BZGRyQ2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWRkckNhbGxiYWNrICAgICAgICAgKi8KKworICAgIGlmIChoc21idXMtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NNQlVTX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YyAqLworICAgIGhzbWJ1cy0+TXNwSW5pdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgSEFMX1NNQlVTX01zcEluaXQoaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU01CVVNfRElTQUJMRShoc21idXMpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUJVU3ggVElNSU5HUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBTTUJVU3g6IEZyZXF1ZW5jeSByYW5nZSAqLworICBoc21idXMtPkluc3RhbmNlLT5USU1JTkdSID0gaHNtYnVzLT5Jbml0LlRpbWluZyAmIFRJTUlOR19DTEVBUl9NQVNLOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUJVU3ggVElNRU9VVFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgU01CVVN4OiBCdXMgVGltZW91dCAgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+VElNRU9VVFIgJj0gfkkyQ19USU1FT1VUUl9USU1PVVRFTjsKKyAgaHNtYnVzLT5JbnN0YW5jZS0+VElNRU9VVFIgJj0gfkkyQ19USU1FT1VUUl9URVhURU47CisgIGhzbWJ1cy0+SW5zdGFuY2UtPlRJTUVPVVRSID0gaHNtYnVzLT5Jbml0LlNNQnVzVGltZW91dDsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU01CVVN4IE9BUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBTTUJVU3g6IE93biBBZGRyZXNzMSBhbmQgYWNrIG93biBhZGRyZXNzMSBtb2RlICovCisgIGhzbWJ1cy0+SW5zdGFuY2UtPk9BUjEgJj0gfkkyQ19PQVIxX09BMUVOOworCisgIGlmIChoc21idXMtPkluaXQuT3duQWRkcmVzczEgIT0gMFVMKQorICB7CisgICAgaWYgKGhzbWJ1cy0+SW5pdC5BZGRyZXNzaW5nTW9kZSA9PSBTTUJVU19BRERSRVNTSU5HTU9ERV83QklUKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPk9BUjEgPSAoSTJDX09BUjFfT0ExRU4gfCBoc21idXMtPkluaXQuT3duQWRkcmVzczEpOworICAgIH0KKyAgICBlbHNlIC8qIFNNQlVTX0FERFJFU1NJTkdNT0RFXzEwQklUICovCisgICAgeworICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+T0FSMSA9IChJMkNfT0FSMV9PQTFFTiB8IEkyQ19PQVIxX09BMU1PREUgfCBoc21idXMtPkluaXQuT3duQWRkcmVzczEpOworICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUJVU3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIFNNQlVTeDogQWRkcmVzc2luZyBNYXN0ZXIgbW9kZSAqLworICBpZiAoaHNtYnVzLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IFNNQlVTX0FERFJFU1NJTkdNT0RFXzEwQklUKQorICB7CisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyID0gKEkyQ19DUjJfQUREMTApOworICB9CisgIC8qIEVuYWJsZSB0aGUgQVVUT0VORCBieSBkZWZhdWx0LCBhbmQgZW5hYmxlIE5BQ0sgKHNob3VsZCBiZSBkaXNhYmxlIG9ubHkgZHVyaW5nIFNsYXZlIHByb2Nlc3MpICovCisgIC8qIEFVVE9FTkQgYW5kIE5BQ0sgYml0IHdpbGwgYmUgbWFuYWdlIGR1cmluZyBUcmFuc2ZlciBwcm9jZXNzICovCisgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiB8PSAoSTJDX0NSMl9BVVRPRU5EIHwgSTJDX0NSMl9OQUNLKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU01CVVN4IE9BUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBTTUJVU3g6IER1YWwgbW9kZSBhbmQgT3duIEFkZHJlc3MyICovCisgIGhzbWJ1cy0+SW5zdGFuY2UtPk9BUjIgPSAoaHNtYnVzLT5Jbml0LkR1YWxBZGRyZXNzTW9kZSB8IGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMiB8IChoc21idXMtPkluaXQuT3duQWRkcmVzczJNYXNrcyA8PCA4VSkpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUJVU3ggQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIFNNQlVTeDogR2VuZXJhbGNhbGwgYW5kIE5vU3RyZXRjaCBtb2RlICovCisgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSA9IChoc21idXMtPkluaXQuR2VuZXJhbENhbGxNb2RlIHwgaHNtYnVzLT5Jbml0Lk5vU3RyZXRjaE1vZGUgfCBoc21idXMtPkluaXQuUGFja2V0RXJyb3JDaGVja01vZGUgfCBoc21idXMtPkluaXQuUGVyaXBoZXJhbE1vZGUgfCBoc21idXMtPkluaXQuQW5hbG9nRmlsdGVyKTsKKworICAvKiBFbmFibGUgU2xhdmUgQnl0ZSBDb250cm9sIG9ubHkgaW4gY2FzZSBvZiBQYWNrZXQgRXJyb3IgQ2hlY2sgaXMgZW5hYmxlZCBhbmQgU01CVVMgUGVyaXBoZXJhbCBpcyBzZXQgaW4gU2xhdmUgbW9kZSAqLworICBpZiAoKGhzbWJ1cy0+SW5pdC5QYWNrZXRFcnJvckNoZWNrTW9kZSA9PSBTTUJVU19QRUNfRU5BQkxFKQorICAgICAgJiYgKChoc21idXMtPkluaXQuUGVyaXBoZXJhbE1vZGUgPT0gU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX1NMQVZFKSB8fCAoaHNtYnVzLT5Jbml0LlBlcmlwaGVyYWxNb2RlID09IFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRV9BUlApKSkKKyAgeworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1NCQzsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgU01CVVMgcGVyaXBoZXJhbCAqLworICBfX0hBTF9TTUJVU19FTkFCTEUoaHNtYnVzKTsKKworICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFNNQlVTIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EZUluaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBDaGVjayB0aGUgU01CVVMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhzbWJ1cyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19JTlNUQU5DRShoc21idXMtPkluc3RhbmNlKSk7CisKKyAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFNNQlVTIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfU01CVVNfRElTQUJMRShoc21idXMpOworCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChoc21idXMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoc21idXMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NNQlVTX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLworICB9CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDICovCisgIGhzbWJ1cy0+TXNwRGVJbml0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfU01CVVNfTXNwRGVJbml0KGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSAgSEFMX1NNQlVTX1NUQVRFX1JFU0VUOworICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgU01CVVMgTVNQLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfTXNwSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFNNQlVTIE1TUC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX01zcERlSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQW5hbG9nIG5vaXNlIGZpbHRlci4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgQW5hbG9nRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0FOQUxPR0ZJTFRFUl9ESVNBQkxFCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfQ29uZmlnQW5hbG9nRmlsdGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgQW5hbG9nRmlsdGVyKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfSU5TVEFOQ0UoaHNtYnVzLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfQU5BTE9HX0ZJTFRFUihBbmFsb2dGaWx0ZXIpKTsKKworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfQlVTWTsKKworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TTUJVU19ESVNBQkxFKGhzbWJ1cyk7CisKKyAgICAvKiBSZXNldCBBTk9GRiBiaXQgKi8KKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjEgJj0gfihJMkNfQ1IxX0FORk9GRik7CisKKyAgICAvKiBTZXQgYW5hbG9nIGZpbHRlciBiaXQqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSB8PSBBbmFsb2dGaWx0ZXI7CisKKyAgICBfX0hBTF9TTUJVU19FTkFCTEUoaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBEaWdpdGFsIG5vaXNlIGZpbHRlci4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgRGlnaXRhbEZpbHRlciBDb2VmZmljaWVudCBvZiBkaWdpdGFsIG5vaXNlIGZpbHRlciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MEYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfQ29uZmlnRGlnaXRhbEZpbHRlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfSU5TVEFOQ0UoaHNtYnVzLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfRElHSVRBTF9GSUxURVIoRGlnaXRhbEZpbHRlcikpOworCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9CVVNZOworCisgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU01CVVMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NNQlVTX0RJU0FCTEUoaHNtYnVzKTsKKworICAgIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovCisgICAgdG1wcmVnID0gaHNtYnVzLT5JbnN0YW5jZS0+Q1IxOworCisgICAgLyogUmVzZXQgSTJDIERORiBiaXRzIFsxMTo4XSAqLworICAgIHRtcHJlZyAmPSB+KEkyQ19DUjFfRE5GKTsKKworICAgIC8qIFNldCBJMkN4IERORiBjb2VmZmljaWVudCAqLworICAgIHRtcHJlZyB8PSBEaWdpdGFsRmlsdGVyIDw8IEkyQ19DUjFfRE5GX1BvczsKKworICAgIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjEgPSB0bXByZWc7CisKKyAgICBfX0hBTF9TTUJVU19FTkFCTEUoaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBTTUJVUyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19TTEFWRV9SWF9DT01QTEVURV9DQl9JRCBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX0xJU1RFTl9DT01QTEVURV9DQl9JRCBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCBIQUxfU01CVVNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNNQlVTX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgaWYgKEhBTF9TTUJVU19TVEFURV9SRUFEWSA9PSBoc21idXMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPlNsYXZlVHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19TTEFWRV9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+U2xhdmVSeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX0xJU1RFTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TGlzdGVuQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfRVJST1JfQ0JfSUQgOgorICAgICAgICBoc21idXMtPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfU01CVVNfU1RBVEVfUkVTRVQgPT0gaHNtYnVzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TTUJVU19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc21idXMpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gU01CVVMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFNNQlVTIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX01BU1RFUl9SWF9DT01QTEVURV9DQl9JRCBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTElTVEVOX0NPTVBMRVRFX0NCX0lEIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1VuUmVnaXN0ZXJDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIEhBTF9TTUJVU19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc21idXMpOworCisgIGlmIChIQUxfU01CVVNfU1RBVEVfUkVBRFkgPT0gaHNtYnVzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TTUJVU19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1hc3RlclR4Q3BsdENhbGxiYWNrID0gSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBNYXN0ZXJUeENwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5NYXN0ZXJSeENwbHRDYWxsYmFjayA9IEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgTWFzdGVyUnhDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX1NMQVZFX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5TbGF2ZVR4Q3BsdENhbGxiYWNrID0gSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgU2xhdmVUeENwbHRDYWxsYmFjayAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrID0gSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgU2xhdmVSeENwbHRDYWxsYmFjayAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX0xJU1RFTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TGlzdGVuQ3BsdENhbGxiYWNrID0gSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIExpc3RlbkNwbHRDYWxsYmFjayAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19FUlJPUl9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+RXJyb3JDYWxsYmFjayA9IEhBTF9TTUJVU19FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTXNwRGVJbml0OyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9TTUJVU19TVEFURV9SRVNFVCA9PSBoc21idXMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TTUJVU19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TTUJVU19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciB0aGUgU2xhdmUgQWRkcmVzcyBNYXRjaCBTTUJVUyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBBZGRyZXNzIE1hdGNoIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCBwU01CVVNfQWRkckNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc21idXMpOworCisgIGlmIChIQUxfU01CVVNfU1RBVEVfUkVBRFkgPT0gaHNtYnVzLT5TdGF0ZSkKKyAgeworICAgIGhzbWJ1cy0+QWRkckNhbGxiYWNrID0gcENhbGxiYWNrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgU2xhdmUgQWRkcmVzcyBNYXRjaCBTTUJVUyBDYWxsYmFjaworICAqICAgICAgICAgSW5mbyBSZWFkeSBTTUJVUyBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19VblJlZ2lzdGVyQWRkckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICBpZiAoSEFMX1NNQlVTX1NUQVRFX1JFQURZID09IGhzbWJ1cy0+U3RhdGUpCisgIHsKKyAgICBoc21idXMtPkFkZHJDYWxsYmFjayA9IEhBTF9TTUJVU19BZGRyQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFkZHJDYWxsYmFjayAgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc21idXMpOworICByZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgU01CVVMgZGF0YQorICAgIHRyYW5zZmVycy4KKworICAgICgjKSBCbG9ja2luZyBtb2RlIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGRldmljZSBpcyByZWFkeSBmb3IgdXNhZ2UgaXMgOgorICAgICAgICAoKyspIEhBTF9TTUJVU19Jc0RldmljZVJlYWR5KCkKKworICAgICgjKSBUaGVyZSBpcyBvbmx5IG9uZSBtb2RlIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgTm9uLUJsb2NraW5nIG1vZGUgOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cy4KKyAgICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIgc3RhcnR1cC4KKyAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgZGVkaWNhdGVkIFNNQlVTIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlLgorCisgICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAoKyspIEhBTF9TTUJVU19NYXN0ZXJfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUJVU19NYXN0ZXJfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQlVTX1NsYXZlX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfU2xhdmVfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQlVTX0VuYWJsZUxpc3Rlbl9JVCgpIG9yIGFsaWFzIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQoKQorICAgICAgICAoKyspIEhBTF9TTUJVU19EaXNhYmxlTGlzdGVuX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfRW5hYmxlQWxlcnRfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUJVU19EaXNhYmxlQWxlcnRfSVQoKQorCisgICAgKCMpIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gbm9uLUJsb2NraW5nIG1vZGU6CisgICAgICAgICgrKykgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQlVTX0FkZHJDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soKQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGluIG1hc3Rlci9ob3N0IFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBTTUJVU19YZmVyT3B0aW9uc19kZWZpbml0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfTWFzdGVyX1RyYW5zbWl0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWDsKKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhzbWJ1cy0+cEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc21idXMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworCisgICAgLyogSW4gY2FzZSBvZiBRdWljayBjb21tYW5kLCByZW1vdmUgYXV0b2VuZCBtb2RlICovCisgICAgLyogTWFuYWdlIHRoZSBzdG9wIGdlbmVyYXRpb24gYnkgc29mdHdhcmUgKi8KKyAgICBpZiAoaHNtYnVzLT5wQnVmZlB0ciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgJj0gflNNQlVTX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICBpZiAoU2l6ZSA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBTaXplOworICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBzaXplID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPCBoc21idXMtPlhmZXJDb3VudCkgJiYgKGhzbWJ1cy0+WGZlclNpemUgPT0gTUFYX05CWVRFX1NJWkUpKQorICAgIHsKKyAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgU01CVVNfUkVMT0FEX01PREUgfCAoaHNtYnVzLT5YZmVyT3B0aW9ucyAmIFNNQlVTX1NFTkRQRUNfTU9ERSksIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRyYW5zZmVyIGRpcmVjdGlvbiBub3QgY2hhbmdlLCBkbyBub3QgZ2VuZXJhdGUgUmVzdGFydCBDb25kaXRpb24gKi8KKyAgICAgIC8qIE1lYW4gUHJldmlvdXMgc3RhdGUgaXMgc2FtZSBhcyBjdXJyZW50IHN0YXRlICovCisKKyAgICAgIC8qIFN0b3JlIGN1cnJlbnQgdm9sYXRpbGUgWGZlck9wdGlvbnMsIG1pc3JhIHJ1bGUgKi8KKyAgICAgIHRtcCA9IGhzbWJ1cy0+WGZlck9wdGlvbnM7CisKKyAgICAgIGlmICgoaHNtYnVzLT5QcmV2aW91c1N0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkgJiYgKElTX1NNQlVTX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVCh0bXApID09IDApKQorICAgICAgeworICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIERldkFkZHJlc3MsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICB9CisgICAgICAvKiBFbHNlIHRyYW5zZmVyIGRpcmVjdGlvbiBjaGFuZ2UsIHNvIGdlbmVyYXRlIFJlc3RhcnQgd2l0aCBuZXcgdHJhbnNmZXIgZGlyZWN0aW9uICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgICAgICBTTUJVU19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhoc21idXMpOworCisgICAgICAgIC8qIEhhbmRsZSBUcmFuc2ZlciAqLworICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIERldkFkZHJlc3MsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKyAgICAgIH0KKworICAgICAgLyogSWYgUEVDIG1vZGUgaXMgZW5hYmxlLCBzaXplIHRvIHRyYW5zbWl0IG1hbmFnZSBieSBTVyBwYXJ0IHNob3VsZCBiZSBTaXplLTEgYnl0ZSwgY29ycmVzcG9uZGluZyB0byBQRUMgYnl0ZSAqLworICAgICAgLyogUEVDIGJ5dGUgaXMgYXV0b21hdGljYWxseSBzZW50IGJ5IEhXIGJsb2NrLCBubyBuZWVkIHRvIG1hbmFnZSBpdCBpbiBUcmFuc21pdCBwcm9jZXNzICovCisgICAgICBpZiAoU01CVVNfR0VUX1BFQ19NT0RFKGhzbWJ1cykgIT0gMFVMKQorICAgICAgeworICAgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgU01CVVNfRW5hYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1RYKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBpbiBtYXN0ZXIvaG9zdCBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgU01CVVNfWGZlck9wdGlvbnNfZGVmaW5pdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX01hc3Rlcl9SZWNlaXZlX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWDsKKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaHNtYnVzLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWJ1cy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisKKyAgICAvKiBJbiBjYXNlIG9mIFF1aWNrIGNvbW1hbmQsIHJlbW92ZSBhdXRvZW5kIG1vZGUgKi8KKyAgICAvKiBNYW5hZ2UgdGhlIHN0b3AgZ2VuZXJhdGlvbiBieSBzb2Z0d2FyZSAqLworICAgIGlmIChoc21idXMtPnBCdWZmUHRyID09IE5VTEwpCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyAmPSB+U01CVVNfQVVUT0VORF9NT0RFOworICAgIH0KKworICAgIGlmIChTaXplID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IFNpemU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIHNpemUgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIGlmICgoaHNtYnVzLT5YZmVyU2l6ZSA8IGhzbWJ1cy0+WGZlckNvdW50KSAmJiAoaHNtYnVzLT5YZmVyU2l6ZSA9PSBNQVhfTkJZVEVfU0laRSkpCisgICAgeworICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBTTUJVU19SRUxPQURfTU9ERSAgfCAoaHNtYnVzLT5YZmVyT3B0aW9ucyAmIFNNQlVTX1NFTkRQRUNfTU9ERSksIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdHJhbnNmZXIgZGlyZWN0aW9uIG5vdCBjaGFuZ2UsIGRvIG5vdCBnZW5lcmF0ZSBSZXN0YXJ0IENvbmRpdGlvbiAqLworICAgICAgLyogTWVhbiBQcmV2aW91cyBzdGF0ZSBpcyBzYW1lIGFzIGN1cnJlbnQgc3RhdGUgKi8KKworICAgICAgLyogU3RvcmUgY3VycmVudCB2b2xhdGlsZSBYZmVyT3B0aW9ucywgTWlzcmEgcnVsZSAqLworICAgICAgdG1wID0gaHNtYnVzLT5YZmVyT3B0aW9uczsKKworICAgICAgaWYgKChoc21idXMtPlByZXZpb3VzU3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKSAmJiAoSVNfU01CVVNfVFJBTlNGRVJfT1RIRVJfT1BUSU9OU19SRVFVRVNUKHRtcCkgPT0gMCkpCisgICAgICB7CisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgIH0KKyAgICAgIC8qIEVsc2UgdHJhbnNmZXIgZGlyZWN0aW9uIGNoYW5nZSwgc28gZ2VuZXJhdGUgUmVzdGFydCB3aXRoIG5ldyB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgICAgIFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhzbWJ1cyk7CisKKyAgICAgICAgLyogSGFuZGxlIFRyYW5zZmVyICovCisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgU01CVVNfRW5hYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgYSBtYXN0ZXIvaG9zdCBTTUJVUyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQuCisgICogQG5vdGUgICBUaGlzIGFib3J0IGNhbiBiZSBjYWxsZWQgb25seSBpZiBzdGF0ZSBpcyByZWFkeQorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfTWFzdGVyX0Fib3J0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcykKK3sKKyAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBLZWVwIHRoZSBzYW1lIHN0YXRlIGFzIHByZXZpb3VzICovCisgICAgLyogdG8gcGVyZm9ybSBhcyB3ZWxsIHRoZSBjYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVuZCBvZiB0cmFuc2ZlciBjYWxsYmFjayAqLworICAgIGlmIChoc21idXMtPlByZXZpb3VzU3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFg7CisgICAgfQorICAgIGVsc2UgaWYgKGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgeworICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdyb25nIHVzYWdlIG9mIGFib3J0IGZ1bmN0aW9uICovCisgICAgICAvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgaW4gY2FzZSBvZiBhYm9ydCBtb25pdG9yZWQgYnkgbWFzdGVyIGRldmljZSAqLworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfTk9ORTsKKworICAgIC8qIFNldCBOQllURVMgdG8gMSB0byBnZW5lcmF0ZSBhIGR1bW15IHJlYWQgb24gU01CVVMgcGVyaXBoZXJhbCAqLworICAgIC8qIFNldCBBVVRPRU5EIG1vZGUsIHRoaXMgd2lsbCBnZW5lcmF0ZSBhIE5BQ0sgdGhlbiBTVE9QIGNvbmRpdGlvbiB0byBhYm9ydCB0aGUgY3VycmVudCB0cmFuc2ZlciAqLworICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgMSwgU01CVVNfQVVUT0VORF9NT0RFLCBTTUJVU19OT19TVEFSVFNUT1ApOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgIHsKKyAgICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisgICAgfQorICAgIGVsc2UgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgIHsKKyAgICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBpbiBzbGF2ZS9kZXZpY2UgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19TbGF2ZV9UcmFuc21pdF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9MSVNURU4pID09IEhBTF9TTUJVU19TVEFURV9MSVNURU4pCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVTCkpCisgICAgeworICAgICAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzLCB0byBwcmV2ZW50IHByZWVtcHRpb24gZHVyaW5nIHRyZWF0bWVudCBpbiBjYXNlIG9mIG11bHRpY2FsbCAqLworICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfQUREUiB8IFNNQlVTX0lUX1RYKTsKKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IChIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCB8IEhBTF9TTUJVU19TVEFURV9MSVNURU4pOworICAgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisKKyAgICAvKiBTZXQgU0JDIGJpdCB0byBtYW5hZ2UgQWNrbm93bGVkZ2UgYXQgZWFjaCBiaXQgKi8KKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9TQkM7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaHNtYnVzLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWJ1cy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisKKyAgICAvKiBDb252ZXJ0IE9USEVSX3h4eCBYZmVyT3B0aW9ucyBpZiBhbnkgKi8KKyAgICBTTUJVU19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhoc21idXMpOworCisgICAgaWYgKFNpemUgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoc21idXMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc21idXMtPlhmZXJTaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgc2l6ZSA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgaWYgKChoc21idXMtPlhmZXJTaXplIDwgaHNtYnVzLT5YZmVyQ291bnQpICYmIChoc21idXMtPlhmZXJTaXplID09IE1BWF9OQllURV9TSVpFKSkKKyAgICB7CisgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDAsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIFNNQlVTX1JFTE9BRF9NT0RFIHwgKGhzbWJ1cy0+WGZlck9wdGlvbnMgJiBTTUJVU19TRU5EUEVDX01PREUpLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IE5CWVRFIHRvIHRyYW5zbWl0ICovCisgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDAsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisKKyAgICAgIC8qIElmIFBFQyBtb2RlIGlzIGVuYWJsZSwgc2l6ZSB0byB0cmFuc21pdCBzaG91bGQgYmUgU2l6ZS0xIGJ5dGUsIGNvcnJlc3BvbmRpbmcgdG8gUEVDIGJ5dGUgKi8KKyAgICAgIC8qIFBFQyBieXRlIGlzIGF1dG9tYXRpY2FsbHkgc2VudCBieSBIVyBibG9jaywgbm8gbmVlZCB0byBtYW5hZ2UgaXQgaW4gVHJhbnNtaXQgcHJvY2VzcyAqLworICAgICAgaWYgKFNNQlVTX0dFVF9QRUNfTU9ERShoc21idXMpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgLyogVGhpcyBhY3Rpb24gd2lsbCBnZW5lcmF0ZSBhbiBhY2tub3dsZWRnZSB0byB0aGUgSE9TVCAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FERFIpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgLyogUkVuYWJsZSBBRERSIGludGVycnVwdCAqLworICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCB8IFNNQlVTX0lUX0FERFIpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGluIHNsYXZlL2RldmljZSBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgU01CVVNfWGZlck9wdGlvbnNfZGVmaW5pdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1NsYXZlX1JlY2VpdmVfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSA9PSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVUwpKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cywgdG8gcHJldmVudCBwcmVlbXB0aW9uIGR1cmluZyB0cmVhdG1lbnQgaW4gY2FzZSBvZiBtdWx0aWNhbGwgKi8KKyAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX0FERFIgfCBTTUJVU19JVF9SWCk7CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSAoSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlggfCBIQUxfU01CVVNfU1RBVEVfTElTVEVOKTsKKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworCisgICAgLyogU2V0IFNCQyBiaXQgdG8gbWFuYWdlIEFja25vd2xlZGdlIGF0IGVhY2ggYml0ICovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfU0JDOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhzbWJ1cy0+cEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc21idXMtPlhmZXJTaXplID0gU2l6ZTsKKyAgICBoc21idXMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworCisgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaHNtYnVzKTsKKworICAgIC8qIFNldCBOQllURSB0byByZWNlaXZlICovCisgICAgLyogSWYgWGZlclNpemUgZXF1YWwgIjEiLCBvciBYZmVyU2l6ZSBlcXVhbCAiMiIgd2l0aCBQRUMgcmVxdWVzdGVkIChtZWFuIDEgZGF0YSBieXRlICsgMSBQRUMgYnl0ZSAqLworICAgIC8qIG5vIG5lZWQgdG8gc2V0IFJFTE9BRCBiaXQgbW9kZSwgYSBBQ0sgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBpbiB0aGF0IGNhc2UgKi8KKyAgICAvKiBlbHNlIG5lZWQgdG8gc2V0IFJFTE9BRCBiaXQgbW9kZSB0byBnZW5lcmF0ZSBhbiBhdXRvbWF0aWMgQUNLIGF0IGVhY2ggYnl0ZSBSZWNlaXZlZCAqLworICAgIC8qIFRoaXMgUkVMT0FEIGJpdCB3aWxsIGJlIHJlc2V0IGZvciBsYXN0IEJZVEUgdG8gYmUgcmVjZWl2ZSBpbiBTTUJVU19TbGF2ZV9JU1IgKi8KKyAgICBpZiAoKChTTUJVU19HRVRfUEVDX01PREUoaHNtYnVzKSAhPSAwVUwpICYmIChoc21idXMtPlhmZXJTaXplID09IDJVKSkgfHwgKGhzbWJ1cy0+WGZlclNpemUgPT0gMVUpKQorICAgIHsKKyAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMCwgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMCwgMSwgaHNtYnVzLT5YZmVyT3B0aW9ucyB8IFNNQlVTX1JFTE9BRF9NT0RFLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgIH0KKworICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgLyogVGhpcyBhY3Rpb24gd2lsbCBnZW5lcmF0ZSBhbiBhY2tub3dsZWRnZSB0byB0aGUgSE9TVCAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FERFIpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgLyogUkVuYWJsZSBBRERSIGludGVycnVwdCAqLworICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCB8IFNNQlVTX0lUX0FERFIpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTjsKKworICAvKiBFbmFibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BRERSKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EaXNhYmxlTGlzdGVuX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogRGlzYWJsZSBBZGRyZXNzIGxpc3RlbiBtb2RlIG9ubHkgaWYgYSB0cmFuc2ZlciBpcyBub3Qgb25nb2luZyAqLworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgIC8qIERpc2FibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BRERSKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBTTUJVUyBhbGVydCBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVN4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRW5hYmxlQWxlcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBFbmFibGUgU01CdXMgYWxlcnQgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfQUxFUlRFTjsKKworICAvKiBDbGVhciBBTEVSVCBmbGFnICovCisgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FMRVJUKTsKKworICAvKiBFbmFibGUgQWxlcnQgSW50ZXJydXB0ICovCisgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BTEVSVCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgU01CVVMgYWxlcnQgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTeCBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0Rpc2FibGVBbGVydF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIEVuYWJsZSBTTUJ1cyBhbGVydCAqLworICBoc21idXMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfQUxFUlRFTjsKKworICAvKiBEaXNhYmxlIEFsZXJ0IEludGVycnVwdCAqLworICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX0FMRVJUKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRhcmdldCBkZXZpY2UgaXMgcmVhZHkgZm9yIGNvbW11bmljYXRpb24uCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIFRyaWFscyBOdW1iZXIgb2YgdHJpYWxzCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19Jc0RldmljZVJlYWR5KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDMyX3QgVHJpYWxzLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgX19JTyB1aW50MzJfdCBTTUJVU19UcmlhbHMgPSAwVUw7CisKKyAgRmxhZ1N0YXR1cyB0bXAxOworICBGbGFnU3RhdHVzIHRtcDI7CisKKyAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19CVVNZKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX0JVU1k7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfTk9ORTsKKworICAgIGRvCisgICAgeworICAgICAgLyogR2VuZXJhdGUgU3RhcnQgKi8KKyAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiA9IFNNQlVTX0dFTkVSQVRFX1NUQVJUKGhzbWJ1cy0+SW5pdC5BZGRyZXNzaW5nTW9kZSwgRGV2QWRkcmVzcyk7CisKKyAgICAgIC8qIE5vIG5lZWQgdG8gQ2hlY2sgVEMgZmxhZywgd2l0aCBBVVRPRU5EIG1vZGUgdGhlIHN0b3AgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgKi8KKyAgICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyBzZXQgb3IgYSBOQUNLIGZsYWcgaXMgc2V0Ki8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgIHRtcDEgPSBfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworICAgICAgdG1wMiA9IF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRik7CisKKyAgICAgIHdoaWxlICgodG1wMSA9PSBSRVNFVCkgJiYgKHRtcDIgPT0gUkVTRVQpKQorICAgICAgeworICAgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVUwpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERldmljZSBpcyByZWFkeSAqLworICAgICAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogVXBkYXRlIFNNQlVTIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9IQUxUSU1FT1VUOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wMSA9IF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisgICAgICAgIHRtcDIgPSBfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUYpOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgTkFDS0YgZmxhZyBoYXMgbm90IGJlZW4gc2V0ICovCisgICAgICBpZiAoX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKSA9PSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAgIC8qIERldmljZSBpcyByZWFkeSAqLworICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUYpOworCisgICAgICAgIC8qIENsZWFyIFNUT1AgRmxhZywgYXV0byBnZW5lcmF0ZWQgd2l0aCBhdXRvZW5kKi8KKyAgICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiB0cmlhbHMgaGFzIGJlZW4gcmVhY2hlZCAqLworICAgICAgaWYgKFNNQlVTX1RyaWFscyA9PSBUcmlhbHMpCisgICAgICB7CisgICAgICAgIC8qIEdlbmVyYXRlIFN0b3AgKi8KKyAgICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfU1RPUDsKKworICAgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgcmVzZXQgKi8KKyAgICAgICAgaWYgKFNNQlVTX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGLCBSRVNFVCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisgICAgICB9CisKKyAgICAgIC8qIEluY3JlbWVudCBUcmlhbHMgKi8KKyAgICAgIFNNQlVTX1RyaWFscysrOworICAgIH0KKyAgICB3aGlsZSAoU01CVVNfVHJpYWxzIDwgVHJpYWxzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBVcGRhdGUgU01CVVMgZXJyb3IgY29kZSAqLworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9IQUxUSU1FT1VUOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNNQlVTIGV2ZW50IGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TTUJVU19FVl9JUlFIYW5kbGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogVXNlIGEgbG9jYWwgdmFyaWFibGUgdG8gc3RvcmUgdGhlIGN1cnJlbnQgSVNSIGZsYWdzICovCisgIC8qIFRoaXMgYWN0aW9uIHdpbGwgYXZvaWQgYSB3cm9uZyB0cmVhdG1lbnQgZHVlIHRvIElTUiBmbGFncyBjaGFuZ2UgZHVyaW5nIGludGVycnVwdCBoYW5kbGVyICovCisgIHVpbnQzMl90IHRtcGlzcnZhbHVlID0gUkVBRF9SRUcoaHNtYnVzLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgdG1wY3IxdmFsdWUgPSBSRUFEX1JFRyhoc21idXMtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIFNNQlVTIGluIG1vZGUgVHJhbnNtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChTTUJVU19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIChTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfVFhJKSkgIT0gUkVTRVQpICYmICgoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19UWElTKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfVENSKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfVEMpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19TVE9QRikgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX0FGKSAhPSBSRVNFVCkpKQorICB7CisgICAgLyogU2xhdmUgbW9kZSBzZWxlY3RlZCAqLworICAgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKSA9PSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkKKyAgICB7CisgICAgICAodm9pZClTTUJVU19TbGF2ZV9JU1IoaHNtYnVzLCB0bXBpc3J2YWx1ZSk7CisgICAgfQorICAgIC8qIE1hc3RlciBtb2RlIHNlbGVjdGVkICovCisgICAgZWxzZSBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICB7CisgICAgICAodm9pZClTTUJVU19NYXN0ZXJfSVNSKGhzbWJ1cywgdG1waXNydmFsdWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorCisgIC8qIFNNQlVTIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoU01CVVNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCAoU01CVVNfSVRfVENJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSSB8IFNNQlVTX0lUX1JYSSkpICE9IFJFU0VUKSAmJiAoKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1RDUikgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1RDKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19BRikgIT0gUkVTRVQpKSkKKyAgeworICAgIC8qIFNsYXZlIG1vZGUgc2VsZWN0ZWQgKi8KKyAgICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkgPT0gSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpCisgICAgeworICAgICAgKHZvaWQpU01CVVNfU2xhdmVfSVNSKGhzbWJ1cywgdG1waXNydmFsdWUpOworICAgIH0KKyAgICAvKiBNYXN0ZXIgbW9kZSBzZWxlY3RlZCAqLworICAgIGVsc2UgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgeworICAgICAgKHZvaWQpU01CVVNfTWFzdGVyX0lTUihoc21idXMsIHRtcGlzcnZhbHVlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KKworICAvKiBTTUJVUyBpbiBtb2RlIExpc3RlbmVyIE9ubHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChTTUJVU19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIFNNQlVTX0lUX0FERFJJKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0lUX1NPVVJDRSh0bXBjcjF2YWx1ZSwgU01CVVNfSVRfU1RPUEkpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCBTTUJVU19JVF9OQUNLSSkgIT0gUkVTRVQpKSAmJiAoKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfQUREUikgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1NUT1BGKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfQUYpICE9IFJFU0VUKSkpCisgIHsKKyAgICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSA9PSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgICh2b2lkKVNNQlVTX1NsYXZlX0lTUihoc21idXMsIHRtcGlzcnZhbHVlKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU01CVVMgZXJyb3IgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NNQlVTX0VSX0lSUUhhbmRsZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICBTTUJVU19JVEVycm9ySGFuZGxlcihoc21idXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqIEBicmllZiAgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNsYXZlIEFkZHJlc3MgTWF0Y2ggY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIE1hc3RlciByZXF1ZXN0IFRyYW5zZmVyIERpcmVjdGlvbiAoV3JpdGUvUmVhZCkKKyAgKiBAcGFyYW0gIEFkZHJNYXRjaENvZGUgQWRkcmVzcyBNYXRjaCBDb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfQWRkckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKyAgVU5VU0VEKFRyYW5zZmVyRGlyZWN0aW9uKTsKKyAgVU5VU0VEKEFkZHJNYXRjaENvZGUpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfQWRkckNhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTTUJVUyBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBTTUJVUyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLwordWludDMyX3QgSEFMX1NNQlVTX0dldFN0YXRlKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUmV0dXJuIFNNQlVTIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaHNtYnVzLT5TdGF0ZTsKK30KKworLyoqCisqIEBicmllZiAgUmV0dXJuIHRoZSBTTUJVUyBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorKiBAcmV0dmFsIFNNQlVTIEVycm9yIENvZGUKKyovCit1aW50MzJfdCBIQUxfU01CVVNfR2V0RXJyb3IoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICByZXR1cm4gaHNtYnVzLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUJVU19Qcml2YXRlX0Z1bmN0aW9ucyBTTUJVUyBQcml2YXRlIEZ1bmN0aW9ucworICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIFByaXZhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgTWFzdGVyIE1vZGUuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIFN0YXR1c0ZsYWdzIFZhbHVlIG9mIEludGVycnVwdCBGbGFncy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19NYXN0ZXJfSVNSKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgU3RhdHVzRmxhZ3MpCit7CisgIHVpbnQxNl90IERldkFkZHJlc3M7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc21idXMpOworCisgIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX0FGKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKTsKKworICAgIC8qIFNldCBjb3JyZXNwb25kaW5nIEVycm9yIENvZGUgKi8KKyAgICAvKiBObyBuZWVkIHRvIGdlbmVyYXRlIFNUT1AsIGl0IGlzIGF1dG9tYXRpY2FsbHkgZG9uZSAqLworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9BQ0tGOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgLyogQ2FsbCB0aGUgRXJyb3IgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaHNtYnVzLT5FcnJvckNhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1NUT1BGKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGFuZCB0cmVhdCBlcnJvcnMgaWYgZXJyb3JzIG9jY3VycyBkdXJpbmcgU1RPUCBwcm9jZXNzICovCisgICAgU01CVVNfSVRFcnJvckhhbmRsZXIoaHNtYnVzKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEludGVycnVwdCAqLworICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisKKyAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICAgIFNNQlVTX1JFU0VUX0NSMihoc21idXMpOworCisgICAgICAvKiBGbHVzaCByZW1haW5pbmcgZGF0YSBpbiBGaWZvIHJlZ2lzdGVyIGluIGNhc2Ugb2YgZXJyb3Igb2NjdXJzIGJlZm9yZSBUWEVtcHR5ICovCisgICAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTTUJVUyBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9TTUJVU19ESVNBQkxFKGhzbWJ1cyk7CisKKyAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAvKiBSRWVuYWJsZSB0aGUgc2VsZWN0ZWQgU01CVVMgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfU01CVVNfRU5BQkxFKGhzbWJ1cyk7CisKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHNtYnVzLT5NYXN0ZXJUeENwbHRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGVsc2UgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgIHsKKyAgICAgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICAgICAgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICAgKmhzbWJ1cy0+cEJ1ZmZQdHIgPSAodWludDhfdCkoaHNtYnVzLT5JbnN0YW5jZS0+UlhEUik7CisKKyAgICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGhzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgICAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPiAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIEludGVycnVwdCAqLworICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCk7CisKKyAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICAgIFNNQlVTX1JFU0VUX0NSMihoc21idXMpOworCisgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAqaHNtYnVzLT5wQnVmZlB0ciA9ICh1aW50OF90KShoc21idXMtPkluc3RhbmNlLT5SWERSKTsKKworICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgIGhzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgIC8qIEluY3JlbWVudCBTaXplIGNvdW50ZXIgKi8KKyAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgfQorICBlbHNlIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1RYSVMpICE9IFJFU0VUKQorICB7CisgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+VFhEUiA9ICpoc21idXMtPnBCdWZmUHRyOworCisgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgaHNtYnVzLT5wQnVmZlB0cisrOworCisgICAgLyogSW5jcmVtZW50IFNpemUgY291bnRlciAqLworICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICBoc21idXMtPlhmZXJDb3VudC0tOworICB9CisgIGVsc2UgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfVENSKSAhPSBSRVNFVCkKKyAgeworICAgIGlmICgoaHNtYnVzLT5YZmVyQ291bnQgIT0gMFUpICYmIChoc21idXMtPlhmZXJTaXplID09IDBVKSkKKyAgICB7CisgICAgICBEZXZBZGRyZXNzID0gKHVpbnQxNl90KShoc21idXMtPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX1NBREQpOworCisgICAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgIHsKKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCBNQVhfTkJZVEVfU0laRSwgKFNNQlVTX1JFTE9BRF9NT0RFIHwgKGhzbWJ1cy0+WGZlck9wdGlvbnMgJiBTTUJVU19TRU5EUEVDX01PREUpKSwgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoc21idXMtPlhmZXJTaXplID0gaHNtYnVzLT5YZmVyQ291bnQ7CisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgLyogSWYgUEVDIG1vZGUgaXMgZW5hYmxlLCBzaXplIHRvIHRyYW5zbWl0IHNob3VsZCBiZSBTaXplLTEgYnl0ZSwgY29ycmVzcG9uZGluZyB0byBQRUMgYnl0ZSAqLworICAgICAgICAvKiBQRUMgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgYnkgSFcgYmxvY2ssIG5vIG5lZWQgdG8gbWFuYWdlIGl0IGluIFRyYW5zbWl0IHByb2Nlc3MgKi8KKyAgICAgICAgaWYgKFNNQlVTX0dFVF9QRUNfTU9ERShoc21idXMpICE9IDBVTCkKKyAgICAgICAgeworICAgICAgICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChoc21idXMtPlhmZXJDb3VudCA9PSAwVSkgJiYgKGhzbWJ1cy0+WGZlclNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIC8qIENhbGwgVHhDcGx0Q2FsbGJhY2soKSBpZiBubyBzdG9wIG1vZGUgaXMgc2V0ICovCisgICAgICBpZiAoU01CVVNfR0VUX1NUT1BfTU9ERShoc21idXMpICE9IFNNQlVTX0FVVE9FTkRfTU9ERSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICAgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgSW50ZXJydXB0ICovCisgICAgICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisgICAgICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHNtYnVzLT5NYXN0ZXJUeENwbHRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgICAgICBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgICAgICB7CisgICAgICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCk7CisgICAgICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHNtYnVzLT5NYXN0ZXJSeENwbHRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgICAgICBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorICBlbHNlIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1RDKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChoc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBTcGVjaWZpYyB1c2UgY2FzZSBmb3IgUXVpY2sgY29tbWFuZCAqLworICAgICAgaWYgKGhzbWJ1cy0+cEJ1ZmZQdHIgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgLyogR2VuZXJhdGUgYSBTdG9wIGNvbW1hbmQgKi8KKyAgICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfU1RPUDsKKyAgICAgIH0KKyAgICAgIC8qIENhbGwgVHhDcGx0Q2FsbGJhY2soKSBpZiBubyBzdG9wIG1vZGUgaXMgc2V0ICovCisgICAgICBlbHNlIGlmIChTTUJVU19HRVRfU1RPUF9NT0RFKGhzbWJ1cykgIT0gU01CVVNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBObyBHZW5lcmF0ZSBTdG9wLCB0byBwZXJtaXQgcmVzdGFydCBtb2RlICovCisgICAgICAgIC8qIFRoZSBzdG9wIHdpbGwgYmUgZG9uZSBhdCB0aGUgZW5kIG9mIHRyYW5zZmVyLCB3aGVuIFNNQlVTX0FVVE9FTkRfTU9ERSBlbmFibGUgKi8KKworICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1RYKTsKKyAgICAgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBoc21idXMtPk1hc3RlclR4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgICAgIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgICAgIHsKKyAgICAgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYKTsKKyAgICAgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBoc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgICAgIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICByZXR1cm4gSEFMX09LOworfQorLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgU2xhdmUgTW9kZS4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgU3RhdHVzRmxhZ3MgVmFsdWUgb2YgSW50ZXJydXB0IEZsYWdzLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQlVTX1NsYXZlX0lTUihzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IFN0YXR1c0ZsYWdzKQoreworICB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uOworICB1aW50MTZfdCBTbGF2ZUFkZHJDb2RlOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19BRikgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayB0aGF0IFNNQlVTIHRyYW5zZmVyIGZpbmlzaGVkICovCisgICAgLyogaWYgeWVzLCBub3JtYWwgdXNlY2FzZSwgYSBOQUNLIGlzIHNlbnQgYnkgdGhlIEhPU1Qgd2hlbiBUcmFuc2ZlciBpcyBmaW5pc2hlZCAqLworICAgIC8qIE1lYW4gWGZlckNvdW50ID09IDAqLworICAgIC8qIFNvIGNsZWFyIEZsYWcgTkFDS0Ygb25seSAqLworICAgIGlmIChoc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBpZiBubywgZXJyb3IgdXNlY2FzZSwgYSBOb24tQWNrbm93bGVkZ2Ugb2YgbGFzdCBEYXRhIGlzIGdlbmVyYXRlZCBieSB0aGUgSE9TVCovCisgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKTsKKworICAgICAgLyogU2V0IEhBTCBTdGF0ZSB0byAiSWRsZSIgU3RhdGUsIG1lYW4gdG8gTElTVEVOIHN0YXRlICovCisgICAgICAvKiBTbyByZXNldCBTbGF2ZSBCdXN5IHN0YXRlICovCisgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgaHNtYnVzLT5TdGF0ZSAmPSB+KCh1aW50MzJfdClIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCk7CisgICAgICBoc21idXMtPlN0YXRlICY9IH4oKHVpbnQzMl90KUhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKTsKKworICAgICAgLyogRGlzYWJsZSBSWC9UWCBJbnRlcnJ1cHRzLCBrZWVwIG9ubHkgQUREUiBJbnRlcnJ1cHQgKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlggfCBTTUJVU19JVF9UWCk7CisKKyAgICAgIC8qIFNldCBFcnJvckNvZGUgY29ycmVzcG9uZGluZyB0byBhIE5vbi1BY2tub3dsZWRnZSAqLworICAgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0FDS0Y7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAvKiBDYWxsIHRoZSBFcnJvciBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhzbWJ1cy0+RXJyb3JDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19BRERSKSAhPSBSRVNFVCkKKyAgeworICAgIFRyYW5zZmVyRGlyZWN0aW9uID0gKHVpbnQ4X3QpKFNNQlVTX0dFVF9ESVIoaHNtYnVzKSk7CisgICAgU2xhdmVBZGRyQ29kZSA9ICh1aW50MTZfdCkoU01CVVNfR0VUX0FERFJfTUFUQ0goaHNtYnVzKSk7CisKKyAgICAvKiBEaXNhYmxlIEFERFIgaW50ZXJydXB0IHRvIHByZXZlbnQgbXVsdGlwbGUgQUREUkludGVycnVwdCovCisgICAgLyogT3RoZXIgQUREUkludGVycnVwdCB3aWxsIGJlIHRyZWF0IGluIG5leHQgTGlzdGVuIHVzZWNhc2UgKi8KKyAgICBfX0hBTF9TTUJVU19ESVNBQkxFX0lUKGhzbWJ1cywgU01CVVNfSVRfQUREUkkpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgLyogQ2FsbCBTbGF2ZSBBZGRyIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaHNtYnVzLT5BZGRyQ2FsbGJhY2soaHNtYnVzLCBUcmFuc2ZlckRpcmVjdGlvbiwgU2xhdmVBZGRyQ29kZSk7CisjZWxzZQorICAgIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soaHNtYnVzLCBUcmFuc2ZlckRpcmVjdGlvbiwgU2xhdmVBZGRyQ29kZSk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlIGlmICgoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfVENSKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkgPT0gSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpCisgICAgeworICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgKmhzbWJ1cy0+cEJ1ZmZQdHIgPSAodWludDhfdCkoaHNtYnVzLT5JbnN0YW5jZS0+UlhEUik7CisKKyAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgaHNtYnVzLT5wQnVmZlB0cisrOworCisgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworCisgICAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPT0gMVUpCisgICAgICB7CisgICAgICAgIC8qIFJlY2VpdmUgbGFzdCBCeXRlLCBjYW4gYmUgUEVDIGJ5dGUgaW4gY2FzZSBvZiBQRUMgQllURSBlbmFibGVkICovCisgICAgICAgIC8qIG9yIG9ubHkgdGhlIGxhc3QgQnl0ZSBvZiBUcmFuc2ZlciAqLworICAgICAgICAvKiBTbyByZXNldCB0aGUgUkVMT0FEIGJpdCBtb2RlICovCisgICAgICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgJj0gflNNQlVTX1JFTE9BRF9NT0RFOworICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDAsIDEsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChoc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogTGFzdCBCeXRlIGlzIHJlY2VpdmVkLCBkaXNhYmxlIEludGVycnVwdCAqLworICAgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYKTsKKworICAgICAgICAvKiBSZW1vdmUgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgsIGtlZXAgb25seSBIQUxfU01CVVNfU1RBVEVfTElTVEVOICovCisgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICAgIGhzbWJ1cy0+U3RhdGUgJj0gfigodWludDMyX3QpSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGhzbWJ1cy0+U2xhdmVSeENwbHRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgICAgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBTZXQgUmVsb2FkIGZvciBuZXh0IEJ5dGVzICovCisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMCwgMSwgU01CVVNfUkVMT0FEX01PREUgIHwgKGhzbWJ1cy0+WGZlck9wdGlvbnMgJiBTTUJVU19TRU5EUEVDX01PREUpLCBTTUJVU19OT19TVEFSVFNUT1ApOworCisgICAgICAgIC8qIEFjayBsYXN0IEJ5dGUgUmVhZCAqLworICAgICAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkgPT0gSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpCisgICAgeworICAgICAgaWYgKChoc21idXMtPlhmZXJDb3VudCAhPSAwVSkgJiYgKGhzbWJ1cy0+WGZlclNpemUgPT0gMFUpKQorICAgICAgeworICAgICAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMCwgTUFYX05CWVRFX1NJWkUsIChTTUJVU19SRUxPQURfTU9ERSB8IChoc21idXMtPlhmZXJPcHRpb25zICYgU01CVVNfU0VORFBFQ19NT0RFKSksIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBoc21idXMtPlhmZXJDb3VudDsKKyAgICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDAsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICAgICAgLyogSWYgUEVDIG1vZGUgaXMgZW5hYmxlLCBzaXplIHRvIHRyYW5zbWl0IHNob3VsZCBiZSBTaXplLTEgYnl0ZSwgY29ycmVzcG9uZGluZyB0byBQRUMgYnl0ZSAqLworICAgICAgICAgIC8qIFBFQyBieXRlIGlzIGF1dG9tYXRpY2FsbHkgc2VudCBieSBIVyBibG9jaywgbm8gbmVlZCB0byBtYW5hZ2UgaXQgaW4gVHJhbnNtaXQgcHJvY2VzcyAqLworICAgICAgICAgIGlmIChTTUJVU19HRVRfUEVDX01PREUoaHNtYnVzKSAhPSAwVUwpCisgICAgICAgICAgeworICAgICAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19UWElTKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiBvbmx5IGlmIFhmZXJDb3VudCBub3QgcmVhY2ggIjAiICovCisgICAgLyogQSBUWElTIGZsYWcgY2FuIGJlIHNldCwgZHVyaW5nIFNUT1AgdHJlYXRtZW50ICAgICAgKi8KKyAgICAvKiBDaGVjayBpZiBhbGwgRGF0YSBoYXZlIGFscmVhZHkgYmVlbiBzZW50ICovCisgICAgLyogSWYgaXQgaXMgdGhlIGNhc2UsIHRoaXMgbGFzdCB3cml0ZSBpbiBUWERSIGlzIG5vdCBzZW50LCBjb3JyZXNwb25kIHRvIGEgZHVtbXkgVFhJUyBldmVudCAqLworICAgIGlmIChoc21idXMtPlhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiAqLworICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+VFhEUiA9ICpoc21idXMtPnBCdWZmUHRyOworCisgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIGhzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICB9CisKKyAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogTGFzdCBCeXRlIGlzIFRyYW5zbWl0dGVkICovCisgICAgICAvKiBSZW1vdmUgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgsIGtlZXAgb25seSBIQUxfU01CVVNfU1RBVEVfTElTVEVOICovCisgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1RYKTsKKyAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICBoc21idXMtPlN0YXRlICY9IH4oKHVpbnQzMl90KUhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHNtYnVzLT5TbGF2ZVR4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKworICAvKiBDaGVjayBpZiBTVE9QRiBpcyBzZXQgKi8KKyAgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfU1RPUEYpICE9IFJFU0VUKQorICB7CisgICAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgPT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBTdG9yZSBMYXN0IHJlY2VpdmUgZGF0YSBpZiBhbnkgKi8KKyAgICAgIGlmIChfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICAgKmhzbWJ1cy0+cEJ1ZmZQdHIgPSAodWludDhfdCkoaHNtYnVzLT5JbnN0YW5jZS0+UlhEUik7CisKKyAgICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGhzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgICAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPiAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFJYIGFuZCBUWCBJbnRlcnJ1cHRzICovCisgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYIHwgU01CVVNfSVRfVFgpOworCisgICAgICAvKiBEaXNhYmxlIEFERFIgSW50ZXJydXB0ICovCisgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX0FERFIpOworCisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisKKyAgICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgICAgU01CVVNfUkVTRVRfQ1IyKGhzbWJ1cyk7CisKKyAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAvKiBDbGVhciBBRERSIGZsYWcgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FERFIpOworCisgICAgICBoc21idXMtPlhmZXJPcHRpb25zID0gMDsKKyAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgLyogQ2FsbCB0aGUgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrLCB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgdGhlIGVuZCBvZiBMaXN0ZW4gdXNlY2FzZSAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHNtYnVzLT5MaXN0ZW5DcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisvKioKKyAgKiBAYnJpZWYgIE1hbmFnZSB0aGUgZW5hYmxpbmcgb2YgSW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgSW50ZXJydXB0UmVxdWVzdCBWYWx1ZSBvZiBAcmVmIFNNQlVTX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgdm9pZCBTTUJVU19FbmFibGVfSVJRKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgSW50ZXJydXB0UmVxdWVzdCkKK3sKKyAgdWludDMyX3QgdG1waXNyID0gMFVMOworCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX0FMRVJUKSA9PSBTTUJVU19JVF9BTEVSVCkKKyAgeworICAgIC8qIEVuYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkk7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9BRERSKSA9PSBTTUJVU19JVF9BRERSKQorICB7CisgICAgLyogRW5hYmxlIEFERFIsIFNUT1AgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX0FERFJJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSSB8IFNNQlVTX0lUX0VSUkk7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9UWCkgPT0gU01CVVNfSVRfVFgpCisgIHsKKyAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgUlhJIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBTTUJVU19JVF9FUlJJIHwgU01CVVNfSVRfVENJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSSB8IFNNQlVTX0lUX1RYSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX1JYKSA9PSBTTUJVU19JVF9SWCkKKyAgeworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBUWEkgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkkgfCBTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfUlhJOworICB9CisKKyAgLyogRW5hYmxlIGludGVycnVwdHMgb25seSBhdCB0aGUgZW5kICovCisgIC8qIHRvIGF2b2lkIHRoZSByaXNrIG9mIFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSAqLworICAvKiBhbGwgaW50ZXJydXB0cyByZXF1ZXN0ZWQgZG9uZSAqLworICBfX0hBTF9TTUJVU19FTkFCTEVfSVQoaHNtYnVzLCB0bXBpc3IpOworfQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIGRpc2FibGluZyBvZiBJbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBJbnRlcnJ1cHRSZXF1ZXN0IFZhbHVlIG9mIEByZWYgU01CVVNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQlVTX0Rpc2FibGVfSVJRKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgSW50ZXJydXB0UmVxdWVzdCkKK3sKKyAgdWludDMyX3QgdG1waXNyID0gMFVMOworICB1aW50MzJfdCB0bXBzdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisKKyAgaWYgKCh0bXBzdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpICYmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX0FMRVJUKSA9PSBTTUJVU19JVF9BTEVSVCkpCisgIHsKKyAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX1RYKSA9PSBTTUJVU19JVF9UWCkKKyAgeworICAgIC8qIERpc2FibGUgVEMsIFNUT1AsIE5BQ0sgYW5kIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfVENJIHwgU01CVVNfSVRfVFhJOworCisgICAgaWYgKChTTUJVU19HRVRfQUxFUlRfRU5BQkxFRChoc21idXMpID09IDBVTCkKKyAgICAgICAgJiYgKCh0bXBzdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9MSVNURU4pICE9IEhBTF9TTUJVU19TVEFURV9MSVNURU4pKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkk7CisgICAgfQorCisgICAgaWYgKCh0bXBzdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9MSVNURU4pICE9IEhBTF9TTUJVU19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBTVE9QIGFuZCBOQUNLIGludGVycnVwdCAqLworICAgICAgdG1waXNyIHw9IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0k7CisgICAgfQorICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfUlgpID09IFNNQlVTX0lUX1JYKQorICB7CisgICAgLyogRGlzYWJsZSBUQywgU1RPUCwgTkFDSyBhbmQgUlhJIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9SWEk7CisKKyAgICBpZiAoKFNNQlVTX0dFVF9BTEVSVF9FTkFCTEVEKGhzbWJ1cykgPT0gMFVMKQorICAgICAgICAmJiAoKHRtcHN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgIT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSTsKKyAgICB9CisKKyAgICBpZiAoKHRtcHN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgIT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIFNUT1AgYW5kIE5BQ0sgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSTsKKyAgICB9CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9BRERSKSA9PSBTTUJVU19JVF9BRERSKQorICB7CisgICAgLyogRGlzYWJsZSBBRERSLCBTVE9QIGFuZCBOQUNLIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBTTUJVU19JVF9BRERSSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0k7CisKKyAgICBpZiAoU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQoaHNtYnVzKSA9PSAwVUwpCisgICAgeworICAgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSTsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIGludGVycnVwdHMgb25seSBhdCB0aGUgZW5kICovCisgIC8qIHRvIGF2b2lkIGEgYnJlYWtpbmcgc2l0dWF0aW9uIGxpa2UgYXQgInQiIHRpbWUgKi8KKyAgLyogYWxsIGRpc2FibGUgaW50ZXJydXB0cyByZXF1ZXN0IGFyZSBub3QgZG9uZSAqLworICBfX0hBTF9TTUJVU19ESVNBQkxFX0lUKGhzbWJ1cywgdG1waXNyKTsKK30KKworLyoqCisgICogQGJyaWVmICBTTUJVUyBpbnRlcnJ1cHRzIGVycm9yIGhhbmRsZXIuCisgICogQHBhcmFtICBoc21idXMgU01CVVMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01CVVNfSVRFcnJvckhhbmRsZXIoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICB1aW50MzJfdCBpdGZsYWdzICAgPSBSRUFEX1JFRyhoc21idXMtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBpdHNvdXJjZXMgPSBSRUFEX1JFRyhoc21idXMtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCB0bXBzdGF0ZTsKKyAgdWludDMyX3QgdG1wZXJyb3I7CisKKyAgLyogU01CVVMgQnVzIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgU01CVVNfRkxBR19CRVJSKSA9PSBTTUJVU19GTEFHX0JFUlIpICYmICgoaXRzb3VyY2VzICYgU01CVVNfSVRfRVJSSSkgPT0gU01CVVNfSVRfRVJSSSkpCisgIHsKKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfQkVSUjsKKworICAgIC8qIENsZWFyIEJFUlIgZmxhZyAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0JFUlIpOworICB9CisKKyAgLyogU01CVVMgT3Zlci1SdW4vVW5kZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIFNNQlVTX0ZMQUdfT1ZSKSA9PSBTTUJVU19GTEFHX09WUikgJiYgKChpdHNvdXJjZXMgJiBTTUJVU19JVF9FUlJJKSA9PSBTTUJVU19JVF9FUlJJKSkKKyAgeworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9PVlI7CisKKyAgICAvKiBDbGVhciBPVlIgZmxhZyAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX09WUik7CisgIH0KKworICAvKiBTTUJVUyBBcmJpdHJhdGlvbiBMb3NzIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgU01CVVNfRkxBR19BUkxPKSA9PSBTTUJVU19GTEFHX0FSTE8pICYmICgoaXRzb3VyY2VzICYgU01CVVNfSVRfRVJSSSkgPT0gU01CVVNfSVRfRVJSSSkpCisgIHsKKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfQVJMTzsKKworICAgIC8qIENsZWFyIEFSTE8gZmxhZyAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FSTE8pOworICB9CisKKyAgLyogU01CVVMgVGltZW91dCBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIFNNQlVTX0ZMQUdfVElNRU9VVCkgPT0gU01CVVNfRkxBR19USU1FT1VUKSAmJiAoKGl0c291cmNlcyAmIFNNQlVTX0lUX0VSUkkpID09IFNNQlVTX0lUX0VSUkkpKQorICB7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0JVU1RJTUVPVVQ7CisKKyAgICAvKiBDbGVhciBUSU1FT1VUIGZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19USU1FT1VUKTsKKyAgfQorCisgIC8qIFNNQlVTIEFsZXJ0IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBTTUJVU19GTEFHX0FMRVJUKSA9PSBTTUJVU19GTEFHX0FMRVJUKSAmJiAoKGl0c291cmNlcyAmIFNNQlVTX0lUX0VSUkkpID09IFNNQlVTX0lUX0VSUkkpKQorICB7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0FMRVJUOworCisgICAgLyogQ2xlYXIgQUxFUlQgZmxhZyAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FMRVJUKTsKKyAgfQorCisgIC8qIFNNQlVTIFBhY2tldCBFcnJvciBDaGVjayBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBTTUJVU19GTEFHX1BFQ0VSUikgPT0gU01CVVNfRkxBR19QRUNFUlIpICYmICgoaXRzb3VyY2VzICYgU01CVVNfSVRfRVJSSSkgPT0gU01CVVNfSVRfRVJSSSkpCisgIHsKKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfUEVDRVJSOworCisgICAgLyogQ2xlYXIgUEVDIGVycm9yIGZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19QRUNFUlIpOworICB9CisKKyAgLyogU3RvcmUgY3VycmVudCB2b2xhdGlsZSBoc21idXMtPlN0YXRlLCBtaXNyYSBydWxlICovCisgIHRtcGVycm9yID0gaHNtYnVzLT5FcnJvckNvZGU7CisKKyAgLyogQ2FsbCB0aGUgRXJyb3IgQ2FsbGJhY2sgaW4gY2FzZSBvZiBFcnJvciBkZXRlY3RlZCAqLworICBpZiAoKHRtcGVycm9yICE9IEhBTF9TTUJVU19FUlJPUl9OT05FKSAmJiAodG1wZXJyb3IgIT0gSEFMX1NNQlVTX0VSUk9SX0FDS0YpKQorICB7CisgICAgLyogRG8gbm90IFJlc2V0IHRoZSBIQUwgc3RhdGUgaW4gY2FzZSBvZiBBTEVSVCBlcnJvciAqLworICAgIGlmICgodG1wZXJyb3IgJiBIQUxfU01CVVNfRVJST1JfQUxFUlQpICE9IEhBTF9TTUJVU19FUlJPUl9BTEVSVCkKKyAgICB7CisgICAgICAvKiBTdG9yZSBjdXJyZW50IHZvbGF0aWxlIGhzbWJ1cy0+U3RhdGUsIG1pc3JhIHJ1bGUgKi8KKyAgICAgIHRtcHN0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKworICAgICAgaWYgKCgodG1wc3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkgPT0gSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpCisgICAgICAgICAgfHwgKCh0bXBzdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKSA9PSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkpCisgICAgICB7CisgICAgICAgIC8qIFJlc2V0IG9ubHkgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfWFggKi8KKyAgICAgICAgLyoga2VlcCBIQUxfU01CVVNfU1RBVEVfTElTVEVOIGlmIHNldCAqLworICAgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfTElTVEVOOworICAgICAgfQorICAgIH0KKworICAgIC8qIENhbGwgdGhlIEVycm9yIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhzbWJ1cy0+RXJyb3JDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICBIQUxfU01CVVNfRXJyb3JDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU01CVVMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBGbGFnIFNwZWNpZmllcyB0aGUgU01CVVMgZmxhZyB0byBjaGVjay4KKyAgKiBAcGFyYW0gIFN0YXR1cyBUaGUgbmV3IEZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01CVVNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KKyAgd2hpbGUgKChGbGFnU3RhdHVzKShfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIEZsYWcpKSA9PSBTdGF0dXMpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkKKyAgICAgIHsKKyAgICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBVcGRhdGUgU01CVVMgZXJyb3IgY29kZSAqLworICAgICAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSEFMVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU01CVVN4IGNvbW11bmljYXRpb24gd2hlbiBzdGFydGluZyB0cmFuc2ZlciBvciBkdXJpbmcgdHJhbnNmZXIgKFRDIG9yIFRDUiBmbGFnIGFyZSBzZXQpLgorICAqIEBwYXJhbSAgaHNtYnVzIFNNQlVTIGhhbmRsZS4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3Mgc3BlY2lmaWVzIHRoZSBzbGF2ZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBTaXplIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2dyYW1tZWQuCisgICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuCisgICogQHBhcmFtICBNb2RlIE5ldyBzdGF0ZSBvZiB0aGUgU01CVVMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgU01CVVNfUkVMT0FEX01PREUgRW5hYmxlIFJlbG9hZCBtb2RlLgorICAqICAgICBAYXJnIEByZWYgU01CVVNfQVVUT0VORF9NT0RFIEVuYWJsZSBBdXRvbWF0aWMgZW5kIG1vZGUuCisgICogICAgIEBhcmcgQHJlZiBTTUJVU19TT0ZURU5EX01PREUgRW5hYmxlIFNvZnR3YXJlIGVuZCBtb2RlIGFuZCBSZWxvYWQgbW9kZS4KKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX1NFTkRQRUNfTU9ERSBFbmFibGUgUGFja2V0IEVycm9yIENhbGN1bGF0aW9uIG1vZGUuCisgICogQHBhcmFtICBSZXF1ZXN0IE5ldyBzdGF0ZSBvZiB0aGUgU01CVVMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgU01CVVNfTk9fU1RBUlRTVE9QIERvbid0IEdlbmVyYXRlIHN0b3AgYW5kIHN0YXJ0IGNvbmRpdGlvbi4KKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX0dFTkVSQVRFX1NUT1AgR2VuZXJhdGUgc3RvcCBjb25kaXRpb24gKFNpemUgc2hvdWxkIGJlIHNldCB0byAwKS4KKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1JFQUQgR2VuZXJhdGUgUmVzdGFydCBmb3IgcmVhZCByZXF1ZXN0LgorICAqICAgICBAYXJnIEByZWYgU01CVVNfR0VORVJBVEVfU1RBUlRfV1JJVEUgR2VuZXJhdGUgUmVzdGFydCBmb3Igd3JpdGUgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQlVTX1RyYW5zZmVyQ29uZmlnKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgU2l6ZSwgdWludDMyX3QgTW9kZSwgdWludDMyX3QgUmVxdWVzdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0lOU1RBTkNFKGhzbWJ1cy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1RSQU5TRkVSX01PREUoTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfVFJBTlNGRVJfUkVRVUVTVChSZXF1ZXN0KSk7CisKKyAgLyogdXBkYXRlIENSMiByZWdpc3RlciAqLworICBNT0RJRllfUkVHKGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiwgKChJMkNfQ1IyX1NBREQgfCBJMkNfQ1IyX05CWVRFUyB8IEkyQ19DUjJfUkVMT0FEIHwgSTJDX0NSMl9BVVRPRU5EIHwgKEkyQ19DUjJfUkRfV1JOICYgKHVpbnQzMl90KShSZXF1ZXN0ID4+ICgzMVVMIC0gSTJDX0NSMl9SRF9XUk5fUG9zKSkpIHwgSTJDX0NSMl9TVEFSVCB8IEkyQ19DUjJfU1RPUCAgfCBJMkNfQ1IyX1BFQ0JZVEUpKSwgXAorICAgICAgICAgICAgICh1aW50MzJfdCkoKCh1aW50MzJfdClEZXZBZGRyZXNzICYgSTJDX0NSMl9TQUREKSB8ICgoKHVpbnQzMl90KVNpemUgPDwgSTJDX0NSMl9OQllURVNfUG9zKSAmIEkyQ19DUjJfTkJZVEVTKSB8ICh1aW50MzJfdClNb2RlIHwgKHVpbnQzMl90KVJlcXVlc3QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IFNNQlVTeCBPVEhFUl94eHggWGZlck9wdGlvbnMgdG8gZnVuY3Rpb25uYWwgWGZlck9wdGlvbnMuCisgICogQHBhcmFtICBoc21idXMgU01CVVMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19PVEhFUl9GUkFNRV9OT19QRUMgICAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfRklSU1RfRlJBTUUgICAgICAgICAgICAgICAgICAqLworICBpZiAoaHNtYnVzLT5YZmVyT3B0aW9ucyA9PSBTTUJVU19PVEhFUl9GUkFNRV9OT19QRUMpCisgIHsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gU01CVVNfRklSU1RfRlJBTUU7CisgIH0KKyAgLyogZWxzZSBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19PVEhFUl9GUkFNRV9XSVRIX1BFQyAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAgICAgICovCisgIC8qIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19GSVJTVF9GUkFNRSB8IFNNQlVTX1NFTkRQRUNfTU9ERSAgKi8KKyAgZWxzZSBpZiAoaHNtYnVzLT5YZmVyT3B0aW9ucyA9PSBTTUJVU19PVEhFUl9GUkFNRV9XSVRIX1BFQykKKyAgeworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBTTUJVU19GSVJTVF9GUkFNRSB8IFNNQlVTX1NFTkRQRUNfTU9ERTsKKyAgfQorICAvKiBlbHNlIGlmIHVzZXIgc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX05PX1BFQyAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAgICAgICAgICAgICAqLworICAvKiB0aGVuIGdlbmVyYXRlIGEgc3RvcCBjb25kaXRpb24gYXQgdGhlIGVuZCBvZiB0cmFuc2ZlciAgICAgICAgICAgICAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfTk9fUEVDICAgICAgICAgICAgICAqLworICBlbHNlIGlmIChoc21idXMtPlhmZXJPcHRpb25zID09IFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX05PX1BFQykKKyAgeworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9OT19QRUM7CisgIH0KKyAgLyogZWxzZSBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQyAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAgICAgICAgICAgICAgICovCisgIC8qIHRoZW4gZ2VuZXJhdGUgYSBzdG9wIGNvbmRpdGlvbiBhdCB0aGUgZW5kIG9mIHRyYW5zZmVyICAgICAgICAgICAgICAgKi8KKyAgLyogc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDICAgICAgICAgICAgICAqLworICBlbHNlIGlmIChoc21idXMtPlhmZXJPcHRpb25zID09IFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDKQorICB7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorfQorLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9TTUJVU19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsX3NwaS5jIGIvU3JjL3N0bTMybDB4eF9oYWxfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4ZGEyMgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX3NwaS5jCkBAIC0wLDAgKzEsMzg1NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfc3BpLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNQSSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIFNQSSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKSBEZWNsYXJlIGEgU1BJX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6CisgICAgICAgICAgU1BJX0hhbmRsZVR5cGVEZWYgIGhzcGk7CisKKyAgICAgICgjKUluaXRpYWxpemUgdGhlIFNQSSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1NQSV9Nc3BJbml0KCkgQVBJOgorICAgICAgICAgICgjIykgRW5hYmxlIHRoZSBTUEl4IGludGVyZmFjZSBjbG9jaworICAgICAgICAgICgjIykgU1BJIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU1BJIEdQSU9zCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBTUEkgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gcHVzaC1wdWxsCisgICAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU1BJeCBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFNQSSBJUlEgaGFuZGxlCisgICAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MKKyAgICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQV9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSB0cmFuc21pdCBvciByZWNlaXZlIFN0cmVhbS9DaGFubmVsCisgICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBjbG9jaworICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBoYW5kbGUgcGFyYW1ldGVycworICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeCBvciBSeCBTdHJlYW0vQ2hhbm5lbAorICAgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIGhkbWFfdHgob3IgX3J4KSAgaGFuZGxlIHRvIHRoZSBoc3BpIERNQSBUeCBvciBSeCBoYW5kbGUKKyAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZSBETUEgVHggb3IgUnggU3RyZWFtL0NoYW5uZWwKKworICAgICAgKCMpIFByb2dyYW0gdGhlIE1vZGUsIEJpZGlyZWN0aW9uYWxNb2RlICwgRGF0YSBzaXplLCBCYXVkcmF0ZSBQcmVzY2FsZXIsIE5TUworICAgICAgICAgIG1hbmFnZW1lbnQsIENsb2NrIHBvbGFyaXR5IGFuZCBwaGFzZSwgRmlyc3RCaXQgYW5kIENSQyBjb25maWd1cmF0aW9uIGluIHRoZSBoc3BpIEluaXQgc3RydWN0dXJlLgorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU1BJIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfU1BJX0luaXQoKSBBUEk6CisgICAgICAgICAgKCsrKSBUaGlzIEFQSSBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZSBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjKQorICAgICAgICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEhBTF9TUElfTXNwSW5pdCgpIEFQSS4KKyAgICAgWy4uXQorICAgICAgIENpcmN1bGFyIG1vZGUgcmVzdHJpY3Rpb246CisgICAgICAoIykgVGhlIERNQSBjaXJjdWxhciBtb2RlIGNhbm5vdCBiZSB1c2VkIHdoZW4gdGhlIFNQSSBpcyBjb25maWd1cmVkIGluIHRoZXNlIG1vZGVzOgorICAgICAgICAgICgjIykgTWFzdGVyIDJMaW5lcyBSeE9ubHkKKyAgICAgICAgICAoIyMpIE1hc3RlciAxTGluZSBSeAorICAgICAgKCMpIFRoZSBDUkMgZmVhdHVyZSBpcyBub3QgbWFuYWdlZCB3aGVuIHRoZSBETUEgY2lyY3VsYXIgbW9kZSBpcyBlbmFibGVkCisgICAgICAoIykgV2hlbiB0aGUgU1BJIERNQSBQYXVzZS9TdG9wIGZlYXR1cmVzIGFyZSB1c2VkLCB3ZSBtdXN0IHVzZSB0aGUgZm9sbG93aW5nIEFQSXMKKyAgICAgICAgICB0aGUgSEFMX1NQSV9ETUFQYXVzZSgpLyBIQUxfU1BJX0RNQVN0b3AoKSBvbmx5IHVuZGVyIHRoZSBTUEkgY2FsbGJhY2tzCisgICAgIFsuLl0KKyAgICAgICBNYXN0ZXIgUmVjZWl2ZSBtb2RlIHJlc3RyaWN0aW9uOgorICAgICAgKCMpIEluIE1hc3RlciB1bmlkaXJlY3Rpb25hbCByZWNlaXZlLW9ubHkgbW9kZSAoTVNUUiA9MSwgQklESU1PREU9MCwgUlhPTkxZPTEpIG9yCisgICAgICAgICAgYmlkaXJlY3Rpb25hbCByZWNlaXZlIG1vZGUgKE1TVFI9MSwgQklESU1PREU9MSwgQklESU9FPTApLCB0byBlbnN1cmUgdGhhdCB0aGUgU1BJCisgICAgICAgICAgZG9lcyBub3QgaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgaGFzIHRvIGJlIHJlc3BlY3RlZDoKKyAgICAgICAgICAoIyMpIEhBTF9TUElfRGVJbml0KCkKKyAgICAgICAgICAoIyMpIEhBTF9TUElfSW5pdCgpCisgICAgIFsuLl0KKyAgICAgICBEYXRhIGJ1ZmZlciBhZGRyZXNzIGFsaWdubWVudCByZXN0cmljdGlvbjoKKyAgICAgICgjKSBJbiBjYXNlIG1vcmUgdGhhbiAxIGJ5dGUgaXMgcmVxdWVzdGVkIHRvIGJlIHRyYW5zZmVycmVkLCB0aGUgSEFMIFNQSSB1c2VzIDE2LWJpdCBhY2Nlc3MgZm9yIGRhdGEgYnVmZmVyLgorICAgICAgICAgIEJ1dCB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciB1bmFsaWduZWQgYWNjZXNzZXMgb24gdGhlIENvcnRleC1NMCBwcm9jZXNzb3IuCisgICAgICAgICAgU28sIGlmIHRoZSB1c2VyIHdhbnRzIHRvIHRyYW5zZmVyIG1vcmUgdGhhbiAxIGJ5dGUsIGl0IHNoYWxsIGVuc3VyZSB0aGF0IDE2LWJpdCBhbGlnbmVkIGFkZHJlc3MgaXMgdXNlZCBmb3I6CisgICAgICAgICAgKCMjKSBwRGF0YSBwYXJhbWV0ZXIgaW4gSEFMX1NQSV9UcmFuc21pdCgpLCBIQUxfU1BJX1RyYW5zbWl0X0lUKCksIEhBTF9TUElfUmVjZWl2ZSgpIGFuZCBIQUxfU1BJX1JlY2VpdmVfSVQoKQorICAgICAgICAgICgjIykgcFR4RGF0YSBhbmQgcFJ4RGF0YSBwYXJhbWV0ZXJzIGluIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKCkgYW5kIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKCkKKyAgICAgICgjKSBUaGVyZSBpcyBubyBzdWNoIHJlc3RyaWN0aW9uIHdoZW4gZ29pbmcgdGhyb3VnaCBETUEgYnkgdXNpbmcgSEFMX1NQSV9UcmFuc21pdF9ETUEoKSwgSEFMX1NQSV9SZWNlaXZlX0RNQSgpCisgICAgICAgICAgYW5kIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQSgpLgorICAgICBbLi5dCisgICAgICAgQ2FsbGJhY2sgcmVnaXN0cmF0aW9uOgorCisgICAgICAoIykgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDFVCisgICAgICAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgICAgICBVc2UgRnVuY3Rpb25zIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4KKworICAgICAgICAgIEZ1bmN0aW9uIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICAgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICA6IFNQSSBUeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgOiBTUEkgUnggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgVHhSeENwbHRDYWxsYmFjayAgICAgIDogU1BJIFR4UnggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgIDogU1BJIFR4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgIDogU1BJIFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgVHhSeEhhbGZDcGx0Q2FsbGJhY2sgIDogU1BJIFR4UnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgOiBTUEkgRXJyb3IgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgOiBTUEkgQWJvcnQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgOiBTUEkgTXNwIEluaXQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBTUEkgTXNwIERlSW5pdCBjYWxsYmFjaworICAgICAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICAgICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisKKyAgICAgICgjKSBVc2UgZnVuY3Rpb24gSEFMX1NQSV9VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgICAgICAgIHdlYWsgZnVuY3Rpb24uCisgICAgICAgICAgSEFMX1NQSV9VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgICAgICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAgICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgICAgOiBTUEkgVHggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgIDogU1BJIFJ4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFR4UnhDcGx0Q2FsbGJhY2sgICAgICA6IFNQSSBUeFJ4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayAgICA6IFNQSSBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFJ4SGFsZkNwbHRDYWxsYmFjayAgICA6IFNQSSBSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFR4UnhIYWxmQ3BsdENhbGxiYWNrICA6IFNQSSBUeFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgIDogU1BJIEVycm9yIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgIDogU1BJIEFib3J0IGNhbGxiYWNrCisgICAgICAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogU1BJIE1zcCBJbml0IGNhbGxiYWNrCisgICAgICAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgIDogU1BJIE1zcCBEZUluaXQgY2FsbGJhY2sKKworICAgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBIQUxfU1BJX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX1NQSV9TVEFURV9SRVNFVAorICAgICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgICAgICBleGFtcGxlcyBIQUxfU1BJX01hc3RlclR4Q3BsdENhbGxiYWNrKCksIEhBTF9TUElfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKS4KKyAgICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZQorICAgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEhBTF9TUElfSW5pdCgpLyBIQUxfU1BJX0RlSW5pdCgpIG9ubHkgd2hlbgorICAgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgICAgSWYgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgSEFMX1NQSV9Jbml0KCkvIEhBTF9TUElfRGVJbml0KCkKKyAgICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4KKworICAgICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1NQSV9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgICAgIGluIEhBTF9TUElfU1RBVEVfUkVBRFkgb3IgSEFMX1NQSV9TVEFURV9SRVNFVCBzdGF0ZSwKKyAgICAgICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgICAgIFRoZW4sIHRoZSB1c2VyIGZpcnN0IHJlZ2lzdGVycyB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgICAgICB1c2luZyBIQUxfU1BJX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBIQUxfU1BJX0RlSW5pdCgpCisgICAgICAgb3IgSEFMX1NQSV9Jbml0KCkgZnVuY3Rpb24uCisKKyAgICAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9QUFBfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RlcmluZyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisgICAgIFsuLl0KKyAgICAgICBVc2luZyB0aGUgSEFMIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZWFjaCBhbGwgc3VwcG9ydGVkIFNQSSBmcmVxdWVuY3kgd2l0aCB0aGUgZGlmZmVyZW50IFNQSSBNb2RlcywKKyAgICAgICB0aGUgZm9sbG93aW5nIHRhYmxlIHJlc3VtZSB0aGUgbWF4IFNQSSBmcmVxdWVuY3kgcmVhY2hlZCB3aXRoIGRhdGEgc2l6ZSA4Yml0cy8xNmJpdHMsCisgICAgICAgICBhY2NvcmRpbmcgdG8gZnJlcXVlbmN5IG9mIHRoZSBBUEJ4IFBlcmlwaGVyYWwgQ2xvY2sgKGZQQ0xLKSB1c2VkIGJ5IHRoZSBTUEkgaW5zdGFuY2UuCisKKyAgQGVuZHZlcmJhdGltCisKKyAgQWRkaXRpb25hbCB0YWJsZSA6CisKKyAgICAgICBEYXRhU2l6ZSA9IFNQSV9EQVRBU0laRV84QklUOgorICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgMkxpbmVzIEZ1bGxkdXBsZXggICB8ICAgICAyTGluZXMgUnhPbmx5ICAgIHwgICAgICAgICAxTGluZSAgICAgICAgfAorICAgICAgIHwgUHJvY2VzcyB8IFRyYW5mZXJ0IG1vZGUgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgIE1hc3RlciAgfCAgU2xhdmUgICB8ICBNYXN0ZXIgICB8ICBTbGF2ZSAgIHwgIE1hc3RlciAgIHwgIFNsYXZlICAgfAorICAgICAgIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAorICAgICAgIHwgICAgVCAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvMiAgfCBGcGNsay8yICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwgICAgTkEgICAgIHwgICBOQSAgICAgfAorICAgICAgIHwgICAgWCAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgLyAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvNCAgfCBGcGNsay84ICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwgICAgTkEgICAgIHwgICBOQSAgICAgfAorICAgICAgIHwgICAgUiAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgWCAgICB8ICAgICAgIERNQSAgICAgIHwgRnBjbGsvMiAgfCBGcGNsay8yICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwgICAgTkEgICAgIHwgICBOQSAgICAgfAorICAgICAgIHw9PT09PT09PT18PT09PT09PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fAorICAgICAgIHwgICAgICAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvMiAgfCBGcGNsay8yICB8IEZwY2xrLzY0ICB8IEZwY2xrLzIgIHwgRnBjbGsvNjQgIHwgRnBjbGsvMiAgfAorICAgICAgIHwgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgUiAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvOCAgfCBGcGNsay84ICB8IEZwY2xrLzY0ICB8IEZwY2xrLzIgIHwgRnBjbGsvNjQgIHwgRnBjbGsvMiAgfAorICAgICAgIHwgICAgWCAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgICAgICB8ICAgICAgIERNQSAgICAgIHwgRnBjbGsvMiAgfCBGcGNsay8yICB8IEZwY2xrLzY0ICB8IEZwY2xrLzIgIHwgRnBjbGsvMTI4IHwgRnBjbGsvMiAgfAorICAgICAgIHw9PT09PT09PT18PT09PT09PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fAorICAgICAgIHwgICAgICAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvMiAgfCBGcGNsay80ICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwgRnBjbGsvMiAgIHwgRnBjbGsvNjQgfAorICAgICAgIHwgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgVCAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvMiAgfCBGcGNsay80ICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwgRnBjbGsvMiAgIHwgRnBjbGsvNjQgfAorICAgICAgIHwgICAgWCAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgICAgICB8ICAgICAgIERNQSAgICAgIHwgRnBjbGsvMiAgfCBGcGNsay8yICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwgRnBjbGsvMiAgIHwgRnBjbGsvMTI4fAorICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICAgICAgRGF0YVNpemUgPSBTUElfREFUQVNJWkVfMTZCSVQ6CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAyTGluZXMgRnVsbGR1cGxleCAgIHwgICAgIDJMaW5lcyBSeE9ubHkgICAgfCAgICAgICAgIDFMaW5lICAgICAgICB8CisgICAgICAgfCBQcm9jZXNzIHwgVHJhbmZlcnQgbW9kZSAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgTWFzdGVyICB8ICBTbGF2ZSAgIHwgIE1hc3RlciAgIHwgIFNsYXZlICAgfCAgTWFzdGVyICAgfCAgU2xhdmUgICB8CisgICAgICAgfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CisgICAgICAgfCAgICBUICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgTkEgICAgIHwgICAgTkEgICAgfCAgICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfCAgICBYICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAvICAgIHwgICAgIEludGVycnVwdCAgfCBGcGNsay80ICB8IEZwY2xrLzQgIHwgICAgTkEgICAgIHwgICAgTkEgICAgfCAgICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfCAgICBSICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBYICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgTkEgICAgIHwgICAgTkEgICAgfCAgICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgRnBjbGsvNjQgIHwgRnBjbGsvMiAgfCBGcGNsay8zMiAgfCBGcGNsay8yICB8CisgICAgICAgfCAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBSICAgIHwgICAgIEludGVycnVwdCAgfCBGcGNsay80ICB8IEZwY2xrLzQgIHwgRnBjbGsvNjQgIHwgRnBjbGsvMiAgfCBGcGNsay82NCAgfCBGcGNsay8yICB8CisgICAgICAgfCAgICBYICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgRnBjbGsvNjQgIHwgRnBjbGsvMiAgfCBGcGNsay8xMjggfCBGcGNsay8yICB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfCBGcGNsay8yICAgfCBGcGNsay8zMiB8CisgICAgICAgfCAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBUICAgIHwgICAgIEludGVycnVwdCAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfCBGcGNsay8yICAgfCBGcGNsay82NCB8CisgICAgICAgfCAgICBYICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfCBGcGNsay8yICAgfCBGcGNsay8xMjh8CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgQG5vdGUgVGhlIG1heCBTUEkgZnJlcXVlbmN5IGRlcGVuZCBvbiBTUEkgZGF0YSBzaXplICg4Yml0cywgMTZiaXRzKSwKKyAgICAgICAgICAgICBTUEkgbW9kZSgyIExpbmVzIGZ1bGxkdXBsZXgsIDIgbGluZXMgUnhPbmx5LCAxIGxpbmUgVFgvUlgpIGFuZCBQcm9jZXNzIG1vZGUgKFBvbGxpbmcsIElULCBETUEpLgorICAgICAgIEBub3RlCisgICAgICAgICAgICAoIykgVFgvUlggcHJvY2Vzc2VzIGFyZSBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZSgpLCBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVCgpIGFuZCBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9ETUEoKQorICAgICAgICAgICAgKCMpIFJYIHByb2Nlc3NlcyBhcmUgSEFMX1NQSV9SZWNlaXZlKCksIEhBTF9TUElfUmVjZWl2ZV9JVCgpIGFuZCBIQUxfU1BJX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgICAgICgjKSBUWCBwcm9jZXNzZXMgYXJlIEhBTF9TUElfVHJhbnNtaXQoKSwgSEFMX1NQSV9UcmFuc21pdF9JVCgpIGFuZCBIQUxfU1BJX1RyYW5zbWl0X0RNQSgpCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTUEkgU1BJCisgICogQGJyaWVmIFNQSSBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisjaWZkZWYgSEFMX1NQSV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX1ByaXZhdGVfQ29uc3RhbnRzIFNQSSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9ERUZBVUxUX1RJTUVPVVQgMTAwVQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9GdW5jdGlvbnMgU1BJIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyB2b2lkIFNQSV9UeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9UeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfUnhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1R4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1R4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzE2QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl84QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KK3N0YXRpYyB2b2lkIFNQSV9BYm9ydFJ4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfQWJvcnRUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX0Nsb3NlUnhUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX0Nsb3NlUnhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9DbG9zZVR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHJhbnNhY3Rpb24oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnMgU1BJIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZAorICAgICAgICAgIGRlLWluaXRpYWxpemUgdGhlIFNQSXggcGVyaXBoZXJhbDoKKworICAgICAgKCspIFVzZXIgbXVzdCBpbXBsZW1lbnQgSEFMX1NQSV9Nc3BJbml0KCkgZnVuY3Rpb24gaW4gd2hpY2ggaGUgY29uZmlndXJlcworICAgICAgICAgIGFsbCByZWxhdGVkIHBlcmlwaGVyYWxzIHJlc291cmNlcyAoQ0xPQ0ssIEdQSU8sIERNQSwgSVQgYW5kIE5WSUMgKS4KKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TUElfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGgKKyAgICAgICAgICB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbjoKKyAgICAgICAgKCsrKSBNb2RlCisgICAgICAgICgrKykgRGlyZWN0aW9uCisgICAgICAgICgrKykgRGF0YSBTaXplCisgICAgICAgICgrKykgQ2xvY2sgUG9sYXJpdHkgYW5kIFBoYXNlCisgICAgICAgICgrKykgTlNTIE1hbmFnZW1lbnQKKyAgICAgICAgKCsrKSBCYXVkUmF0ZSBQcmVzY2FsZXIKKyAgICAgICAgKCsrKSBGaXJzdEJpdAorICAgICAgICAoKyspIFRJTW9kZQorICAgICAgICAoKyspIENSQyBDYWxjdWxhdGlvbgorICAgICAgICAoKyspIENSQyBQb2x5bm9taWFsIGlmIENSQyBlbmFibGVkCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfU1BJX0RlSW5pdCgpIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBTUEl4IHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU1BJIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIHRoZSBTUElfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9Jbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBDaGVjayB0aGUgU1BJIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc3BpID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfSU5TVEFOQ0UoaHNwaS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9NT0RFKGhzcGktPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTihoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RBVEFTSVpFKGhzcGktPkluaXQuRGF0YVNpemUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9OU1MoaHNwaS0+SW5pdC5OU1MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9CQVVEUkFURV9QUkVTQ0FMRVIoaHNwaS0+SW5pdC5CYXVkUmF0ZVByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0ZJUlNUX0JJVChoc3BpLT5Jbml0LkZpcnN0Qml0KSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfVElNT0RFKGhzcGktPkluaXQuVElNb2RlKSk7CisgIGlmIChoc3BpLT5Jbml0LlRJTW9kZSA9PSBTUElfVElNT0RFX0RJU0FCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0NQT0woaHNwaS0+SW5pdC5DTEtQb2xhcml0eSkpOworICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1BIQShoc3BpLT5Jbml0LkNMS1BoYXNlKSk7CisgIH0KKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX0NBTENVTEFUSU9OKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24pKTsKKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX1BPTFlOT01JQUwoaHNwaS0+SW5pdC5DUkNQb2x5bm9taWFsKSk7CisgIH0KKyNlbHNlCisgIGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPSBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRTsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5TdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhzcGktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIC8qIEluaXQgdGhlIFNQSSBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgIGhzcGktPlR4Q3BsdENhbGxiYWNrICAgICAgID0gSEFMX1NQSV9UeENwbHRDYWxsYmFjazsgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgICBoc3BpLT5SeENwbHRDYWxsYmFjayAgICAgICA9IEhBTF9TUElfUnhDcGx0Q2FsbGJhY2s7ICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgaHNwaS0+VHhSeENwbHRDYWxsYmFjayAgICAgPSBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBUeFJ4Q3BsdENhbGxiYWNrICAgICAqLworICAgIGhzcGktPlR4SGFsZkNwbHRDYWxsYmFjayAgID0gSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICBoc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2sgICA9IEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICovCisgICAgaHNwaS0+VHhSeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeFJ4SGFsZkNwbHRDYWxsYmFjayAqLworICAgIGhzcGktPkVycm9yQ2FsbGJhY2sgICAgICAgID0gSEFMX1NQSV9FcnJvckNhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKyAgICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayAgICA9IEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICovCisKKyAgICBpZiAoaHNwaS0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLworICAgIEhBTF9TUElfTXNwSW5pdChoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNQSSBwZXJpcGhlcmFsICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBDUjEgJiBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgOiBTUEkgTW9kZSwgQ29tbXVuaWNhdGlvbiBNb2RlLCBEYXRhIHNpemUsIENsb2NrIHBvbGFyaXR5IGFuZCBwaGFzZSwgTlNTIG1hbmFnZW1lbnQsCisgIENvbW11bmljYXRpb24gc3BlZWQsIEZpcnN0IGJpdCBhbmQgQ1JDIGNhbGN1bGF0aW9uIHN0YXRlICovCisgIFdSSVRFX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IxLCAoaHNwaS0+SW5pdC5Nb2RlIHwgaHNwaS0+SW5pdC5EaXJlY3Rpb24gfCBoc3BpLT5Jbml0LkRhdGFTaXplIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3BpLT5Jbml0LkNMS1BvbGFyaXR5IHwgaHNwaS0+SW5pdC5DTEtQaGFzZSB8IChoc3BpLT5Jbml0Lk5TUyAmIFNQSV9DUjFfU1NNKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNwaS0+SW5pdC5CYXVkUmF0ZVByZXNjYWxlciB8IGhzcGktPkluaXQuRmlyc3RCaXQgIHwgaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbikpOworCisgIC8qIENvbmZpZ3VyZSA6IE5TUyBtYW5hZ2VtZW50LCBUSSBNb2RlICovCisgIFdSSVRFX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoKChoc3BpLT5Jbml0Lk5TUyA+PiAxNlUpICYgU1BJX0NSMl9TU09FKSB8IGhzcGktPkluaXQuVElNb2RlKSk7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IENSQ1BPTFkgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgOiBDUkMgUG9seW5vbWlhbCAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgV1JJVEVfUkVHKGhzcGktPkluc3RhbmNlLT5DUkNQUiwgaHNwaS0+SW5pdC5DUkNQb2x5bm9taWFsKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyNpZiBkZWZpbmVkKFNQSV9JMlNDRkdSX0kyU01PRCkKKyAgLyogQWN0aXZhdGUgdGhlIFNQSSBtb2RlIChNYWtlIHN1cmUgdGhhdCBJMlNNT0QgYml0IGluIEkyU0NGR1IgcmVnaXN0ZXIgaXMgcmVzZXQpICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTTU9EKTsKKyNlbmRpZiAvKiBTUElfSTJTQ0ZHUl9JMlNNT0QgKi8KKworICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPlN0YXRlICAgICA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZS1Jbml0aWFsaXplIHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRGVJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBDaGVjayB0aGUgU1BJIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc3BpID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgU1BJIEluc3RhbmNlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9JTlNUQU5DRShoc3BpLT5JbnN0YW5jZSkpOworCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFNQSSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaWYgKGhzcGktPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgSEFMX1NQSV9Nc3BEZUluaXQoaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFNQSSBNU1AuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX01zcEluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX01zcEluaXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZSB0aGUgU1BJIE1TUC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfTXNwRGVJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9Nc3BEZUluaXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgU1BJIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHNwaSBQb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwU1BJX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc3BpLT5FcnJvckNvZGUgfD0gSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIGlmIChIQUxfU1BJX1NUQVRFX1JFQURZID09IGhzcGktPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1NQSV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzcGktPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeFJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1RYX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfUlhfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzcGktPlJ4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9UWF9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+VHhSeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfRVJST1JfQ0JfSUQgOgorICAgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX0FCT1JUX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1NQSV9TVEFURV9SRVNFVCA9PSBoc3BpLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBTUEkgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFNQSSBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzcGkgUG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoSEFMX1NQSV9TVEFURV9SRUFEWSA9PSBoc3BpLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TUElfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeENwbHRDYWxsYmFjayA9IEhBTF9TUElfVHhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5SeENwbHRDYWxsYmFjayA9IEhBTF9TUElfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeFJ4Q3BsdENhbGxiYWNrID0gSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4UnhDcGx0Q2FsbGJhY2sgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzcGktPlR4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1RYX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeFJ4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4UnhIYWxmQ3BsdENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfRVJST1JfQ0JfSUQgOgorICAgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrID0gSEFMX1NQSV9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfQUJPUlRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayA9IEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwRGVJbml0OyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9TUElfU1RBVEVfUkVTRVQgPT0gaHNwaS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU1BJX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU1BJX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU1BJX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgU1BJCisgICAgZGF0YSB0cmFuc2ZlcnMuCisKKyAgICBbLi5dIFRoZSBTUEkgc3VwcG9ydHMgbWFzdGVyIGFuZCBzbGF2ZSBtb2RlIDoKKworICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUgZnVuY3Rpb24KKyAgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKyspIE5vLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgICBvciBETUEsIFRoZXNlIEFQSXMgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICBkZWRpY2F0ZWQgU1BJIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLgorICAgICAgICAgICAgVGhlIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soKSwgSEFMX1NQSV9SeENwbHRDYWxsYmFjaygpIGFuZCBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrcworICAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgUmVjZWl2ZSBwcm9jZXNzCisgICAgICAgICAgICBUaGUgSEFMX1NQSV9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBBUElzIHByb3ZpZGVkIGZvciB0aGVzZSAyIHRyYW5zZmVyIG1vZGVzIChCbG9ja2luZyBtb2RlIG9yIE5vbiBibG9ja2luZyBtb2RlIHVzaW5nIGVpdGhlciBJbnRlcnJ1cHQgb3IgRE1BKQorICAgICAgICBleGlzdCBmb3IgMUxpbmUgKHNpbXBsZXgpIGFuZCAyTGluZXMgKGZ1bGwgZHVwbGV4KSBtb2Rlcy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKyAgdWludDE2X3QgaW5pdGlhbF9UeFhmZXJDb3VudDsKKworICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgfHwgKChoc3BpLT5Jbml0LkRhdGFTaXplIDw9IFNQSV9EQVRBU0laRV84QklUKSAmJiAoU2l6ZSA+IDFVKSkpCisgIHsKKyAgICAvKiBpbiB0aGlzIGNhc2UsIDE2LWJpdCBhY2Nlc3MgaXMgcGVyZm9ybWVkIG9uIERhdGEKKyAgICAgICBTbywgY2hlY2sgRGF0YSBpcyAxNi1iaXQgYWxpZ25lZCBhZGRyZXNzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1NQSV8xNkJJVF9BTElHTkVEX0FERFJFU1MocERhdGEpKTsKKyAgfQorCisgIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTX09SXzFMSU5FKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgaW5pdGlhbF9UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+U3RhdGUgICAgICAgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFg7CisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopcERhdGE7CisgIGhzcGktPlR4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgIC8qSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5wUnhCdWZmUHRyICA9ICh1aW50OF90ICopTlVMTDsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSAwVTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5SeElTUiAgICAgICA9IE5VTEw7CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgIHsKKyAgICBTUElfMUxJTkVfVFgoaHNwaSk7CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoKGhzcGktPkluc3RhbmNlLT5DUjEgJiBTUElfQ1IxX1NQRSkgIT0gU1BJX0NSMV9TUEUpCisgIHsKKyAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOworICB9CisKKyAgLyogVHJhbnNtaXQgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfMTZCSVQpCisgIHsKKyAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGluaXRpYWxfVHhYZmVyQ291bnQgPT0gMHgwMVUpKQorICAgIHsKKyAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgICAgd2hpbGUgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgdG8gc2VuZCBkYXRhICovCisgICAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpCisgICAgICB7CisgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkgJiYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogVHJhbnNtaXQgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgIGVsc2UKKyAgeworICAgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX1NMQVZFKSB8fCAoaW5pdGlhbF9UeFhmZXJDb3VudCA9PSAweDAxVSkpCisgICAgeworICAgICAgKigoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUikgPSAoKmhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDhfdCk7CisgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgICB3aGlsZSAoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFRYRSBmbGFnIGlzIHNldCB0byBzZW5kIGRhdGEgKi8KKyAgICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfVFhFKSkKKyAgICAgIHsKKyAgICAgICAgKigoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUikgPSAoKmhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50OF90KTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkgJiYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9GTEFHOworICB9CisKKyAgLyogQ2xlYXIgb3ZlcnJ1biBmbGFnIGluIDIgTGluZXMgY29tbXVuaWNhdGlvbiBtb2RlIGJlY2F1c2UgcmVjZWl2ZWQgaXMgbm90IHJlYWQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKQorICB7CisgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgIH0KKworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgfQorCitlcnJvcjoKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOworCisgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB8fCAoKGhzcGktPkluaXQuRGF0YVNpemUgPD0gU1BJX0RBVEFTSVpFXzhCSVQpICYmIChTaXplID4gMVUpKSkKKyAgeworICAgIC8qIGluIHRoaXMgY2FzZSwgMTYtYml0IGFjY2VzcyBpcyBwZXJmb3JtZWQgb24gRGF0YQorICAgICAgIFNvLCBjaGVjayBEYXRhIGlzIDE2LWJpdCBhbGlnbmVkIGFkZHJlc3MgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJXzE2QklUX0FMSUdORURfQUREUkVTUyhwRGF0YSkpOworICB9CisKKyAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisgICAgLyogQ2FsbCB0cmFuc21pdC1yZWNlaXZlIGZ1bmN0aW9uIHRvIHNlbmQgRHVtbXkgZGF0YSBvbiBUeCBsaW5lIGFuZCBnZW5lcmF0ZSBjbG9jayBvbiBDTEsgbGluZSAqLworICAgIHJldHVybiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZShoc3BpLCBwRGF0YSwgcERhdGEsIFNpemUsIFRpbWVvdXQpOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilOVUxMOworICBoc3BpLT5UeFhmZXJTaXplICA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5SeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlR4SVNSICAgICAgID0gTlVMTDsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICAgIC8qIHRoaXMgaXMgZG9uZSB0byBoYW5kbGUgdGhlIENSQ05FWFQgYmVmb3JlIHRoZSBsYXRlc3QgZGF0YSAqLworICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbjogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgIHsKKyAgICBTUElfMUxJTkVfUlgoaHNwaSk7CisgIH0KKworICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoKGhzcGktPkluc3RhbmNlLT5DUjEgJiBTUElfQ1IxX1NQRSkgIT0gU1BJX0NSMV9TUEUpCisgIHsKKyAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOworICB9CisKKyAgLyogUmVjZWl2ZSBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPT0gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICAvKiBUcmFuc2ZlciBsb29wICovCisgICAgd2hpbGUgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIFJYTkUgZmxhZyAqLworICAgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkKKyAgICAgIHsKKyAgICAgICAgLyogcmVhZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICAgICAgICAoKiAodWludDhfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50OF90KTsKKyAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkgJiYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVHJhbnNmZXIgbG9vcCAqLworICAgIHdoaWxlIChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBSWE5FIGZsYWcgKi8KKyAgICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfUlhORSkpCisgICAgICB7CisgICAgICAgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpaHNwaS0+SW5zdGFuY2UtPkRSOworICAgICAgICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gIFRpbWVvdXQpICYmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIEhhbmRsZSB0aGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgLyogZnJlZXplIHRoZSBDUkMgYmVmb3JlIHRoZSBsYXRlc3QgZGF0YSAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKworICAgIC8qIFJlYWQgdGhlIGxhdGVzdCBkYXRhICovCisgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogdGhlIGxhdGVzdCBkYXRhIGhhcyBub3QgYmVlbiByZWNlaXZlZCAqLworICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIFJlY2VpdmUgbGFzdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgICAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPT0gU1BJX0RBVEFTSVpFXzE2QklUKQorICAgIHsKKyAgICAgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpaHNwaS0+SW5zdGFuY2UtPkRSOworICAgIH0KKyAgICAvKiBSZWNlaXZlIGxhc3QgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICgqKHVpbnQ4X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgICB9CisKKyAgICAvKiBXYWl0IHRoZSBDUkMgZGF0YSAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogUmVhZCBDUkMgdG8gRmx1c2ggRFIgYW5kIFJYTkUgZmxhZyAqLworICAgIFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgIGlmIChTUElfRW5kUnhUcmFuc2FjdGlvbihoc3BpLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgIH0KKworZXJyb3IgOgorICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIHRyYW5zbWlzc2lvbiBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIHJlY2VwdGlvbiBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50IGFuZCByZWNlaXZlZAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQxNl90ICAgICAgICAgICAgIGluaXRpYWxfVHhYZmVyQ291bnQ7CisgIHVpbnQzMl90ICAgICAgICAgICAgIHRtcF9tb2RlOworICBIQUxfU1BJX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CisgIHVpbnQzMl90ICAgICAgICAgICAgIHRpY2tzdGFydDsKKworICAvKiBWYXJpYWJsZSB1c2VkIHRvIGFsdGVybmF0ZSBSeCBhbmQgVHggZHVyaW5nIHRyYW5zZmVyICovCisgIHVpbnQzMl90ICAgICAgICAgICAgIHR4YWxsb3dlZCA9IDFVOworICBIQUxfU3RhdHVzVHlwZURlZiAgICBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHx8ICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkgJiYgKFNpemUgPiAxVSkpKQorICB7CisgICAgLyogaW4gdGhpcyBjYXNlLCAxNi1iaXQgYWNjZXNzIGlzIHBlcmZvcm1lZCBvbiBEYXRhCisgICAgICAgU28sIGNoZWNrIERhdGEgaXMgMTYtYml0IGFsaWduZWQgYWRkcmVzcyAqLworICAgIGFzc2VydF9wYXJhbShJU19TUElfMTZCSVRfQUxJR05FRF9BRERSRVNTKHBUeERhdGEpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJXzE2QklUX0FMSUdORURfQUREUkVTUyhwUnhEYXRhKSk7CisgIH0KKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FUyhoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogSW5pdCB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisgIHRtcF9zdGF0ZSAgICAgICAgICAgPSBoc3BpLT5TdGF0ZTsKKyAgdG1wX21vZGUgICAgICAgICAgICA9IGhzcGktPkluaXQuTW9kZTsKKyAgaW5pdGlhbF9UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgaWYgKCEoKHRtcF9zdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX1JFQURZKSB8fCBcCisgICAgICAgICgodG1wX21vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmICh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSkpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIERvbid0IG92ZXJ3cml0ZSBpbiBjYXNlIG9mIEhBTF9TUElfU1RBVEVfQlVTWV9SWCAqLworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFhfUlg7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wUnhCdWZmUHRyICA9ICh1aW50OF90ICopcFJ4RGF0YTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOworICBoc3BpLT5SeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwVHhEYXRhOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIGhzcGktPlR4WGZlclNpemUgID0gU2l6ZTsKKworICAvKkluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+UnhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPT0gU1BJX0RBVEFTSVpFXzE2QklUKQorICB7CisgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfU0xBVkUpIHx8IChpbml0aWFsX1R4WGZlckNvdW50ID09IDB4MDFVKSkKKyAgICB7CisgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgICAgd2hpbGUgKChoc3BpLT5UeFhmZXJDb3VudCA+IDBVKSB8fCAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkpCisgICAgeworICAgICAgLyogQ2hlY2sgVFhFIGZsYWcgKi8KKyAgICAgIGlmICgoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpICYmIChoc3BpLT5UeFhmZXJDb3VudCA+IDBVKSAmJiAodHhhbGxvd2VkID09IDFVKSkKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSByZWNlcHRpb24gKFJ4KS4gVHggbm90IGFsbG93ZWQgKi8KKyAgICAgICAgdHhhbGxvd2VkID0gMFU7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgICAgICAgIGlmICgoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpICYmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKQorICAgICAgICB7CisgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgUlhORSBmbGFnICovCisgICAgICBpZiAoKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkgJiYgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpKQorICAgICAgeworICAgICAgICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKHVpbnQxNl90KWhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudC0tOworICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSBUcmFuc21pc3Npb24gKFR4KS4gVHggaXMgYWxsb3dlZCAqLworICAgICAgICB0eGFsbG93ZWQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49ICBUaW1lb3V0KSAmJiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkKKyAgICAgIHsKKyAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGRhdGEgaW4gOCBCaXQgbW9kZSAqLworICBlbHNlCisgIHsKKyAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGluaXRpYWxfVHhYZmVyQ291bnQgPT0gMHgwMVUpKQorICAgIHsKKyAgICAgICooKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpID0gKCpoc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgICAgd2hpbGUgKChoc3BpLT5UeFhmZXJDb3VudCA+IDBVKSB8fCAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkpCisgICAgeworICAgICAgLyogQ2hlY2sgVFhFIGZsYWcgKi8KKyAgICAgIGlmICgoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpICYmIChoc3BpLT5UeFhmZXJDb3VudCA+IDBVKSAmJiAodHhhbGxvd2VkID09IDFVKSkKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSID0gKCpoc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgaHNwaS0+cFR4QnVmZlB0cisrOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSByZWNlcHRpb24gKFJ4KS4gVHggbm90IGFsbG93ZWQgKi8KKyAgICAgICAgdHhhbGxvd2VkID0gMFU7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgICAgICAgIGlmICgoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpICYmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKQorICAgICAgICB7CisgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICAgIH0KKworICAgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgaXMgcmVzZXQgKi8KKyAgICAgIGlmICgoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1JYTkUpKSAmJiAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkpCisgICAgICB7CisgICAgICAgICgqKHVpbnQ4X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9IGhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgaHNwaS0+cFJ4QnVmZlB0cisrOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudC0tOworICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSBUcmFuc21pc3Npb24gKFR4KS4gVHggaXMgYWxsb3dlZCAqLworICAgICAgICB0eGFsbG93ZWQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkgJiYgKChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKSkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVhZCBDUkMgZnJvbSBEUiB0byBjbG9zZSBDUkMgY2FsY3VsYXRpb24gcHJvY2VzcyAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIEVycm9yIG9uIHRoZSBDUkMgcmVjZXB0aW9uICovCisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICAvKiBSZWFkIENSQyAqLworICAgIFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7CisgIH0KKworICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAvKiBDbGVhciBDUkMgRmxhZyAqLworICAgIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKGhzcGkpOworCisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0ZMQUc7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBpbiAyIExpbmVzIGNvbW11bmljYXRpb24gbW9kZSBiZWNhdXNlIHJlY2VpdmVkIGlzIG5vdCByZWFkICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykKKyAgeworICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICB9CisKK2Vycm9yIDoKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHx8ICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkgJiYgKFNpemUgPiAxVSkpKQorICB7CisgICAgLyogaW4gdGhpcyBjYXNlLCAxNi1iaXQgYWNjZXNzIGlzIHBlcmZvcm1lZCBvbiBEYXRhCisgICAgICAgU28sIGNoZWNrIERhdGEgaXMgMTYtYml0IGFsaWduZWQgYWRkcmVzcyAqLworICAgIGFzc2VydF9wYXJhbShJU19TUElfMTZCSVRfQUxJR05FRF9BRERSRVNTKHBEYXRhKSk7CisgIH0KKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FU19PUl8xTElORShoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+U3RhdGUgICAgICAgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFg7CisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopcERhdGE7CisgIGhzcGktPlR4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgIC8qIEluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKU5VTEw7CisgIGhzcGktPlJ4WGZlclNpemUgID0gMFU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKworICAvKiBTZXQgdGhlIGZ1bmN0aW9uIGZvciBJVCB0cmVhdG1lbnQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIGhzcGktPlR4SVNSID0gU1BJX1R4SVNSXzE2QklUOworICB9CisgIGVsc2UKKyAgeworICAgIGhzcGktPlR4SVNSID0gU1BJX1R4SVNSXzhCSVQ7CisgIH0KKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9UWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIEVuYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX1RYRSB8IFNQSV9JVF9FUlIpKTsKKworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworZXJyb3IgOgorICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlX0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOworCisgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKSB8fCAoKGhzcGktPkluaXQuRGF0YVNpemUgPD0gU1BJX0RBVEFTSVpFXzhCSVQpICYmIChTaXplID4gMVUpKSkKKyAgeworICAgIC8qIGluIHRoaXMgY2FzZSwgMTYtYml0IGFjY2VzcyBpcyBwZXJmb3JtZWQgb24gRGF0YQorICAgICAgIFNvLCBjaGVjayBEYXRhIGlzIDE2LWJpdCBhbGlnbmVkIGFkZHJlc3MgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJXzE2QklUX0FMSUdORURfQUREUkVTUyhwRGF0YSkpOworICB9CisKKyAgaWYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYgKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisgICAgLyogQ2FsbCB0cmFuc21pdC1yZWNlaXZlIGZ1bmN0aW9uIHRvIHNlbmQgRHVtbXkgZGF0YSBvbiBUeCBsaW5lIGFuZCBnZW5lcmF0ZSBjbG9jayBvbiBDTEsgbGluZSAqLworICAgIHJldHVybiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVChoc3BpLCBwRGF0YSwgcERhdGEsIFNpemUpOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLyogSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopTlVMTDsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworCisgIC8qIFNldCB0aGUgZnVuY3Rpb24gZm9yIElUIHRyZWF0bWVudCAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICB7CisgICAgaHNwaS0+UnhJU1IgPSBTUElfUnhJU1JfMTZCSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgaHNwaS0+UnhJU1IgPSBTUElfUnhJU1JfOEJJVDsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbiA6IDFMaW5lICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICB7CisgICAgU1BJXzFMSU5FX1JYKGhzcGkpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogRW5hYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICAvKiBOb3RlIDogVGhlIFNQSSBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU1BJIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworZXJyb3IgOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCBhbmQgcmVjZWl2ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCAgICAgICAgICAgICB0bXBfbW9kZTsKKyAgSEFMX1NQSV9TdGF0ZVR5cGVEZWYgdG1wX3N0YXRlOworICBIQUxfU3RhdHVzVHlwZURlZiAgICBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHx8ICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkgJiYgKFNpemUgPiAxVSkpKQorICB7CisgICAgLyogaW4gdGhpcyBjYXNlLCAxNi1iaXQgYWNjZXNzIGlzIHBlcmZvcm1lZCBvbiBEYXRhCisgICAgICAgU28sIGNoZWNrIERhdGEgaXMgMTYtYml0IGFsaWduZWQgYWRkcmVzcyAqLworICAgIGFzc2VydF9wYXJhbShJU19TUElfMTZCSVRfQUxJR05FRF9BRERSRVNTKHBUeERhdGEpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJXzE2QklUX0FMSUdORURfQUREUkVTUyhwUnhEYXRhKSk7CisgIH0KKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FUyhoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogSW5pdCB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisgIHRtcF9zdGF0ZSAgICAgICAgICAgPSBoc3BpLT5TdGF0ZTsKKyAgdG1wX21vZGUgICAgICAgICAgICA9IGhzcGktPkluaXQuTW9kZTsKKworICBpZiAoISgodG1wX3N0YXRlID09IEhBTF9TUElfU1RBVEVfUkVBRFkpIHx8IFwKKyAgICAgICAgKCh0bXBfbW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYgKHRtcF9zdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpKSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogRG9uJ3Qgb3ZlcndyaXRlIGluIGNhc2Ugb2YgSEFMX1NQSV9TVEFURV9CVVNZX1JYICovCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWF9SWDsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwVHhEYXRhOworICBoc3BpLT5UeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKXBSeERhdGE7CisgIGhzcGktPlJ4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOworCisgIC8qIFNldCB0aGUgZnVuY3Rpb24gZm9yIElUIHRyZWF0bWVudCAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICB7CisgICAgaHNwaS0+UnhJU1IgICAgID0gU1BJXzJsaW5lc1J4SVNSXzE2QklUOworICAgIGhzcGktPlR4SVNSICAgICA9IFNQSV8ybGluZXNUeElTUl8xNkJJVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoc3BpLT5SeElTUiAgICAgPSBTUElfMmxpbmVzUnhJU1JfOEJJVDsKKyAgICBoc3BpLT5UeElTUiAgICAgPSBTUElfMmxpbmVzVHhJU1JfOEJJVDsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIEVuYWJsZSBUWEUsIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX1RYRSB8IFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworZXJyb3IgOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdF9ETUEoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdHggZG1hIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RNQV9IQU5ETEUoaHNwaS0+aGRtYXR4KSk7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPlN0YXRlICAgICAgID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYOworICBoc3BpLT5FcnJvckNvZGUgICA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFR4QnVmZlB0ciAgPSAodWludDhfdCAqKXBEYXRhOworICBoc3BpLT5UeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKiBJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilOVUxMOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSAwVTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9UWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFNldCB0aGUgU1BJIFR4RE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNQSV9ETUFIYWxmVHJhbnNtaXRDcGx0OworCisgIC8qIFNldCB0aGUgU1BJIFR4RE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IFNQSV9ETUFUcmFuc21pdENwbHQ7CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNQSV9ETUFFcnJvcjsKKworICAvKiBTZXQgdGhlIERNQSBBYm9ydENwbHRDYWxsYmFjayAqLworICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBFbmFibGUgdGhlIFR4IERNQSBTdHJlYW0vQ2hhbm5lbCAqLworICBpZiAoSEFMX09LICE9IEhBTF9ETUFfU3RhcnRfSVQoaHNwaS0+aGRtYXR4LCAodWludDMyX3QpaHNwaS0+cFR4QnVmZlB0ciwgKHVpbnQzMl90KSZoc3BpLT5JbnN0YW5jZS0+RFIsIGhzcGktPlR4WGZlckNvdW50KSkKKyAgeworICAgIC8qIFVwZGF0ZSBTUEkgZXJyb3IgY29kZSAqLworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworCisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoKGhzcGktPkluc3RhbmNlLT5DUjEgJiBTUElfQ1IxX1NQRSkgIT0gU1BJX0NSMV9TUEUpCisgIHsKKyAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBTUEkgRXJyb3IgSW50ZXJydXB0IEJpdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfRVJSKSk7CisKKyAgLyogRW5hYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKworZXJyb3IgOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBNQVNURVIgbW9kZSBhbmQgU1BJX0RJUkVDVElPTl8yTElORVMgZGlyZWN0aW9uLCBoZG1hdHggc2hhbGwgYmUgZGVmaW5lZC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIENSQyBmZWF0dXJlIGlzIGVuYWJsZWQgdGhlIHBEYXRhIExlbmd0aCBtdXN0IGJlIFNpemUgKyAxLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOworCisgIC8qIENoZWNrIHJ4IGRtYSBoYW5kbGUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ETUFfSEFORExFKGhzcGktPmhkbWFyeCkpOworCisgIGlmICgoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmIChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSkKKyAgeworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1JYOworCisgICAgLyogQ2hlY2sgdHggZG1hIGhhbmRsZSAqLworICAgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hdHgpKTsKKworICAgIC8qIENhbGwgdHJhbnNtaXQtcmVjZWl2ZSBmdW5jdGlvbiB0byBzZW5kIER1bW15IGRhdGEgb24gVHggbGluZSBhbmQgZ2VuZXJhdGUgY2xvY2sgb24gQ0xLIGxpbmUgKi8KKyAgICByZXR1cm4gSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKGhzcGksIHBEYXRhLCBwRGF0YSwgU2l6ZSk7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPlN0YXRlICAgICAgID0gSEFMX1NQSV9TVEFURV9CVVNZX1JYOworICBoc3BpLT5FcnJvckNvZGUgICA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKXBEYXRhOworICBoc3BpLT5SeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKkluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+UnhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlR4WGZlclNpemUgID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgIHsKKyAgICBTUElfMUxJTkVfUlgoaHNwaSk7CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBTZXQgdGhlIFNQSSBSeERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTUElfRE1BSGFsZlJlY2VpdmVDcGx0OworCisgIC8qIFNldCB0aGUgU1BJIFJ4IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTUElfRE1BUmVjZWl2ZUNwbHQ7CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNQSV9ETUFFcnJvcjsKKworICAvKiBTZXQgdGhlIERNQSBBYm9ydENwbHRDYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBFbmFibGUgdGhlIFJ4IERNQSBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX1N0YXJ0X0lUKGhzcGktPmhkbWFyeCwgKHVpbnQzMl90KSZoc3BpLT5JbnN0YW5jZS0+RFIsICh1aW50MzJfdCloc3BpLT5wUnhCdWZmUHRyLCBoc3BpLT5SeFhmZXJDb3VudCkpCisgIHsKKyAgICAvKiBVcGRhdGUgU1BJIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgU1BJIEVycm9yIEludGVycnVwdCBCaXQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX0VSUikpOworCisgIC8qIEVuYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisKK2Vycm9yOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXIKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIENSQyBmZWF0dXJlIGlzIGVuYWJsZWQgdGhlIHBSeERhdGEgTGVuZ3RoIG11c3QgYmUgU2l6ZSArIDEKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90ICAgICAgICAgICAgIHRtcF9tb2RlOworICBIQUxfU1BJX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworICAvKiBDaGVjayByeCAmIHR4IGRtYSBoYW5kbGVzICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hcngpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ETUFfSEFORExFKGhzcGktPmhkbWF0eCkpOworCisgIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBJbml0IHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKyAgdG1wX3N0YXRlICAgICAgICAgICA9IGhzcGktPlN0YXRlOworICB0bXBfbW9kZSAgICAgICAgICAgID0gaHNwaS0+SW5pdC5Nb2RlOworCisgIGlmICghKCh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgfHwKKyAgICAgICAgKCh0bXBfbW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYgKHRtcF9zdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpKSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogRG9uJ3Qgb3ZlcndyaXRlIGluIGNhc2Ugb2YgSEFMX1NQSV9TVEFURV9CVVNZX1JYICovCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWF9SWDsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwVHhEYXRhOworICBoc3BpLT5UeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKXBSeERhdGE7CisgIGhzcGktPlJ4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOworCisgIC8qIEluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+UnhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ2hlY2sgaWYgd2UgYXJlIGluIFJ4IG9ubHkgb3IgaW4gUngvVHggTW9kZSBhbmQgY29uZmlndXJlIHRoZSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGhzcGktPlN0YXRlID09IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIC8qIFNldCB0aGUgU1BJIFJ4IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHNwaS0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQ7CisgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrICAgICA9IFNQSV9ETUFSZWNlaXZlQ3BsdDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgdGhlIFNQSSBUeC9SeCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzcGktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTUElfRE1BSGFsZlRyYW5zbWl0UmVjZWl2ZUNwbHQ7CisgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrICAgICA9IFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0OworICB9CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNQSV9ETUFFcnJvcjsKKworICAvKiBTZXQgdGhlIERNQSBBYm9ydENwbHRDYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBFbmFibGUgdGhlIFJ4IERNQSBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX1N0YXJ0X0lUKGhzcGktPmhkbWFyeCwgKHVpbnQzMl90KSZoc3BpLT5JbnN0YW5jZS0+RFIsICh1aW50MzJfdCloc3BpLT5wUnhCdWZmUHRyLCBoc3BpLT5SeFhmZXJDb3VudCkpCisgIHsKKyAgICAvKiBVcGRhdGUgU1BJIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogRW5hYmxlIFJ4IERNQSBSZXF1ZXN0ICovCisgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKKworICAvKiBTZXQgdGhlIFNQSSBUeCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgYXMgTlVMTCBiZWNhdXNlIHRoZSBjb21tdW5pY2F0aW9uIGNsb3NpbmcKKyAgaXMgcGVyZm9ybWVkIGluIERNQSByZWNlcHRpb24gY29tcGxldGUgY2FsbGJhY2sgICovCisgIGhzcGktPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICBoc3BpLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgICAgID0gTlVMTDsKKyAgaHNwaS0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayAgICA9IE5VTEw7CisgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgICAgPSBOVUxMOworCisgIC8qIEVuYWJsZSB0aGUgVHggRE1BIFN0cmVhbS9DaGFubmVsICAqLworICBpZiAoSEFMX09LICE9IEhBTF9ETUFfU3RhcnRfSVQoaHNwaS0+aGRtYXR4LCAodWludDMyX3QpaHNwaS0+cFR4QnVmZlB0ciwgKHVpbnQzMl90KSZoc3BpLT5JbnN0YW5jZS0+RFIsIGhzcGktPlR4WGZlckNvdW50KSkKKyAgeworICAgIC8qIFVwZGF0ZSBTUEkgZXJyb3IgY29kZSAqLworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworCisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoKGhzcGktPkluc3RhbmNlLT5DUjEgJiBTUElfQ1IxX1NQRSkgIT0gU1BJX0NSMV9TUEUpCisgIHsKKyAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOworICB9CisgIC8qIEVuYWJsZSB0aGUgU1BJIEVycm9yIEludGVycnVwdCBCaXQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX0VSUikpOworCisgIC8qIEVuYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisKK2Vycm9yIDoKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoc3BpIFNQSSBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciAoVHggYW5kIFJ4KSwKKyAgKiAgICAgICAgIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU1BJIEludGVycnVwdHMgKGRlcGVuZGluZyBvZiB0cmFuc2ZlciBkaXJlY3Rpb24pCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9BYm9ydChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlOworICBfX0lPIHVpbnQzMl90IGNvdW50LCByZXNldGNvdW50OworCisgIC8qIEluaXRpYWxpemVkIGxvY2FsIHZhcmlhYmxlICAqLworICBlcnJvcmNvZGUgPSBIQUxfT0s7CisgIHJlc2V0Y291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKyAgY291bnQgPSByZXNldGNvdW50OworCisgIC8qIENsZWFyIEVSUklFIGludGVycnVwdCB0byBhdm9pZCBlcnJvciBpbnRlcnJ1cHRzIGdlbmVyYXRpb24gZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9FUlJJRSk7CisKKyAgLyogRGlzYWJsZSBUWEVJRSwgUlhORUlFIGFuZCBFUlJJRShtb2RlIGZhdWx0IGV2ZW50LCBvdmVycnVuIGVycm9yLCBUSSBmcmFtZSBlcnJvcikgaW50ZXJydXB0cyAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWEVJRSkpCisgIHsKKyAgICBoc3BpLT5UeElTUiA9IFNQSV9BYm9ydFR4X0lTUjsKKyAgICAvKiBXYWl0IEhBTF9TUElfU1RBVEVfQUJPUlQgc3RhdGUgKi8KKyAgICBkbworICAgIHsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNvdW50LS07CisgICAgfQorICAgIHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsKKyAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8KKyAgICBjb3VudCA9IHJlc2V0Y291bnQ7CisgIH0KKworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKQorICB7CisgICAgaHNwaS0+UnhJU1IgPSBTUElfQWJvcnRSeF9JU1I7CisgICAgLyogV2FpdCBIQUxfU1BJX1NUQVRFX0FCT1JUIHN0YXRlICovCisgICAgZG8KKyAgICB7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb3VudC0tOworICAgIH0KKyAgICB3aGlsZSAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9BQk9SVCk7CisgICAgLyogUmVzZXQgVGltZW91dCBDb3VudGVyICovCisgICAgY291bnQgPSByZXNldGNvdW50OworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTikpCisgIHsKKyAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBUeCBTdHJlYW0vQ2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTUEkgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEFib3J0IERNQSBUeCBIYW5kbGUgbGlua2VkIHRvIFNQSSBQZXJpcGhlcmFsICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoc3BpLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1RYRE1BRU4pKTsKKworICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb3VudC0tOworICAgICAgfQorICAgICAgd2hpbGUgKChoc3BpLT5JbnN0YW5jZS0+U1IgJiBTUElfRkxBR19UWEUpID09IFJFU0VUKTsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkKKyAgeworICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFJ4IFN0cmVhbS9DaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogQWJvcnQgRE1BIFJ4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhzcGktPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgICAgICAvKiBEaXNhYmxlIFJ4IERNQSBSZXF1ZXN0ICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKFNQSV9DUjJfUlhETUFFTikpOworICAgIH0KKyAgfQorICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDaGVjayBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgIGlmIChoc3BpLT5FcnJvckNvZGUgPT0gSEFMX1NQSV9FUlJPUl9BQk9SVCkKKyAgeworICAgIC8qIHJldHVybiBIQUxfRXJyb3IgaW4gY2FzZSBvZiBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgfQorCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgU1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKGhzcGkpOworCisgIC8qIFJlc3RvcmUgaHNwaS0+c3RhdGUgdG8gcmVhZHkgKi8KKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlciAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaHNwaSBTUEkgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgKFR4IGFuZCBSeCksCisgICogICAgICAgICBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNQSSBJbnRlcnJ1cHRzIChkZXBlbmRpbmcgb2YgdHJhbnNmZXIgZGlyZWN0aW9uKQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9BYm9ydF9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlOworICB1aW50MzJfdCBhYm9ydGNwbHQgOworICBfX0lPIHVpbnQzMl90IGNvdW50LCByZXNldGNvdW50OworCisgIC8qIEluaXRpYWxpemVkIGxvY2FsIHZhcmlhYmxlICAqLworICBlcnJvcmNvZGUgPSBIQUxfT0s7CisgIGFib3J0Y3BsdCA9IDFVOworICByZXNldGNvdW50ID0gU1BJX0RFRkFVTFRfVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAyNFUgLyAxMDAwVSk7CisgIGNvdW50ID0gcmVzZXRjb3VudDsKKworICAvKiBDbGVhciBFUlJJRSBpbnRlcnJ1cHQgdG8gYXZvaWQgZXJyb3IgaW50ZXJydXB0cyBnZW5lcmF0aW9uIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfRVJSSUUpOworCisgIC8qIENoYW5nZSBSeCBhbmQgVHggSXJxIEhhbmRsZXIgdG8gRGlzYWJsZSBUWEVJRSwgUlhORUlFIGFuZCBFUlJJRSBpbnRlcnJ1cHRzICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRUlFKSkKKyAgeworICAgIGhzcGktPlR4SVNSID0gU1BJX0Fib3J0VHhfSVNSOworICAgIC8qIFdhaXQgSEFMX1NQSV9TVEFURV9BQk9SVCBzdGF0ZSAqLworICAgIGRvCisgICAgeworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY291bnQtLTsKKyAgICB9CisgICAgd2hpbGUgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQUJPUlQpOworICAgIC8qIFJlc2V0IFRpbWVvdXQgQ291bnRlciAqLworICAgIGNvdW50ID0gcmVzZXRjb3VudDsKKyAgfQorCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYTkVJRSkpCisgIHsKKyAgICBoc3BpLT5SeElTUiA9IFNQSV9BYm9ydFJ4X0lTUjsKKyAgICAvKiBXYWl0IEhBTF9TUElfU1RBVEVfQUJPUlQgc3RhdGUgKi8KKyAgICBkbworICAgIHsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNvdW50LS07CisgICAgfQorICAgIHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsKKyAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8KKyAgICBjb3VudCA9IHJlc2V0Y291bnQ7CisgIH0KKworICAvKiBJZiBETUEgVHggYW5kL29yIERNQSBSeCBIYW5kbGVzIGFyZSBhc3NvY2lhdGVkIHRvIFNQSSBIYW5kbGUsIERNQSBBYm9ydCBjb21wbGV0ZSBjYWxsYmFja3Mgc2hvdWxkIGJlIGluaXRpYWxpc2VkCisgICAgIGJlZm9yZSBhbnkgY2FsbCB0byBETUEgQWJvcnQgZnVuY3Rpb25zICovCisgIC8qIERNQSBUeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pKQorICAgIHsKKyAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTUElfRE1BVHhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIC8qIERNQSBSeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pKQorICAgIHsKKyAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTUElfRE1BUnhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTikpCisgIHsKKyAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBUeCBTdHJlYW0vQ2hhbm5lbCAqLworICAgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBBYm9ydCBETUEgVHggSGFuZGxlIGxpbmtlZCB0byBTUEkgUGVyaXBoZXJhbCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNwaS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTikpCisgIHsKKyAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBSeCBTdHJlYW0vQ2hhbm5lbCAqLworICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBBYm9ydCBETUEgUnggSGFuZGxlIGxpbmtlZCB0byBTUEkgUGVyaXBoZXJhbCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNwaS0+aGRtYXJ4KSAhPSAgSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkKKyAgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENoZWNrIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlID09IEhBTF9TUElfRVJST1JfQUJPUlQpCisgICAgeworICAgICAgLyogcmV0dXJuIEhBTF9FcnJvciBpbiBjYXNlIG9mIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICAgIH0KKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgU1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsKKworICAgIC8qIFJlc3RvcmUgaHNwaS0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGF1c2UgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFQYXVzZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4ICYgUnggcmVxdWVzdHMgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFSZXN1bWUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogRW5hYmxlIHRoZSBTUEkgRE1BIFR4ICYgUnggcmVxdWVzdHMgKi8KKyAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVN0b3AoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKyAgLyogVGhlIExvY2sgaXMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgQVBJIHRvIGFsbG93IHRoZSB1c2VyIGFwcGxpY2F0aW9uCisgICAgIHRvIGNhbGwgdGhlIEhBTCBTUEkgQVBJIHVuZGVyIGNhbGxiYWNrcyBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX1NQSV9SeENwbHRDYWxsYmFjaygpIG9yIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjaygpOgorICAgICB3aGVuIGNhbGxpbmcgSEFMX0RNQV9BYm9ydCgpIEFQSSB0aGUgRE1BIFRYL1JYIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQKKyAgICAgYW5kIHRoZSBjb3JyZXNwb25kIGNhbGwgYmFjayBpcyBleGVjdXRlZCBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX1NQSV9SeENwbHRDYWxsYmFjaygpIG9yIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjaygpCisgICAgICovCisKKyAgLyogQWJvcnQgdGhlIFNQSSBETUEgdHggU3RyZWFtL0NoYW5uZWwgICovCisgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoc3BpLT5oZG1hdHgpKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7CisgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisgIC8qIEFib3J0IHRoZSBTUEkgRE1BIHJ4IFN0cmVhbS9DaGFubmVsICAqLworICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoSEFMX09LICE9IEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXJ4KSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICAgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgVHggJiBSeCByZXF1ZXN0cyAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKTsKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTUEkgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NQSV9JUlFIYW5kbGVyKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICB1aW50MzJfdCBpdHNvdXJjZSA9IGhzcGktPkluc3RhbmNlLT5DUjI7CisgIHVpbnQzMl90IGl0ZmxhZyAgID0gaHNwaS0+SW5zdGFuY2UtPlNSOworCisgIC8qIFNQSSBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfT1ZSKSA9PSBSRVNFVCkgJiYKKyAgICAgIChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX1JYTkUpICE9IFJFU0VUKSAmJiAoU1BJX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZSwgU1BJX0lUX1JYTkUpICE9IFJFU0VUKSkKKyAgeworICAgIGhzcGktPlJ4SVNSKGhzcGkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFNQSSBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfVFhFKSAhPSBSRVNFVCkgJiYgKFNQSV9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIFNQSV9JVF9UWEUpICE9IFJFU0VUKSkKKyAgeworICAgIGhzcGktPlR4SVNSKGhzcGkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFNQSSBpbiBFcnJvciBUcmVhdG1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX01PREYpICE9IFJFU0VUKSB8fCAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19PVlIpICE9IFJFU0VUKSB8fCAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19GUkUpICE9IFJFU0VUKSkgJiYgKFNQSV9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIFNQSV9JVF9FUlIpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIFNQSSBPdmVycnVuIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19PVlIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFgpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX09WUik7CisgICAgICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIC8qIFNQSSBNb2RlIEZhdWx0IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19NT0RGKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9NT0RGKTsKKyAgICAgIF9fSEFMX1NQSV9DTEVBUl9NT0RGRkxBRyhoc3BpKTsKKyAgICB9CisKKyAgICAvKiBTUEkgRnJhbWUgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfRlJFKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GUkUpOworICAgICAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7CisgICAgfQorCisgICAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX1JYTkUgfCBTUElfSVRfVFhFIHwgU1BJX0lUX0VSUik7CisKKyAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgcmVxdWVzdHMgaWYgZW5hYmxlZCAqLworICAgICAgaWYgKChIQUxfSVNfQklUX1NFVChpdHNvdXJjZSwgU1BJX0NSMl9UWERNQUVOKSkgfHwgKEhBTF9JU19CSVRfU0VUKGl0c291cmNlLCBTUElfQ1IyX1JYRE1BRU4pKSkKKyAgICAgIHsKKyAgICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pKTsKKworICAgICAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBSeCBjaGFubmVsICovCisgICAgICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgU1BJIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NQSV9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU1BJX0RNQUFib3J0T25FcnJvcjsKKyAgICAgICAgICBpZiAoSEFMX09LICE9IEhBTF9ETUFfQWJvcnRfSVQoaHNwaS0+aGRtYXJ4KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICAgICAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IHRoZSBTUEkgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTUElfRE1BQWJvcnRPbkVycm9yOworICAgICAgICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydF9JVChoc3BpLT5oZG1hdHgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9UeENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHggYW5kIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKCkgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHggYW5kIFJ4IEhhbGYgVHJhbnNmZXIgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9UeFJ4SGFsZkNwbHRDYWxsYmFjaygpIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNQSSBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfRXJyb3JDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfRXJyb3JDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KKyAgLyogTk9URSA6IFRoZSBFcnJvckNvZGUgcGFyYW1ldGVyIGluIHRoZSBoc3BpIGhhbmRsZSBpcyB1cGRhdGVkIGJ5IHRoZSBTUEkgcHJvY2Vzc2VzCisgICAgICAgICAgICBhbmQgdXNlciBjYW4gdXNlIEhBTF9TUElfR2V0RXJyb3IoKSBBUEkgdG8gY2hlY2sgdGhlIGxhdGVzdCBlcnJvciBvY2N1cnJlZAorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTUEkgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIFNQSSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICAqIEBicmllZiAgIFNQSSBjb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBTUEkuCisgICAgICgrKSBIQUxfU1BJX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZSBvZiB0aGUgU1BJIHBlcmlwaGVyYWwKKyAgICAgKCspIEhBTF9TUElfR2V0RXJyb3IoKSBjaGVjayBpbiBydW4tdGltZSBFcnJvcnMgb2NjdXJyaW5nIGR1cmluZyBjb21tdW5pY2F0aW9uCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgU1BJIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIFNQSSBzdGF0ZQorICAqLworSEFMX1NQSV9TdGF0ZVR5cGVEZWYgSEFMX1NQSV9HZXRTdGF0ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUmV0dXJuIFNQSSBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhzcGktPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgU1BJIGVycm9yIGNvZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBTUEkgZXJyb3IgY29kZSBpbiBiaXRtYXAgZm9ybWF0CisgICovCit1aW50MzJfdCBIQUxfU1BJX0dldEVycm9yKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBSZXR1cm4gU1BJIEVycm9yQ29kZSAqLworICByZXR1cm4gaHNwaS0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQGJyaWVmICAgUHJpdmF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBETUEgTm9ybWFsIE1vZGUgKi8KKyAgaWYgKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSAhPSBETUFfQ0NSX0NJUkMpCisgIHsKKyAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfRVJSKTsKKworICAgIC8qIERpc2FibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKworICAgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgICAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgfQorCisgICAgLyogQ2xlYXIgb3ZlcnJ1biBmbGFnIGluIDIgTGluZXMgY29tbXVuaWNhdGlvbiBtb2RlIGJlY2F1c2UgcmVjZWl2ZWQgZGF0YSBpcyBub3QgcmVhZCAqLworICAgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykKKyAgICB7CisgICAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgICB9CisKKyAgICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgLyogQ2FsbCB1c2VyIFR4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+VHhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogRE1BIE5vcm1hbCBNb2RlICovCisgIGlmICgoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgIT0gRE1BX0NDUl9DSVJDKQorICB7CisgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgLyogQ1JDIGhhbmRsaW5nICovCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFJYTkUgZmxhZyAqLworICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIEVycm9yIG9uIHRoZSBDUkMgcmVjZXB0aW9uICovCisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICB9CisgICAgICAvKiBSZWFkIENSQyAqLworICAgICAgUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKGRvbmUgYnkgZGVmYXVsdCB0byBoYW5kbGUgdGhlIGNhc2UgbWFzdGVyIHJ4IGRpcmVjdGlvbiAyIGxpbmVzKSAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgICAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgICBpZiAoU1BJX0VuZFJ4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9GTEFHOworICAgIH0KKworICAgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIC8qIENhbGwgdXNlciBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPlJ4Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIHRyYW5zbWl0IHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQVRyYW5zbWl0UmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogRE1BIE5vcm1hbCBNb2RlICovCisgIGlmICgoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgIT0gRE1BX0NDUl9DSVJDKQorICB7CisgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgLyogQ1JDIGhhbmRsaW5nICovCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBXYWl0IHRoZSBDUkMgZGF0YSAqLworICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICB9CisgICAgICAvKiBSZWFkIENSQyB0byBGbHVzaCBEUiBhbmQgUlhORSBmbGFnICovCisgICAgICBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgICAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIFJ4L1R4IERNQSBSZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7CisKKyAgICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICAgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIC8qIENhbGwgdXNlciBUeFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+VHhSeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIGhhbGYgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIENhbGwgdXNlciBUeCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+VHhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBoYWxmIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BSGFsZlJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKworICAvKiBDYWxsIHVzZXIgUnggaGFsZiBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPlJ4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgaGFsZiB0cmFuc21pdCByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmVHJhbnNtaXRSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogQ2FsbCB1c2VyIFR4UnggaGFsZiBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPlR4UnhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9UeFJ4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogU3RvcCB0aGUgZGlzYWJsZSBETUEgdHJhbnNmZXIgb24gU1BJIHNpZGUgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7CisKKyAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgSEFMIHNlcnZpY2VzIG9uIEVycm9yCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlbmNlKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgUnggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworICBfX0lPIHVpbnQzMl90IGNvdW50OworCisgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICBjb3VudCA9IFNQSV9ERUZBVUxUX1RJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMjRVIC8gMTAwMFUpOworCisgIC8qIERpc2FibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisKKyAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgKi8KKyAgZG8KKyAgeworICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY291bnQtLTsKKyAgfQorICB3aGlsZSAoKGhzcGktPkluc3RhbmNlLT5TUiAmIFNQSV9GTEFHX1RYRSkgPT0gUkVTRVQpOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIFN0cmVhbS9DaGFubmVsIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDaGVjayBubyBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9BQk9SVCkKKyAgeworICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgfQorCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgU1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKGhzcGkpOworCisgIC8qIFJlc3RvcmUgaHNwaS0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNwaS0+U3RhdGUgID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogRGlzYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKKworICAvKiBDaGVjayBCdXN5IGZsYWcgKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICB9CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIGlmIChoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgU3RyZWFtL0NoYW5uZWwgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENoZWNrIG5vIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX0FCT1JUKQorICB7CisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICB9CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBTUiByZWdpc3RlciAqLworICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7CisKKyAgLyogUmVzdG9yZSBoc3BpLT5TdGF0ZSB0byBSZWFkeSAqLworICBoc3BpLT5TdGF0ZSAgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBSZWNlaXZlIGRhdGEgaW4gOGJpdCBtb2RlICovCisgICpoc3BpLT5wUnhCdWZmUHRyID0gKigoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisgIGhzcGktPnBSeEJ1ZmZQdHIrKzsKKyAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKworICAvKiBDaGVjayBlbmQgb2YgdGhlIHJlY2VwdGlvbiAqLworICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICBoc3BpLT5SeElTUiA9ICBTUElfMmxpbmVzUnhJU1JfOEJJVENSQzsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgUlhORSAgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7CisgICAgfQorICB9Cit9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisvKioKKyAgKiBAYnJpZWYgIFJ4IDgtYml0IGhhbmRsZXIgZm9yIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGluIEludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzhCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlYWQgOGJpdCBDUkMgdG8gZmx1c2ggRGF0YSBSZWdzaXRlciAqLworICBSRUFEX1JFRygqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworCisgIC8qIERpc2FibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICB7CisgICAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7CisgIH0KK30KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisvKioKKyAgKiBAYnJpZWYgIFR4IDgtYml0IGhhbmRsZXIgZm9yIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGluIEludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1R4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUiA9ICgqaHNwaS0+cFR4QnVmZlB0cik7CisgIGhzcGktPnBUeEJ1ZmZQdHIrKzsKKyAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc21pc3Npb24gKi8KKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogU2V0IENSQyBOZXh0IEJpdCB0byBzZW5kIENSQyAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgLyogRGlzYWJsZSBUWEUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9UWEUpOworCisgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IDE2LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUmVjZWl2ZSBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpKGhzcGktPkluc3RhbmNlLT5EUik7CisgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKworICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICBoc3BpLT5SeElTUiA9ICBTUElfMmxpbmVzUnhJU1JfMTZCSVRDUkM7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFJYTkUgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX1JYTkUpOworCisgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIENSQyAxNi1iaXQgcmVjZWl2ZSBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfMTZCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlYWQgMTZiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnc2l0ZXIgKi8KKyAgUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKworICAvKiBEaXNhYmxlIFJYTkUgaW50ZXJydXB0ICovCisgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9SWE5FKTsKKworICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKK30KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisvKioKKyAgKiBAYnJpZWYgIFR4IDE2LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogVHJhbnNtaXQgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLworICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgIGhzcGktPlR4WGZlckNvdW50LS07CisKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogU2V0IENSQyBOZXh0IEJpdCB0byBzZW5kIENSQyAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgLyogRGlzYWJsZSBUWEUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9UWEUpOworCisgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIENSQyA4LWJpdCByZWNlaXZlIGluIEludGVycnVwdCBjb250ZXh0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlYWQgOGJpdCBDUkMgdG8gZmx1c2ggRGF0YSBSZWdpc3RlciAqLworICBSRUFEX1JFRygqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworCisgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKK30KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisvKioKKyAgKiBAYnJpZWYgIE1hbmFnZSB0aGUgcmVjZWl2ZSA4LWJpdCBpbiBJbnRlcnJ1cHQgY29udGV4dC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9SeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAqaHNwaS0+cFJ4QnVmZlB0ciA9ICgqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworICBoc3BpLT5wUnhCdWZmUHRyKys7CisgIGhzcGktPlJ4WGZlckNvdW50LS07CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgIGlmICgoaHNwaS0+UnhYZmVyQ291bnQgPT0gMVUpICYmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICBoc3BpLT5SeElTUiA9ICBTUElfUnhJU1JfOEJJVENSQzsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICBTUElfQ2xvc2VSeF9JU1IoaHNwaSk7CisgIH0KK30KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBDUkMgMTYtYml0IHJlY2VpdmUgaW4gSW50ZXJydXB0IGNvbnRleHQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlYWQgMTZiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnaXN0ZXIgKi8KKyAgUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKworICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKK30KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisvKioKKyAgKiBAYnJpZWYgIE1hbmFnZSB0aGUgMTYtYml0IHJlY2VpdmUgaW4gSW50ZXJydXB0IGNvbnRleHQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpKGhzcGktPkluc3RhbmNlLT5EUik7CisgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKChoc3BpLT5SeFhmZXJDb3VudCA9PSAxVSkgJiYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIGhzcGktPlJ4SVNSID0gU1BJX1J4SVNSXzE2QklUQ1JDOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZGF0YSA4LWJpdCB0cmFuc21pdCBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9UeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIgPSAoKmhzcGktPnBUeEJ1ZmZQdHIpOworICBoc3BpLT5wVHhCdWZmUHRyKys7CisgIGhzcGktPlR4WGZlckNvdW50LS07CisKKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICBTUElfQ2xvc2VUeF9JU1IoaHNwaSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGRhdGEgMTYtYml0IHRyYW5zbWl0IGluIEludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX1R4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKworICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVR4X0lTUihoc3BpKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTUEkgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBGbGFnIFNQSSBmbGFnIHRvIGNoZWNrCisgICogQHBhcmFtICBTdGF0ZSBmbGFnIHN0YXRlIHRvIGNoZWNrCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCB0aWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICB3aGlsZSAoKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBGbGFnKSA/IFNFVCA6IFJFU0VUKSAhPSBTdGF0ZSkKKyAgeworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPj0gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTUEkgYW5kIHJlc2V0IHRoZSBDUkM6IHRoZSBDUkMgdmFsdWUgc2hvdWxkIGJlIGNsZWFyZWQKKyAgICAgICAgb24gYm90aCBtYXN0ZXIgYW5kIHNsYXZlIHNpZGVzIGluIG9yZGVyIHRvIHJlc3luY2hyb25pemUgdGhlIG1hc3RlcgorICAgICAgICBhbmQgc2xhdmUgZm9yIHRoZWlyIHJlc3BlY3RpdmUgQ1JDIGNhbGN1bGF0aW9uICovCisKKyAgICAgICAgLyogRGlzYWJsZSBUWEUsIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICAgICAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmICgoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkpKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgICAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgICAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICAgICAgICB9CisKKyAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSB0aGUgY2hlY2sgb2YgdGhlIFJYIHRyYW5zYWN0aW9uIGNvbXBsZXRlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgdGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9FbmRSeFRyYW5zYWN0aW9uKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCAgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmICgoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkpKQorICB7CisgICAgLyogRGlzYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICB9CisKKyAgLyogRXJyYXRhc2hlZXQ6IEJTWSBiaXQgbWF5IHN0YXkgaGlnaCBhdCB0aGUgZW5kIG9mIGEgZGF0YSB0cmFuc2ZlciBpbiBTbGF2ZSBtb2RlICovCisgIGlmIChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKQorICB7CisgICAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uICE9IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkKKyAgICB7CisgICAgICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogV2FpdCB0aGUgUlhORSByZXNldCAqLworICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFJFU0VULCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogV2FpdCB0aGUgUlhORSByZXNldCAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBSRVNFVCwgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIHRoZSBjaGVjayBvZiB0aGUgUlhUWCBvciBUWCB0cmFuc2FjdGlvbiBjb21wbGV0ZS4KKyAgKiBAcGFyYW0gIGhzcGkgU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgdGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgLyogRXJyYXRhc2hlZXQ6IEJTWSBiaXQgbWF5IHN0YXkgaGlnaCBhdCB0aGUgZW5kIG9mIGEgZGF0YSB0cmFuc2ZlciBpbiBTbGF2ZSBtb2RlICovCisgIGlmIChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKQorICB7CisgICAgLyogQ29udHJvbCB0aGUgQlNZIGZsYWcgKi8KKyAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfQlNZLCBSRVNFVCwgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENvbnRyb2wgUlhORSBmbGFnIGluIGNhc2Ugb2YgRnVsbC1EdXBsZXggdHJhbnNmZXIgKi8KKyAgICBpZiAoaHNwaS0+U3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdGhlIFJYTkUgcmVzZXQgKi8KKyAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBSRVNFVCwgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIHRoZSBlbmQgb2YgdGhlIFJYVFggdHJhbnNhY3Rpb24uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfQ2xvc2VSeFR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICBfX0lPIHVpbnQzMl90IGNvdW50ID0gU1BJX0RFRkFVTFRfVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAyNFUgLyAxMDAwVSk7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7CisKKyAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgKi8KKyAgZG8KKyAgeworICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjb3VudC0tOworICB9CisgIHdoaWxlICgoaHNwaS0+SW5zdGFuY2UtPlNSICYgU1BJX0ZMQUdfVFhFKSA9PSBSRVNFVCk7CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgfQorCisgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBpbiAyIExpbmVzIGNvbW11bmljYXRpb24gbW9kZSBiZWNhdXNlIHJlY2VpdmVkIGlzIG5vdCByZWFkICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykKKyAgeworICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikgIT0gUkVTRVQpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgPT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIGlmIChoc3BpLT5TdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpCisgICAgICB7CisgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgICBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIENhbGwgdXNlciBUeFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaHNwaS0+VHhSeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICAgIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGVuZCBvZiB0aGUgUlggdHJhbnNhY3Rpb24uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfQ2xvc2VSeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIERpc2FibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICB9CisKKyAgLyogQ2xlYXIgb3ZlcnJ1biBmbGFnIGluIDIgTGluZXMgY29tbXVuaWNhdGlvbiBtb2RlIGJlY2F1c2UgcmVjZWl2ZWQgaXMgbm90IHJlYWQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKQorICB7CisgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgIH0KKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpICE9IFJFU0VUKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgPT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIC8qIENhbGwgdXNlciBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBoc3BpLT5SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZW5kIG9mIHRoZSBUWCB0cmFuc2FjdGlvbi4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9DbG9zZVR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICBfX0lPIHVpbnQzMl90IGNvdW50ID0gU1BJX0RFRkFVTFRfVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAyNFUgLyAxMDAwVSk7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgKi8KKyAgZG8KKyAgeworICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjb3VudC0tOworICB9CisgIHdoaWxlICgoaHNwaS0+SW5zdGFuY2UtPlNSICYgU1BJX0ZMQUdfVFhFKSA9PSBSRVNFVCk7CisKKyAgLyogRGlzYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfRVJSKSk7CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgfQorCisgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBpbiAyIExpbmVzIGNvbW11bmljYXRpb24gbW9kZSBiZWNhdXNlIHJlY2VpdmVkIGlzIG5vdCByZWFkICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykKKyAgeworICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICB9CisKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgeworICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENhbGwgdXNlciBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHNwaS0+VHhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgYWJvcnQgYSBSeCB0cmFuc2FjdGlvbi4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9BYm9ydFJ4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudCA9IFNQSV9ERUZBVUxUX1RJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMjRVIC8gMTAwMFUpOworCisgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0ICovCisgIGRvCisgIHsKKyAgICBpZiAoY291bnQgPT0gMFUpCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNvdW50LS07CisgIH0KKyAgd2hpbGUgKChoc3BpLT5JbnN0YW5jZS0+U1IgJiBTUElfRkxBR19UWEUpID09IFJFU0VUKTsKKworICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgIC8qIERpc2FibGUgVFhFSUUsIFJYTkVJRSBhbmQgRVJSSUUobW9kZSBmYXVsdCBldmVudCwgb3ZlcnJ1biBlcnJvciwgVEkgZnJhbWUgZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1RYRUlFIHwgU1BJX0NSMl9SWE5FSUUgfCBTUElfQ1IyX0VSUklFKSk7CisKKyAgLyogUmVhZCBDUkMgdG8gZmx1c2ggRGF0YSBSZWdpc3RlciAqLworICBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+RFIpOworCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9BQk9SVDsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgYWJvcnQgYSBUeCBvciBSeC9UeCB0cmFuc2FjdGlvbi4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9BYm9ydFR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSBpbnRlcnJ1cHQgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1RYRUlFKSk7CisKKyAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLworICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQUJPUlQ7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfU1BJX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF90aW0uYyBiL1NyYy9zdG0zMmwweHhfaGFsX3RpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Y2Y4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF90aW0uYwpAQCAtMCwwICsxLDYyOTcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3RpbS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUSU0gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVGltZXIgKFRJTSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBUSU0gVGltZSBCYXNlIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVElNIFRpbWUgQmFzZSBTdGFydAorICAqICAgICAgICAgICArIFRJTSBUaW1lIEJhc2UgU3RhcnQgSW50ZXJydXB0aW9uCisgICogICAgICAgICAgICsgVElNIFRpbWUgQmFzZSBTdGFydCBETUEKKyAgKiAgICAgICAgICAgKyBUSU0gT3V0cHV0IENvbXBhcmUvUFdNIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVElNIE91dHB1dCBDb21wYXJlL1BXTSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gT3V0cHV0IENvbXBhcmUvUFdNICBTdGFydAorICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gIFN0YXJ0IEludGVycnVwdGlvbgorICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gU3RhcnQgRE1BCisgICogICAgICAgICAgICsgVElNIElucHV0IENhcHR1cmUgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gSW5wdXQgQ2FwdHVyZSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gSW5wdXQgQ2FwdHVyZSBTdGFydAorICAqICAgICAgICAgICArIFRJTSBJbnB1dCBDYXB0dXJlIFN0YXJ0IEludGVycnVwdGlvbgorICAqICAgICAgICAgICArIFRJTSBJbnB1dCBDYXB0dXJlIFN0YXJ0IERNQQorICAqICAgICAgICAgICArIFRJTSBPbmUgUHVsc2UgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gT25lIFB1bHNlIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRJTSBPbmUgUHVsc2UgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgU3RhcnQgSW50ZXJydXB0aW9uCisgICogICAgICAgICAgICsgVElNIEVuY29kZXIgSW50ZXJmYWNlIFN0YXJ0IERNQQorICAqICAgICAgICAgICArIENvbW11dGF0aW9uIEV2ZW50IGNvbmZpZ3VyYXRpb24gd2l0aCBJbnRlcnJ1cHRpb24gYW5kIERNQQorICAqICAgICAgICAgICArIFRJTSBPQ1JlZiBjbGVhciBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVElNIEV4dGVybmFsIENsb2NrIGNvbmZpZ3VyYXRpb24KKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTUVSIEdlbmVyaWMgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhlIFRpbWVyIGZlYXR1cmVzIGluY2x1ZGU6CisgICAgICAgKCMpIDE2LWJpdCB1cCwgZG93biwgdXAvZG93biBhdXRvLXJlbG9hZCBjb3VudGVyLgorICAgICAgICgjKSAxNi1iaXQgcHJvZ3JhbW1hYmxlIHByZXNjYWxlciBhbGxvd2luZyBkaXZpZGluZyAoYWxzbyBvbiB0aGUgZmx5KSB0aGUKKyAgICAgICAgICAgY291bnRlciBjbG9jayBmcmVxdWVuY3kgZWl0aGVyIGJ5IGFueSBmYWN0b3IgYmV0d2VlbiAxIGFuZCA2NTUzNi4KKyAgICAgICAoIykgVXAgdG8gNCBpbmRlcGVuZGVudCBjaGFubmVscyBmb3I6CisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZQorICAgICAgICAgICAoKyspIE91dHB1dCBDb21wYXJlCisgICAgICAgICAgICgrKykgUFdNIGdlbmVyYXRpb24gKEVkZ2UgYW5kIENlbnRlci1hbGlnbmVkIE1vZGUpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0CisgICAgICAgKCMpIFN5bmNocm9uaXphdGlvbiBjaXJjdWl0IHRvIGNvbnRyb2wgdGhlIHRpbWVyIHdpdGggZXh0ZXJuYWwgc2lnbmFscyBhbmQgdG8gaW50ZXJjb25uZWN0CisgICAgICAgICAgICBzZXZlcmFsIHRpbWVycyB0b2dldGhlci4KKyAgICAgICAoIykgU3VwcG9ydHMgaW5jcmVtZW50YWwgZW5jb2RlciBmb3IgcG9zaXRpb25pbmcgcHVycG9zZXMKKworICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKKyAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgZmVhdHVyZToKKyAgICAgICAgICAgKCsrKSBUaW1lIEJhc2UgOiBIQUxfVElNX0Jhc2VfTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZSA6IEhBTF9USU1fSUNfTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgT3V0cHV0IENvbXBhcmUgOiBIQUxfVElNX09DX01zcEluaXQoKQorICAgICAgICAgICAoKyspIFBXTSBnZW5lcmF0aW9uIDogSEFMX1RJTV9QV01fTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0KCkKKyAgICAgICAgICAgKCsrKSBFbmNvZGVyIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoKQorCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyA6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBUSU0gaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19USU14X0NMS19FTkFCTEUoKTsKKyAgICAgICAgKCMjKSBUSU0gcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgVElNIEdQSU9zIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAgICAgICAgX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKTsKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBUSU0gcGlucyBpbiBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSB1c2luZyBIQUxfR1BJT19Jbml0KCk7CisKKyAgICAgKCMpIFRoZSBleHRlcm5hbCBDbG9jayBjYW4gYmUgY29uZmlndXJlZCwgaWYgbmVlZGVkICh0aGUgZGVmYXVsdCBjbG9jayBpcyB0aGUKKyAgICAgICAgIGludGVybmFsIGNsb2NrIGZyb20gdGhlIEFQQngpLCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorICAgICAgICAgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZSwgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGRvbmUgYmVmb3JlCisgICAgICAgICBhbnkgc3RhcnQgZnVuY3Rpb24uCisKKyAgICAgKCMpIENvbmZpZ3VyZSB0aGUgVElNIGluIHRoZSBkZXNpcmVkIGZ1bmN0aW9uaW5nIG1vZGUgdXNpbmcgb25lIG9mIHRoZQorICAgICAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9mIHRoaXMgZHJpdmVyOgorICAgICAgICgrKykgSEFMX1RJTV9CYXNlX0luaXQ6IHRvIHVzZSB0aGUgVGltZXIgdG8gZ2VuZXJhdGUgYSBzaW1wbGUgdGltZSBiYXNlCisgICAgICAgKCsrKSBIQUxfVElNX09DX0luaXQgYW5kIEhBTF9USU1fT0NfQ29uZmlnQ2hhbm5lbDogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhbgorICAgICAgICAgICAgT3V0cHV0IENvbXBhcmUgc2lnbmFsLgorICAgICAgICgrKykgSEFMX1RJTV9QV01fSW5pdCBhbmQgSEFMX1RJTV9QV01fQ29uZmlnQ2hhbm5lbDogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhCisgICAgICAgICAgICBQV00gc2lnbmFsLgorICAgICAgICgrKykgSEFMX1RJTV9JQ19Jbml0IGFuZCBIQUxfVElNX0lDX0NvbmZpZ0NoYW5uZWw6IHRvIHVzZSB0aGUgVGltZXIgdG8gbWVhc3VyZSBhbgorICAgICAgICAgICAgZXh0ZXJuYWwgc2lnbmFsLgorICAgICAgICgrKykgSEFMX1RJTV9PbmVQdWxzZV9Jbml0IGFuZCBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWw6IHRvIHVzZSB0aGUgVGltZXIKKyAgICAgICAgICAgIGluIE9uZSBQdWxzZSBNb2RlLgorICAgICAgICgrKykgSEFMX1RJTV9FbmNvZGVyX0luaXQ6IHRvIHVzZSB0aGUgVGltZXIgRW5jb2RlciBJbnRlcmZhY2UuCisKKyAgICAgKCMpIEFjdGl2YXRlIHRoZSBUSU0gcGVyaXBoZXJhbCB1c2luZyBvbmUgb2YgdGhlIHN0YXJ0IGZ1bmN0aW9ucyBkZXBlbmRpbmcgZnJvbSB0aGUgZmVhdHVyZSB1c2VkOgorICAgICAgICAgICAoKyspIFRpbWUgQmFzZSA6IEhBTF9USU1fQmFzZV9TdGFydCgpLCBIQUxfVElNX0Jhc2VfU3RhcnRfRE1BKCksIEhBTF9USU1fQmFzZV9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZSA6ICBIQUxfVElNX0lDX1N0YXJ0KCksIEhBTF9USU1fSUNfU3RhcnRfRE1BKCksIEhBTF9USU1fSUNfU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIE91dHB1dCBDb21wYXJlIDogSEFMX1RJTV9PQ19TdGFydCgpLCBIQUxfVElNX09DX1N0YXJ0X0RNQSgpLCBIQUxfVElNX09DX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBQV00gZ2VuZXJhdGlvbiA6IEhBTF9USU1fUFdNX1N0YXJ0KCksIEhBTF9USU1fUFdNX1N0YXJ0X0RNQSgpLCBIQUxfVElNX1BXTV9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9PbmVQdWxzZV9TdGFydCgpLCBIQUxfVElNX09uZVB1bHNlX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBFbmNvZGVyIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9FbmNvZGVyX1N0YXJ0KCksIEhBTF9USU1fRW5jb2Rlcl9TdGFydF9ETUEoKSwgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKCkuCisKKyAgICAgKCMpIFRoZSBETUEgQnVyc3QgaXMgbWFuYWdlZCB3aXRoIHRoZSB0d28gZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgICAgICAgIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdGFydCgpCisgICAgICAgICBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdGFydCgpCisKKyAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorCisgIFVzZSBGdW5jdGlvbiBAcmVmIEhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2suCisgIEByZWYgSEFMX1RJTV9SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICB0aGUgQ2FsbGJhY2sgSUQgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKworICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgd2VhayBmdW5jdGlvbi4KKyAgQHJlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisKKyAgVGhlc2UgZnVuY3Rpb25zIGFsbG93IHRvIHJlZ2lzdGVyL3VucmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgQmFzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2suCisgICAgKCspIEJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICA6IFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2suCisgICAgKCspIElDX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgICA6IFRJTSBJQyBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgSUNfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogVElNIElDIE1zcCBEZUluaXQgQ2FsbGJhY2suCisgICAgKCspIE9DX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgICA6IFRJTSBPQyBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgT0NfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogVElNIE9DIE1zcCBEZUluaXQgQ2FsbGJhY2suCisgICAgKCspIFBXTV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICA6IFRJTSBQV00gTXNwIEluaXQgQ2FsbGJhY2suCisgICAgKCspIFBXTV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICA6IFRJTSBQV00gTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgT25lUHVsc2VfTXNwSW5pdENhbGxiYWNrICAgICAgICAgIDogVElNIE9uZSBQdWxzZSBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgT25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgIDogVElNIE9uZSBQdWxzZSBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBFbmNvZGVyX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBUSU0gRW5jb2RlciBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgRW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVElNIEVuY29kZXIgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgUGVyaW9kRWxhcHNlZENhbGxiYWNrICAgICAgICAgICAgIDogVElNIFBlcmlvZCBFbGFwc2VkIENhbGxiYWNrLgorICAgICgrKSBQZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayAgICAgOiBUSU0gUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgVHJpZ2dlckNhbGxiYWNrICAgICAgICAgICAgICAgICAgIDogVElNIFRyaWdnZXIgQ2FsbGJhY2suCisgICAgKCspIFRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA6IFRJTSBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIElDX0NhcHR1cmVDYWxsYmFjayAgICAgICAgICAgICAgICA6IFRJTSBJbnB1dCBDYXB0dXJlIENhbGxiYWNrLgorICAgICgrKSBJQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBUSU0gSW5wdXQgQ2FwdHVyZSBoYWxmIGNvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBPQ19EZWxheUVsYXBzZWRDYWxsYmFjayAgICAgICAgICAgOiBUSU0gT3V0cHV0IENvbXBhcmUgRGVsYXkgRWxhcHNlZCBDYWxsYmFjay4KKyAgICAoKykgUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayAgICAgICAgIDogVElNIFBXTSBQdWxzZSBGaW5pc2hlZCBDYWxsYmFjay4KKyAgICAoKykgUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrIDogVElNIFBXTSBQdWxzZSBGaW5pc2hlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgOiBUSU0gRXJyb3IgQ2FsbGJhY2suCisKK0J5IGRlZmF1bHQsIGFmdGVyIHRoZSBJbml0IGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfVElNX1NUQVRFX1JFU0VUCithbGwgaW50ZXJydXB0IGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICBleGFtcGxlcyBAcmVmIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKCksIEByZWYgSEFMX1RJTV9FcnJvckNhbGxiYWNrKCkuCisKKyAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrCisgIGZ1bmN0aW9uYWxpdGllcyBpbiB0aGUgSW5pdCAvIERlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsCisgIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4gSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBJbml0IC8gRGVJbml0CisgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQgLyBNc3BEZUluaXQgY2FsbGJhY2tzKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkKKworICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZCAvIHVucmVnaXN0ZXJlZCBpbiBIQUxfVElNX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdCAvIE1zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIC8gdW5yZWdpc3RlcmVkCisgICAgaW4gSEFMX1RJTV9TVEFURV9SRUFEWSBvciBIQUxfVElNX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgIHRodXMgcmVnaXN0ZXJlZCh1c2VyKSBNc3BJbml0IC8gRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQgLyBEZUluaXQuCisgIEluIHRoYXQgY2FzZSBmaXJzdCByZWdpc3RlciB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgICAgIHVzaW5nIEByZWYgSEFMX1RJTV9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgRGVJbml0IG9yIEluaXQgZnVuY3Rpb24uCisKKyAgICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICAgICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTSBUSU0KKyAgKiBAYnJpZWYgVElNIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVElNX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9CYXNlX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX0Jhc2VfSW5pdFR5cGVEZWYgKlN0cnVjdHVyZSk7CitzdGF0aWMgdm9pZCBUSU1fT0MxX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOworc3RhdGljIHZvaWQgVElNX09DMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKTsKK3N0YXRpYyB2b2lkIFRJTV9PQzNfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7CitzdGF0aWMgdm9pZCBUSU1fT0M0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOworc3RhdGljIHZvaWQgVElNX1RJMV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOworc3RhdGljIHZvaWQgVElNX1RJMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOworc3RhdGljIHZvaWQgVElNX1RJMl9Db25maWdJbnB1dFN0YWdlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDRmlsdGVyKTsKK3N0YXRpYyB2b2lkIFRJTV9USTNfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKTsKK3N0YXRpYyB2b2lkIFRJTV9USTRfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKTsKK3N0YXRpYyB2b2lkIFRJTV9JVFJ4X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgSW5wdXRUcmlnZ2VyU291cmNlKTsKK3N0YXRpYyB2b2lkIFRJTV9FVFJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0V4dFRSR1BvbGFyaXR5LCB1aW50MzJfdCBFeHRUUkdGaWx0ZXIpOworc3RhdGljIHZvaWQgVElNX0NDeENoYW5uZWxDbWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENoYW5uZWxTdGF0ZSk7CitzdGF0aWMgdm9pZCBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVElNX0RNQVBlcmlvZEVsYXBzZWRIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBUSU1fRE1BVHJpZ2dlckNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVElNX0RNQVRyaWdnZXJIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZyk7CisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFRJTSBUaW1lIEJhc2UgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFRpbWUgQmFzZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIFRpbWUgQmFzZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBiYXNlLgorICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUSU0gYmFzZS4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgQmFzZS4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBCYXNlLgorICAgICgrKSBTdGFydCB0aGUgVGltZSBCYXNlIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUaW1lIEJhc2UgYW5kIGRpc2FibGUgaW50ZXJydXB0LgorICAgICgrKSBTdGFydCB0aGUgVGltZSBCYXNlIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICgrKSBTdG9wIHRoZSBUaW1lIEJhc2UgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIFRpbWUgYmFzZSBVbml0IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yIHJldmVyc2UpCisgICogICAgICAgICByZXF1aXJlcyBhIHRpbWVyIHJlc2V0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlyZWN0aW9uCisgICogICAgICAgICBkdWUgdG8gRElSIGJpdCByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLgorICAqICAgICAgICAgRXg6IGNhbGwgQHJlZiBIQUxfVElNX0Jhc2VfRGVJbml0KCkgYmVmb3JlIEhBTF9USU1fQmFzZV9Jbml0KCkKKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BFUklPRChodGltLT5Jbml0LlBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BSRVNDQUxFUihodGltLT5Jbml0LlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisKKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOworCisgICAgaWYgKGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0Jhc2VfTXNwSW5pdDsKKyAgICB9CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBIQUxfVElNX0Jhc2VfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIFNldCB0aGUgVGltZSBCYXNlIGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIEJhc2UgcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBUSU0gUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0Jhc2VfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX1RJTV9CYXNlX01zcERlSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBDaGFuZ2UgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBCYXNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0Jhc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fQmFzZV9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gQmFzZSBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9CYXNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fQmFzZV9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gVXBkYXRlIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9VUERBVEUpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIC8qIERpc2FibGUgdGhlIFRJTSBVcGRhdGUgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9VUERBVEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHBhcmFtICBwRGF0YSBUaGUgc291cmNlIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSAmJiAoTGVuZ3RoID4gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2tzICovCisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQVBlcmlvZEVsYXBzZWRDcGx0OworICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZEhhbGZDcGx0OworCisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5BUlIsIExlbmd0aCkgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX1VQREFURSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBVcGRhdGUgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfVVBEQVRFKTsKKworICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVElNIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZS4KKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIE91dHB1dCBDb21wYXJlLgorICAgICgrKSBTdGFydCB0aGUgVElNIE91dHB1dCBDb21wYXJlLgorICAgICgrKSBTdG9wIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9IYW5kbGVUeXBlRGVmIGFuZCBpbml0aWFsaXplcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yIHJldmVyc2UpCisgICogICAgICAgICByZXF1aXJlcyBhIHRpbWVyIHJlc2V0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlyZWN0aW9uCisgICogICAgICAgICBkdWUgdG8gRElSIGJpdCByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLgorICAqICAgICAgICAgRXg6IGNhbGwgQHJlZiBIQUxfVElNX09DX0RlSW5pdCgpIGJlZm9yZSBIQUxfVElNX09DX0luaXQoKQorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QRVJJT0QoaHRpbS0+SW5pdC5QZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QUkVTQ0FMRVIoaHRpbS0+SW5pdC5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmIChodGltLT5PQ19Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodGltLT5PQ19Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09DX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgICAgSEFMX1RJTV9PQ19Nc3BJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogSW5pdCB0aGUgYmFzZSB0aW1lIGZvciB0aGUgT3V0cHV0IENvbXBhcmUgKi8KKyAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAgJmh0aW0tPkluaXQpOworCisgIC8qIEluaXRpYWxpemUgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09DX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgIEhBTF9USU1fT0NfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9PQ19Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9PQ19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gT3V0cHV0IENvbXBhcmUgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX09DX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT0NfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBFbmFibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHBhcmFtICBwRGF0YSBUaGUgc291cmNlIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBUSU0gcGVyaXBoZXJhbAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreworICAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1I0LCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgT3V0cHV0IGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFRJTSBQV00gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFRJTSBQV00gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gUFdNIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIFBXTS4KKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIFBXTS4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBQV00uCisgICAgKCspIFN0b3AgdGhlIFRJTSBQV00uCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gUFdNIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUSU0gUFdNIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBQV00gYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBQV00gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIFBXTSBUaW1lIEJhc2UgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9IYW5kbGVUeXBlRGVmIGFuZCBpbml0aWFsaXplcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yIHJldmVyc2UpCisgICogICAgICAgICByZXF1aXJlcyBhIHRpbWVyIHJlc2V0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlyZWN0aW9uCisgICogICAgICAgICBkdWUgdG8gRElSIGJpdCByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLgorICAqICAgICAgICAgRXg6IGNhbGwgQHJlZiBIQUxfVElNX1BXTV9EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9QV01fSW5pdCgpCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUEVSSU9EKGh0aW0tPkluaXQuUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUFJFU0NBTEVSKGh0aW0tPkluaXQuUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKworICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZiAoaHRpbS0+UFdNX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX1BXTV9Nc3BJbml0OworICAgIH0KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNX1BXTV9Nc3BJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogSW5pdCB0aGUgYmFzZSB0aW1lIGZvciB0aGUgUFdNICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIEluaXRpYWxpemUgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBUSU0gUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9QV01fTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgIEhBTF9USU1fUFdNX01zcERlSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBDaGFuZ2UgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBQV00gTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9QV01fTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fUFdNX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBQV00gTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9QV01fTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QV01fTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBzb3VyY2UgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIFRJTSBwZXJpcGhlcmFsCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgJiYgKExlbmd0aCA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ2FwdHVyZS9Db21wYXJlIDMgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1I0LCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzQpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFRJTSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucworICogIEBicmllZiAgICBUSU0gSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIFRJTSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dCisgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIElucHV0IENhcHR1cmUuCisgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIElucHV0IENhcHR1cmUuCisgICAoKykgU3RhcnQgdGhlIFRJTSBJbnB1dCBDYXB0dXJlLgorICAgKCspIFN0b3AgdGhlIFRJTSBJbnB1dCBDYXB0dXJlLgorICAgKCspIFN0YXJ0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICgrKSBTdG9wIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAoKykgU3RhcnQgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgKCspIFN0b3AgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIFRpbWUgYmFzZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0hhbmRsZVR5cGVEZWYgYW5kIGluaXRpYWxpemVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFN3aXRjaGluZyBmcm9tIENlbnRlciBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3IgcmV2ZXJzZSkKKyAgKiAgICAgICAgIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24KKyAgKiAgICAgICAgIGR1ZSB0byBESVIgYml0IHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuCisgICogICAgICAgICBFeDogY2FsbCBAcmVmIEhBTF9USU1fSUNfRGVJbml0KCkgYmVmb3JlIEhBTF9USU1fSUNfSW5pdCgpCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUEVSSU9EKGh0aW0tPkluaXQuUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUFJFU0NBTEVSKGh0aW0tPkluaXQuUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKworICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZiAoaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9JQ19Nc3BJbml0OworICAgIH0KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIEhBTF9USU1fSUNfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEluaXQgdGhlIGJhc2UgdGltZSBmb3IgdGhlIGlucHV0IGNhcHR1cmUgKi8KKyAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh0aW0tPklDX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9JQ19Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICBIQUxfVElNX0lDX01zcERlSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBDaGFuZ2UgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0lDX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0lDX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBJbnB1dCBDYXB0dXJlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0lDX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQuCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBFbmFibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudCBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBUSU0gcGVyaXBoZXJhbCB0byBtZW1vcnkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQ0NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSAmJiAoTGVuZ3RoID4gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCAodWludDMyX3QpcERhdGEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IzLCAodWludDMyX3QpcERhdGEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1I0LCAodWludDMyX3QpcERhdGEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudCBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0NDX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzQpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gT25lIFB1bHNlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIE9uZSBQdWxzZS4KKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIE9uZSBQdWxzZS4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBPbmUgUHVsc2UuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPbmUgUHVsc2UuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gT25lIFB1bHNlIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUSU0gT25lIFB1bHNlIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPbmUgUHVsc2UgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE9uZSBQdWxzZSBUaW1lIEJhc2UgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9IYW5kbGVUeXBlRGVmIGFuZCBpbml0aWFsaXplcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yIHJldmVyc2UpCisgICogICAgICAgICByZXF1aXJlcyBhIHRpbWVyIHJlc2V0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlyZWN0aW9uCisgICogICAgICAgICBkdWUgdG8gRElSIGJpdCByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLgorICAqICAgICAgICAgRXg6IGNhbGwgQHJlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdCgpIGJlZm9yZSBIQUxfVElNX09uZVB1bHNlX0luaXQoKQorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT25lUHVsc2VNb2RlIFNlbGVjdCB0aGUgT25lIHB1bHNlIG1vZGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fT1BNT0RFX1NJTkdMRTogT25seSBvbmUgcHVsc2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCisgICogICAgICAgICAgICBAYXJnIFRJTV9PUE1PREVfUkVQRVRJVElWRTogUmVwZXRpdGl2ZSBwdWxzZXMgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE9uZVB1bHNlTW9kZSkKK3sKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09QTV9NT0RFKE9uZVB1bHNlTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BFUklPRChodGltLT5Jbml0LlBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BSRVNDQUxFUihodGltLT5Jbml0LlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisKKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOworCisgICAgaWYgKGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdDsKKyAgICB9CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNX09uZVB1bHNlX01zcEluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBDb25maWd1cmUgdGhlIFRpbWUgYmFzZSBpbiB0aGUgT25lIFB1bHNlIE1vZGUgKi8KKyAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7CisKKyAgLyogUmVzZXQgdGhlIE9QTSBCaXQgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMSAmPSB+VElNX0NSMV9PUE07CisKKyAgLyogQ29uZmlndXJlIHRoZSBPUE0gTW9kZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IxIHw9IE9uZVB1bHNlTW9kZTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gT25lIFB1bHNlCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT25lIFB1bHNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIE9uZSBQdWxzZSBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoT3V0cHV0Q2hhbm5lbCk7CisKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgYW5kIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzCisgICAgKGluIHRoZSBPUE0gTW9kZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpCisgICAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIGlucHV0IGFuZAorICAgIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBpbnB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIG91dHB1dAorICAgIGluIGFsbCBjb21iaW5hdGlvbnMsIHRoZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yIHNob3VsZCBiZSBlbmFibGVkIHRvZ2V0aGVyCisKKyAgICBObyBuZWVkIHRvIGVuYWJsZSB0aGUgY291bnRlciwgaXQncyBlbmFibGVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUKKyAgICAodGhlIGNvdW50ZXIgc3RhcnRzIGluIHJlc3BvbnNlIHRvIGEgc3RpbXVsdXMgYW5kIGdlbmVyYXRlIGEgcHVsc2UgKi8KKworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoT3V0cHV0Q2hhbm5lbCk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscworICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikKKyAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIGlucHV0IGFuZAorICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQKKyAgaW4gYWxsIGNvbWJpbmF0aW9ucywgdGhlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIgc2hvdWxkIGJlIGRpc2FibGVkIHRvZ2V0aGVyICovCisKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKE91dHB1dENoYW5uZWwpOworCisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscworICAgIChpbiB0aGUgT1BNIE1vZGUgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKQorICAgIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBvdXRwdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBpbnB1dCBhbmQKKyAgICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQKKyAgICBpbiBhbGwgY29tYmluYXRpb25zLCB0aGUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZW5hYmxlZCB0b2dldGhlcgorCisgICAgTm8gbmVlZCB0byBlbmFibGUgdGhlIGNvdW50ZXIsIGl0J3MgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGJ5IGhhcmR3YXJlCisgICAgKHRoZSBjb3VudGVyIHN0YXJ0cyBpbiByZXNwb25zZSB0byBhIHN0aW11bHVzIGFuZCBnZW5lcmF0ZSBhIHB1bHNlICovCisKKyAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKE91dHB1dENoYW5uZWwpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgYW5kIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzCisgIChpbiB0aGUgT1BNIE1vZGUgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKQorICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgb3V0cHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgaW5wdXQgYW5kCisgIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBpbnB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIG91dHB1dAorICBpbiBhbGwgY29tYmluYXRpb25zLCB0aGUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZGlzYWJsZWQgdG9nZXRoZXIgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2IFRJTSBFbmNvZGVyIGZ1bmN0aW9ucworICogIEBicmllZiAgICBUSU0gRW5jb2RlciBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIEVuY29kZXIuCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBFbmNvZGVyLgorICAgICgrKSBTdGFydCB0aGUgVElNIEVuY29kZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBFbmNvZGVyLgorICAgICgrKSBTdGFydCB0aGUgVElNIEVuY29kZXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0b3AgdGhlIFRJTSBFbmNvZGVyIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBFbmNvZGVyIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICgrKSBTdG9wIHRoZSBUSU0gRW5jb2RlciBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9FbmNvZGVyX0RlSW5pdCgpIGJlZm9yZSBIQUxfVElNX0VuY29kZXJfSW5pdCgpCisgICogQG5vdGUgICBFbmNvZGVyIG1vZGUgYW5kIEV4dGVybmFsIGNsb2NrIG1vZGUgMiBhcmUgbm90IGNvbXBhdGlibGUgYW5kIG11c3Qgbm90IGJlIHNlbGVjdGVkIHRvZ2V0aGVyCisgICogICAgICAgICBFeDogQSBjYWxsIGZvciBAcmVmIEhBTF9USU1fRW5jb2Rlcl9Jbml0IHdpbGwgZXJhc2UgdGhlIHNldHRpbmdzIG9mIEByZWYgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZQorICAqICAgICAgICAgdXNpbmcgVElNX0NMT0NLU09VUkNFX0VUUk1PREUyIGFuZCB2aWNlIHZlcnNhCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIEVuY29kZXIgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgIFRJTV9FbmNvZGVyX0luaXRUeXBlRGVmICpzQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBzbWNyOworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUl9NT0RFKHNDb25maWctPkVuY29kZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfU0VMRUNUSU9OKHNDb25maWctPklDMVNlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihzQ29uZmlnLT5JQzJTZWxlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShzQ29uZmlnLT5JQzFQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKHNDb25maWctPklDMlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKHNDb25maWctPklDMVByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihzQ29uZmlnLT5JQzJQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19GSUxURVIoc0NvbmZpZy0+SUMxRmlsdGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKHNDb25maWctPklDMkZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BFUklPRChodGltLT5Jbml0LlBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BSRVNDQUxFUihodGltLT5Jbml0LlByZXNjYWxlcikpOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmIChodGltLT5FbmNvZGVyX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9FbmNvZGVyX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNX0VuY29kZXJfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIFJlc2V0IHRoZSBTTVMgYW5kIEVDRSBiaXRzICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH4oVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfRUNFKTsKKworICAvKiBDb25maWd1cmUgdGhlIFRpbWUgYmFzZSBpbiB0aGUgRW5jb2RlciBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjEgPSBodGltLT5JbnN0YW5jZS0+Q0NNUjE7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOworCisgIC8qIFNldCB0aGUgZW5jb2RlciBNb2RlICovCisgIHRtcHNtY3IgfD0gc0NvbmZpZy0+RW5jb2Rlck1vZGU7CisKKyAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgMSBhbmQgdGhlIENhcHR1cmUgQ29tcGFyZSAyIGFzIGlucHV0ICovCisgIHRtcGNjbXIxICY9IH4oVElNX0NDTVIxX0NDMVMgfCBUSU1fQ0NNUjFfQ0MyUyk7CisgIHRtcGNjbXIxIHw9IChzQ29uZmlnLT5JQzFTZWxlY3Rpb24gfCAoc0NvbmZpZy0+SUMyU2VsZWN0aW9uIDw8IDhVKSk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgMSBhbmQgdGhlIENhcHR1cmUgQ29tcGFyZSAyIHByZXNjYWxlcnMgYW5kIGZpbHRlcnMgKi8KKyAgdG1wY2NtcjEgJj0gfihUSU1fQ0NNUjFfSUMxUFNDIHwgVElNX0NDTVIxX0lDMlBTQyk7CisgIHRtcGNjbXIxICY9IH4oVElNX0NDTVIxX0lDMUYgfCBUSU1fQ0NNUjFfSUMyRik7CisgIHRtcGNjbXIxIHw9IHNDb25maWctPklDMVByZXNjYWxlciB8IChzQ29uZmlnLT5JQzJQcmVzY2FsZXIgPDwgOFUpOworICB0bXBjY21yMSB8PSAoc0NvbmZpZy0+SUMxRmlsdGVyIDw8IDRVKSB8IChzQ29uZmlnLT5JQzJGaWx0ZXIgPDwgMTJVKTsKKworICAvKiBTZXQgdGhlIFRJMSBhbmQgdGhlIFRJMiBQb2xhcml0aWVzICovCisgIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MyUCk7CisgIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSBzQ29uZmlnLT5JQzFQb2xhcml0eSB8IChzQ29uZmlnLT5JQzJQb2xhcml0eSA8PCA0VSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSA9IHRtcGNjbXIxOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBodGltLT5JbnN0YW5jZS0+Q0NFUiA9IHRtcGNjZXI7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gRW5jb2RlciBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0VuY29kZXJfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIEVuY29kZXIgSW50ZXJmYWNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjaGFubmVscyAqLworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdCA6CisgICAgeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UuCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgorICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQgOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjaGFubmVscyAqLworICAvKiBFbmFibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDEgYW5kL29yIDIgKi8KKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdCA6CisgICAgeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzIDEgYW5kIDIKKyAgICAoaW4gdGhlIEVuY29kZXJJbnRlcmZhY2UgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKSAqLworICBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgIH0KKyAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIH0KKyAgZWxzZQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxIGFuZCAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhMSBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MgZm9yIElDMS4KKyAgKiBAcGFyYW0gIHBEYXRhMiBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MgZm9yIElDMi4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBUSU0gcGVyaXBoZXJhbCB0byBtZW1vcnkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGExLCB1aW50MzJfdCAqcERhdGEyLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0NDX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmICgoKChwRGF0YTEgPT0gTlVMTCkgfHwgKHBEYXRhMiA9PSBOVUxMKSkpICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCAodWludDMyX3QpcERhdGExLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworCisgICAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgKHVpbnQzMl90KXBEYXRhMiwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBJbnB1dCBDYXB0dXJlICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworCisgICAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMX0FMTDoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsICh1aW50MzJfdClwRGF0YTEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsICh1aW50MzJfdClwRGF0YTIsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworCisgICAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfQUxMOiBUSU0gQ2hhbm5lbCAxIGFuZCBUSU0gQ2hhbm5lbCAyIGFyZSBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9DQ19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgorICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovCisgIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAxICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgfQorICBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzIpCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAxIGFuZCAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgVElNIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAqICBAYnJpZWYgICAgVElNIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJUlEgaGFuZGxlciBtYW5hZ2VtZW50ICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIFRpbWVyIElSUSBoYW5kbGVyIGZ1bmN0aW9uLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgVElNIGludGVycnVwdHMgcmVxdWVzdHMuCisgICogQHBhcmFtICBodGltIFRJTSAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9USU1fSVJRSGFuZGxlcihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2FwdHVyZSBjb21wYXJlIDEgZXZlbnQgKi8KKyAgaWYgKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19DQzEpICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9DQzEpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIHsKKyAgICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8xOworCisgICAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8KKyAgICAgICAgaWYgKChodGltLT5JbnN0YW5jZS0+Q0NNUjEgJiBUSU1fQ0NNUjFfQ0MxUykgIT0gMHgwMFUpCisgICAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgICBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBPdXRwdXQgY29tcGFyZSBldmVudCAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogQ2FwdHVyZSBjb21wYXJlIDIgZXZlbnQgKi8KKyAgaWYgKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19DQzIpICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9DQzIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzI7CisgICAgICAvKiBJbnB1dCBjYXB0dXJlIGV2ZW50ICovCisgICAgICBpZiAoKGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmIFRJTV9DQ01SMV9DQzJTKSAhPSAweDAwVSkKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZXZlbnQgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICB9CisgIH0KKyAgLyogQ2FwdHVyZSBjb21wYXJlIDMgZXZlbnQgKi8KKyAgaWYgKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19DQzMpICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9DQzMpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgICAgICAvKiBJbnB1dCBjYXB0dXJlIGV2ZW50ICovCisgICAgICBpZiAoKGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9DQzNTKSAhPSAweDAwVSkKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZXZlbnQgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICB9CisgIH0KKyAgLyogQ2FwdHVyZSBjb21wYXJlIDQgZXZlbnQgKi8KKyAgaWYgKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19DQzQpICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9DQzQpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7CisgICAgICAvKiBJbnB1dCBjYXB0dXJlIGV2ZW50ICovCisgICAgICBpZiAoKGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9DQzRTKSAhPSAweDAwVSkKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZXZlbnQgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICB9CisgIH0KKyAgLyogVElNIFVwZGF0ZSBldmVudCAqLworICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX1VQREFURSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX1VQREFURSkgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9JVF9VUERBVEUpOworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGh0aW0tPlBlcmlvZEVsYXBzZWRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICBIQUxfVElNX1BlcmlvZEVsYXBzZWRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgLyogVElNIFRyaWdnZXIgZGV0ZWN0aW9uIGV2ZW50ICovCisgIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfVFJJR0dFUikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX1RSSUdHRVIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVChodGltLCBUSU1fSVRfVFJJR0dFUik7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHRpbS0+VHJpZ2dlckNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA4IFRJTSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFRJTSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXQorICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgVGhlIElucHV0IE91dHB1dCBjaGFubmVscyBmb3IgT0MsIFBXTSwgSUMgb3IgT25lIFB1bHNlIG1vZGUuCisgICAgICAoKykgQ29uZmlndXJlIEV4dGVybmFsIENsb2NrIHNvdXJjZS4KKyAgICAgICgrKSBDb25maWd1cmUgTWFzdGVyIGFuZCB0aGUgU2xhdmUgc3luY2hyb25pemF0aW9uLgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IE1vZGUuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBDaGFubmVscyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX09DX0luaXRUeXBlRGVmLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBPdXRwdXQgQ29tcGFyZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gY29uZmlndXJlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiAqc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUxTKENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19NT0RFKHNDb25maWctPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKHNDb25maWctPk9DUG9sYXJpdHkpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCAxIGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0MxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgMiBpbiBPdXRwdXQgQ29tcGFyZSAqLworICAgICAgVElNX09DMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDMgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzNfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCA0IGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0M0X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIENoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSUNfSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBodGltIFRJTSBJQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIElucHV0IENhcHR1cmUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gY29uZmlndXJlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fSUNfSW5pdFR5cGVEZWYgKnNDb25maWcsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoc0NvbmZpZy0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihzQ29uZmlnLT5JQ1NlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihzQ29uZmlnLT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQ0ZpbHRlcikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkKKyAgeworICAgIC8qIFRJMSBDb25maWd1cmF0aW9uICovCisgICAgVElNX1RJMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ0ZpbHRlcik7CisKKyAgICAvKiBSZXNldCB0aGUgSUMxUFNDIEJpdHMgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7CisKKyAgICAvKiBTZXQgdGhlIElDMVBTQyB2YWx1ZSAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5JQ1ByZXNjYWxlcjsKKyAgfQorICBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzIpCisgIHsKKyAgICAvKiBUSTIgQ29uZmlndXJhdGlvbiAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICBUSU1fVEkyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDRmlsdGVyKTsKKworICAgIC8qIFJlc2V0IHRoZSBJQzJQU0MgQml0cyAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMlBTQzsKKworICAgIC8qIFNldCB0aGUgSUMyUFNDIHZhbHVlICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IChzQ29uZmlnLT5JQ1ByZXNjYWxlciA8PCA4VSk7CisgIH0KKyAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8zKQorICB7CisgICAgLyogVEkzIENvbmZpZ3VyYXRpb24gKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgVElNX1RJM19TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ0ZpbHRlcik7CisKKyAgICAvKiBSZXNldCB0aGUgSUMzUFNDIEJpdHMgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9JQzNQU0M7CisKKyAgICAvKiBTZXQgdGhlIElDM1BTQyB2YWx1ZSAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBzQ29uZmlnLT5JQ1ByZXNjYWxlcjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBUSTQgQ29uZmlndXJhdGlvbiAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M0X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICBUSU1fVEk0X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDRmlsdGVyKTsKKworICAgIC8qIFJlc2V0IHRoZSBJQzRQU0MgQml0cyAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX0lDNFBTQzsKKworICAgIC8qIFNldCB0aGUgSUM0UFNDIHZhbHVlICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IChzQ29uZmlnLT5JQ1ByZXNjYWxlciA8PCA4VSk7CisgIH0KKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBQV00gIGNoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fT0NfSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBQV00gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT0NfSW5pdFR5cGVEZWYgKnNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTFMoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BXTV9NT0RFKHNDb25maWctPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKHNDb25maWctPk9DUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9GQVNUX1NUQVRFKHNDb25maWctPk9DRmFzdE1vZGUpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDEgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKworICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWwxICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMVBFOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMUZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IHNDb25maWctPk9DRmFzdE1vZGU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCAyIGluIFBXTSBtb2RlICovCisgICAgICBUSU1fT0MyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisKKyAgICAgIC8qIFNldCB0aGUgUHJlbG9hZCBlbmFibGUgYml0IGZvciBjaGFubmVsMiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzJQRTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBPdXRwdXQgRmFzdCBtb2RlICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9PQzJGRTsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlIDw8IDhVOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMyBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DM19TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDMgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0MzUEU7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0MzRkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDQgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzRfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKworICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWw0ICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DNFBFOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DNEZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IHNDb25maWctPk9DRmFzdE1vZGUgPDwgOFU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPbmUgUHVsc2UgQ2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PbmVQdWxzZV9Jbml0VHlwZURlZi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIE9uZSBQdWxzZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gb3V0cHV0IGNoYW5uZWwgdG8gY29uZmlndXJlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHBhcmFtICBJbnB1dENoYW5uZWwgVElNIGlucHV0IENoYW5uZWwgdG8gY29uZmlndXJlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sICBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYgKnNDb25maWcsIHVpbnQzMl90IE91dHB1dENoYW5uZWwsICB1aW50MzJfdCBJbnB1dENoYW5uZWwpCit7CisgIFRJTV9PQ19Jbml0VHlwZURlZiB0ZW1wMTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX09QTV9DSEFOTkVMUyhPdXRwdXRDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fT1BNX0NIQU5ORUxTKElucHV0Q2hhbm5lbCkpOworCisgIGlmIChPdXRwdXRDaGFubmVsICE9IElucHV0Q2hhbm5lbCkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodGltKTsKKworICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgICAgLyogRXh0cmFjdCB0aGUgT3V0cHV0IGNvbXBhcmUgY29uZmlndXJhdGlvbiBmcm9tIHNDb25maWcgc3RydWN0dXJlICovCisgICAgdGVtcDEuT0NNb2RlID0gc0NvbmZpZy0+T0NNb2RlOworICAgIHRlbXAxLlB1bHNlID0gc0NvbmZpZy0+UHVsc2U7CisgICAgdGVtcDEuT0NQb2xhcml0eSA9IHNDb25maWctPk9DUG9sYXJpdHk7CisKKyAgICBzd2l0Y2ggKE91dHB1dENoYW5uZWwpCisgICAgeworICAgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAgIFRJTV9PQzFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmdGVtcDEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICAgIHsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgICBUSU1fT0MyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJnRlbXAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKElucHV0Q2hhbm5lbCkKKyAgICB7CisgICAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgICB7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgICAgVElNX1RJMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWctPklDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDU2VsZWN0aW9uLCBzQ29uZmlnLT5JQ0ZpbHRlcik7CisKKyAgICAgICAgLyogUmVzZXQgdGhlIElDMVBTQyBCaXRzICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMVBTQzsKKworICAgICAgICAvKiBTZWxlY3QgdGhlIFRyaWdnZXIgc291cmNlICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsKKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1RTX1RJMUZQMTsKKworICAgICAgICAvKiBTZWxlY3QgdGhlIFNsYXZlIE1vZGUgKi8KKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1NNUzsKKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1NMQVZFTU9ERV9UUklHR0VSOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICAgIHsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgICBUSU1fVEkyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZy0+SUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sIHNDb25maWctPklDRmlsdGVyKTsKKworICAgICAgICAvKiBSZXNldCB0aGUgSUMyUFNDIEJpdHMgKi8KKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMyUFNDOworCisgICAgICAgIC8qIFNlbGVjdCB0aGUgVHJpZ2dlciBzb3VyY2UgKi8KKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fVFNfVEkyRlAyOworCisgICAgICAgIC8qIFNlbGVjdCB0aGUgU2xhdmUgTW9kZSAqLworICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfU01TOworICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fU0xBVkVNT0RFX1RSSUdHRVI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQSBCdXJzdCB0byB0cmFuc2ZlciBEYXRhIGZyb20gdGhlIG1lbW9yeSB0byB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQnVyc3RCYXNlQWRkcmVzcyBUSU0gQmFzZSBhZGRyZXNzIGZyb20gd2hlcmUgdGhlIERNQSAgd2lsbCBzdGFydCB0aGUgRGF0YSB3cml0ZQorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IxCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NSMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TTUNSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0RJRVIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfU1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRUdSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIxCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDRVIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ05UCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1BTQworICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BUlIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9EQ1IKKyAgKiBAcGFyYW0gIEJ1cnN0UmVxdWVzdFNyYyBUSU0gRE1BIFJlcXVlc3Qgc291cmNlcworICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9VUERBVEU6IFRJTSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9UUklHR0VSOiBUSU0gVHJpZ2dlciBETUEgc291cmNlCisgICogQHBhcmFtICBCdXJzdEJ1ZmZlciBUaGUgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBCdXJzdExlbmd0aCBETUEgQnVyc3QgbGVuZ3RoLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlCisgICogICAgICAgICBiZXR3ZWVuOiBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSIGFuZCBUSU1fRE1BQlVSU1RMRU5HVEhfMThUUkFOU0ZFUlMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1dyaXRlU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFCVVJTVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9CQVNFKEJ1cnN0QmFzZUFkZHJlc3MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9MRU5HVEgoQnVyc3RMZW5ndGgpKTsKKworICBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYgKChCdXJzdEJ1ZmZlciA9PSBOVUxMKSAmJiAoQnVyc3RMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKyAgc3dpdGNoIChCdXJzdFJlcXVlc3RTcmMpCisgIHsKKyAgICBjYXNlIFRJTV9ETUFfVVBEQVRFOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MxOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0M0OgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9UUklHR0VSOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIHRyaWdnZXIgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BVHJpZ2dlckNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQVRyaWdnZXJIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogY29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZSAqLworICBodGltLT5JbnN0YW5jZS0+RENSID0gKEJ1cnN0QmFzZUFkZHJlc3MgfCBCdXJzdExlbmd0aCk7CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gRE1BIFJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRE1BIEJ1cnN0IG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQnVyc3RSZXF1ZXN0U3JjIFRJTSBETUEgUmVxdWVzdCBzb3VyY2VzIHRvIGRpc2FibGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOworCisgIC8qIEFib3J0IHRoZSBETUEgdHJhbnNmZXIgKGF0IGxlYXN0IGRpc2FibGUgdGhlIERNQSBjaGFubmVsKSAqLworICBzd2l0Y2ggKEJ1cnN0UmVxdWVzdFNyYykKKyAgeworICAgIGNhc2UgVElNX0RNQV9VUERBVEU6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMToKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MyOgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzM6CisgICAgeworICAgICAgc3RhdHVzID0gIEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzQ6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChIQUxfT0sgPT0gc3RhdHVzKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBCdXJzdFJlcXVlc3RTcmMpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IHRvIHRyYW5zZmVyIERhdGEgZnJvbSB0aGUgVElNIHBlcmlwaGVyYWwgdG8gdGhlIG1lbW9yeQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBCdXJzdEJhc2VBZGRyZXNzIFRJTSBCYXNlIGFkZHJlc3MgZnJvbSB3aGVyZSB0aGUgRE1BICB3aWxsIHN0YXJ0IHRoZSBEYXRhIHJlYWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NSMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfU01DUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9ESUVSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0VHUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ0VSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NOVAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9QU0MKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQVJSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IzCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRENSCisgICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVElNIFRyaWdnZXIgRE1BIHNvdXJjZQorICAqIEBwYXJhbSAgQnVyc3RCdWZmZXIgVGhlIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgQnVyc3RMZW5ndGggRE1BIEJ1cnN0IGxlbmd0aC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZQorICAqICAgICAgICAgYmV0d2VlbjogVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUiBhbmQgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFCVVJTVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9CQVNFKEJ1cnN0QmFzZUFkZHJlc3MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9MRU5HVEgoQnVyc3RMZW5ndGgpKTsKKworICBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYgKChCdXJzdEJ1ZmZlciA9PSBOVUxMKSAmJiAoQnVyc3RMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKyAgc3dpdGNoIChCdXJzdFJlcXVlc3RTcmMpCisgIHsKKyAgICBjYXNlIFRJTV9ETUFfVVBEQVRFOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MxOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZS9jb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MzOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzQ6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgdHJpZ2dlciBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFUcmlnZ2VyQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BVHJpZ2dlckhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIGNvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IE1vZGUgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkRDUiA9IChCdXJzdEJhc2VBZGRyZXNzIHwgQnVyc3RMZW5ndGgpOworCisgIC8qIEVuYWJsZSB0aGUgVElNIERNQSBSZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIEJ1cnN0UmVxdWVzdFNyYyk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBETUEgYnVyc3QgcmVhZGluZworICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMgdG8gZGlzYWJsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9TT1VSQ0UoQnVyc3RSZXF1ZXN0U3JjKSk7CisKKyAgLyogQWJvcnQgdGhlIERNQSB0cmFuc2ZlciAoYXQgbGVhc3QgZGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwpICovCisgIHN3aXRjaCAoQnVyc3RSZXF1ZXN0U3JjKQorICB7CisgICAgY2FzZSBUSU1fRE1BX1VQREFURToKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MxOgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzI6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMzoKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0M0OgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9UUklHR0VSOgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoSEFMX09LID09IHN0YXR1cykKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFRJTSBVcGRhdGUgRE1BIHJlcXVlc3QgKi8KKyAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIGV2ZW50CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEV2ZW50U291cmNlIHNwZWNpZmllcyB0aGUgZXZlbnQgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9VUERBVEU6IFRpbWVyIHVwZGF0ZSBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0NDMTogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDEgRXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9DQzI6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAyIEV2ZW50IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0MzOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMyBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0NDNDogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDQgRXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9UUklHR0VSOiBUaW1lciBUcmlnZ2VyIEV2ZW50IHNvdXJjZQorICAqIEBub3RlICAgQmFzaWMgdGltZXJzIGNhbiBvbmx5IGdlbmVyYXRlIGFuIHVwZGF0ZSBldmVudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9HZW5lcmF0ZUV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBFdmVudFNvdXJjZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VWRU5UX1NPVVJDRShFdmVudFNvdXJjZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogU2V0IHRoZSBldmVudCBzb3VyY2VzICovCisgIGh0aW0tPkluc3RhbmNlLT5FR1IgPSBFdmVudFNvdXJjZTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBPQ1JlZiBjbGVhciBmZWF0dXJlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDbGVhcklucHV0Q29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fQ2xlYXJJbnB1dENvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGFuZCBwYXJhbWV0ZXJzIGZvciB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ09DcmVmQ2xlYXIoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmICpzQ2xlYXJJbnB1dENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfU09VUkNFKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICBzd2l0Y2ggKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKQorICB7CisgICAgY2FzZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FOgorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBPQ1JFRiBjbGVhciBzZWxlY3Rpb24gYml0IGFuZCB0aGUgdGhlIEVUUiBCaXRzICovCisgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPlNNQ1IsIChUSU1fU01DUl9FVEYgfCBUSU1fU01DUl9FVFBTIHwgVElNX1NNQ1JfRUNFIHwgVElNX1NNQ1JfRVRQKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0VUUjoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTEVBUklOUFVUX1BPTEFSSVRZKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xFQVJJTlBVVF9QUkVTQ0FMRVIoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xFQVJJTlBVVF9GSUxURVIoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRGaWx0ZXIpKTsKKworICAgICAgLyogV2hlbiBPQ1JlZiBjbGVhciBmZWF0dXJlIGlzIHVzZWQgd2l0aCBFVFIgc291cmNlLCBFVFIgcHJlc2NhbGVyIG11c3QgYmUgb2ZmICovCisgICAgICBpZiAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQcmVzY2FsZXIgIT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMSkKKyAgICAgIHsKKyAgICAgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgICAgICAgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dEZpbHRlcik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgaWYgKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gKHVpbnQzMl90KURJU0FCTEUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCAxICovCisgICAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MxQ0UpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDEgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMSwgVElNX0NDTVIxX09DMUNFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgaWYgKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gKHVpbnQzMl90KURJU0FCTEUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCAyICovCisgICAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MyQ0UpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDIgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMSwgVElNX0NDTVIxX09DMkNFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgaWYgKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gKHVpbnQzMl90KURJU0FCTEUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCAzICovCisgICAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIyLCBUSU1fQ0NNUjJfT0MzQ0UpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDMgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMiwgVElNX0NDTVIyX09DM0NFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgaWYgKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gKHVpbnQzMl90KURJU0FCTEUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCA0ICovCisgICAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIyLCBUSU1fQ0NNUjJfT0M0Q0UpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDQgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMiwgVElNX0NDTVIyX09DNENFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgIENvbmZpZ3VyZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBiZSB1c2VkCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDbG9ja1NvdXJjZUNvbmZpZyBwb2ludGVyIHRvIGEgVElNX0Nsb2NrQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNsb2NrIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0Nsb2NrQ29uZmlnVHlwZURlZiAqc0Nsb2NrU291cmNlQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrU291cmNlKSk7CisKKyAgLyogUmVzZXQgdGhlIFNNUywgVFMsIEVDRSwgRVRQUyBhbmQgRVRSRiBiaXRzICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKyAgdG1wc21jciAmPSB+KFRJTV9TTUNSX1NNUyB8IFRJTV9TTUNSX1RTKTsKKyAgdG1wc21jciAmPSB+KFRJTV9TTUNSX0VURiB8IFRJTV9TTUNSX0VUUFMgfCBUSU1fU01DUl9FQ0UgfCBUSU1fU01DUl9FVFApOworICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7CisKKyAgc3dpdGNoIChzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrU291cmNlKQorICB7CisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUw6CisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTE6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQgbW9kZSAxIChFVFJGKSovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENoZWNrIEVUUiBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUFJFU0NBTEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQT0xBUklUWShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIEVUUiBDbG9jayBzb3VyY2UgKi8KKyAgICAgIFRJTV9FVFJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpOworCisgICAgICAvKiBTZWxlY3QgdGhlIEV4dGVybmFsIGNsb2NrIG1vZGUxIGFuZCB0aGUgRVRSRiB0cmlnZ2VyICovCisgICAgICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1I7CisgICAgICB0bXBzbWNyIHw9IChUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSB8IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSk7CisgICAgICAvKiBXcml0ZSB0byBUSU14IFNNQ1IgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0VUUk1PREUyOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCB0cmlnZ2VyIGlucHV0IG1vZGUgMiAoRVRSRikqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDaGVjayBFVFIgaW5wdXQgY29uZGl0aW9uaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BSRVNDQUxFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBFVFIgQ2xvY2sgc291cmNlICovCisgICAgICBUSU1fRVRSX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIC8qIEVuYWJsZSB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTIgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9TTUNSX0VDRTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX1RJMToKKyAgICB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZSAxICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFX1RJWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDaGVjayBUSTEgaW5wdXQgY29uZGl0aW9uaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7CisKKyAgICAgIFRJTV9USTFfQ29uZmlnSW5wdXRTdGFnZShodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcik7CisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIFRJTV9DTE9DS1NPVVJDRV9USTEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDEgKEVUUkYpKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENoZWNrIFRJMiBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsKKworICAgICAgVElNX1RJMl9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgVElNX0NMT0NLU09VUkNFX1RJMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9USTFFRDoKKyAgICB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZSAxICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFX1RJWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDaGVjayBUSTEgaW5wdXQgY29uZGl0aW9uaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7CisKKyAgICAgIFRJTV9USTFfQ29uZmlnSW5wdXRTdGFnZShodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcik7CisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIFRJTV9DTE9DS1NPVVJDRV9USTFFRCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFIwOgorICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjE6CisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMjoKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFIzOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBpbnRlcm5hbCB0cmlnZ2VyIGlucHV0ICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFX0lUUlhfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgVElNX0lUUnhfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrU291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0cyB0aGUgc2lnbmFsIGNvbm5lY3RlZCB0byB0aGUgVEkxIGlucHV0OiBkaXJlY3QgZnJvbSBDSDFfaW5wdXQKKyAgKiAgICAgICAgIG9yIGEgWE9SIGNvbWJpbmF0aW9uIGJldHdlZW4gQ0gxX2lucHV0LCBDSDJfaW5wdXQgJiBDSDNfaW5wdXQKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIFRJMV9TZWxlY3Rpb24gSW5kaWNhdGUgd2hldGhlciBvciBub3QgY2hhbm5lbCAxIGlzIGNvbm5lY3RlZCB0byB0aGUKKyAgKiAgICAgICAgIG91dHB1dCBvZiBhIFhPUiBnYXRlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USTFTRUxFQ1RJT05fQ0gxOiBUaGUgVElNeF9DSDEgcGluIGlzIGNvbm5lY3RlZCB0byBUSTEgaW5wdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJMVNFTEVDVElPTl9YT1JDT01CSU5BVElPTjogVGhlIFRJTXhfQ0gxLCBDSDIgYW5kIENIMworICAqICAgICAgICAgICAgcGlucyBhcmUgY29ubmVjdGVkIHRvIHRoZSBUSTEgaW5wdXQgKFhPUiBjb21iaW5hdGlvbikKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnVEkxSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IFRJMV9TZWxlY3Rpb24pCit7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX1hPUl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1RJMVNFTEVDVElPTihUSTFfU2VsZWN0aW9uKSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBodGltLT5JbnN0YW5jZS0+Q1IyOworCisgIC8qIFJlc2V0IHRoZSBUSTEgc2VsZWN0aW9uICovCisgIHRtcGNyMiAmPSB+VElNX0NSMl9USTFTOworCisgIC8qIFNldCB0aGUgVEkxIHNlbGVjdGlvbiAqLworICB0bXBjcjIgfD0gVEkxX1NlbGVjdGlvbjsKKworICAvKiBXcml0ZSB0byBUSU14Q1IyICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgPSB0bXBjcjI7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0gaW4gU2xhdmUgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgc1NsYXZlQ29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fU2xhdmVDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgc2VsZWN0ZWQgdHJpZ2dlciAoaW50ZXJuYWwgdHJpZ2dlciBpbnB1dCwgZmlsdGVyZWQKKyAgKiAgICAgICAgIHRpbWVyIGlucHV0IG9yIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQpIGFuZCB0aGUgU2xhdmUgbW9kZQorICAqICAgICAgICAgKERpc2FibGUsIFJlc2V0LCBHYXRlZCwgVHJpZ2dlciwgRXh0ZXJuYWwgY2xvY2sgbW9kZSAxKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9NT0RFKHNTbGF2ZUNvbmZpZy0+U2xhdmVNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUl9TRUxFQ1RJT04oc1NsYXZlQ29uZmlnLT5JbnB1dFRyaWdnZXIpKTsKKworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIGlmKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykKKyAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogRGlzYWJsZSBUcmlnZ2VyIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfVFJJR0dFUik7CisKKyAgLyogRGlzYWJsZSBUcmlnZ2VyIERNQSByZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX1RSSUdHRVIpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0gaW4gU2xhdmUgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgc1NsYXZlQ29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fU2xhdmVDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgc2VsZWN0ZWQgdHJpZ2dlciAoaW50ZXJuYWwgdHJpZ2dlciBpbnB1dCwgZmlsdGVyZWQKKyAgKiAgICAgICAgIHRpbWVyIGlucHV0IG9yIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQpIGFuZCB0aGUgU2xhdmUgbW9kZQorICAqICAgICAgICAgKERpc2FibGUsIFJlc2V0LCBHYXRlZCwgVHJpZ2dlciwgRXh0ZXJuYWwgY2xvY2sgbW9kZSAxKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9NT0RFKHNTbGF2ZUNvbmZpZy0+U2xhdmVNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUl9TRUxFQ1RJT04oc1NsYXZlQ29uZmlnLT5JbnB1dFRyaWdnZXIpKTsKKworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIGlmKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykKKyAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogRW5hYmxlIFRyaWdnZXIgSW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX1RSSUdHRVIpOworCisgIC8qIERpc2FibGUgVHJpZ2dlciBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9UUklHR0VSKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCB0aGUgY2FwdHVyZWQgdmFsdWUgZnJvbSBDYXB0dXJlIENvbXBhcmUgdW5pdAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIENhcHR1cmVkIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfVElNX1JlYWRDYXB0dXJlZFZhbHVlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXByZWcgPSAwVTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSAxIHZhbHVlICovCisgICAgICB0bXByZWcgPSAgaHRpbS0+SW5zdGFuY2UtPkNDUjE7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSAyIHZhbHVlICovCisgICAgICB0bXByZWcgPSAgIGh0aW0tPkluc3RhbmNlLT5DQ1IyOworCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSAzIHZhbHVlICovCisgICAgICB0bXByZWcgPSAgIGh0aW0tPkluc3RhbmNlLT5DQ1IzOworCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M0X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSA0IHZhbHVlICovCisgICAgICB0bXByZWcgPSAgIGh0aW0tPkluc3RhbmNlLT5DQ1I0OworCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdG1wcmVnOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA5IFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXQorICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIFRJTSBjYWxsYmFjayBmdW5jdGlvbnM6CisgICAoKykgVElNIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrCisgICAoKykgVElNIE91dHB1dCBDb21wYXJlIGNhbGxiYWNrCisgICAoKykgVElNIElucHV0IGNhcHR1cmUgY2FsbGJhY2sKKyAgICgrKSBUSU0gVHJpZ2dlciBjYWxsYmFjaworICAgKCspIFRJTSBFcnJvciBjYWxsYmFjaworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBQZXJpb2QgZWxhcHNlZCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgT3V0cHV0IENvbXBhcmUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9DIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJbnB1dCBDYXB0dXJlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBJQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIElDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBQV00gUHVsc2UgZmluaXNoZWQgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUFdNIFB1bHNlIGZpbmlzaGVkIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbGwgVHJpZ2dlciBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX1RyaWdnZXJDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbGwgVHJpZ2dlciBkZXRlY3Rpb24gaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX1RyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFRpbWVyIGVycm9yIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fRXJyb3JDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgVElNIGNhbGxiYWNrIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtIGh0aW0gdGltIGhhbmRsZQorICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEIEJhc2UgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEIEJhc2UgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQSU5JVF9DQl9JRCBJQyBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEIElDIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQgT0MgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCBPQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRCBQV00gTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQgUFdNIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEIE9uZSBQdWxzZSBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRCBPbmUgUHVsc2UgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRU5DT0RFUl9NU1BJTklUX0NCX0lEIEVuY29kZXIgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEIEVuY29kZXIgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfQ0JfSUQgUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9IQUxGX0NCX0lEIFBlcmlvZCBFbGFwc2VkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9UUklHR0VSX0NCX0lEIFRyaWdnZXIgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9UUklHR0VSX0hBTEZfQ0JfSUQgVHJpZ2dlciBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCBJbnB1dCBDYXB0dXJlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX0RFTEFZX0VMQVBTRURfQ0JfSUQgT3V0cHV0IENvbXBhcmUgRGVsYXkgRWxhcHNlZCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9DQl9JRCBQV00gUHVsc2UgRmluaXNoZWQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRCBQV00gUHVsc2UgRmluaXNoZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VSUk9SX0NCX0lEIEVycm9yIENhbGxiYWNrIElECisgICogICAgICAgICAgQHBhcmFtIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICAqICAgICAgICAgIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT0NfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBlcmlvZEVsYXBzZWRDYWxsYmFjayAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1RSSUdHRVJfQ0JfSUQgOgorICAgICAgICBodGltLT5UcmlnZ2VyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+VHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX0NBUFRVUkVfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19DYXB0dXJlQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09DX0RFTEFZX0VMQVBTRURfQ0JfSUQgOgorICAgICAgICBodGltLT5PQ19EZWxheUVsYXBzZWRDYWxsYmFjayAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPklDX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT0NfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT0NfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5FbmNvZGVyX01zcERlSW5pdENhbGxiYWNrICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBUSU0gY2FsbGJhY2sKKyAgKiAgICAgICAgIFRJTSBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gaHRpbSB0aW0gaGFuZGxlCisgICogQHBhcmFtIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JBU0VfTVNQSU5JVF9DQl9JRCBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCBCYXNlIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgSUMgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRCBJQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIE9DIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgT0MgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgUFdNIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIFBXTSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCBPbmUgUHVsc2UgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgT25lIFB1bHNlIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCBFbmNvZGVyIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCBFbmNvZGVyIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0NCX0lEIFBlcmlvZCBFbGFwc2VkIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfSEFMRl9DQl9JRCBQZXJpb2QgRWxhcHNlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fVFJJR0dFUl9DQl9JRCBUcmlnZ2VyIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX0NBUFRVUkVfQ0JfSUQgSW5wdXQgQ2FwdHVyZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX0NBUFRVUkVfSEFMRl9DQl9JRCBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19ERUxBWV9FTEFQU0VEX0NCX0lEIE91dHB1dCBDb21wYXJlIERlbGF5IEVsYXBzZWQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfQ0JfSUQgUFdNIFB1bHNlIEZpbmlzaGVkIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0hBTEZfQ0JfSUQgUFdNIFB1bHNlIEZpbmlzaGVkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgSEFMX1RJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgID0gSEFMX1RJTV9CYXNlX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEJhc2UgTXNwSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgID0gSEFMX1RJTV9CYXNlX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICAgPSBIQUxfVElNX0lDX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgPSBIQUxfVElNX0lDX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICAgPSBIQUxfVElNX09DX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgT0MgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgPSBIQUxfVElNX09DX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgT0MgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgID0gSEFMX1RJTV9QV01fTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBXTSBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgPSBIQUxfVElNX1BXTV9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUFdNIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayAgICAgICAgICA9IEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBPbmUgUHVsc2UgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgID0gSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9uZSBQdWxzZSBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgID0gSEFMX1RJTV9FbmNvZGVyX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVuY29kZXIgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFbmNvZGVyIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBlcmlvZEVsYXBzZWRDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBQZXJpb2QgRWxhcHNlZCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayAgICAgPSBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1RSSUdHRVJfQ0JfSUQgOgorICAgICAgICBodGltLT5UcmlnZ2VyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgPSBIQUxfVElNX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHJpZ2dlciBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1RSSUdHRVJfSEFMRl9DQl9JRCA6CisgICAgICAgIGh0aW0tPlRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA9IEhBTF9USU1fVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19DQVBUVVJFX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrICAgICAgICAgICAgICAgID0gSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2s7ICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIENhcHR1cmUgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19DQVBUVVJFX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgQ2FwdHVyZSBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrICAgICAgICAgICA9IEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBPQyBEZWxheSBFbGFwc2VkIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayAgICAgICAgID0gSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBXTSBQdWxzZSBGaW5pc2hlZCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFBXTSBQdWxzZSBGaW5pc2hlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fRVJST1JfQ0JfSUQgOgorICAgICAgICBodGltLT5FcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgPSBIQUxfVElNX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayAgICAgICAgID0gSEFMX1RJTV9CYXNlX01zcEluaXQ7ICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgPSBIQUxfVElNX0Jhc2VfTXNwRGVJbml0OyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgID0gSEFMX1RJTV9JQ19Nc3BJbml0OyAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBJQyBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPklDX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgPSBIQUxfVElNX0lDX01zcERlSW5pdDsgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA9IEhBTF9USU1fT0NfTXNwSW5pdDsgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgT0MgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gSEFMX1RJTV9PQ19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBPQyBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrICAgICAgICAgID0gSEFMX1RJTV9QV01fTXNwSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICA9IEhBTF9USU1fUFdNX01zcERlSW5pdDsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUFdNIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayAgICAgPSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQ7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9uZSBQdWxzZSBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayAgID0gSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQ7ICAgICAgICAvKiBMZWdhY3kgd2VhayBPbmUgUHVsc2UgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrICAgICAgPSBIQUxfVElNX0VuY29kZXJfTXNwSW5pdDsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVuY29kZXIgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgICAgPSBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0OyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVuY29kZXIgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxMCBUSU0gUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBUSU0gUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBCYXNlIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fQmFzZV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIE9DIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09DX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gUFdNIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX1BXTV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIElucHV0IENhcHR1cmUgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSUMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fSUNfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBPbmUgUHVsc2UgTW9kZSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBodGltIFRJTSBPUE0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBFbmNvZGVyIE1vZGUgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX0Z1bmN0aW9ucyBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgZXJyb3IgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5FcnJvckNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9FcnJvckNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgRGVsYXkgUHVsc2UgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX0RNQURlbGF5UHVsc2VDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9IChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzI7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIERlbGF5IFB1bHNlIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPSAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8xOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF80OworICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgQ2FwdHVyZSBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRE1BQ2FwdHVyZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMzsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIENhcHR1cmUgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9IChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzI7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPklDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgUGVyaW9kIEVsYXBzZSBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0RNQVBlcmlvZEVsYXBzZWRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9IChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBQZXJpb2QgRWxhcHNlIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9ETUFQZXJpb2RFbGFwc2VkSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBUcmlnZ2VyIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fRE1BVHJpZ2dlckNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5UcmlnZ2VyQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX1RyaWdnZXJDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0RNQVRyaWdnZXJIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPSAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUaW1lIEJhc2UgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgVElNeCBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgU3RydWN0dXJlIFRJTSBCYXNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9CYXNlX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX0Jhc2VfSW5pdFR5cGVEZWYgKlN0cnVjdHVyZSkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworICB0bXBjcjEgPSBUSU14LT5DUjE7CisKKyAgLyogU2V0IFRJTSBUaW1lIEJhc2UgVW5pdCBwYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmIChJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFNlbGVjdCB0aGUgQ291bnRlciBNb2RlICovCisgICAgdG1wY3IxICY9IH4oVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUyk7CisgICAgdG1wY3IxIHw9IFN0cnVjdHVyZS0+Q291bnRlck1vZGU7CisgIH0KKworICBpZiAoSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgLyogU2V0IHRoZSBjbG9jayBkaXZpc2lvbiAqLworICAgIHRtcGNyMSAmPSB+VElNX0NSMV9DS0Q7CisgICAgdG1wY3IxIHw9ICh1aW50MzJfdClTdHJ1Y3R1cmUtPkNsb2NrRGl2aXNpb247CisgIH0KKworICAvKiBTZXQgdGhlIGF1dG8tcmVsb2FkIHByZWxvYWQgKi8KKyAgTU9ESUZZX1JFRyh0bXBjcjEsIFRJTV9DUjFfQVJQRSwgU3RydWN0dXJlLT5BdXRvUmVsb2FkUHJlbG9hZCk7CisKKyAgVElNeC0+Q1IxID0gdG1wY3IxOworCisgIC8qIFNldCB0aGUgQXV0b3JlbG9hZCB2YWx1ZSAqLworICBUSU14LT5BUlIgPSAodWludDMyX3QpU3RydWN0dXJlLT5QZXJpb2QgOworCisgIC8qIFNldCB0aGUgUHJlc2NhbGVyIHZhbHVlICovCisgIFRJTXgtPlBTQyA9IFN0cnVjdHVyZS0+UHJlc2NhbGVyOworCisgIC8qIEdlbmVyYXRlIGFuIHVwZGF0ZSBldmVudCB0byByZWxvYWQgdGhlIFByZXNjYWxlcgorICAgICBhbmQgdGhlIHJlcGV0aXRpb24gY291bnRlciAob25seSBmb3IgYWR2YW5jZWQgdGltZXIpIHZhbHVlIGltbWVkaWF0ZWx5ICovCisgIFRJTXgtPkVHUiA9IFRJTV9FR1JfVUc7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgMSBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzFfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wY2Ntcng7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzFFOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9ICBUSU14LT5DUjI7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjE7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgQml0cyAqLworICB0bXBjY21yeCAmPSB+VElNX0NDTVIxX09DMU07CisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjFfQ0MxUzsKKyAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovCisgIHRtcGNjbXJ4IHw9IE9DX0NvbmZpZy0+T0NNb2RlOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MxUDsKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICB0bXBjY2VyIHw9IE9DX0NvbmZpZy0+T0NQb2xhcml0eTsKKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXJ4OworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjEgPSBPQ19Db25maWctPlB1bHNlOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSAyIGNvbmZpZ3VyYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX09DMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeDsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIFRJTXgtPkNSMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjFfT0MyTTsKKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMV9DQzJTOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSAoT0NfQ29uZmlnLT5PQ01vZGUgPDwgOFUpOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MyUDsKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgNFUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIFRJTXgtPkNSMiA9IHRtcGNyMjsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2Ntcng7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgVElNeC0+Q0NSMiA9IE9DX0NvbmZpZy0+UHVsc2U7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRpbWVyIE91dHB1dCBDb21wYXJlIDMgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91cHV0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fT0MzX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpCit7CisgIHVpbnQzMl90IHRtcGNjbXJ4OworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAzOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MzRTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSAgVElNeC0+Q1IyOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yeCA9IFRJTXgtPkNDTVIyOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBtb2RlIGFuZCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8KKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMl9PQzNNOworICB0bXBjY21yeCAmPSB+VElNX0NDTVIyX0NDM1M7CisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSBPQ19Db25maWctPk9DTW9kZTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDM1A7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDhVKTsKKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLworICBUSU14LT5DQ01SMiA9IHRtcGNjbXJ4OworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjMgPSBPQ19Db25maWctPlB1bHNlOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSA0IGNvbmZpZ3VyYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX09DNF9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeDsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNDogUmVzZXQgdGhlIENDNEUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDNEU7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIFRJTXgtPkNSMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfT0M0TTsKKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMl9DQzRTOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSAoT0NfQ29uZmlnLT5PQ01vZGUgPDwgOFUpOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0M0UDsKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgMTJVKTsKKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLworICBUSU14LT5DQ01SMiA9IHRtcGNjbXJ4OworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjQgPSBPQ19Db25maWctPlB1bHNlOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBTbGF2ZSBUaW1lciBjb25maWd1cmF0aW9uIGZ1bmN0aW9uCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNTbGF2ZUNvbmZpZyBTbGF2ZSB0aW1lciBjb25maWd1cmF0aW9uCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOworCisgIC8qIFJlc2V0IHRoZSBUcmlnZ2VyIFNlbGVjdGlvbiBCaXRzICovCisgIHRtcHNtY3IgJj0gflRJTV9TTUNSX1RTOworICAvKiBTZXQgdGhlIElucHV0IFRyaWdnZXIgc291cmNlICovCisgIHRtcHNtY3IgfD0gc1NsYXZlQ29uZmlnLT5JbnB1dFRyaWdnZXI7CisKKyAgLyogUmVzZXQgdGhlIHNsYXZlIG1vZGUgQml0cyAqLworICB0bXBzbWNyICY9IH5USU1fU01DUl9TTVM7CisgIC8qIFNldCB0aGUgc2xhdmUgbW9kZSAqLworICB0bXBzbWNyIHw9IHNTbGF2ZUNvbmZpZy0+U2xhdmVNb2RlOworCisgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7CisKKyAgLyogQ29uZmlndXJlIHRoZSB0cmlnZ2VyIHByZXNjYWxlciwgZmlsdGVyLCBhbmQgcG9sYXJpdHkgKi8KKyAgc3dpdGNoIChzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikKKyAgeworICAgIGNhc2UgVElNX1RTX0VUUkY6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBSRVNDQUxFUihzU2xhdmVDb25maWctPlRyaWdnZXJQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBPTEFSSVRZKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIEVUUiBUcmlnZ2VyIHNvdXJjZSAqLworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBzU2xhdmVDb25maWctPlRyaWdnZXJQcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9UU19USTFGX0VEOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSRklMVEVSKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikpOworCisgICAgICBpZihzU2xhdmVDb25maWctPlNsYXZlTW9kZSA9PSBUSU1fU0xBVkVNT0RFX0dBVEVEKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICAgICAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7CisgICAgICB0bXBjY21yMSA9IGh0aW0tPkluc3RhbmNlLT5DQ01SMTsKKworICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgICAgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMxRjsKKyAgICAgIHRtcGNjbXIxIHw9ICgoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSA8PCA0VSk7CisKKyAgICAgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgPSB0bXBjY21yMTsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ0VSID0gdG1wY2NlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX1RTX1RJMUZQMToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBPTEFSSVRZKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBUSTEgRmlsdGVyIGFuZCBQb2xhcml0eSAqLworICAgICAgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9UU19USTJGUDI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJQT0xBUklUWShzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSRklMVEVSKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikpOworCisgICAgICAvKiBDb25maWd1cmUgVEkyIEZpbHRlciBhbmQgUG9sYXJpdHkgKi8KKyAgICAgIFRJTV9USTJfQ29uZmlnSW5wdXRTdGFnZShodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzU2xhdmVDb25maWctPlRyaWdnZXJGaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fVFNfSVRSMDoKKyAgICBjYXNlIFRJTV9UU19JVFIxOgorICAgIGNhc2UgVElNX1RTX0lUUjI6CisgICAgY2FzZSBUSU1fVFNfSVRSMzoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTEgYXMgSW5wdXQuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0RJUkVDVFRJOiBUSU0gSW5wdXQgMSBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMxLgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSTogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMi4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX1RSQzogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQy4KKyAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgICogQHJldHZhbCBOb25lCisgICogQG5vdGUgVElNX0lDRmlsdGVyIGFuZCBUSU1fSUNQb2xhcml0eSBhcmUgbm90IHVzZWQgaW4gSU5ESVJFQ1QgbW9kZSBhcyBUSTJGUDEKKyAgKiAgICAgICAob24gY2hhbm5lbDIgcGF0aCkgaXMgdXNlZCBhcyB0aGUgaW5wdXQgc2lnbmFsLiBUaGVyZWZvcmUgQ0NNUjEgbXVzdCBiZQorICAqICAgICAgICBwcm90ZWN0ZWQgYWdhaW5zdCB1bi1pbml0aWFsaXplZCBmaWx0ZXIgYW5kIHBvbGFyaXR5IHZhbHVlcy4KKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9USTFfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKQoreworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzFFOworICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKworICAvKiBTZWxlY3QgdGhlIElucHV0ICovCisgIGlmIChJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpICE9IFJFU0VUKQorICB7CisgICAgdG1wY2NtcjEgJj0gflRJTV9DQ01SMV9DQzFTOworICAgIHRtcGNjbXIxIHw9IFRJTV9JQ1NlbGVjdGlvbjsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXBjY21yMSB8PSBUSU1fQ0NNUjFfQ0MxU18wOworICB9CisKKyAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgdG1wY2NtcjEgJj0gflRJTV9DQ01SMV9JQzFGOworICB0bXBjY21yMSB8PSAoKFRJTV9JQ0ZpbHRlciA8PCA0VSkgJiBUSU1fQ0NNUjFfSUMxRik7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzFFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKTsKKyAgdG1wY2NlciB8PSAoVElNX0lDUG9sYXJpdHkgJiAoVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSBhbmQgQ0NFUiByZWdpc3RlcnMgKi8KKyAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBQb2xhcml0eSBhbmQgRmlsdGVyIGZvciBUSTEuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzFFOworICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOworCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMxRjsKKyAgdG1wY2NtcjEgfD0gKFRJTV9JQ0ZpbHRlciA8PCA0VSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzFFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKTsKKyAgdG1wY2NlciB8PSBUSU1fSUNQb2xhcml0eTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJMiBhcyBJbnB1dC4KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDIgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMi4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzEuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEByZXR2YWwgTm9uZQorICAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEkxRlAyCisgICogICAgICAgKG9uIGNoYW5uZWwxIHBhdGgpIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNpZ25hbC4gVGhlcmVmb3JlIENDTVIxIG11c3QgYmUKKyAgKiAgICAgICAgcHJvdGVjdGVkIGFnYWluc3QgdW4taW5pdGlhbGl6ZWQgZmlsdGVyIGFuZCBwb2xhcml0eSB2YWx1ZXMuCisgICovCitzdGF0aWMgdm9pZCBUSU1fVEkyX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MyRTsKKyAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsKKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCAqLworICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0NDMlM7CisgIHRtcGNjbXIxIHw9IChUSU1fSUNTZWxlY3Rpb24gPDwgOFUpOworCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMyRjsKKyAgdG1wY2NtcjEgfD0gKChUSU1fSUNGaWx0ZXIgPDwgMTJVKSAmIFRJTV9DQ01SMV9JQzJGKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMkUgQml0ICovCisgIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApOworICB0bXBjY2VyIHw9ICgoVElNX0lDUG9sYXJpdHkgPDwgNFUpICYgKFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2NtcjEgOworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFBvbGFyaXR5IGFuZCBGaWx0ZXIgZm9yIFRJMi4KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9CT1RIRURHRQorICAqIEBwYXJhbSAgVElNX0lDRmlsdGVyIFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9USTJfQ29uZmlnSW5wdXRTdGFnZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MyRTsKKyAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsKKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisKKyAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgdG1wY2NtcjEgJj0gflRJTV9DQ01SMV9JQzJGOworICB0bXBjY21yMSB8PSAoVElNX0lDRmlsdGVyIDw8IDEyVSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSAoVElNX0lDUG9sYXJpdHkgPDwgNFUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2NtcjEgOworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJMyBhcyBJbnB1dC4KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMy4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzQuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEByZXR2YWwgTm9uZQorICAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEkzRlA0CisgICogICAgICAgKG9uIGNoYW5uZWwxIHBhdGgpIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNpZ25hbC4gVGhlcmVmb3JlIENDTVIyIG11c3QgYmUKKyAgKiAgICAgICAgcHJvdGVjdGVkIGFnYWluc3QgdW4taW5pdGlhbGl6ZWQgZmlsdGVyIGFuZCBwb2xhcml0eSB2YWx1ZXMuCisgICovCitzdGF0aWMgdm9pZCBUSU1fVEkzX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wY2NtcjI7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAzOiBSZXNldCB0aGUgQ0MzRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MzRTsKKyAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsKKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCAqLworICB0bXBjY21yMiAmPSB+VElNX0NDTVIyX0NDM1M7CisgIHRtcGNjbXIyIHw9IFRJTV9JQ1NlbGVjdGlvbjsKKworICAvKiBTZXQgdGhlIGZpbHRlciAqLworICB0bXBjY21yMiAmPSB+VElNX0NDTVIyX0lDM0Y7CisgIHRtcGNjbXIyIHw9ICgoVElNX0lDRmlsdGVyIDw8IDRVKSAmIFRJTV9DQ01SMl9JQzNGKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDM0UgQml0ICovCisgIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzNQIHwgVElNX0NDRVJfQ0MzTlApOworICB0bXBjY2VyIHw9ICgoVElNX0lDUG9sYXJpdHkgPDwgOFUpICYgKFRJTV9DQ0VSX0NDM1AgfCBUSU1fQ0NFUl9DQzNOUCkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7CisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEk0IGFzIElucHV0LgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0RJUkVDVFRJOiBUSU0gSW5wdXQgNCBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUM0LgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMy4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX1RSQzogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQy4KKyAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgICogQG5vdGUgVElNX0lDRmlsdGVyIGFuZCBUSU1fSUNQb2xhcml0eSBhcmUgbm90IHVzZWQgaW4gSU5ESVJFQ1QgbW9kZSBhcyBUSTRGUDMKKyAgKiAgICAgICAob24gY2hhbm5lbDEgcGF0aCkgaXMgdXNlZCBhcyB0aGUgaW5wdXQgc2lnbmFsLiBUaGVyZWZvcmUgQ0NNUjIgbXVzdCBiZQorICAqICAgICAgICBwcm90ZWN0ZWQgYWdhaW5zdCB1bi1pbml0aWFsaXplZCBmaWx0ZXIgYW5kIHBvbGFyaXR5IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9USTRfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKQoreworICB1aW50MzJfdCB0bXBjY21yMjsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQzRFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzRFOworICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKworICAvKiBTZWxlY3QgdGhlIElucHV0ICovCisgIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfQ0M0UzsKKyAgdG1wY2NtcjIgfD0gKFRJTV9JQ1NlbGVjdGlvbiA8PCA4VSk7CisKKyAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgdG1wY2NtcjIgJj0gflRJTV9DQ01SMl9JQzRGOworICB0bXBjY21yMiB8PSAoKFRJTV9JQ0ZpbHRlciA8PCAxMlUpICYgVElNX0NDTVIyX0lDNEYpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0M0RSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCk7CisgIHRtcGNjZXIgfD0gKChUSU1fSUNQb2xhcml0eSA8PCAxMlUpICYgKFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7CisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyIDsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3RzIHRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZQorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBJbnB1dFRyaWdnZXJTb3VyY2UgVGhlIElucHV0IFRyaWdnZXIgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIwOiBJbnRlcm5hbCBUcmlnZ2VyIDAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjE6IEludGVybmFsIFRyaWdnZXIgMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMjogSW50ZXJuYWwgVHJpZ2dlciAyCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIzOiBJbnRlcm5hbCBUcmlnZ2VyIDMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX1RJMUZfRUQ6IFRJMSBFZGdlIERldGVjdG9yCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19USTFGUDE6IEZpbHRlcmVkIFRpbWVyIElucHV0IDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX1RJMkZQMjogRmlsdGVyZWQgVGltZXIgSW5wdXQgMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfRVRSRjogRXh0ZXJuYWwgVHJpZ2dlciBpbnB1dAorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0lUUnhfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBJbnB1dFRyaWdnZXJTb3VyY2UpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wc21jciA9IFRJTXgtPlNNQ1I7CisgIC8qIFJlc2V0IHRoZSBUUyBCaXRzICovCisgIHRtcHNtY3IgJj0gflRJTV9TTUNSX1RTOworICAvKiBTZXQgdGhlIElucHV0IFRyaWdnZXIgc291cmNlIGFuZCB0aGUgc2xhdmUgbW9kZSovCisgIHRtcHNtY3IgfD0gKElucHV0VHJpZ2dlclNvdXJjZSB8IFRJTV9TTEFWRU1PREVfRVhURVJOQUwxKTsKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIFRJTXgtPlNNQ1IgPSB0bXBzbWNyOworfQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IEV4dGVybmFsIFRyaWdnZXIgKEVUUikuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIFRJTV9FeHRUUkdQcmVzY2FsZXIgVGhlIGV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9FVFJQUkVTQ0FMRVJfRElWMTogRVRSUCBQcmVzY2FsZXIgT0ZGLgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUFJFU0NBTEVSX0RJVjI6IEVUUlAgZnJlcXVlbmN5IGRpdmlkZWQgYnkgMi4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBSRVNDQUxFUl9ESVY0OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDQuCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVFJQUkVTQ0FMRVJfRElWODogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA4LgorICAqIEBwYXJhbSAgVElNX0V4dFRSR1BvbGFyaXR5IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRDogYWN0aXZlIGxvdyBvciBmYWxsaW5nIGVkZ2UgYWN0aXZlLgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQ6IGFjdGl2ZSBoaWdoIG9yIHJpc2luZyBlZGdlIGFjdGl2ZS4KKyAgKiBAcGFyYW0gIEV4dFRSR0ZpbHRlciBFeHRlcm5hbCBUcmlnZ2VyIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fRVRSX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0V4dFRSR1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9FeHRUUkdQb2xhcml0eSwgdWludDMyX3QgRXh0VFJHRmlsdGVyKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIHRtcHNtY3IgPSBUSU14LT5TTUNSOworCisgIC8qIFJlc2V0IHRoZSBFVFIgQml0cyAqLworICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfRVRGIHwgVElNX1NNQ1JfRVRQUyB8IFRJTV9TTUNSX0VDRSB8IFRJTV9TTUNSX0VUUCk7CisKKyAgLyogU2V0IHRoZSBQcmVzY2FsZXIsIHRoZSBGaWx0ZXIgdmFsdWUgYW5kIHRoZSBQb2xhcml0eSAqLworICB0bXBzbWNyIHw9ICh1aW50MzJfdCkoVElNX0V4dFRSR1ByZXNjYWxlciB8IChUSU1fRXh0VFJHUG9sYXJpdHkgfCAoRXh0VFJHRmlsdGVyIDw8IDhVKSkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICBUSU14LT5TTUNSID0gdG1wc21jcjsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0gQ2FwdHVyZSBDb21wYXJlIENoYW5uZWwgeC4KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgQ2hhbm5lbCBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNAorICAqIEBwYXJhbSAgQ2hhbm5lbFN0YXRlIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwgQ0N4RSBiaXQgbmV3IHN0YXRlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogVElNX0NDeF9FTkFCTEUgb3IgVElNX0NDeF9ESVNBQkxFLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0NDeENoYW5uZWxDbWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENoYW5uZWxTdGF0ZSkKK3sKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DSEFOTkVMUyhDaGFubmVsKSk7CisKKyAgdG1wID0gVElNX0NDRVJfQ0MxRSA8PCAoQ2hhbm5lbCAmIDB4MUZVKTsgLyogMHgxRlUgPSAzMSBiaXRzIG1heCBzaGlmdCAqLworCisgIC8qIFJlc2V0IHRoZSBDQ3hFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH50bXA7CisKKyAgLyogU2V0IG9yIHJlc2V0IHRoZSBDQ3hFIEJpdCAqLworICBUSU14LT5DQ0VSIHw9ICh1aW50MzJfdCkoQ2hhbm5lbFN0YXRlIDw8IChDaGFubmVsICYgMHgxRlUpKTsgLyogMHgxRlUgPSAzMSBiaXRzIG1heCBzaGlmdCAqLworfQorCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIHRoZSBsZWdhY3kgd2VhayBjYWxsYmFja3MuCisgICogQHBhcmFtICBodGltIHBvaW50ZXIgdG8gYSBUSU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBUSU0gbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fUmVzZXRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUmVzZXQgdGhlIFRJTSBjYWxsYmFjayB0byB0aGUgbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgIGh0aW0tPlBlcmlvZEVsYXBzZWRDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBQZXJpb2RFbGFwc2VkQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgaHRpbS0+UGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2sgICAgID0gSEFMX1RJTV9QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIFBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrICAgICAqLworICBodGltLT5UcmlnZ2VyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgPSBIQUxfVElNX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHJpZ2dlckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICovCisgIGh0aW0tPlRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA9IEhBTF9USU1fVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUcmlnZ2VySGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgKi8KKyAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrICAgICAgICAgICAgICAgID0gSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2s7ICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDX0NhcHR1cmVDYWxsYmFjayAgICAgICAgICAgICAgICAqLworICBodGltLT5JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICovCisgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrICAgICAgICAgICA9IEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBPQ19EZWxheUVsYXBzZWRDYWxsYmFjayAgICAgICAgICAgKi8KKyAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayAgICAgICAgID0gSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2sgICAgICAgICAqLworICBodGltLT5QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrICovCisgIGh0aW0tPkVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICA9IEhBTF9USU1fRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgKi8KK30KKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfdGltX2V4LmMgYi9TcmMvc3RtMzJsMHh4X2hhbF90aW1fZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJjMDZiCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfdGltX2V4LmMKQEAgLTAsMCArMSw0MjQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3RpbV9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUSU0gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVGltZXIgRXh0ZW5kZWQgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBUaW1lIE1hc3RlciBhbmQgU2xhdmUgc3luY2hyb25pemF0aW9uIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUaW1lciByZW1hcHBpbmcgY2FwYWJpbGl0aWVzIGNvbmZpZ3VyYXRpb24KKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTUVSIEV4dGVuZGVkIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhlIFRpbWVyIEV4dGVuZGVkIGZlYXR1cmVzIGluY2x1ZGU6CisgICAgKCMpIFN5bmNocm9uaXphdGlvbiBjaXJjdWl0IHRvIGNvbnRyb2wgdGhlIHRpbWVyIHdpdGggZXh0ZXJuYWwgc2lnbmFscyBhbmQgdG8KKyAgICAgICAgaW50ZXJjb25uZWN0IHNldmVyYWwgdGltZXJzIHRvZ2V0aGVyLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4IFRJTUV4CisgICogQGJyaWVmIFRJTSBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfVElNX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnMgVElNIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIE1hc3RlciBzeW5jaHJvbml6YXRpb24uCisgICAgICAoKykgQ29uZmlndXJlIHRpbWVyIHJlbWFwcGluZyBjYXBhYmlsaXRpZXMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNIGluIG1hc3RlciBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgc01hc3RlckNvbmZpZyBwb2ludGVyIHRvIGEgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIG91dHB1dCAoVFJHTykgYW5kIHRoZSBNYXN0ZXIvU2xhdmUKKyAgKiAgICAgICAgIG1vZGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfTWFzdGVyQ29uZmlnU3luY2hyb25pemF0aW9uKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTWFzdGVyQ29uZmlnVHlwZURlZiAqc01hc3RlckNvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wY3IyOworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fU1lOQ0hST19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSR09fU09VUkNFKHNNYXN0ZXJDb25maWctPk1hc3Rlck91dHB1dFRyaWdnZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9NU01fU1RBVEUoc01hc3RlckNvbmZpZy0+TWFzdGVyU2xhdmVNb2RlKSk7CisKKyAgLyogQ2hlY2sgaW5wdXQgc3RhdGUgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIGhhbmRsZXIgc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBodGltLT5JbnN0YW5jZS0+Q1IyOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKworICAvKiBSZXNldCB0aGUgTU1TIEJpdHMgKi8KKyAgdG1wY3IyICY9IH5USU1fQ1IyX01NUzsKKyAgLyogU2VsZWN0IHRoZSBUUkdPIHNvdXJjZSAqLworICB0bXBjcjIgfD0gIHNNYXN0ZXJDb25maWctPk1hc3Rlck91dHB1dFRyaWdnZXI7CisKKyAgLyogUmVzZXQgdGhlIE1TTSBCaXQgKi8KKyAgdG1wc21jciAmPSB+VElNX1NNQ1JfTVNNOworICAvKiBTZXQgbWFzdGVyIG1vZGUgKi8KKyAgdG1wc21jciB8PSBzTWFzdGVyQ29uZmlnLT5NYXN0ZXJTbGF2ZU1vZGU7CisKKyAgLyogVXBkYXRlIFRJTXggQ1IyICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgPSB0bXBjcjI7CisKKyAgLyogVXBkYXRlIFRJTXggU01DUiAqLworICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7CisKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IFJlbWFwcGluZyBpbnB1dCBjYXBhYmlsaXRpZXMuCisgIEBpZiBTVE0zMkwwNzN4eAorICAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNvbm5lY3QgVElNMiBhbmQgVElNMjEgb24gUEI1KEFGNCkgYXQgdGhlIHNhbWUgdGltZS4KKyAgKiAgICAgICAgIFdoZW4gc2VsZWN0aW5nIFRJTTNfVEkyX0dQSU9CNV9BRjQsIENoYW5uZWwyIG9mIFRJTTMgd2lsbCBiZQorICAqICAgICAgICAgY29ubmVjdGVkIHRvIFBCNShBRjQpIGFuZCBDaGFubmVsMiBvZiBUSU0yMSB3aWxsIGJlIGNvbm5lY3RlZCB0bworICAqICAgICAgICAgc29tZSBvdGhlciBHUElPcy4gKHJlZmVyIHRvIGFsdGVybmF0ZSBmdW5jdGlvbnMgZm9yIG1vcmUgZGV0YWlscykKKyAgKiAgICAgICAgIFdoZW4gc2VsZWN0aW5nIFRJTTNfVEkyX0dQSU9fREVGLCBDaGFubmVsMiBvZiBUaW1lciAzIHdpbGwgYmUKKyAgKiAgICAgICAgIGNvbm5lY3RlZCBhbiBHUElPIChvdGhlciB0aGFuIFBCNShBRjQpKSBhbmQgQ2hhbm5lbDIgb2YgVElNMjEKKyAgKiAgICAgICAgIHdpbGwgYmUgY29ubmVjdGVkIHRvIFBCNShBRjQpLgorICAqIEBub3RlICAgV2hlbiBUSU0yIEVUUiBpcyBmZWQgd2l0aCBIU0k0OCwgdGhpcyBFVFIgbXVzdCBiZSBwcmVzY2FsZWQgaW50ZXJuYWxseQorICAqICAgICAgICAgdG8gdGhlIFRJTUVSMiBiZWNhdXNlIHRoZSBtYXhpbXVtIHN5c3RlbSBmcmVxdWVuY3kgaXMgMzIgTUh6CisgIEBlbmRpZgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgUmVtYXAgc3BlY2lmaWVzIHRoZSBUSU0gcmVtYXBwaW5nIHNvdXJjZS4KKyAgQGlmIFNUTTMyTDA3M3h4CisgICogICAgICAgICBGb3IgVElNMiwgdGhlIHBhcmFtZXRlciBpcyBhIGNvbWJpbmF0aW9uIG9mIDIgZmllbGRzIChmaWVsZDEgfCBmaWVsZDIpOgorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQxIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTJfRVRSX0dQSU86ICAgICAgVElNMiAgRVRSIGNvbm5lY3RlZCB0byBHUElPIChkZWZhdWx0KToKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBMChBRjUpIG9yIFBBNShBRjIpIG9yIFBBMTUoQUYyKSBvciBQRTkoQUYyKQorICAqICAgICAgICAgICBAYXJnIFRJTTJfRVRSX0hTSTQ4OiAgICAgVElNMiAgRVRSIGNvbm5lY3RlZCB0byBIU0k0OAorICAqICAgICAgICAgICBAYXJnIFRJTTJfRVRSX0hTSTE2OiAgICAgVElNMiAgRVRSIGNvbm5lY3RlZCB0byBIU0kxNgorICAqICAgICAgICAgICBAYXJnIFRJTTJfRVRSX0xTRTogICAgICAgVElNMiAgRVRSIGNvbm5lY3RlZCB0byBMU0UKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX0VUUl9DT01QMl9PVVQ6IFRJTTIgIEVUUiBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMl9FVFJfQ09NUDFfT1VUOiBUSU0yICBFVFIgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dAorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQyIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTJfVEk0X0dQSU8gOiAgICAgVElNMiAgVEk0IGNvbm5lY3RlZCB0byBHUElPMShkZWZhdWx0KToKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBMyhBRjIpIG9yIFBCMTEoQUYyKSBvciBQRTEyKEFGMCkKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX1RJNF9DT01QMTogICAgIFRJTTIgIFRJNCBjb25uZWN0ZWQgdG8gQ09NUDEKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX1RJNF9DT01QMjogICAgIFRJTTIgIFRJNCBjb25uZWN0ZWQgdG8gQ09NUDIKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkwwMzF4eAorICAqICAgICAgICAgRm9yIFRJTTIsIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGZpZWxkcyAoZmllbGQxIHwgZmllbGQyKToKKyAgKgorICAqICAgICAgICAgICAgICAgICAgIGZpZWxkMSBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX0VUUl9HUElPOiAgICAgIFRJTTIgIEVUUiBjb25uZWN0ZWQgdG8gR1BJTyAoZGVmYXVsdCk6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQTAoQUY1KSBvciBQQTUoQUYyKSBvciBQQTE1KEFGMikKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX0VUUl9IU0kxNjogICAgIFRJTTIgIEVUUiBjb25uZWN0ZWQgdG8gSFMxNiAoSFNJT1VUKQorICAqICAgICAgICAgICBAYXJnIFRJTTJfRVRSX0xTRTogICAgICAgVElNMiAgRVRSIGNvbm5lY3RlZCB0byBMU0UKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX0VUUl9DT01QMl9PVVQ6IFRJTTIgIEVUUiBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMl9FVFJfQ09NUDFfT1VUOiBUSU0yICBFVFIgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dAorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQyIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTJfVEk0X0dQSU8gOiAgICAgVElNMiAgVEk0IGNvbm5lY3RlZCB0byBHUElPIChkZWZhdWx0KToKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBMyhBRjIpIG9yIFBCMTEoQUYyKSBvciBQQjEoQUY1KQorICAqICAgICAgICAgICBAYXJnIFRJTTJfVEk0X0NPTVAxX09VVDogVElNMiAgVEk0IGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX1RJNF9DT01QMl9PVVQ6IFRJTTIgIFRJNCBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgIEBlbmRpZgorICBAaWYgU1RNMzJMMDExeHgKKyAgKiAgICAgICAgIEZvciBUSU0yLCB0aGUgcGFyYW1ldGVyIGlzIGEgY29tYmluYXRpb24gb2YgMiBmaWVsZHMgKGZpZWxkMSB8IGZpZWxkMik6CisgICoKKyAgKiAgICAgICAgICAgICAgICAgICBmaWVsZDEgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgVElNMl9FVFJfR1BJTzogICAgICBUSU0yICBFVFIgY29ubmVjdGVkIHRvIEdQSU8gKGRlZmF1bHQpOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEEwKEFGNSkgb3IgUEE1KEFGMikgb3IgUEExNShBRjIpCisgICogICAgICAgICAgIEBhcmcgVElNMl9FVFJfSFNJMTY6ICAgICBUSU0yICBFVFIgY29ubmVjdGVkIHRvIEhTMTYgKEhTSU9VVCkKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX0VUUl9MU0U6ICAgICAgIFRJTTIgIEVUUiBjb25uZWN0ZWQgdG8gTFNFCisgICogICAgICAgICAgIEBhcmcgVElNMl9FVFJfQ09NUDJfT1VUOiBUSU0yICBFVFIgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICBAYXJnIFRJTTJfRVRSX0NPTVAxX09VVDogVElNMiAgRVRSIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKgorICAqICAgICAgICAgICAgICAgICAgIGZpZWxkMiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX1RJNF9HUElPIDogICAgIFRJTTIgIFRJNCBjb25uZWN0ZWQgdG8gR1BJTyAoZGVmYXVsdCk6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQTMoQUYyKSBvciBQQjExKEFGMikgb3IgUEIxKEFGNSkKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX1RJNF9DT01QMV9PVVQ6IFRJTTIgIFRJNCBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMl9USTRfQ09NUDJfT1VUOiBUSU0yICBUSTQgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dAorICBAZW5kaWYKKyAgQGlmIFNUTTMyTDA1MXh4CisgICogICAgICAgICBGb3IgVElNMiwgdGhlIHBhcmFtZXRlciBpcyBhIGNvbWJpbmF0aW9uIG9mIDIgZmllbGRzIChmaWVsZDEgfCBmaWVsZDIpOgorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQxIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTJfRVRSX0dQSU86ICAgICAgVElNMiAgRVRSIGNvbm5lY3RlZCB0byBHUElPIChkZWZhdWx0KToKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBMChBRjUpIG9yIFBBNShBRjIpIG9yIFBBMTUoQUYyKSBvciBQRTkoQUYyKQorICAqICAgICAgICAgICBAYXJnIFRJTTJfRVRSX0hTSTQ4OiAgICAgVElNMiAgRVRSIGNvbm5lY3RlZCB0byBIU0k0OAorICAqICAgICAgICAgICBAYXJnIFRJTTJfRVRSX0xTRTogICAgICAgVElNMiAgRVRSIGNvbm5lY3RlZCB0byBMU0UKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX0VUUl9DT01QMl9PVVQ6IFRJTTIgIEVUUiBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMl9FVFJfQ09NUDFfT1VUOiBUSU0yICBFVFIgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dAorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQyIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTJfVEk0X0dQSU86ICAgICAgVElNMiAgVEk0IGNvbm5lY3RlZCB0byBHUElPMShkZWZhdWx0KToKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBMyhBRjIpIG9yIFBCMTEoQUYyKSBvciBQRTEyKEFGMCkKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX1RJNF9DT01QMTogICAgIFRJTTIgIFRJNCBjb25uZWN0ZWQgdG8gQ09NUDEKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX1RJNF9DT01QMjogICAgIFRJTTIgIFRJNCBjb25uZWN0ZWQgdG8gQ09NUDIKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yX1RJNF9HUElPMjogICAgIFRJTTIgIFRJNCBjb25uZWN0ZWQgdG8gR1BJTzIgOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEEzKEFGMikgb3IgUEIxMShBRjIpIG9yIFBFMTIoQUYwKQorICBAZW5kaWYKKyAgQGlmIFNUTTMyTDA3M3h4CisgICoKKyAgKiAgICAgICAgIEZvciBUSU0zLCB0aGUgcGFyYW1ldGVyIGlzIGEgY29tYmluYXRpb24gb2YgNCBmaWVsZHMgKGZpZWxkMSB8IGZpZWxkMiB8IGZpZWxkMyB8IGZpZWxkNCk6CisgICoKKyAgKiAgICAgICAgICAgICAgICAgICBmaWVsZDEgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgVElNM19FVFJfR1BJTzogICAgICBUSU0zICBFVFIgY29ubmVjdGVkIHRvIEdQSU8gKGRlZmF1bHQpOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEUyKEFGMikgb3IgUEQyKEFGMikgb3IgUEUyKEFGMikKKyAgKiAgICAgICAgICAgQGFyZyBUSU0zX0VUUl9IU0k6ICAgICAgIFRJTTMgRVRSIGNvbm5lY3RlZCB0byBIU0kKKyAgKgorICAqICAgICAgICAgICAgICAgICAgIGZpZWxkMiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBUSU0zX1RJMV9VU0JfU09GOiAgIFRJTTMgVEkxIGNvbm5lY3RlZCB0byBVU0JfU09GIChkZWZhdWx0KQorICAqICAgICAgICAgICBAYXJnIFRJTTNfVEkxX0dQSU86ICAgICAgVElNMyBUSTEgY29ubmVjdGVkIHRvIEdQSU8gOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEUzKEFGMikgb3IgUEE2KEFGMikgb3IgUEM2KEFGMikgb3IgUEI0KEFGMikKKyAgKgorICAqICAgICAgICAgICAgICAgICAgIGZpZWxkMyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBUSU0zX1RJMl9HUElPQjVfQUY0OlRJTTMgVEkzIGNvbm5lY3RlZCB0byBQNShBRjQpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVmZXIgdG8gbm90ZSkKKyAgKiAgICAgICAgICAgQGFyZyBUSU0zX1RJMl9HUElPX0RFRjogIFRJTTMgVEkzIGNvbm5lY3RlZCB0byBHUElPIChkZWZhdWx0KToKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBNyhBRjIpIG9yIFBCNShBRjQpIG9yIFBDNyhBRjIpIG9yIFBFNyhBRjIpCisgICoKKyAgKiAgICAgICAgICAgICAgICAgICBmaWVsZDQgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgVElNM19USTRfR1BJT19ERUY6ICBUSU0zIFRJNCBjb25uZWN0ZWQgdG8gR1BJTzoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBCMShBRjIpIG9yIFBFNihBRjIpCisgICogICAgICAgICAgIEBhcmcgVElNM19USTRfR1BJT0M5X0FGMjpUSU0zIFRJNCBjb25uZWN0ZWQgdG8gUEM5KEFGKTIKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkwwNzN4eAorICAqICAgICAgICAgRm9yIFRJTTIxLCB0aGUgcGFyYW1ldGVyIGlzIGEgY29tYmluYXRpb24gb2YgMyBmaWVsZHMgKGZpZWxkMSB8IGZpZWxkMiB8IGZpZWxkMyk6CisgICoKKyAgKiAgICAgICAgICAgICAgICAgICBmaWVsZDEgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgVElNMjFfRVRSX0dQSU86ICAgICBUSU0yMSBFVFIgY29ubmVjdGVkIHRvIEdQSU8oZGVmYXVsdCkgOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEM5KEFGMCkgb3IgUEExKEFGNSkKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9FVFJfQ09NUDJfT1VUOlRJTTIxIEVUUiBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMjFfRVRSX0NPTVAxX09VVDpUSU0yMSBFVFIgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dAorICAqICAgICAgICAgICBAYXJnIFRJTTIxX0VUUl9MU0U6ICAgICAgVElNMjEgRVRSIGNvbm5lY3RlZCB0byBMU0UKKyAgKgorICAqICAgICAgICAgICAgICAgICAgIGZpZWxkMiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfTUNPOiAgICAgIFRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gTUNPCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX1JUQ19XS1VUX0lUOiBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIFJUQyBXQUtFVVAgaW50ZXJydXB0CisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX0hTRV9SVEM6ICBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIEhTRV9SVEMKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfTVNJOiAgICAgIFRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gTVNJIGNsb2NrCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX0xTRTogICAgICBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIExTRQorICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMV9MU0k6ICAgICAgVElNMjEgVEkxIGNvbm5lY3RlZCB0byBMU0kKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfQ09NUDFfT1VUOlRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX0dQSU86ICAgICBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIEdQSU8oZGVmYXVsdCk6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQTIoQUYwKSBvciBQQjEzKEFGNikgb3IgUEU1KEFGMCkgb3IgUEQwKEFGMCkKKyAgKgorICAqICAgICAgICAgICAgICAgICAgIGZpZWxkMyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTJfR1BJTzogICAgIFRJTTIxIFRJMiBjb25uZWN0ZWQgdG8gR1BJTyhkZWZhdWx0KToKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBMyhBRjApIG9yIFBCMTQoQUY2KSBvciBQRTYoQUYwKSBvciBQRDcoQUYxKQorICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMl9DT01QMl9PVVQ6VElNMjEgVEkyIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgQGVuZGlmCisgIEBpZiBTVE0zMkwwMzF4eAorICAqICAgICAgICAgRm9yIFRJTTIxLCB0aGUgcGFyYW1ldGVyIGlzIGEgY29tYmluYXRpb24gb2YgMyBmaWVsZHMgKGZpZWxkMSB8IGZpZWxkMiB8IGZpZWxkMyk6CisgICoKKyAgKiAgICAgICAgICAgICAgICAgICBmaWVsZDEgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgVElNMjFfRVRSX0dQSU86ICAgICBUSU0yMSBFVFIgY29ubmVjdGVkIHRvIEdQSU8oZGVmYXVsdCkgOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEExKEFGNSkKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9FVFJfQ09NUDJfT1VUOlRJTTIxIEVUUiBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMjFfRVRSX0NPTVAxX09VVDpUSU0yMSBFVFIgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dAorICAqICAgICAgICAgICBAYXJnIFRJTTIxX0VUUl9MU0U6ICAgICAgVElNMjEgRVRSIGNvbm5lY3RlZCB0byBMU0UKKyAgKgorICAqICAgICAgICAgICAgICAgICAgIGZpZWxkMiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfTUNPOiAgICAgIFRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gTUNPCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX1JUQ19XS1VUX0lUOiBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIFJUQyBXQUtFVVAgaW50ZXJydXB0CisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX0hTRV9SVEM6ICBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIEhTRV9SVEMKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfTVNJOiAgICAgIFRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gTVNJIGNsb2NrCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX0xTRTogICAgICBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIExTRQorICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMV9MU0k6ICAgICAgVElNMjEgVEkxIGNvbm5lY3RlZCB0byBMU0kKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfQ09NUDFfT1VUOlRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUCisgICoKKyAgKiAgICAgICAgICAgICAgICAgICBmaWVsZDMgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkyX0dQSU86ICAgICBUSU0yMSBUSTIgY29ubmVjdGVkIHRvIEdQSU8oZGVmYXVsdCk6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQTMoQUYwKSBvciBQQjE0KEFGNikKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTJfQ09NUDJfT1VUOlRJTTIxIFRJMiBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgIEBlbmRpZgorICBAaWYgU1RNMzJMMDExeHgKKyAgKiAgICAgICAgIEZvciBUSU0yMSwgdGhlIHBhcmFtZXRlciBpcyBhIGNvbWJpbmF0aW9uIG9mIDMgZmllbGRzIChmaWVsZDEgfCBmaWVsZDIgfCBmaWVsZDMpOgorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQxIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTIxX0VUUl9HUElPOiAgICAgVElNMjEgRVRSIGNvbm5lY3RlZCB0byBHUElPKGRlZmF1bHQpIDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBMShBRjUpCisgICogICAgICAgICAgIEBhcmcgVElNMjFfRVRSX0NPTVAyX09VVDpUSU0yMSBFVFIgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICBAYXJnIFRJTTIxX0VUUl9DT01QMV9PVVQ6VElNMjEgRVRSIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9FVFJfTFNFOiAgICAgIFRJTTIxIEVUUiBjb25uZWN0ZWQgdG8gTFNFCisgICoKKyAgKiAgICAgICAgICAgICAgICAgICBmaWVsZDIgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX01DTzogICAgICBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIE1DTworICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMV9SVENfV0tVVF9JVDogVElNMjEgVEkxIGNvbm5lY3RlZCB0byBSVEMgV0FLRVVQIGludGVycnVwdAorICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMV9IU0VfUlRDOiAgVElNMjEgVEkxIGNvbm5lY3RlZCB0byBIU0VfUlRDCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX01TSTogICAgICBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIE1TSSBjbG9jaworICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMV9MU0U6ICAgICAgVElNMjEgVEkxIGNvbm5lY3RlZCB0byBMU0UKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfTFNJOiAgICAgIFRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gTFNJCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX0NPTVAxX09VVDpUSU0yMSBUSTEgY29ubmVjdGVkIHRvIENPTVAxX09VVAorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQzIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMl9HUElPOiAgICAgVElNMjEgVEkyIGNvbm5lY3RlZCB0byBHUElPKGRlZmF1bHQpOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEEzKEFGMCkgb3IgUEIxNChBRjYpCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkyX0NPTVAyX09VVDpUSU0yMSBUSTIgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dAorICBAZW5kaWYKKyAgQGlmIFNUTTMyTDA1MXh4CisgICogICAgICAgICBGb3IgVElNMjEsIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb21iaW5hdGlvbiBvZiAzIGZpZWxkcyAoZmllbGQxIHwgZmllbGQyIHwgZmllbGQzKToKKyAgKgorICAqICAgICAgICAgICAgICAgICAgIGZpZWxkMSBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9FVFJfR1BJTzogICAgIFRJTTIxIEVUUiBjb25uZWN0ZWQgdG8gR1BJTyhkZWZhdWx0KSA6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQzkoQUYwKSBvciBQQTEoQUY1KQorICAqICAgICAgICAgICBAYXJnIFRJTTIxX0VUUl9DT01QMl9PVVQ6VElNMjEgRVRSIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9FVFJfQ09NUDFfT1VUOlRJTTIxIEVUUiBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMjFfRVRSX0xTRTogICAgICBUSU0yMSBFVFIgY29ubmVjdGVkIHRvIExTRQorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQyIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMV9NQ086ICAgICAgVElNMjEgVEkxIGNvbm5lY3RlZCB0byBNQ08KKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfUlRDX1dLVVRfSVQ6IFRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gUlRDIFdBS0VVUCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfSFNFX1JUQzogIFRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gSFNFX1JUQworICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMV9NU0k6ICAgICAgVElNMjEgVEkxIGNvbm5lY3RlZCB0byBNU0kgY2xvY2sKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfTFNFOiAgICAgIFRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gTFNFCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkxX0xTSTogICAgICBUSU0yMSBUSTEgY29ubmVjdGVkIHRvIExTSQorICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMV9DT01QMV9PVVQ6VElNMjEgVEkxIGNvbm5lY3RlZCB0byBDT01QMV9PVVQKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMV9USTFfR1BJTzogICAgIFRJTTIxIFRJMSBjb25uZWN0ZWQgdG8gR1BJTyhkZWZhdWx0KToKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBMihBRjApIG9yIFBCMTMoQUY2KSBvciBQRTUoQUYwKSBvciBQRDAoQUYwKQorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQzIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTIxX1RJMl9HUElPOiAgICAgVElNMjEgVEkyIGNvbm5lY3RlZCB0byBHUElPKGRlZmF1bHQpOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEEzKEFGMCkgb3IgUEIxNChBRjYpIG9yIFBFNihBRjApIG9yIFBENyhBRjEpCisgICogICAgICAgICAgIEBhcmcgVElNMjFfVEkyX0NPTVAyX09VVDpUSU0yMSBUSTIgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dAorICBAZW5kaWYKKyAgQGlmIFNUTTMyTDA3M3h4CisgICoKKyAgKiAgICAgICAgIEZvciBUSU0yMiwgdGhlIHBhcmFtZXRlciBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMl9FVFJfTFNFOiAgICAgIFRJTTIyIEVUUiBjb25uZWN0ZWQgdG8gTFNFCisgICogICAgICAgICAgIEBhcmcgVElNMjJfRVRSX0NPTVAyX09VVDpUSU0yMiBFVFIgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICBAYXJnIFRJTTIyX0VUUl9DT01QMV9PVVQ6VElNMjIgRVRSIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMl9FVFJfR1BJTzogICAgIFRJTTIyIEVUUiBjb25uZWN0ZWQgdG8gR1BJTyhkZWZhdWx0KToKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDOChBRjApIG9yIFBBNChBRjUpCisgICogICAgICAgICAgIEBhcmcgVElNMjJfVEkxX0dQSU86ICAgICBUSU0yMiBUSTEgY29ubmVjdGVkIHRvIEdQSU8oZGVmYXVsdCk6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQzYoQUYwKSBvciBQQTYoQUY1KSBvciBQQjQoQUY0KSBvciBQRTAoQUYzKQorICAqICAgICAgICAgICBAYXJnIFRJTTIyX1RJMV9DT01QMl9PVVQ6VElNMjIgVEkxIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMl9USTFfQ09NUDFfT1VUOlRJTTIyIFRJMSBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0CisgIEBlbmRpZgorICBAaWYgU1RNMzJMMDMxeHgKKyAgKgorICAqICAgICAgICAgRm9yIFRJTTIyLCB0aGUgcGFyYW1ldGVyIGlzIGEgY29tYmluYXRpb24gb2YgMiBmaWVsZHMgKGZpZWxkMSB8IGZpZWxkMik6CisgICoKKyAgKiAgICAgICAgICAgICAgICAgICBmaWVsZDEgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgVElNMjJfRVRSX0xTRTogICAgICBUSU0yMiBFVFIgY29ubmVjdGVkIHRvIExTRQorICAqICAgICAgICAgICBAYXJnIFRJTTIyX0VUUl9DT01QMl9PVVQ6VElNMjIgRVRSIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMl9FVFJfQ09NUDFfT1VUOlRJTTIyIEVUUiBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMjJfRVRSX0dQSU86ICAgICBUSU0yMiBFVFIgY29ubmVjdGVkIHRvIEdQSU8oZGVmYXVsdCk6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQTQoQUY1KQorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQyIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTIyX1RJMV9HUElPOiAgICAgVElNMjIgVEkxIGNvbm5lY3RlZCB0byBHUElPKGRlZmF1bHQpOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEMwKEFGNikgb3IgUEE1KEFGNikgb3IgUEI0KEFGNCkKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMl9USTFfQ09NUDJfT1VUOlRJTTIyIFRJMSBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMjJfVEkxX0NPTVAxX09VVDpUSU0yMiBUSTEgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dAorICAqCisgIEBlbmRpZgorICBAaWYgU1RNMzJMMDUxeHgKKyAgKgorICAqICAgICAgICAgRm9yIFRJTTIyLCB0aGUgcGFyYW1ldGVyIGlzIGEgY29tYmluYXRpb24gb2YgMiBmaWVsZHMgKGZpZWxkMSB8IGZpZWxkMik6CisgICoKKyAgKiAgICAgICAgICAgICAgICAgICBmaWVsZDEgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgVElNMjJfRVRSX0xTRTogICAgICBUSU0yMiBFVFIgY29ubmVjdGVkIHRvIExTRQorICAqICAgICAgICAgICBAYXJnIFRJTTIyX0VUUl9DT01QMl9PVVQ6VElNMjIgRVRSIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMl9FVFJfQ09NUDFfT1VUOlRJTTIyIEVUUiBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMjJfRVRSX0dQSU86ICAgICBUSU0yMiBFVFIgY29ubmVjdGVkIHRvIEdQSU8oZGVmYXVsdCk6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQzgoQUYwKSBvciBQQTQoQUY1KQorICAqCisgICogICAgICAgICAgICAgICAgICAgZmllbGQyIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFRJTTIyX1RJMV9HUElPOiAgICAgVElNMjIgVEkxIGNvbm5lY3RlZCB0byBHUElPKGRlZmF1bHQpOgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEM2KEFGMCkgb3IgUEE2KEFGNSkgb3IgUEI0KEFGNCkgb3IgUEUwKEFGMykKKyAgKiAgICAgICAgICAgQGFyZyBUSU0yMl9USTFfQ09NUDJfT1VUOlRJTTIyIFRJMSBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgICogICAgICAgICAgIEBhcmcgVElNMjJfVEkxX0NPTVAxX09VVDpUSU0yMiBUSTEgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dAorICBAZW5kaWYKKyAgKgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1JlbWFwQ29uZmlnKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBSZW1hcCkKK3sKKyAgX19IQUxfTE9DSyhodGltKTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fUkVNQVAoaHRpbS0+SW5zdGFuY2UsIFJlbWFwKSk7CisKKyAgLyogU2V0IHRoZSBUaW1lciByZW1hcHBpbmcgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHRpbS0+SW5zdGFuY2UtPk9SLCBSZW1hcCk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworI2VuZGlmIC8qIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF90c2MuYyBiL1NyYy9zdG0zMmwweHhfaGFsX3RzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjc1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF90c2MuYwpAQCAtMCwwICsxLDEwNzAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3RzYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBUb3VjaCBTZW5zaW5nIENvbnRyb2xsZXIgKFRTQykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgRGUtaW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBDaGFubmVsIElPcywgU2hpZWxkIElPcyBhbmQgU2FtcGxpbmcgSU9zIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBTdGFydCBhbmQgU3RvcCBhbiBhY3F1aXNpdGlvbgorICAqICAgICAgICAgICArIFJlYWQgYWNxdWlzaXRpb24gcmVzdWx0CisgICogICAgICAgICAgICsgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudAorICAqCisgIEB2ZXJiYXRpbQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVFNDIHNwZWNpZmljIGZlYXR1cmVzICMjIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICgjKSBQcm92ZW4gYW5kIHJvYnVzdCBzdXJmYWNlIGNoYXJnZSB0cmFuc2ZlciBhY3F1aXNpdGlvbiBwcmluY2lwbGUKKworICAoIykgU3VwcG9ydHMgdXAgdG8gMyBjYXBhY2l0aXZlIHNlbnNpbmcgY2hhbm5lbHMgcGVyIGdyb3VwCisKKyAgKCMpIENhcGFjaXRpdmUgc2Vuc2luZyBjaGFubmVscyBjYW4gYmUgYWNxdWlyZWQgaW4gcGFyYWxsZWwgb2ZmZXJpbmcgYSB2ZXJ5IGdvb2QKKyAgICAgIHJlc3BvbnNlIHRpbWUKKworICAoIykgU3ByZWFkIHNwZWN0cnVtIGZlYXR1cmUgdG8gaW1wcm92ZSBzeXN0ZW0gcm9idXN0bmVzcyBpbiBub2lzeSBlbnZpcm9ubWVudHMKKworICAoIykgRnVsbCBoYXJkd2FyZSBtYW5hZ2VtZW50IG9mIHRoZSBjaGFyZ2UgdHJhbnNmZXIgYWNxdWlzaXRpb24gc2VxdWVuY2UKKworICAoIykgUHJvZ3JhbW1hYmxlIGNoYXJnZSB0cmFuc2ZlciBmcmVxdWVuY3kKKworICAoIykgUHJvZ3JhbW1hYmxlIHNhbXBsaW5nIGNhcGFjaXRvciBJL08gcGluCisKKyAgKCMpIFByb2dyYW1tYWJsZSBjaGFubmVsIEkvTyBwaW4KKworICAoIykgUHJvZ3JhbW1hYmxlIG1heCBjb3VudCB2YWx1ZSB0byBhdm9pZCBsb25nIGFjcXVpc2l0aW9uIHdoZW4gYSBjaGFubmVsIGlzIGZhdWx0eQorCisgICgjKSBEZWRpY2F0ZWQgZW5kIG9mIGFjcXVpc2l0aW9uIGFuZCBtYXggY291bnQgZXJyb3IgZmxhZ3Mgd2l0aCBpbnRlcnJ1cHQgY2FwYWJpbGl0eQorCisgICgjKSBPbmUgc2FtcGxpbmcgY2FwYWNpdG9yIGZvciB1cCB0byAzIGNhcGFjaXRpdmUgc2Vuc2luZyBjaGFubmVscyB0byByZWR1Y2UgdGhlIHN5c3RlbQorICAgICAgY29tcG9uZW50cworCisgICgjKSBDb21wYXRpYmxlIHdpdGggcHJveGltaXR5LCB0b3VjaGtleSwgbGluZWFyIGFuZCByb3RhcnkgdG91Y2ggc2Vuc29yIGltcGxlbWVudGF0aW9uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgjKSBFbmFibGUgdGhlIFRTQyBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1RTQ19DTEtfRU5BQkxFKCkgbWFjcm8uCisKKyAgICAoIykgR1BJTyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICgrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFRTQyBHUElPcyB1c2luZyBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpIG1hY3JvLgorICAgICAgKCsrKSBDb25maWd1cmUgdGhlIFRTQyBwaW5zIHVzZWQgYXMgc2FtcGxpbmcgSU9zIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBvdXRwdXQgT3Blbi1EcmFpbiBtb2RlLAorICAgICAgICAgICBhbmQgVFNDIHBpbnMgdXNlZCBhcyBjaGFubmVsL3NoaWVsZCBJT3MgaW4gYWx0ZXJuYXRlIGZ1bmN0aW9uIG91dHB1dCBQdXNoLVB1bGwgbW9kZQorICAgICAgICAgICB1c2luZyBIQUxfR1BJT19Jbml0KCkgZnVuY3Rpb24uCisKKyAgICAoIykgSW50ZXJydXB0cyBjb25maWd1cmF0aW9uCisgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgTlZJQyAoaWYgdGhlIGludGVycnVwdCBtb2RlbCBpcyB1c2VkKSB1c2luZyBIQUxfTlZJQ19TZXRQcmlvcml0eSgpCisgICAgICAgICAgIGFuZCBIQUxfTlZJQ19FbmFibGVJUlEoKSBhbmQgZnVuY3Rpb24uCisKKyAgICAoIykgVFNDIGNvbmZpZ3VyYXRpb24KKyAgICAgICgrKykgQ29uZmlndXJlIGFsbCBUU0MgcGFyYW1ldGVycyBhbmQgdXNlZCBUU0MgSU9zIHVzaW5nIEhBTF9UU0NfSW5pdCgpIGZ1bmN0aW9uLgorCisgWy4uXSAgIFRTQyBwZXJpcGhlcmFsIGFsdGVybmF0ZSBmdW5jdGlvbnMgYXJlIG1hcHBlZCBvbiBBRjMuCisKKyAgKioqIEFjcXVpc2l0aW9uIHNlcXVlbmNlICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIERpc2NoYXJnZSBhbGwgSU9zIHVzaW5nIEhBTF9UU0NfSU9EaXNjaGFyZ2UoKSBmdW5jdGlvbi4KKyAgICAoKykgV2FpdCBhIGNlcnRhaW4gdGltZSBhbGxvd2luZyBhIGdvb2QgZGlzY2hhcmdlIG9mIGFsbCBjYXBhY2l0b3JzLiBUaGlzIGRlbGF5IGRlcGVuZHMKKyAgICAgICAgb2YgdGhlIHNhbXBsaW5nIGNhcGFjaXRvciBhbmQgZWxlY3Ryb2RlcyBkZXNpZ24uCisgICAgKCspIFNlbGVjdCB0aGUgY2hhbm5lbCBJT3MgdG8gYmUgYWNxdWlyZWQgdXNpbmcgSEFMX1RTQ19JT0NvbmZpZygpIGZ1bmN0aW9uLgorICAgICgrKSBMYXVuY2ggdGhlIGFjcXVpc2l0aW9uIHVzaW5nIGVpdGhlciBIQUxfVFNDX1N0YXJ0KCkgb3IgSEFMX1RTQ19TdGFydF9JVCgpIGZ1bmN0aW9uLgorICAgICAgICBJZiB0aGUgc3luY2hyb25pemVkIG1vZGUgaXMgc2VsZWN0ZWQsIHRoZSBhY3F1aXNpdGlvbiB3aWxsIHN0YXJ0IGFzIHNvb24gYXMgdGhlIHNpZ25hbAorICAgICAgICBpcyByZWNlaXZlZCBvbiB0aGUgc3luY2hybyBwaW4uCisgICAgKCspIFdhaXQgdGhlIGVuZCBvZiBhY3F1aXNpdGlvbiB1c2luZyBlaXRoZXIgSEFMX1RTQ19Qb2xsRm9yQWNxdWlzaXRpb24oKSBvcgorICAgICAgICBIQUxfVFNDX0dldFN0YXRlKCkgZnVuY3Rpb24gb3IgdXNpbmcgV0ZJIGluc3RydWN0aW9uIGZvciBleGFtcGxlLgorICAgICgrKSBDaGVjayB0aGUgZ3JvdXAgYWNxdWlzaXRpb24gc3RhdHVzIHVzaW5nIEhBTF9UU0NfR3JvdXBHZXRTdGF0dXMoKSBmdW5jdGlvbi4KKyAgICAoKykgUmVhZCB0aGUgYWNxdWlzaXRpb24gdmFsdWUgdXNpbmcgSEFMX1RTQ19Hcm91cEdldFZhbHVlKCkgZnVuY3Rpb24uCisKKyAgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9UU0NfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4KKworICAgICBGdW5jdGlvbiBAcmVmIEhBTF9UU0NfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBDb252Q3BsdENhbGxiYWNrICAgOiBjYWxsYmFjayBmb3IgY29udmVyc2lvbiBjb21wbGV0ZSBwcm9jZXNzLgorICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgorICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgTXNwIEluaXQuCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgorICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1RTQ19VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgICB3ZWFrIGZ1bmN0aW9uLgorICAgICBAcmVmIEhBTF9UU0NfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICAgYW5kIHRoZSBDYWxsYmFjayBJRC4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgQ29udkNwbHRDYWxsYmFjayAgIDogY2FsbGJhY2sgZm9yIGNvbnZlcnNpb24gY29tcGxldGUgcHJvY2Vzcy4KKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgTXNwIERlSW5pdC4KKworICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfVFNDX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgQHJlZiBIQUxfVFNDX1NUQVRFX1JFU0VUCisgICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgICAgZXhhbXBsZXMgQHJlZiBIQUxfVFNDX0NvbnZDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfVFNDX0Vycm9yQ2FsbGJhY2soKS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfVFNDX0luaXQoKS8gQHJlZiBIQUxfVFNDX0RlSW5pdCgpIG9ubHkgd2hlbgorICAgICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9UU0NfSW5pdCgpLyBAcmVmIEhBTF9UU0NfRGVJbml0KCkKKyAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKSB3aGF0ZXZlciB0aGUgc3RhdGUuCisKKyAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBAcmVmIEhBTF9UU0NfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgIGluIEByZWYgSEFMX1RTQ19TVEFURV9SRUFEWSBvciBAcmVmIEhBTF9UU0NfU1RBVEVfUkVTRVQgc3RhdGUsCisgICAgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgIFRoZW4sIHRoZSB1c2VyIGZpcnN0IHJlZ2lzdGVycyB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgICAgdXNpbmcgQHJlZiBIQUxfVFNDX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9UU0NfRGVJbml0KCkKKyAgICAgb3IgQHJlZiBIQUxfVFNDX0luaXQoKSBmdW5jdGlvbi4KKworICAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKyNpZiBkZWZpbmVkKFRTQykKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDIFRTQworICAqIEBicmllZiBIQUwgVFNDIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1RTQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB1aW50MzJfdCBUU0NfZXh0cmFjdF9ncm91cHModWludDMyX3QgaW9tYXNrKTsKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRTQy4KKyAgICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUU0MuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFRTQyBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIHRoZSBUU0NfSW5pdFR5cGVEZWYgc3RydWN0dXJlIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGh0c2MgVFNDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19Jbml0KFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKQoreworICAvKiBDaGVjayBUU0MgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh0c2MgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0FMTF9JTlNUQU5DRShodHNjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0NUUEgoaHRzYy0+SW5pdC5DVFB1bHNlSGlnaExlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0NUUEwoaHRzYy0+SW5pdC5DVFB1bHNlTG93TGVuZ3RoKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfU1MoaHRzYy0+SW5pdC5TcHJlYWRTcGVjdHJ1bSkpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX1NTRChodHNjLT5Jbml0LlNwcmVhZFNwZWN0cnVtRGV2aWF0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfU1NfUFJFU0MoaHRzYy0+SW5pdC5TcHJlYWRTcGVjdHJ1bVByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX1BHX1BSRVNDKGh0c2MtPkluaXQuUHVsc2VHZW5lcmF0b3JQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19NQ1YoaHRzYy0+SW5pdC5NYXhDb3VudFZhbHVlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfSU9ERUYoaHRzYy0+SW5pdC5JT0RlZmF1bHRNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfU1lOQ19QT0woaHRzYy0+SW5pdC5TeW5jaHJvUGluUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BQ1FfTU9ERShodHNjLT5Jbml0LkFjcXVpc2l0aW9uTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX01DRV9JVChodHNjLT5Jbml0Lk1heENvdW50SW50ZXJydXB0KSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfR1JPVVAoaHRzYy0+SW5pdC5DaGFubmVsSU9zKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfR1JPVVAoaHRzYy0+SW5pdC5TaGllbGRJT3MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19HUk9VUChodHNjLT5Jbml0LlNhbXBsaW5nSU9zKSk7CisKKyAgaWYgKGh0c2MtPlN0YXRlID09IEhBTF9UU0NfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRzYy0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBJbml0IHRoZSBUU0MgQ2FsbGJhY2sgc2V0dGluZ3MgKi8KKyAgICBodHNjLT5Db252Q3BsdENhbGxiYWNrICA9IEhBTF9UU0NfQ29udkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQ29udkNwbHRDYWxsYmFjayAgICAgKi8KKyAgICBodHNjLT5FcnJvckNhbGxiYWNrICAgICA9IEhBTF9UU0NfRXJyb3JDYWxsYmFjazsgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKworICAgIGlmIChodHNjLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodHNjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVFNDX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YyAqLworICAgIGh0c2MtPk1zcEluaXRDYWxsYmFjayhodHNjKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWCAqLworICAgIEhBTF9UU0NfTXNwSW5pdChodHNjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIFRTQyBzdGF0ZSAqLworICBodHNjLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfQlVTWTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogU2V0IFRTQyBwYXJhbWV0ZXJzICovCisKKyAgLyogRW5hYmxlIFRTQyAqLworICBodHNjLT5JbnN0YW5jZS0+Q1IgPSBUU0NfQ1JfVFNDRTsKKworICAvKiBTZXQgYWxsIGZ1bmN0aW9ucyAqLworICBodHNjLT5JbnN0YW5jZS0+Q1IgfD0gKGh0c2MtPkluaXQuQ1RQdWxzZUhpZ2hMZW5ndGggfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuQ1RQdWxzZUxvd0xlbmd0aCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShodHNjLT5Jbml0LlNwcmVhZFNwZWN0cnVtRGV2aWF0aW9uIDw8IFRTQ19DUl9TU0RfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgaHRzYy0+SW5pdC5TcHJlYWRTcGVjdHJ1bVByZXNjYWxlciB8CisgICAgICAgICAgICAgICAgICAgICAgICAgaHRzYy0+SW5pdC5QdWxzZUdlbmVyYXRvclByZXNjYWxlciB8CisgICAgICAgICAgICAgICAgICAgICAgICAgaHRzYy0+SW5pdC5NYXhDb3VudFZhbHVlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBodHNjLT5Jbml0LlN5bmNocm9QaW5Qb2xhcml0eSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgaHRzYy0+SW5pdC5BY3F1aXNpdGlvbk1vZGUpOworCisgIC8qIFNwcmVhZCBzcGVjdHJ1bSAqLworICBpZiAoKEZ1bmN0aW9uYWxTdGF0ZSlodHNjLT5Jbml0LlNwcmVhZFNwZWN0cnVtID09IEVOQUJMRSkKKyAgeworICAgIGh0c2MtPkluc3RhbmNlLT5DUiB8PSBUU0NfQ1JfU1NFOworICB9CisKKyAgLyogRGlzYWJsZSBTY2htaXR0IHRyaWdnZXIgaHlzdGVyZXNpcyBvbiBhbGwgdXNlZCBUU0MgSU9zICovCisgIGh0c2MtPkluc3RhbmNlLT5JT0hDUiA9ICh1aW50MzJfdCkofihodHNjLT5Jbml0LkNoYW5uZWxJT3MgfCBodHNjLT5Jbml0LlNoaWVsZElPcyB8IGh0c2MtPkluaXQuU2FtcGxpbmdJT3MpKTsKKworICAvKiBTZXQgY2hhbm5lbCBhbmQgc2hpZWxkIElPcyAqLworICBodHNjLT5JbnN0YW5jZS0+SU9DQ1IgPSAoaHRzYy0+SW5pdC5DaGFubmVsSU9zIHwgaHRzYy0+SW5pdC5TaGllbGRJT3MpOworCisgIC8qIFNldCBzYW1wbGluZyBJT3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklPU0NSID0gaHRzYy0+SW5pdC5TYW1wbGluZ0lPczsKKworICAvKiBTZXQgdGhlIGdyb3VwcyB0byBiZSBhY3F1aXJlZCAqLworICBodHNjLT5JbnN0YW5jZS0+SU9HQ1NSID0gVFNDX2V4dHJhY3RfZ3JvdXBzKGh0c2MtPkluaXQuQ2hhbm5lbElPcyk7CisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisgIGh0c2MtPkluc3RhbmNlLT5JRVIgJj0gKHVpbnQzMl90KSh+KFRTQ19JVF9FT0EgfCBUU0NfSVRfTUNFKSk7CisKKyAgLyogQ2xlYXIgZmxhZ3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklDUiA9IChUU0NfRkxBR19FT0EgfCBUU0NfRkxBR19NQ0UpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIC8qIEluaXRpYWxpemUgdGhlIFRTQyBzdGF0ZSAqLworICBodHNjLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZSB0aGUgVFNDIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgaHRzYyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0RlSW5pdChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogQ2hlY2sgVFNDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodHNjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGFuZ2UgVFNDIHN0YXRlICovCisgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9CVVNZOworCisjaWYgKFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRzYy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh0c2MtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1RTQ19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBodHNjLT5Nc3BEZUluaXRDYWxsYmFjayhodHNjKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9UU0NfTXNwRGVJbml0KGh0c2MpOworI2VuZGlmIC8qIFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX1JFU0VUOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBUU0MgTVNQLgorICAqIEBwYXJhbSAgaHRzYyBQb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9UU0NfTXNwSW5pdChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRzYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9UU0NfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFRTQyBNU1AuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RTQ19Nc3BEZUluaXQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0c2MpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVFNDX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworI2lmIChVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFRTQyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19DT05WX0NPTVBMRVRFX0NCX0lEIENvbnZlcnNpb24gY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9UU0NfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfUmVnaXN0ZXJDYWxsYmFjayhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgSEFMX1RTQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVFNDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodHNjLT5FcnJvckNvZGUgfD0gSEFMX1RTQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIGlmIChIQUxfVFNDX1NUQVRFX1JFQURZID09IGh0c2MtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1RTQ19DT05WX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+Q29udkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RTQ19FUlJPUl9DQl9JRCA6CisgICAgICAgIGh0c2MtPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9UU0NfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0c2MtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RTQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodHNjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHRzYy0+RXJyb3JDb2RlIHw9IEhBTF9UU0NfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfVFNDX1NUQVRFX1JFU0VUID09IGh0c2MtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1RTQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVFNDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0c2MtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodHNjLT5FcnJvckNvZGUgfD0gSEFMX1RTQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh0c2MtPkVycm9yQ29kZSB8PSBIQUxfVFNDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRzYyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBUU0MgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRTQyBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19DT05WX0NPTVBMRVRFX0NCX0lEIENvbnZlcnNpb24gY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9UU0NfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1VuUmVnaXN0ZXJDYWxsYmFjayhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgSEFMX1RTQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodHNjKTsKKworICBpZiAoSEFMX1RTQ19TVEFURV9SRUFEWSA9PSBodHNjLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9UU0NfQ09OVl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh0c2MtPkNvbnZDcGx0Q2FsbGJhY2sgPSBIQUxfVFNDX0NvbnZDcGx0Q2FsbGJhY2s7ICAgICAgIC8qIExlZ2FjeSB3ZWFrIENvbnZDcGx0Q2FsbGJhY2sgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVFNDX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+RXJyb3JDYWxsYmFjayA9IEhBTF9UU0NfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVFNDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodHNjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVFNDX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9UU0NfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVFNDX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodHNjLT5FcnJvckNvZGUgfD0gSEFMX1RTQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9UU0NfU1RBVEVfUkVTRVQgPT0gaHRzYy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVFNDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodHNjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVFNDX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9UU0NfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVFNDX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodHNjLT5FcnJvckNvZGUgfD0gSEFMX1RTQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh0c2MtPkVycm9yQ29kZSB8PSBIQUxfVFNDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRzYyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIElPIE9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTdGFydCBhY3F1aXNpdGlvbiBpbiBwb2xsaW5nIG1vZGUuCisgICAgICAoKykgU3RhcnQgYWNxdWlzaXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICAgICAoKykgUG9sbCBmb3IgYWNxdWlzaXRpb24gY29tcGxldGVkLgorICAgICAgKCspIEdldCBncm91cCBhY3F1aXNpdGlvbiBzdGF0dXMuCisgICAgICAoKykgR2V0IGdyb3VwIGFjcXVpc2l0aW9uIHZhbHVlLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgYWNxdWlzaXRpb24uCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19TdGFydChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX0JVU1k7CisKKyAgLyogQ2xlYXIgaW50ZXJydXB0cyAqLworICBfX0hBTF9UU0NfRElTQUJMRV9JVChodHNjLCAoVFNDX0lUX0VPQSB8IFRTQ19JVF9NQ0UpKTsKKworICAvKiBDbGVhciBmbGFncyAqLworICBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhodHNjLCAoVFNDX0ZMQUdfRU9BIHwgVFNDX0ZMQUdfTUNFKSk7CisKKyAgLyogU2V0IHRvdWNoIHNlbnNpbmcgSU9zIG5vdCBhY3F1aXJlZCB0byB0aGUgc3BlY2lmaWVkIElPRGVmYXVsdE1vZGUgKi8KKyAgaWYgKGh0c2MtPkluaXQuSU9EZWZhdWx0TW9kZSA9PSBUU0NfSU9ERUZfT1VUX1BQX0xPVykKKyAgeworICAgIF9fSEFMX1RTQ19TRVRfSU9ERUZfT1VUUFBMT1coaHRzYyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgX19IQUxfVFNDX1NFVF9JT0RFRl9JTkZMT0FUKGh0c2MpOworICB9CisKKyAgLyogTGF1bmNoIHRoZSBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RBUlRfQUNRKGh0c2MpOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgYWNxdWlzaXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfU3RhcnRfSVQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfTUNFX0lUKGh0c2MtPkluaXQuTWF4Q291bnRJbnRlcnJ1cHQpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIGVuZCBvZiBhY3F1aXNpdGlvbiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVFNDX0VOQUJMRV9JVChodHNjLCBUU0NfSVRfRU9BKTsKKworICAvKiBFbmFibGUgbWF4IGNvdW50IGVycm9yIGludGVycnVwdCAob3B0aW9uYWwpICovCisgIGlmICgoRnVuY3Rpb25hbFN0YXRlKWh0c2MtPkluaXQuTWF4Q291bnRJbnRlcnJ1cHQgPT0gRU5BQkxFKQorICB7CisgICAgX19IQUxfVFNDX0VOQUJMRV9JVChodHNjLCBUU0NfSVRfTUNFKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBfX0hBTF9UU0NfRElTQUJMRV9JVChodHNjLCBUU0NfSVRfTUNFKTsKKyAgfQorCisgIC8qIENsZWFyIGZsYWdzICovCisgIF9fSEFMX1RTQ19DTEVBUl9GTEFHKGh0c2MsIChUU0NfRkxBR19FT0EgfCBUU0NfRkxBR19NQ0UpKTsKKworICAvKiBTZXQgdG91Y2ggc2Vuc2luZyBJT3Mgbm90IGFjcXVpcmVkIHRvIHRoZSBzcGVjaWZpZWQgSU9EZWZhdWx0TW9kZSAqLworICBpZiAoaHRzYy0+SW5pdC5JT0RlZmF1bHRNb2RlID09IFRTQ19JT0RFRl9PVVRfUFBfTE9XKQorICB7CisgICAgX19IQUxfVFNDX1NFVF9JT0RFRl9PVVRQUExPVyhodHNjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBfX0hBTF9UU0NfU0VUX0lPREVGX0lORkxPQVQoaHRzYyk7CisgIH0KKworICAvKiBMYXVuY2ggdGhlIGFjcXVpc2l0aW9uICovCisgIF9fSEFMX1RTQ19TVEFSVF9BQ1EoaHRzYyk7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHRzYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIGFjcXVpc2l0aW9uIHByZXZpb3VzbHkgbGF1bmNoZWQgaW4gcG9sbGluZyBtb2RlLgorICAqIEBwYXJhbSAgaHRzYyBQb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfU3RvcChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIC8qIFN0b3AgdGhlIGFjcXVpc2l0aW9uICovCisgIF9fSEFMX1RTQ19TVE9QX0FDUShodHNjKTsKKworICAvKiBTZXQgdG91Y2ggc2Vuc2luZyBJT3MgaW4gbG93IHBvd2VyIG1vZGUgKG91dHB1dCBwdXNoLXB1bGwpICovCisgIF9fSEFMX1RTQ19TRVRfSU9ERUZfT1VUUFBMT1coaHRzYyk7CisKKyAgLyogQ2xlYXIgZmxhZ3MgKi8KKyAgX19IQUxfVFNDX0NMRUFSX0ZMQUcoaHRzYywgKFRTQ19GTEFHX0VPQSB8IFRTQ19GTEFHX01DRSkpOworCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBhY3F1aXNpdGlvbiBwcmV2aW91c2x5IGxhdW5jaGVkIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRzYyBQb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfU3RvcF9JVChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIC8qIFN0b3AgdGhlIGFjcXVpc2l0aW9uICovCisgIF9fSEFMX1RTQ19TVE9QX0FDUShodHNjKTsKKworICAvKiBTZXQgdG91Y2ggc2Vuc2luZyBJT3MgaW4gbG93IHBvd2VyIG1vZGUgKG91dHB1dCBwdXNoLXB1bGwpICovCisgIF9fSEFMX1RTQ19TRVRfSU9ERUZfT1VUUFBMT1coaHRzYyk7CisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisgIF9fSEFMX1RTQ19ESVNBQkxFX0lUKGh0c2MsIChUU0NfSVRfRU9BIHwgVFNDX0lUX01DRSkpOworCisgIC8qIENsZWFyIGZsYWdzICovCisgIF9fSEFMX1RTQ19DTEVBUl9GTEFHKGh0c2MsIChUU0NfRkxBR19FT0EgfCBUU0NfRkxBR19NQ0UpKTsKKworICAvKiBDaGFuZ2UgVFNDIHN0YXRlICovCisgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodHNjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgYWNxdWlzaXRpb24gYW5kIHdhaXQgdW50aWwgY29tcGxldGlvbi4KKyAgKiBAbm90ZSAgIFRoZXJlIGlzIG5vIG5lZWQgb2YgYSB0aW1lb3V0IHBhcmFtZXRlciBhcyB0aGUgbWF4IGNvdW50IGVycm9yIGlzIGFscmVhZHkKKyAgKiAgICAgICAgIG1hbmFnZWQgYnkgdGhlIFRTQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHRzYyBQb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19Qb2xsRm9yQWNxdWlzaXRpb24oVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodHNjKTsKKworICAvKiBDaGVjayBlbmQgb2YgYWNxdWlzaXRpb24gKi8KKyAgd2hpbGUgKEhBTF9UU0NfR2V0U3RhdGUoaHRzYykgPT0gSEFMX1RTQ19TVEFURV9CVVNZKQorICB7CisgICAgLyogVGhlIHRpbWVvdXQgKG1heCBjb3VudCBlcnJvcikgaXMgbWFuYWdlZCBieSB0aGUgVFNDIHBlcmlwaGVyYWwgaXRzZWxmLiAqLworICB9CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHRzYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGFjcXVpc2l0aW9uIHN0YXR1cyBmb3IgYSBncm91cC4KKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHBhcmFtICBneF9pbmRleCBJbmRleCBvZiB0aGUgZ3JvdXAKKyAgKiBAcmV0dmFsIEdyb3VwIHN0YXR1cworICAqLworVFNDX0dyb3VwU3RhdHVzVHlwZURlZiBIQUxfVFNDX0dyb3VwR2V0U3RhdHVzKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjLCB1aW50MzJfdCBneF9pbmRleCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19HUk9VUF9JTkRFWChneF9pbmRleCkpOworCisgIC8qIFJldHVybiB0aGUgZ3JvdXAgc3RhdHVzICovCisgIHJldHVybiAoX19IQUxfVFNDX0dFVF9HUk9VUF9TVEFUVVMoaHRzYywgZ3hfaW5kZXgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGFjcXVpc2l0aW9uIG1lYXN1cmUgZm9yIGEgZ3JvdXAuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgZ3hfaW5kZXggSW5kZXggb2YgdGhlIGdyb3VwCisgICogQHJldHZhbCBBY3F1aXNpdGlvbiBtZWFzdXJlCisgICovCit1aW50MzJfdCBIQUxfVFNDX0dyb3VwR2V0VmFsdWUoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MsIHVpbnQzMl90IGd4X2luZGV4KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0FMTF9JTlNUQU5DRShodHNjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0dST1VQX0lOREVYKGd4X2luZGV4KSk7CisKKyAgLyogUmV0dXJuIHRoZSBncm91cCBhY3F1aXNpdGlvbiBjb3VudGVyICovCisgIHJldHVybiBodHNjLT5JbnN0YW5jZS0+SU9HWENSW2d4X2luZGV4XTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSBUU0MgSU9zCisgICAgICAoKykgRGlzY2hhcmdlIFRTQyBJT3MKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRTQyBJT3MuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgY29uZmlnIFBvaW50ZXIgdG8gdGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19JT0NvbmZpZyhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgVFNDX0lPQ29uZmlnVHlwZURlZiAqY29uZmlnKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0FMTF9JTlNUQU5DRShodHNjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0dST1VQKGNvbmZpZy0+Q2hhbm5lbElPcykpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0dST1VQKGNvbmZpZy0+U2hpZWxkSU9zKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfR1JPVVAoY29uZmlnLT5TYW1wbGluZ0lPcykpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRzYyk7CisKKyAgLyogU3RvcCBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RPUF9BQ1EoaHRzYyk7CisKKyAgLyogRGlzYWJsZSBTY2htaXR0IHRyaWdnZXIgaHlzdGVyZXNpcyBvbiBhbGwgdXNlZCBUU0MgSU9zICovCisgIGh0c2MtPkluc3RhbmNlLT5JT0hDUiA9ICh1aW50MzJfdCkofihjb25maWctPkNoYW5uZWxJT3MgfCBjb25maWctPlNoaWVsZElPcyB8IGNvbmZpZy0+U2FtcGxpbmdJT3MpKTsKKworICAvKiBTZXQgY2hhbm5lbCBhbmQgc2hpZWxkIElPcyAqLworICBodHNjLT5JbnN0YW5jZS0+SU9DQ1IgPSAoY29uZmlnLT5DaGFubmVsSU9zIHwgY29uZmlnLT5TaGllbGRJT3MpOworCisgIC8qIFNldCBzYW1wbGluZyBJT3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklPU0NSID0gY29uZmlnLT5TYW1wbGluZ0lPczsKKworICAvKiBTZXQgZ3JvdXBzIHRvIGJlIGFjcXVpcmVkICovCisgIGh0c2MtPkluc3RhbmNlLT5JT0dDU1IgPSBUU0NfZXh0cmFjdF9ncm91cHMoY29uZmlnLT5DaGFubmVsSU9zKTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodHNjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzY2hhcmdlIFRTQyBJT3MuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgY2hvaWNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0lPRGlzY2hhcmdlKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjLCB1aW50MzJfdCBjaG9pY2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodHNjKTsKKworICBpZiAoKEZ1bmN0aW9uYWxTdGF0ZSljaG9pY2UgPT0gRU5BQkxFKQorICB7CisgICAgX19IQUxfVFNDX1NFVF9JT0RFRl9PVVRQUExPVyhodHNjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBfX0hBTF9UU0NfU0VUX0lPREVGX0lORkxPQVQoaHRzYyk7CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodHNjKTsKKworICAvKiBSZXR1cm4gdGhlIGdyb3VwIGFjcXVpc2l0aW9uIGNvdW50ZXIgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvCisgICAgICAoKykgR2V0IFRTQyBzdGF0ZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRTQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVFNDX1N0YXRlVHlwZURlZiBIQUxfVFNDX0dldFN0YXRlKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0FMTF9JTlNUQU5DRShodHNjLT5JbnN0YW5jZSkpOworCisgIGlmIChodHNjLT5TdGF0ZSA9PSBIQUxfVFNDX1NUQVRFX0JVU1kpCisgIHsKKyAgICAvKiBDaGVjayBlbmQgb2YgYWNxdWlzaXRpb24gZmxhZyAqLworICAgIGlmIChfX0hBTF9UU0NfR0VUX0ZMQUcoaHRzYywgVFNDX0ZMQUdfRU9BKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBDaGVjayBtYXggY291bnQgZXJyb3IgZmxhZyAqLworICAgICAgaWYgKF9fSEFMX1RTQ19HRVRfRkxBRyhodHNjLCBUU0NfRkxBR19NQ0UpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICAvKiBDaGFuZ2UgVFNDIHN0YXRlICovCisgICAgICAgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQ2hhbmdlIFRTQyBzdGF0ZSAqLworICAgICAgICBodHNjLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfUkVBRFk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIFRTQyBzdGF0ZSAqLworICByZXR1cm4gaHRzYy0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0lSUV9IYW5kbGVyX2FuZF9DYWxsYmFja3MgSVJRIEhhbmRsZXIgYW5kIENhbGxiYWNrcworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBUU0MgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfVFNDX0lSUUhhbmRsZXIoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIGVuZCBvZiBhY3F1aXNpdGlvbiBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfVFNDX0dFVF9GTEFHKGh0c2MsIFRTQ19GTEFHX0VPQSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDbGVhciBFT0EgZmxhZyAqLworICAgIF9fSEFMX1RTQ19DTEVBUl9GTEFHKGh0c2MsIFRTQ19GTEFHX0VPQSk7CisgIH0KKworICAvKiBDaGVjayBpZiBtYXggY291bnQgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1RTQ19HRVRfRkxBRyhodHNjLCBUU0NfRkxBR19NQ0UpICE9IFJFU0VUKQorICB7CisgICAgLyogQ2xlYXIgTUNFIGZsYWcgKi8KKyAgICBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhodHNjLCBUU0NfRkxBR19NQ0UpOworICAgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgICBodHNjLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfRVJST1I7CisjaWYgKFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGh0c2MtPkVycm9yQ2FsbGJhY2soaHRzYyk7CisjZWxzZQorICAgIC8qIENvbnZlcnNpb24gY29tcGxldGVkIGNhbGxiYWNrICovCisgICAgSEFMX1RTQ19FcnJvckNhbGxiYWNrKGh0c2MpOworI2VuZGlmIC8qIFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgICBodHNjLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfUkVBRFk7CisjaWYgKFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGh0c2MtPkNvbnZDcGx0Q2FsbGJhY2soaHRzYyk7CisjZWxzZQorICAgIC8qIENvbnZlcnNpb24gY29tcGxldGVkIGNhbGxiYWNrICovCisgICAgSEFMX1RTQ19Db252Q3BsdENhbGxiYWNrKGh0c2MpOworI2VuZGlmIC8qIFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQWNxdWlzaXRpb24gY29tcGxldGVkIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHRzYyBQb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9UU0NfQ29udkNwbHRDYWxsYmFjayhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRzYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9UU0NfQ29udkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBFcnJvciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVFNDX0Vycm9yQ2FsbGJhY2soVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0c2MpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVFNDX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRTQ19Qcml2YXRlX0Z1bmN0aW9ucyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIHRvIHNldCB0aGUgYWNxdWlyZWQgZ3JvdXBzIG1hc2suCisgICogQHBhcmFtICBpb21hc2sgQ2hhbm5lbHMgSU9zIG1hc2sKKyAgKiBAcmV0dmFsIEFjcXVpcmVkIGdyb3VwcyBtYXNrCisgICovCitzdGF0aWMgdWludDMyX3QgVFNDX2V4dHJhY3RfZ3JvdXBzKHVpbnQzMl90IGlvbWFzaykKK3sKKyAgdWludDMyX3QgZ3JvdXBzID0gMFVMOworICB1aW50MzJfdCBpZHg7CisKKyAgZm9yIChpZHggPSAwVUw7IGlkeCA8ICh1aW50MzJfdClUU0NfTkJfT0ZfR1JPVVBTOyBpZHgrKykKKyAgeworICAgIGlmICgoaW9tYXNrICYgKDB4MEZVTCA8PCAoaWR4ICogNFVMKSkpICE9IDBVTCApCisgICAgeworICAgICAgZ3JvdXBzIHw9ICgxVUwgPDwgaWR4KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZ3JvdXBzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1RTQ19NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVFNDICovCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfdWFydC5jIGIvU3JjL3N0bTMybDB4eF9oYWxfdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOWQyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2hhbF91YXJ0LmMKQEAgLTAsMCArMSwzNjgyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF91YXJ0LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFVBUlQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciBUcmFuc21pdHRlciBQZXJpcGhlcmFsIChVQVJUKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGUgVUFSVCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIFVBUlRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gVUFSVF9IYW5kbGVUeXBlRGVmIGh1YXJ0KS4KKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVUFSVCBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1VBUlRfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIFVTQVJUeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgrKykgVUFSVCBwaW5zIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgVUFSVCBHUElPcy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBVQVJUIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCisgICAgICAgICgrKykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1VBUlRfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgIGFuZCBIQUxfVUFSVF9SZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlQgSVJRIGhhbmRsZS4KKyAgICAgICAgKCsrKSBVQVJUIGludGVycnVwdHMgaGFuZGxpbmc6CisgICAgICAgICAgICAgIC1AQC0gIFRoZSBzcGVjaWZpYyBVQVJUIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQsIFJYL1RYIEZJRk9zIHJlbGF0ZWQgaW50ZXJydXB0cyBhbmQgRXJyb3IgSW50ZXJydXB0cykKKyAgICAgICAgICAgICAgICBhcmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zIF9fSEFMX1VBUlRfRU5BQkxFX0lUKCkgYW5kIF9fSEFMX1VBUlRfRElTQUJMRV9JVCgpCisgICAgICAgICAgICAgICAgaW5zaWRlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzZXMuCisgICAgICAgICgrKykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfVUFSVF9UcmFuc21pdF9ETUEoKQorICAgICAgICAgICAgIGFuZCBIQUxfVUFSVF9SZWNlaXZlX0RNQSgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBVQVJUIERNQSBUeC9SeCBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlIERNQSBUeC9SeCBjaGFubmVsLgorCisgICAgKCMpIFByb2dyYW0gdGhlIEJhdWQgUmF0ZSwgV29yZCBMZW5ndGgsIFN0b3AgQml0LCBQYXJpdHksIEhhcmR3YXJlCisgICAgICAgIGZsb3cgY29udHJvbCBhbmQgTW9kZSAoUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpIGluIHRoZSBodWFydCBoYW5kbGUgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSWYgcmVxdWlyZWQsIHByb2dyYW0gVUFSVCBhZHZhbmNlZCBmZWF0dXJlcyAoVFgvUlggcGlucyBzd2FwLCBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24sLi4uKQorICAgICAgICBpbiB0aGUgaHVhcnQgaGFuZGxlIEFkdmFuY2VkSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIGFzeW5jaHJvbm91cyBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycyBieSBjYWxsaW5nCisgICAgICAgIHRoZSBIQUxfVUFSVF9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBIYWxmIGR1cGxleCBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycyBieSBjYWxsaW5nCisgICAgICAgIHRoZSBIQUxfSGFsZkR1cGxleF9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBMSU4gKExvY2FsIEludGVyY29ubmVjdGlvbiBOZXR3b3JrKSBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycworICAgICAgICBieSBjYWxsaW5nIHRoZSBIQUxfTElOX0luaXQoKSBBUEkuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIE11bHRpcHJvY2Vzc29yIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzCisgICAgICAgIGJ5IGNhbGxpbmcgdGhlIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBSUzQ4NSBEcml2ZXIgRW5hYmxlZCBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycworICAgICAgICBieSBjYWxsaW5nIHRoZSBIQUxfUlM0ODVFeF9Jbml0KCkgQVBJLgorCisgICAgWy4uXQorICAgIChAKSBUaGVzZSBBUEkncyAoSEFMX1VBUlRfSW5pdCgpLCBIQUxfSGFsZkR1cGxleF9Jbml0KCksIEhBTF9MSU5fSW5pdCgpLCBIQUxfTXVsdGlQcm9jZXNzb3JfSW5pdCgpLAorICAgICAgICBhbHNvIGNvbmZpZ3VyZSB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpIGJ5CisgICAgICAgIGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1VBUlRfTXNwSW5pdCgpIEFQSS4KKworICAgICMjIyMjIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAjIyMjIworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFsuLl0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgICBbLi5dCisgICAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjay4KKyAgICBGdW5jdGlvbiBAcmVmIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgOiBXYWtldXAgQ2FsbGJhY2suCisgICAgKCspIFJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgOiBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2suCisgICAgKCspIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgOiBUeCBGaWZvIEVtcHR5IENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVUFSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVUFSVCBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLgorICAgIEByZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgOiBXYWtldXAgQ2FsbGJhY2suCisgICAgKCspIFJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgOiBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2suCisgICAgKCspIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgOiBUeCBGaWZvIEVtcHR5IENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVUFSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVUFSVCBNc3BEZUluaXQuCisKKyAgICBbLi5dCisgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX1VBUlRfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfVUFSVF9TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZXMgQHJlZiBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaygpLCBAcmVmIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjaygpLgorICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQorICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9VQVJUX0luaXQoKQorICAgIGFuZCBAcmVmIEhBTF9VQVJUX0RlSW5pdCgpIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfVUFSVF9Jbml0KCkgYW5kIEByZWYgSEFMX1VBUlRfRGVJbml0KCkKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1VBUlRfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgIGluIEhBTF9VQVJUX1NUQVRFX1JFQURZIG9yIEhBTF9VQVJUX1NUQVRFX1JFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpCisgICAgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgIHVzaW5nIEByZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1VBUlRfRGVJbml0KCkKKyAgICBvciBAcmVmIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCisKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUIFVBUlQKKyAgKiBAYnJpZWYgSEFMIFVBUlQgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9Qcml2YXRlX0NvbnN0YW50cyBVQVJUIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX0ZJRUxEUyAgKCh1aW50MzJfdCkoVVNBUlRfQ1IxX00gfCBVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfT1ZFUjggKSkgLyohPCBVQVJUIG9yIFVTQVJUIENSMSBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgVUFSVF9TZXRDb25maWcgQVBJICovCisKKyNkZWZpbmUgVVNBUlRfQ1IzX0ZJRUxEUyAgKCh1aW50MzJfdCkoVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSB8IFVTQVJUX0NSM19PTkVCSVQpKSAgLyohPCBVQVJUIG9yIFVTQVJUIENSMyBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgVUFSVF9TZXRDb25maWcgQVBJICovCisKKyNkZWZpbmUgTFBVQVJUX0JSUl9NSU4gIDB4MDAwMDAzMDBVICAvKiBMUFVBUlQgQlJSIG1pbmltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworI2RlZmluZSBMUFVBUlRfQlJSX01BWCAgMHgwMDBGRkZGRlUgIC8qIExQVUFSVCBCUlIgbWF4aW11bSBhdXRob3JpemVkIHZhbHVlICovCisKKyNkZWZpbmUgVUFSVF9CUlJfTUlOICAgIDB4MTBVICAgICAgICAvKiBVQVJUIEJSUiBtaW5pbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKyNkZWZpbmUgVUFSVF9CUlJfTUFYICAgIDB4MDAwMEZGRkZVICAvKiBVQVJUIEJSUiBtYXhpbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVBUlRfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCitzdGF0aWMgdm9pZCBVQVJUX0VuZFR4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0VuZFJ4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVBUlRfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfOEJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0VuZFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9SeElTUl8xNkJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVUFSVCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4IG9yIHRoZSBVQVJUeQorICAgIGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAgICAgKCspIEZvciB0aGUgYXN5bmNocm9ub3VzIG1vZGUgdGhlIHBhcmFtZXRlcnMgYmVsb3cgY2FuIGJlIGNvbmZpZ3VyZWQ6CisgICAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAgICgrKykgV29yZCBMZW5ndGgKKyAgICAgICAgKCsrKSBTdG9wIEJpdAorICAgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgICBpbiB0aGUgZGF0YSByZWdpc3RlciBpcyB0cmFuc21pdHRlZCBidXQgaXMgY2hhbmdlZCBieSB0aGUgcGFyaXR5IGJpdC4KKyAgICAgICAgKCsrKSBIYXJkd2FyZSBmbG93IGNvbnRyb2wKKyAgICAgICAgKCsrKSBSZWNlaXZlci90cmFuc21pdHRlciBtb2RlcworICAgICAgICAoKyspIE92ZXIgU2FtcGxpbmcgTWV0aG9kCisgICAgICAgICgrKykgT25lLUJpdCBTYW1wbGluZyBNZXRob2QKKyAgICAgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGFkdmFuY2VkIGZlYXR1cmVzIGNhbiBiZSBjb25maWd1cmVkIGFzIHdlbGw6CisgICAgICAgICgrKykgVFggYW5kL29yIFJYIHBpbiBsZXZlbCBpbnZlcnNpb24KKyAgICAgICAgKCsrKSBkYXRhIGxvZ2ljYWwgbGV2ZWwgaW52ZXJzaW9uCisgICAgICAgICgrKykgUlggYW5kIFRYIHBpbnMgc3dhcAorICAgICAgICAoKyspIFJYIG92ZXJydW4gZGV0ZWN0aW9uIGRpc2FibGluZworICAgICAgICAoKyspIERNQSBkaXNhYmxpbmcgb24gUlggZXJyb3IKKyAgICAgICAgKCsrKSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lCisgICAgICAgICgrKykgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uCisgICAgWy4uXQorICAgIFRoZSBIQUxfVUFSVF9Jbml0KCksIEhBTF9IYWxmRHVwbGV4X0luaXQoKSwgSEFMX0xJTl9Jbml0KClhbmQgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKUFQSQorICAgIGZvbGxvdyByZXNwZWN0aXZlbHkgdGhlIFVBUlQgYXN5bmNocm9ub3VzLCBVQVJUIEhhbGYgZHVwbGV4LCBVQVJUIExJTiBtb2RlCisgICAgYW5kIFVBUlQgbXVsdGlwcm9jZXNzb3IgbW9kZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmVzCisgICAgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBmcmFtZSBsZW5ndGggZGVmaW5lZCBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LAorICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVQVJUIGZvcm1hdHMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgZm9sbG93aW5nIHRhYmxlLgorCisgIFRhYmxlIDEuIFVBUlQgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICBNMSBiaXQgfCAgTTAgYml0IHwgIFBDRSBiaXQgIHwgICAgICAgICAgICAgVUFSVCBmcmFtZSAgICAgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDkgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDYgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFVBUlQgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChodWFydC0+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+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1dBS0VVUF9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5XYWtldXBDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBVQVJUIENhbGxiYWNrCisgICogICAgICAgICBVQVJUIGNhbGxhYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh1YXJ0IHVhcnQgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgV2FrZXVwIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgUnggRmlmbyBGdWxsIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBpZiAoSEFMX1VBUlRfU1RBVEVfUkVBRFkgPT0gaHVhcnQtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5UeENwbHRDYWxsYmFjayA9IEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfRVJST1JfQ0JfSUQgOgorICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayA9IEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgOgorICAgICAgICBodWFydC0+V2FrZXVwQ2FsbGJhY2sgPSBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9VQVJUX1NUQVRFX1JFU0VUID09IGh1YXJ0LT5nU3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgVUFSVCBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgVUFSVCBhc3luY2hyb25vdXMKKyAgICBhbmQgSGFsZiBkdXBsZXggZGF0YSB0cmFuc2ZlcnMuCisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlIG9mIHRyYW5zZmVyOgorICAgICAgICgrKSBCbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgaW4gcG9sbGluZyBtb2RlLgorICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKykgTm9uLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgIG9yIERNQSwgVGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgZGVkaWNhdGVkIFVBUlQgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbgorICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgVGhlIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgUmVjZWl2ZSBwcm9jZXNzCisgICAgICAgICAgIFRoZSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBCbG9ja2luZyBtb2RlIEFQSSdzIGFyZSA6CisgICAgICAgICgrKSBIQUxfVUFSVF9UcmFuc21pdCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9SZWNlaXZlKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAoKykgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKykgSEFMX1VBUlRfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9JUlFIYW5kbGVyKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKykgSEFMX1VBUlRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0RNQVBhdXNlKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0RNQVJlc3VtZSgpCisgICAgICAgICgrKSBIQUxfVUFSVF9ETUFTdG9wKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIE5vbl9CbG9ja2luZyBtb2RlOgorICAgICAgICAoKykgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMgY291bGQgYmUgYWJvcnRlZCB1c2luZyBBYm9ydCBBUEkncyA6CisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0KCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZSgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydF9JVCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9VQVJUX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAoKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcworICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgorICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKKyAgICAgICAgICAgYW5kIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gVUFSVCBzaWRlLgorICAgICAgICAgICBJZiB1c2VyIHdhbnRzIHRvIGFib3J0IGl0LCBBYm9ydCBzZXJ2aWNlcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHVzZXIuCisgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICBUaGlzIGNvbmNlcm5zIE92ZXJydW4gRXJyb3IgSW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIGFuZCBhbGwgZXJyb3JzIGluIERNQSBtb2RlLgorICAgICAgICAgICBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsIGFuZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4KKworICAgIC1ALSBJbiB0aGUgSGFsZiBkdXBsZXggY29tbXVuaWNhdGlvbiwgaXQgaXMgZm9yYmlkZGVuIHRvIHJ1biB0aGUgdHJhbnNtaXQKKyAgICAgICAgYW5kIHJlY2VpdmUgcHJvY2VzcyBpbiBwYXJhbGxlbCwgdGhlIFVBUlQgc3RhdGUgSEFMX1VBUlRfU1RBVEVfQlVTWV9UWF9SWCBjYW4ndCBiZSB1c2VmdWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlciBjb250YWluaW5nIGRhdGEgdG8gYmUgc2VudCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgc2VudCBkYXRhIHdpbGwgYmUgaGFuZGxlZCB1c2luZyB1MTYgcG9pbnRlciBjYXN0KS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBEYXRhLgorICAqIEBwYXJhbSBodWFydCAgIFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgICAgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQ4X3QgICpwZGF0YThiaXRzOworICB1aW50MTZfdCAqcGRhdGExNmJpdHM7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBEYXRhIGJ1ZmZlciBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSBmaWxsZWQgaW50byBURFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDEpICE9IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGh1YXJ0LT5UeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgICAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHBkYXRhOGJpdHMgID0gTlVMTDsKKyAgICAgIHBkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBEYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcGRhdGE4Yml0cyAgPSBwRGF0YTsKKyAgICAgIHBkYXRhMTZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAoaHVhcnQtPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVUFSVF9GTEFHX1RYRSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICBpZiAocGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50MTZfdCkoKnBkYXRhMTZiaXRzICYgMHgwMUZGVSk7CisgICAgICAgIHBkYXRhMTZiaXRzKys7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpwZGF0YThiaXRzICYgMHhGRlUpOworICAgICAgICBwZGF0YThiaXRzKys7CisgICAgICB9CisgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisKKyAgICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVQVJUX0ZMQUdfVEMsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVyIGZvciBzdG9yaW5nIGRhdGEgdG8gYmUgcmVjZWl2ZWQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHJlY2VpdmVkIGRhdGEgd2lsbCBiZSBoYW5kbGVkIHVzaW5nIHUxNiBwb2ludGVyIGNhc3QpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcERhdGEuCisgICogQHBhcmFtIGh1YXJ0ICAgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIHBEYXRhICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSAgICBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDhfdCAgKnBkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwZGF0YTE2Yml0czsKKyAgdWludDE2X3QgdWhNYXNrOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIHRvIGJlIHJlY2VpdmVkIGZyb20gUkRSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIHRocm91Z2ggYSB1MTYgY2FzdC4gKi8KKyAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIGlmICgoKCh1aW50MzJfdClwRGF0YSkgJiAxKSAhPSAwKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaHVhcnQtPlJ4WGZlclNpemUgID0gU2l6ZTsKKyAgICBodWFydC0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ29tcHV0YXRpb24gb2YgVUFSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVBUlRfTUFTS19DT01QVVRBVElPTihodWFydCk7CisgICAgdWhNYXNrID0gaHVhcnQtPk1hc2s7CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFJ4RGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgdWludDE2X3QgcG9pbnRlciAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgcGRhdGE4Yml0cyAgPSBOVUxMOworICAgICAgcGRhdGExNmJpdHMgPSAodWludDE2X3QgKikgcERhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwZGF0YThiaXRzICA9IHBEYXRhOworICAgICAgcGRhdGExNmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIC8qIGFzIGxvbmcgYXMgZGF0YSBoYXZlIHRvIGJlIHJlY2VpdmVkICovCisgICAgd2hpbGUgKGh1YXJ0LT5SeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVBUlRfRkxBR19SWE5FLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIGlmIChwZGF0YThiaXRzID09IE5VTEwpCisgICAgICB7CisgICAgICAgICpwZGF0YTE2Yml0cyA9ICh1aW50MTZfdCkoaHVhcnQtPkluc3RhbmNlLT5SRFIgJiB1aE1hc2spOworICAgICAgICBwZGF0YTE2Yml0cysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqcGRhdGE4Yml0cyA9ICh1aW50OF90KShodWFydC0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KXVoTWFzayk7CisgICAgICAgIHBkYXRhOGJpdHMrKzsKKyAgICAgIH0KKyAgICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOworICAgIH0KKworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlciBjb250YWluaW5nIGRhdGEgdG8gYmUgc2VudCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgc2VudCBkYXRhIHdpbGwgYmUgaGFuZGxlZCB1c2luZyB1MTYgcG9pbnRlciBjYXN0KS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBEYXRhLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIHRvIGJlIGZpbGxlZCBpbnRvIFREUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcERhdGEpICYgMSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5wVHhCdWZmUHRyICA9IHBEYXRhOworICAgIGh1YXJ0LT5UeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgICBodWFydC0+VHhJU1IgICAgICAgPSBOVUxMOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBTZXQgdGhlIFR4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaHVhcnQtPlR4SVNSID0gVUFSVF9UeElTUl8xNkJJVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh1YXJ0LT5UeElTUiA9IFVBUlRfVHhJU1JfOEJJVDsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgIC8qIEVuYWJsZSB0aGUgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBpbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlciBmb3Igc3RvcmluZyBkYXRhIHRvIGJlIHJlY2VpdmVkLCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIGhhbGYgd29yZCBmcm9udGllciAoMTYgYml0cykKKyAgKiAgICAgICAgIChhcyByZWNlaXZlZCBkYXRhIHdpbGwgYmUgaGFuZGxlZCB1c2luZyB1MTYgcG9pbnRlciBjYXN0KS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBEYXRhLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBEYXRhIGJ1ZmZlciBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSByZWNlaXZlZCBmcm9tIFJEUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcERhdGEpICYgMSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5wUnhCdWZmUHRyICA9IHBEYXRhOworICAgIGh1YXJ0LT5SeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgICBodWFydC0+UnhJU1IgICAgICAgPSBOVUxMOworCisgICAgLyogQ29tcHV0YXRpb24gb2YgVUFSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVBUlRfTUFTS19DT01QVVRBVElPTihodWFydCk7CisKKyAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogU2V0IHRoZSBSeCBJU1IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgd29yZCBsZW5ndGggKi8KKyAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfMTZCSVQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodWFydC0+UnhJU1IgPSBVQVJUX1J4SVNSXzhCSVQ7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIGludGVycnVwdCBhbmQgRGF0YSBSZWdpc3RlciBOb3QgRW1wdHkgaW50ZXJydXB0ICovCisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfUlhORUlFKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgYnkgRE1BIGZyb20gaGFsZndvcmQgZnJvbnRpZXIpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcERhdGEuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXRfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIGNvcHkgaW50byBURFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgYnkgRE1BIGZyb20gYSB1MTYgZnJvbnRpZXIuICovCisgICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcERhdGEpICYgMSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5wVHhCdWZmUHRyICA9IHBEYXRhOworICAgIGh1YXJ0LT5UeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYOworCisgICAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gVUFSVF9ETUFUcmFuc21pdENwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVQVJUX0RNQVR4SGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFVBUlRfRE1BRXJyb3I7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGFib3J0IGNhbGxiYWNrICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCB0cmFuc21pdCBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHVhcnQtPmhkbWF0eCwgKHVpbnQzMl90KWh1YXJ0LT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmh1YXJ0LT5JbnN0YW5jZS0+VERSLCBTaXplKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfRE1BOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgICAgICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gcmVhZHkgKi8KKyAgICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIENsZWFyIHRoZSBUQyBmbGFnIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfVENGKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIFVBUlQgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBjb250YWluCisgICogICAgICAgICB0aGUgcGFyaXR5IGJpdCAoTVNCIHBvc2l0aW9uKS4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVyIGZvciBzdG9yaW5nIGRhdGEgdG8gYmUgcmVjZWl2ZWQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHJlY2VpdmVkIGRhdGEgd2lsbCBiZSBoYW5kbGVkIGJ5IERNQSBmcm9tIGhhbGZ3b3JkIGZyb250aWVyKS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBEYXRhLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW1ldGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgY29weSBmcm9tIFJEUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCBieSBETUEgZnJvbSBhIHUxNiBmcm9udGllci4gKi8KKyAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIGlmICgoKCh1aW50MzJfdClwRGF0YSkgJiAxKSAhPSAwKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgICAgaHVhcnQtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBodWFydC0+UnhYZmVyU2l6ZSA9IFNpemU7CisKKyAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlg7CisKKyAgICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBVQVJUX0RNQVJlY2VpdmVDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVUFSVF9ETUFSeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVQVJUX0RNQUVycm9yOworCisgICAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodWFydC0+aGRtYXJ4LCAodWludDMyX3QpJmh1YXJ0LT5JbnN0YW5jZS0+UkRSLCAodWludDMyX3QpaHVhcnQtPnBSeEJ1ZmZQdHIsIFNpemUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byByZWFkeSAqLworICAgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUGF1c2UgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFQYXVzZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICBjb25zdCBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgZ3N0YXRlID0gaHVhcnQtPmdTdGF0ZTsKKyAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIHJ4c3RhdGUgPSBodWFydC0+UnhTdGF0ZTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpICYmCisgICAgICAoZ3N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgVHggcmVxdWVzdCAqLworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICB9CisgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgJiYKKyAgICAgIChyeHN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpKQorICB7CisgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCAqLworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFSZXN1bWUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBETUEgVHggcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIC8qIENsZWFyIHRoZSBPdmVycnVuIGZsYWcgYmVmb3JlIHJlc3VtaW5nIHRoZSBSeCB0cmFuc2ZlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGKTsKKworICAgIC8qIFJlZW5hYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgU3RvcCB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVN0b3AoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogVGhlIExvY2sgaXMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgQVBJIHRvIGFsbG93IHRoZSB1c2VyIGFwcGxpY2F0aW9uCisgICAgIHRvIGNhbGwgdGhlIEhBTCBVQVJUIEFQSSB1bmRlciBjYWxsYmFja3MgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soKSAvIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKCkgLworICAgICBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2sgLyBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2s6CisgICAgIGluZGVlZCwgd2hlbiBIQUxfRE1BX0Fib3J0KCkgQVBJIGlzIGNhbGxlZCwgdGhlIERNQSBUWC9SWCBUcmFuc2ZlciBvciBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlCisgICAgIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgaWYgdGhlIERNQSB0cmFuc2ZlciBpbnRlcnJ1cHRpb24gb2NjdXJzIGF0IHRoZSBtaWRkbGUgb3IgYXQgdGhlIGVuZCBvZgorICAgICB0aGUgc3RyZWFtIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjYWxsIGJhY2sgaXMgZXhlY3V0ZWQuICovCisKKyAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIGdzdGF0ZSA9IGh1YXJ0LT5nU3RhdGU7CisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7CisKKyAgLyogU3RvcCBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgorICAgICAgKGdzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVhcnQtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFVBUlRfRW5kVHhUcmFuc2ZlcihodWFydCk7CisgIH0KKworICAvKiBTdG9wIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpICYmCisgICAgICAocnhzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVhcnQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFVBUlRfRW5kUnhUcmFuc2ZlcihodWFydCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBEaXNhYmxlIFRYRUlFLCBUQ0lFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworCisgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFJlc2V0IEhhbmRsZSBFcnJvckNvZGUgdG8gTm8gRXJyb3IgKi8KKyAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFRyYW5zbWl0IHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSBhbmQgVENJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4KKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHVhcnQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihodWFydC0+aGRtYXR4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfRE1BOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLworICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsKKworCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBSeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVhcnQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gVUFSVCBIYW5kbGUsIERNQSBBYm9ydCBjb21wbGV0ZSBjYWxsYmFja3Mgc2hvdWxkIGJlIGluaXRpYWxpc2VkCisgICAgIGJlZm9yZSBhbnkgY2FsbCB0byBETUEgQWJvcnQgZnVuY3Rpb25zICovCisgIC8qIERNQSBUeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BVHhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorICAvKiBETUEgUnggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVQVJUX0RNQVJ4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICAvKiBEaXNhYmxlIERNQSBUeCBhdCBVQVJUIGxldmVsICovCisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgVHggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBVQVJUIFR4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBVQVJUIFJ4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYWJvcnRjcGx0ID0gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGlmIG5vIERNQSBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24gaXMgcmVxdWlyZWQgPT4gY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGlmIChhYm9ydGNwbHQgPT0gMVUpCisgIHsKKyAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENsZWFyIElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIGh1YXJ0LT5SeElTUiA9IE5VTEw7CisgICAgaHVhcnQtPlR4SVNSID0gTlVMTDsKKworICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7CisKKworICAgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoVHgpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BVHhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhodWFydC0+aGRtYXR4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgICAgaHVhcnQtPlR4SVNSID0gTlVMTDsKKworICAgICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIGh1YXJ0LT5UeElTUiA9IE5VTEw7CisKKworICAgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGh1YXJ0LT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBSZWNlaXZlIHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVQVJUX0RNQVJ4T25seUFib3J0Q2FsbGJhY2s7CisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHVhcnQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaHVhcnQtPmhkbWFyeCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBSeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVhcnQtPnBSeEJ1ZmZQdHIgPSBOVUxMOworCisgICAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgICAgICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgICAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAgICAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHVhcnQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgIGh1YXJ0LT5wUnhCdWZmUHRyID0gTlVMTDsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgICAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBIYW5kbGUgVUFSVCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9VQVJUX0lSUUhhbmRsZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDMyX3QgaXNyZmxhZ3MgICA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgY3IxaXRzICAgICA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgY3IzaXRzICAgICA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzKTsKKworICB1aW50MzJfdCBlcnJvcmZsYWdzOworICB1aW50MzJfdCBlcnJvcmNvZGU7CisKKyAgLyogSWYgbm8gZXJyb3Igb2NjdXJzICovCisgIGVycm9yZmxhZ3MgPSAoaXNyZmxhZ3MgJiAodWludDMyX3QpKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9PUkUgfCBVU0FSVF9JU1JfTkUpKTsKKyAgaWYgKGVycm9yZmxhZ3MgPT0gMFUpCisgIHsKKyAgICAvKiBVQVJUIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWE5FKSAhPSAwVSkKKyAgICAgICAgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSAwVSkpCisgICAgeworICAgICAgaWYgKGh1YXJ0LT5SeElTUiAhPSBOVUxMKQorICAgICAgeworICAgICAgICBodWFydC0+UnhJU1IoaHVhcnQpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIElmIHNvbWUgZXJyb3JzIG9jY3VyICovCisgIGlmICgoZXJyb3JmbGFncyAhPSAwVSkKKyAgICAgICYmICgoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKQorICAgICAgICAgIHx8ICgoY3IxaXRzICYgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpICE9IDBVKSkpCisgIHsKKyAgICAvKiBVQVJUIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUEUpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9QRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX1BFRik7CisKKyAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfUEU7CisgICAgfQorCisgICAgLyogVUFSVCBmcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0ZFKSAhPSAwVSkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfRkU7CisgICAgfQorCisgICAgLyogVUFSVCBub2lzZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX05FKSAhPSAwVSkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX05FRik7CisKKyAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfTkU7CisgICAgfQorCisgICAgLyogVUFSVCBPdmVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX09SRSkgIT0gMFUpCisgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IDBVKSB8fAorICAgICAgICAgICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpKQorICAgIHsKKyAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9PUkU7CisgICAgfQorCisgICAgLyogQ2FsbCBVQVJUIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoaHVhcnQtPkVycm9yQ29kZSAhPSBIQUxfVUFSVF9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIC8qIFVBUlQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORSkgIT0gMFUpCisgICAgICAgICAgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSAwVSkpCisgICAgICB7CisgICAgICAgIGlmIChodWFydC0+UnhJU1IgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGh1YXJ0LT5SeElTUihodWFydCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogSWYgT3ZlcnJ1biBlcnJvciBvY2N1cnMsIG9yIGlmIGFueSBlcnJvciBvY2N1cnMgaW4gRE1BIG1vZGUgcmVjZXB0aW9uLAorICAgICAgICAgY29uc2lkZXIgZXJyb3IgYXMgYmxvY2tpbmcgKi8KKyAgICAgIGVycm9yY29kZSA9IGh1YXJ0LT5FcnJvckNvZGU7CisgICAgICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHx8CisgICAgICAgICAgKChlcnJvcmNvZGUgJiBIQUxfVUFSVF9FUlJPUl9PUkUpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBpcyBhYm9ydGVkCisgICAgICAgICAgIFNldCB0aGUgVUFSVCBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzLAorICAgICAgICAgICBEaXNhYmxlIFJ4IEludGVycnVwdHMsIGFuZCBkaXNhYmxlIFJ4IERNQSByZXF1ZXN0LCBpZiBvbmdvaW5nICovCisgICAgICAgIFVBUlRfRW5kUnhUcmFuc2ZlcihodWFydCk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgICAgICAgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgICAgICB7CisgICAgICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgICAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCAqLworICAgICAgICAgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFBYm9ydE9uRXJyb3I7CisKKyAgICAgICAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHVhcnQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaHVhcnQtPmhkbWFyeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICAgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb24gQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBjb3VsZCBnbyBvbi4KKyAgICAgICAgICAgRXJyb3IgaXMgbm90aWZpZWQgdG8gdXNlciB0aHJvdWdoIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgIGh1YXJ0LT5FcnJvckNhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgICAgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKworICB9IC8qIEVuZCBpZiBzb21lIGVycm9yIG9jY3VycyAqLworCisgIC8qIFVBUlQgd2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9XVUYpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19XVUZJRSkgIT0gMFUpKQorICB7CisgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX1dVRik7CisKKyAgICAvKiBVQVJUIFJ4IHN0YXRlIGlzIG5vdCByZXNldCBhcyBhIHJlY2VwdGlvbiBwcm9jZXNzIG1pZ2h0IGJlIG9uZ29pbmcuCisgICAgICAgSWYgVUFSVCBoYW5kbGUgc3RhdGUgZmllbGRzIG5lZWQgdG8gYmUgcmVzZXQgdG8gUkVBRFksIHRoaXMgY291bGQgYmUgZG9uZSBpbiBXYWtldXAgY2FsbGJhY2sgKi8KKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFdha2V1cCBDYWxsYmFjayAqLworICAgIGh1YXJ0LT5XYWtldXBDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgV2FrZXVwIENhbGxiYWNrICovCisgICAgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVBUlQgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UWEUpICE9IDBVKQorICAgICAgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUUpICE9IDBVKSkKKyAgeworICAgIGlmIChodWFydC0+VHhJU1IgIT0gTlVMTCkKKyAgICB7CisgICAgICBodWFydC0+VHhJU1IoaHVhcnQpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvKiBVQVJUIGluIG1vZGUgVHJhbnNtaXR0ZXIgKHRyYW5zbWlzc2lvbiBlbmQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVEMpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UQ0lFKSAhPSAwVSkpCisgIHsKKyAgICBVQVJUX0VuZFRyYW5zbWl0X0lUKGh1YXJ0KTsKKyAgICByZXR1cm47CisgIH0KKworfQorCisvKioKKyAgKiBAYnJpZWYgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVQVJUIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBVQVJUIGNvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFVBUlQuCisgICAgICgrKSBIQUxfTXVsdGlQcm9jZXNzb3JfRW5hYmxlTXV0ZU1vZGUoKSBBUEkgZW5hYmxlcyBtdXRlIG1vZGUKKyAgICAgKCspIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoKSBBUEkgZGlzYWJsZXMgbXV0ZSBtb2RlCisgICAgICgrKSBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZSgpIEFQSSBlbnRlcnMgbXV0ZSBtb2RlCisgICAgICgrKSBVQVJUX1NldENvbmZpZygpIEFQSSBjb25maWd1cmVzIHRoZSBVQVJUIHBlcmlwaGVyYWwKKyAgICAgKCspIFVBUlRfQWR2RmVhdHVyZUNvbmZpZygpIEFQSSBvcHRpb25hbGx5IGNvbmZpZ3VyZXMgdGhlIFVBUlQgYWR2YW5jZWQgZmVhdHVyZXMKKyAgICAgKCspIFVBUlRfQ2hlY2tJZGxlU3RhdGUoKSBBUEkgZW5zdXJlcyB0aGF0IFRFQUNLIGFuZC9vciBSRUFDSyBhcmUgc2V0IGFmdGVyIGluaXRpYWxpemF0aW9uCisgICAgICgrKSBIQUxfSGFsZkR1cGxleF9FbmFibGVUcmFuc21pdHRlcigpIEFQSSBkaXNhYmxlcyByZWNlaXZlciBhbmQgZW5hYmxlcyB0cmFuc21pdHRlcgorICAgICAoKykgSEFMX0hhbGZEdXBsZXhfRW5hYmxlUmVjZWl2ZXIoKSBBUEkgZGlzYWJsZXMgdHJhbnNtaXR0ZXIgYW5kIGVuYWJsZXMgcmVjZWl2ZXIKKyAgICAgKCspIEhBTF9MSU5fU2VuZEJyZWFrKCkgQVBJIHRyYW5zbWl0cyB0aGUgYnJlYWsgY2hhcmFjdGVycworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVUFSVCBpbiBtdXRlIG1vZGUgKGRvZXMgbm90IG1lYW4gVUFSVCBlbnRlcnMgbXV0ZSBtb2RlOworICAqICAgICAgICAgdG8gZW50ZXIgbXV0ZSBtb2RlLCBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZSgpIEFQSSBtdXN0IGJlIGNhbGxlZCkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbmFibGVNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBFbmFibGUgVVNBUlQgbXV0ZSBtb2RlIGJ5IHNldHRpbmcgdGhlIE1NRSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBVQVJUIG11dGUgbW9kZSAoZG9lcyBub3QgbWVhbiB0aGUgVUFSVCBhY3R1YWxseSBleGl0cyBtdXRlIG1vZGUKKyAgKiAgICAgICAgIGFzIGl0IG1heSBub3QgaGF2ZSBiZWVuIGluIG11dGUgbW9kZSBhdCB0aGlzIHZlcnkgbW9tZW50KS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0Rpc2FibGVNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIFVTQVJUIG11dGUgbW9kZSBieSBjbGVhcmluZyB0aGUgTU1FIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX01NRSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIHJldHVybiAoVUFSVF9DaGVja0lkbGVTdGF0ZShodWFydCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgRW50ZXIgVUFSVCBtdXRlIG1vZGUgKG1lYW5zIFVBUlQgYWN0dWFsbHkgZW50ZXJzIG11dGUgbW9kZSkuCisgICogQG5vdGUgIFRvIGV4aXQgZnJvbSBtdXRlIG1vZGUsIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoKSBBUEkgbXVzdCBiZSBjYWxsZWQuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTXVsdGlQcm9jZXNzb3JfRW50ZXJNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX01VVEVfTU9ERV9SRVFVRVNUKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIgYW5kIGRpc2FibGUgdGhlIFVBUlQgcmVjZWl2ZXIuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0VuYWJsZVRyYW5zbWl0dGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBDbGVhciBURSBhbmQgUkUgYml0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpKTsKKworICAvKiBFbmFibGUgdGhlIFVTQVJUJ3MgdHJhbnNtaXQgaW50ZXJmYWNlIGJ5IHNldHRpbmcgdGhlIFRFIGJpdCBpbiB0aGUgVVNBUlQgQ1IxIHJlZ2lzdGVyICovCisgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9URSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgVUFSVCByZWNlaXZlciBhbmQgZGlzYWJsZSB0aGUgVUFSVCB0cmFuc21pdHRlci4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0VuYWJsZVJlY2VpdmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBDbGVhciBURSBhbmQgUkUgYml0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpKTsKKworICAvKiBFbmFibGUgdGhlIFVTQVJUJ3MgcmVjZWl2ZSBpbnRlcmZhY2UgYnkgc2V0dGluZyB0aGUgUkUgYml0IGluIHRoZSBVU0FSVCBDUjEgcmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBicmVhayBjaGFyYWN0ZXJzLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX1NlbmRCcmVhayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9MSU5fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2VuZCBicmVhayBjaGFyYWN0ZXJzICovCisgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfU0VOREJSRUFLX1JFUVVFU1QpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgVUFSVCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byA6CisgICAgICAoKykgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBzdGF0ZS4KKyAgICAgICgrKSBSZXR1cm4gdGhlIFVBUlQgaGFuZGxlIGVycm9yIGNvZGUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgVUFSVCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBodWFydCBQb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJULgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgSEFMX1VBUlRfR2V0U3RhdGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDMyX3QgdGVtcDEsIHRlbXAyOworICB0ZW1wMSA9IGh1YXJ0LT5nU3RhdGU7CisgIHRlbXAyID0gaHVhcnQtPlJ4U3RhdGU7CisKKyAgcmV0dXJuIChIQUxfVUFSVF9TdGF0ZVR5cGVEZWYpKHRlbXAxIHwgdGVtcDIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVUFSVCBoYW5kbGUgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFBvaW50ZXIgdG8gYSBVQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQuCisgICogQHJldHZhbCBVQVJUIEVycm9yIENvZGUKKyovCit1aW50MzJfdCBIQUxfVUFSVF9HZXRFcnJvcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICByZXR1cm4gaHVhcnQtPkVycm9yQ29kZTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9Qcml2YXRlX0Z1bmN0aW9ucyBVQVJUIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBjYWxsYmFja3MgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordm9pZCBVQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogSW5pdCB0aGUgVUFSVCBDYWxsYmFjayBzZXR0aW5ncyAqLworICBodWFydC0+VHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA9IEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgaHVhcnQtPlR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfVUFSVF9UeENwbHRDYWxsYmFjazsgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgID0gSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBodWFydC0+UnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgaHVhcnQtPkVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgPSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICovCisgIGh1YXJ0LT5BYm9ydENwbHRDYWxsYmFjayAgICAgICAgID0gSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICAqLworICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgaHVhcnQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgPSBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgICovCisgIGh1YXJ0LT5XYWtldXBDYWxsYmFjayAgICAgICAgICAgID0gSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjazsgICAgICAgICAgLyogTGVnYWN5IHdlYWsgV2FrZXVwQ2FsbGJhY2sgICAgICAgICAgICAqLworCit9CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBVQVJUIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9TZXRDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDMyX3QgdG1wcmVnOworICB1aW50MTZfdCBicnJ0ZW1wOworICBVQVJUX0Nsb2NrU291cmNlVHlwZURlZiBjbG9ja3NvdXJjZSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOworICB1aW50MzJfdCB1c2FydGRpdiAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDBVOworICBIQUxfU3RhdHVzVHlwZURlZiByZXQgICAgICAgICAgICAgICA9IEhBTF9PSzsKKyAgdWludDMyX3QgbHB1YXJ0X2tlcl9ja19wcmVzICAgICAgICAgPSAweDAwMDAwMDAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9CQVVEUkFURShodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XT1JEX0xFTkdUSChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoKSk7CisgIGlmIChVQVJUX0lOU1RBTkNFX0xPV1BPV0VSKGh1YXJ0KSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MUFVBUlRfU1RPUEJJVFMoaHVhcnQtPkluaXQuU3RvcEJpdHMpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9TVE9QQklUUyhodWFydC0+SW5pdC5TdG9wQml0cykpOworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX09ORV9CSVRfU0FNUExFKGh1YXJ0LT5Jbml0Lk9uZUJpdFNhbXBsaW5nKSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9QQVJJVFkoaHVhcnQtPkluaXQuUGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX01PREUoaHVhcnQtPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9IQVJEV0FSRV9GTE9XX0NPTlRST0woaHVhcnQtPkluaXQuSHdGbG93Q3RsKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX09WRVJTQU1QTElORyhodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2xlYXIgTSwgUENFLCBQUywgVEUsIFJFIGFuZCBPVkVSOCBiaXRzIGFuZCBjb25maWd1cmUKKyAgKiAgdGhlIFVBUlQgV29yZCBMZW5ndGgsIFBhcml0eSwgTW9kZSBhbmQgb3ZlcnNhbXBsaW5nOgorICAqICBzZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gaHVhcnQtPkluaXQuV29yZExlbmd0aCB2YWx1ZQorICAqICBzZXQgUENFIGFuZCBQUyBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5QYXJpdHkgdmFsdWUKKyAgKiAgc2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5Nb2RlIHZhbHVlCisgICogIHNldCBPVkVSOCBiaXQgYWNjb3JkaW5nIHRvIGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZyB2YWx1ZSAqLworICB0bXByZWcgPSAodWludDMyX3QpaHVhcnQtPkluaXQuV29yZExlbmd0aCB8IGh1YXJ0LT5Jbml0LlBhcml0eSB8IGh1YXJ0LT5Jbml0Lk1vZGUgfCBodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcgOworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgdGhlIFVBUlQgU3RvcCBCaXRzOiBTZXQgU1RPUFsxMzoxMl0gYml0cyBhY2NvcmRpbmcKKyAgKiB0byBodWFydC0+SW5pdC5TdG9wQml0cyB2YWx1ZSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgaHVhcnQtPkluaXQuU3RvcEJpdHMpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUKKyAgKiAtIFVBUlQgSGFyZFdhcmUgRmxvdyBDb250cm9sOiBzZXQgQ1RTRSBhbmQgUlRTRSBiaXRzIGFjY29yZGluZworICAqICAgdG8gaHVhcnQtPkluaXQuSHdGbG93Q3RsIHZhbHVlCisgICogLSBvbmUtYml0IHNhbXBsaW5nIG1ldGhvZCB2ZXJzdXMgdGhyZWUgc2FtcGxlcycgbWFqb3JpdHkgcnVsZSBhY2NvcmRpbmcKKyAgKiAgIHRvIGh1YXJ0LT5Jbml0Lk9uZUJpdFNhbXBsaW5nIChub3QgYXBwbGljYWJsZSB0byBMUFVBUlQpICovCisgIHRtcHJlZyA9ICh1aW50MzJfdClodWFydC0+SW5pdC5Id0Zsb3dDdGw7CisKKyAgaWYgKCEoVUFSVF9JTlNUQU5DRV9MT1dQT1dFUihodWFydCkpKQorICB7CisgICAgdG1wcmVnIHw9IGh1YXJ0LT5Jbml0Lk9uZUJpdFNhbXBsaW5nOworICB9CisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19GSUVMRFMsIHRtcHJlZyk7CisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgVUFSVF9HRVRDTE9DS1NPVVJDRShodWFydCwgY2xvY2tzb3VyY2UpOworCisgIC8qIENoZWNrIExQVUFSVCBpbnN0YW5jZSAqLworICBpZiAoVUFSVF9JTlNUQU5DRV9MT1dQT1dFUihodWFydCkpCisgIHsKKyAgICAvKiBSZXRyaWV2ZSBmcmVxdWVuY3kgY2xvY2sgKi8KKyAgICBzd2l0Y2ggKGNsb2Nrc291cmNlKQorICAgIHsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgICAgbHB1YXJ0X2tlcl9ja19wcmVzID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICBpZiAoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSURJVikgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAodWludDMyX3QpKEhTSV9WQUxVRSA+PiAyVSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbHB1YXJ0X2tlcl9ja19wcmVzID0gKHVpbnQzMl90KUhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICAgIGxwdWFydF9rZXJfY2tfcHJlcyA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX0xTRToKKyAgICAgICAgbHB1YXJ0X2tlcl9ja19wcmVzID0gKHVpbnQzMl90KUxTRV9WQUxVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBpZiBwcm9wZXIgY2xvY2sgc291cmNlIHJlcG9ydGVkICovCisgICAgaWYgKGxwdWFydF9rZXJfY2tfcHJlcyAhPSAwVSkKKyAgICB7CisgICAgICAvKiBlbnN1cmUgdGhhdCBGcmVxdWVuY3kgY2xvY2sgaXMgaW4gdGhlIHJhbmdlIFszICogYmF1ZHJhdGUsIDQwOTYgKiBiYXVkcmF0ZV0gKi8KKyAgICAgIGlmICgobHB1YXJ0X2tlcl9ja19wcmVzIDwgKDNVICogaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSB8fAorICAgICAgICAgIChscHVhcnRfa2VyX2NrX3ByZXMgPiAoNDA5NlUgKiBodWFydC0+SW5pdC5CYXVkUmF0ZSkpKQorICAgICAgeworICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVQVJUX0RJVl9MUFVBUlQobHB1YXJ0X2tlcl9ja19wcmVzLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworCisgICAgICAgIC8qIEl0IGlzIGZvcmJpZGRlbiB0byB3cml0ZSB2YWx1ZXMgbG93ZXIgdGhhbiAweDMwMCBpbiB0aGUgTFBVQVJUX0JSUiByZWdpc3RlciAqLworICAgICAgICBpZiAoKHVzYXJ0ZGl2ID49IExQVUFSVF9CUlJfTUlOKSAmJiAodXNhcnRkaXYgPD0gTFBVQVJUX0JSUl9NQVgpKQorICAgICAgICB7CisgICAgICAgICAgaHVhcnQtPkluc3RhbmNlLT5CUlIgPSB1c2FydGRpdjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0gLyogICBpZiAoIChscHVhcnRfa2VyX2NrX3ByZXMgPCAoMyAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSApIHx8IChscHVhcnRfa2VyX2NrX3ByZXMgPiAoNDA5NiAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSApKSAqLworICAgIH0gLyogaWYgKGxwdWFydF9rZXJfY2tfcHJlcyAhPSAwKSAqLworICB9CisgIC8qIENoZWNrIFVBUlQgT3ZlciBTYW1wbGluZyB0byBzZXQgQmF1ZCBSYXRlIFJlZ2lzdGVyICovCisgIGVsc2UgaWYgKGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZyA9PSBVQVJUX09WRVJTQU1QTElOR184KQorICB7CisgICAgc3dpdGNoIChjbG9ja3NvdXJjZSkKKyAgICB7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE6CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzgoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI6CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzgoSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICBpZiAoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSURJVikgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KChIU0lfVkFMVUUgPj4gMlUpLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzgoSFNJX1ZBTFVFLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9MU0U6CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzgoTFNFX1ZBTFVFLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ6CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFVTQVJURElWIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBkMTYgKi8KKyAgICBpZiAoKHVzYXJ0ZGl2ID49IFVBUlRfQlJSX01JTikgJiYgKHVzYXJ0ZGl2IDw9IFVBUlRfQlJSX01BWCkpCisgICAgeworICAgICAgYnJydGVtcCA9ICh1aW50MTZfdCkodXNhcnRkaXYgJiAweEZGRjBVKTsKKyAgICAgIGJycnRlbXAgfD0gKHVpbnQxNl90KSgodXNhcnRkaXYgJiAodWludDE2X3QpMHgwMDBGVSkgPj4gMVUpOworICAgICAgaHVhcnQtPkluc3RhbmNlLT5CUlIgPSBicnJ0ZW1wOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzd2l0Y2ggKGNsb2Nrc291cmNlKQorICAgIHsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI6CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0UENMSzJGcmVxKCksIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX0hTSToKKyAgICAgICAgaWYgKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0lESVYpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoKEhTSV9WQUxVRSA+PiAyVSksIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoSFNJX1ZBTFVFLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkcxNihMU0VfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogVVNBUlRESVYgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMGQxNiAqLworICAgIGlmICgodXNhcnRkaXYgPj0gVUFSVF9CUlJfTUlOKSAmJiAodXNhcnRkaXYgPD0gVUFSVF9CUlJfTUFYKSkKKyAgICB7CisgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9IHVzYXJ0ZGl2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisKKyAgLyogQ2xlYXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgIGh1YXJ0LT5SeElTUiA9IE5VTEw7CisgIGh1YXJ0LT5UeElTUiA9IE5VTEw7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgVUFSVCBwZXJpcGhlcmFsIGFkdmFuY2VkIGZlYXR1cmVzLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIHNldCBvZiBhZHZhbmNlZCBmZWF0dXJlcyB0byBjb25maWd1cmUgaXMgcHJvcGVybHkgc2V0ICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfSU5JVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0KSk7CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgVUFSVF9BRFZGRUFUVVJFX1RYSU5WRVJUX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9UWElOVihodWFydC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYsIGh1YXJ0LT5BZHZhbmNlZEluaXQuVHhQaW5MZXZlbEludmVydCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfUlhJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX1JYSU5WKGh1YXJ0LT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SWElOViwgaHVhcnQtPkFkdmFuY2VkSW5pdC5SeFBpbkxldmVsSW52ZXJ0KTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgZGF0YSBpbnZlcnNpb24gKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9EQVRBSU5WKGh1YXJ0LT5BZHZhbmNlZEluaXQuRGF0YUludmVydCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WLCBodWFydC0+QWR2YW5jZWRJbml0LkRhdGFJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWC9UWCBwaW5zIHN3YXAgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9TV0FQX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9TV0FQKGh1YXJ0LT5BZHZhbmNlZEluaXQuU3dhcCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9TV0FQLCBodWFydC0+QWR2YW5jZWRJbml0LlN3YXApOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBvdmVycnVuIGRldGVjdGlvbiBkaXNhYmxpbmcgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9SWE9WRVJSVU5ESVNBQkxFX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT1ZFUlJVTihodWFydC0+QWR2YW5jZWRJbml0Lk92ZXJydW5EaXNhYmxlKSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX09WUkRJUywgaHVhcnQtPkFkdmFuY2VkSW5pdC5PdmVycnVuRGlzYWJsZSk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIERNQSBkaXNhYmxpbmcgb24gcmVjZXB0aW9uIGVycm9yICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUihodWFydC0+QWR2YW5jZWRJbml0LkRNQURpc2FibGVvblJ4RXJyb3IpKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRERSRSwgaHVhcnQtPkFkdmFuY2VkSW5pdC5ETUFEaXNhYmxlb25SeEVycm9yKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIHNjaGVtZSAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFKGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlRW5hYmxlKSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FCUkVOLCBodWFydC0+QWR2YW5jZWRJbml0LkF1dG9CYXVkUmF0ZUVuYWJsZSk7CisgICAgLyogc2V0IGF1dG8gQmF1ZHJhdGUgZGV0ZWN0aW9uIHBhcmFtZXRlcnMgaWYgZGV0ZWN0aW9uIGlzIGVuYWJsZWQgKi8KKyAgICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BdXRvQmF1ZFJhdGVFbmFibGUgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9FTkFCTEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVNT0RFKGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlTW9kZSkpOworICAgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FCUk1PREUsIGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlTW9kZSk7CisgICAgfQorICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUKGh1YXJ0LT5BZHZhbmNlZEluaXQuTVNCRmlyc3QpKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QsIGh1YXJ0LT5BZHZhbmNlZEluaXQuTVNCRmlyc3QpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBDaGVjayB0aGUgVUFSVCBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfQ2hlY2tJZGxlU3RhdGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXRpYWxpemUgdGhlIFVBUlQgRXJyb3JDb2RlICovCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodWFydC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgSEFMX1VBUlRfVElNRU9VVF9WQUxVRSkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBpZiB0aGUgUmVjZWl2ZXIgaXMgZW5hYmxlZCAqLworICBpZiAoKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1JFKSA9PSBVU0FSVF9DUjFfUkUpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFJFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIFVBUlQgU3RhdGUgKi8KKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBVQVJUIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gaHVhcnQgICAgIFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBGbGFnICAgICAgU3BlY2lmaWVzIHRoZSBVQVJUIGZsYWcgdG8gY2hlY2sKKyAgKiBAcGFyYW0gU3RhdHVzICAgIEZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpCisgICogQHBhcmFtIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHBhcmFtIFRpbWVvdXQgICBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLworICB3aGlsZSAoKF9fSEFMX1VBUlRfR0VUX0ZMQUcoaHVhcnQsIEZsYWcpID8gU0VUIDogUkVTRVQpID09IFN0YXR1cykKKyAgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgVFhFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgZm9yIHRoZSBpbnRlcnJ1cHQgcHJvY2VzcyAqLworICAgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUUpKTsKKyAgICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgICAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFR4IHRyYW5zZmVyIG9uIFVBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBUcmFuc21pdCBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9FbmRUeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgVFhFSUUgYW5kIFRDSUUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworCisgIC8qIEF0IGVuZCBvZiBUeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgUnggdHJhbnNmZXIgb24gVUFSVCBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uIG9yIFJlY2VwdGlvbiBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9FbmRSeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVzZXQgUnhJc3IgZnVuY3Rpb24gcG9pbnRlciAqLworICBodWFydC0+UnhJU1IgPSBOVUxMOworfQorCisKKy8qKgorICAqIEBicmllZiBETUEgVUFSVCB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBETUEgTm9ybWFsIG1vZGUgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhkbWEtPkluc3RhbmNlLT5DQ1IsIERNQV9DQ1JfQ0lSQykpCisgIHsKKyAgICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworICB9CisgIC8qIERNQSBDaXJjdWxhciBtb2RlICovCisgIGVsc2UKKyAgeworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLypDYWxsIHJlZ2lzdGVyZWQgVHggY29tcGxldGUgY2FsbGJhY2sqLworICAgIGh1YXJ0LT5UeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBUeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVBUlQgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKkNhbGwgcmVnaXN0ZXJlZCBUeCBIYWxmIGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgaHVhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKkNhbGwgbGVnYWN5IHdlYWsgVHggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayovCisgIEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVBUlQgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkKKyAgeworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIH0KKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgaHVhcnQtPlJ4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiBETUEgVUFSVCByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgUnggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayovCisgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEhhbGYgY29tcGxldGUgY2FsbGJhY2sqLworICBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmIERNQSBVQVJUIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIGdzdGF0ZSA9IGh1YXJ0LT5nU3RhdGU7CisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7CisKKyAgLyogU3RvcCBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgorICAgICAgKGdzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSkKKyAgeworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICAgIFVBUlRfRW5kVHhUcmFuc2ZlcihodWFydCk7CisgIH0KKworICAvKiBTdG9wIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpICYmCisgICAgICAocnhzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKSkKKyAgeworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworICAgIFVBUlRfRW5kUnhUcmFuc2ZlcihodWFydCk7CisgIH0KKworICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVQVJUIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IEhBTCBzZXJ2aWNlcyBvbiBFcnJvcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZW5jZSkuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFJ4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFR4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlciBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRfSVQgQVBJIChBYm9ydCBvbmx5IFR4IHRyYW5zZmVyKQorICAqICAgICAgICAgKFRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCwKKyAgKiAgICAgICAgIGFuZCBsZWFkcyB0byB1c2VyIFR4IEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbikuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKworICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgVUFSVCBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyIGJ5IGEgY2FsbCB0bworICAqICAgICAgICAgSEFMX1VBUlRfQWJvcnRSZWNlaXZlX0lUIEFQSSAoQWJvcnQgb25seSBSeCB0cmFuc2ZlcikKKyAgKiAgICAgICAgIChUaGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QsCisgICogICAgICAgICBhbmQgbGVhZHMgdG8gdXNlciBSeCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24pLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworCisgIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmIFRYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgNyBvciA4IGJpdHMgZGF0YSB3b3JkIGxlbmd0aCAuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzhCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKQorICB7CisgICAgaWYgKGh1YXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgSW50ZXJydXB0ICovCisgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpodWFydC0+cFR4QnVmZlB0ciAmICh1aW50OF90KTB4RkYpOworICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIrKzsKKyAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgVFggaW50ZXJycnVwdCBoYW5kbGVyIGZvciA5IGJpdHMgZGF0YSB3b3JkIGxlbmd0aC4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVUFSVF9UcmFuc21pdF9JVCgpLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDE2X3QgKnRtcDsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZiAoaHVhcnQtPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdG1wID0gKHVpbnQxNl90ICopIGh1YXJ0LT5wVHhCdWZmUHRyOworICAgICAgaHVhcnQtPkluc3RhbmNlLT5URFIgPSAoKnRtcCAmICh1aW50MTZfdCkweDAxRkYpOworICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgIH0KK30KKworCisvKioKKyAgKiBAYnJpZWYgIFdyYXAgdXAgdHJhbnNtaXNzaW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHVhcnQgcG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9FbmRUcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBEaXNhYmxlIHRoZSBVQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKKworICAvKiBUeCBwcm9jZXNzIGlzIGVuZGVkLCByZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENsZWF0IFR4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgaHVhcnQtPlR4SVNSID0gTlVMTDsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIFR4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgaHVhcnQtPlR4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qQ2FsbCBsZWdhY3kgd2VhayBUeCBjb21wbGV0ZSBjYWxsYmFjayovCisgIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiBSWCBpbnRlcnJydXB0IGhhbmRsZXIgZm9yIDcgb3IgOCBiaXRzIGRhdGEgd29yZCBsZW5ndGggLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfOEJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MTZfdCB1aE1hc2sgPSBodWFydC0+TWFzazsKKyAgdWludDE2X3QgIHVoZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKQorICB7CisgICAgdWhkYXRhID0gKHVpbnQxNl90KSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPlJEUik7CisgICAgKmh1YXJ0LT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QpKHVoZGF0YSAmICh1aW50OF90KXVoTWFzayk7CisgICAgaHVhcnQtPnBSeEJ1ZmZQdHIrKzsKKyAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKworICAgIGlmIChodWFydC0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdHMgKi8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBodWFydC0+UnhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8KKyAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUlggaW50ZXJycnVwdCBoYW5kbGVyIGZvciA5IGJpdHMgZGF0YSB3b3JkIGxlbmd0aCAuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfUmVjZWl2ZV9JVCgpCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9SeElTUl8xNkJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MTZfdCAqdG1wOworICB1aW50MTZfdCB1aE1hc2sgPSBodWFydC0+TWFzazsKKyAgdWludDE2X3QgIHVoZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKQorICB7CisgICAgdWhkYXRhID0gKHVpbnQxNl90KSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPlJEUik7CisgICAgdG1wID0gKHVpbnQxNl90ICopIGh1YXJ0LT5wUnhCdWZmUHRyIDsKKyAgICAqdG1wID0gKHVpbnQxNl90KSh1aGRhdGEgJiB1aE1hc2spOworICAgIGh1YXJ0LT5wUnhCdWZmUHRyICs9IDJVOworICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOworCisgICAgaWYgKGh1YXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBodWFydC0+UnhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8KKyAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorfQorCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfaGFsX3VhcnRfZXguYyBiL1NyYy9zdG0zMmwweHhfaGFsX3VhcnRfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDM2MjE2Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9oYWxfdWFydF9leC5jCkBAIC0wLDAgKzEsNTE1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF91YXJ0X2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIFVBUlQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyBleHRlbmRlZAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciBUcmFuc21pdHRlciBQZXJpcGhlcmFsIChVQVJUKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgIyMjIyMgVUFSVCBwZXJpcGhlcmFsIGV4dGVuZGVkIGZlYXR1cmVzICAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICgjKSBEZWNsYXJlIGEgVUFSVF9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIFJTNDg1IERyaXZlciBFbmFibGUgbW9kZSwgaW5pdGlhbGl6ZSB0aGUgVUFSVCByZWdpc3RlcnMKKyAgICAgICAgYnkgY2FsbGluZyB0aGUgSEFMX1JTNDg1RXhfSW5pdCgpIEFQSS4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXggVUFSVEV4CisgICogQGJyaWVmIFVBUlQgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1ByaXZhdGVfRnVuY3Rpb25zIFVBUlRFeCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK2V4dGVybiB2b2lkIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCitzdGF0aWMgdm9pZCBVQVJURXhfV2FrZXVwX0FkZHJlc3NDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbik7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnMgIFVBUlRFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gRnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgdGhlIFVTQVJUeCBvciB0aGUgVUFSVHkKKyAgICBpbiBhc3luY2hyb25vdXMgbW9kZS4KKyAgICAgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlIHRoZSBwYXJhbWV0ZXJzIGJlbG93IGNhbiBiZSBjb25maWd1cmVkOgorICAgICAgICAoKyspIEJhdWQgUmF0ZQorICAgICAgICAoKyspIFdvcmQgTGVuZ3RoCisgICAgICAgICgrKykgU3RvcCBCaXQKKyAgICAgICAgKCsrKSBQYXJpdHk6IElmIHRoZSBwYXJpdHkgaXMgZW5hYmxlZCwgdGhlbiB0aGUgTVNCIGJpdCBvZiB0aGUgZGF0YSB3cml0dGVuCisgICAgICAgICAgICAgaW4gdGhlIGRhdGEgcmVnaXN0ZXIgaXMgdHJhbnNtaXR0ZWQgYnV0IGlzIGNoYW5nZWQgYnkgdGhlIHBhcml0eSBiaXQuCisgICAgICAgICgrKykgSGFyZHdhcmUgZmxvdyBjb250cm9sCisgICAgICAgICgrKykgUmVjZWl2ZXIvdHJhbnNtaXR0ZXIgbW9kZXMKKyAgICAgICAgKCsrKSBPdmVyIFNhbXBsaW5nIE1ldGhvZAorICAgICAgICAoKyspIE9uZS1CaXQgU2FtcGxpbmcgTWV0aG9kCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBhZHZhbmNlZCBmZWF0dXJlcyBjYW4gYmUgY29uZmlndXJlZCBhcyB3ZWxsOgorICAgICAgICAoKyspIFRYIGFuZC9vciBSWCBwaW4gbGV2ZWwgaW52ZXJzaW9uCisgICAgICAgICgrKykgZGF0YSBsb2dpY2FsIGxldmVsIGludmVyc2lvbgorICAgICAgICAoKyspIFJYIGFuZCBUWCBwaW5zIHN3YXAKKyAgICAgICAgKCsrKSBSWCBvdmVycnVuIGRldGVjdGlvbiBkaXNhYmxpbmcKKyAgICAgICAgKCsrKSBETUEgZGlzYWJsaW5nIG9uIFJYIGVycm9yCisgICAgICAgICgrKykgTVNCIGZpcnN0IG9uIGNvbW11bmljYXRpb24gbGluZQorICAgICAgICAoKyspIGF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbgorICAgIFsuLl0KKyAgICBUaGUgSEFMX1JTNDg1RXhfSW5pdCgpIEFQSSBmb2xsb3dzIHRoZSBVQVJUIFJTNDg1IG1vZGUgY29uZmlndXJhdGlvbgorICAgICBwcm9jZWR1cmVzIChkZXRhaWxzIGZvciB0aGUgcHJvY2VkdXJlcyBhcmUgYXZhaWxhYmxlIGluIHJlZmVyZW5jZSBtYW51YWwpLgorCitAZW5kdmVyYmF0aW0KKworICBEZXBlbmRpbmcgb24gdGhlIGZyYW1lIGxlbmd0aCBkZWZpbmVkIGJ5IHRoZSBNMSBhbmQgTTAgYml0cyAoNy1iaXQsCisgIDgtYml0IG9yIDktYml0KSwgdGhlIHBvc3NpYmxlIFVBUlQgZm9ybWF0cyBhcmUgbGlzdGVkIGluIHRoZQorICBmb2xsb3dpbmcgdGFibGUuCisKKyAgICBUYWJsZSAxLiBVQVJUIGZyYW1lIGZvcm1hdC4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgTTEgYml0IHwgIE0wIGJpdCB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgIFVBUlQgZnJhbWUgICAgICAgICAgICAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAwICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDggYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgNyBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA5IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDggYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgNyBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA2IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBJbml0aWFsaXplIHRoZSBSUzQ4NSBEcml2ZXIgZW5hYmxlIGZlYXR1cmUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSBodWFydCAgICAgICAgICAgIFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBQb2xhcml0eSAgICAgICAgIFNlbGVjdCB0aGUgZHJpdmVyIGVuYWJsZSBwb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0RFX1BPTEFSSVRZX0hJR0ggREUgc2lnbmFsIGlzIGFjdGl2ZSBoaWdoCisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfREVfUE9MQVJJVFlfTE9XICBERSBzaWduYWwgaXMgYWN0aXZlIGxvdworICAqIEBwYXJhbSBBc3NlcnRpb25UaW1lICAgIERyaXZlciBFbmFibGUgYXNzZXJ0aW9uIHRpbWU6CisgICogICAgICAgNS1iaXQgdmFsdWUgZGVmaW5pbmcgdGhlIHRpbWUgYmV0d2VlbiB0aGUgYWN0aXZhdGlvbiBvZiB0aGUgREUgKERyaXZlciBFbmFibGUpCisgICogICAgICAgc2lnbmFsIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdGFydCBiaXQuIEl0IGlzIGV4cHJlc3NlZCBpbiBzYW1wbGUgdGltZQorICAqICAgICAgIHVuaXRzICgxLzggb3IgMS8xNiBiaXQgdGltZSwgZGVwZW5kaW5nIG9uIHRoZSBvdmVyc2FtcGxpbmcgcmF0ZSkKKyAgKiBAcGFyYW0gRGVhc3NlcnRpb25UaW1lICBEcml2ZXIgRW5hYmxlIGRlYXNzZXJ0aW9uIHRpbWU6CisgICogICAgICAgNS1iaXQgdmFsdWUgZGVmaW5pbmcgdGhlIHRpbWUgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBsYXN0IHN0b3AgYml0LCBpbiBhCisgICogICAgICAgdHJhbnNtaXR0ZWQgbWVzc2FnZSwgYW5kIHRoZSBkZS1hY3RpdmF0aW9uIG9mIHRoZSBERSAoRHJpdmVyIEVuYWJsZSkgc2lnbmFsLgorICAqICAgICAgIEl0IGlzIGV4cHJlc3NlZCBpbiBzYW1wbGUgdGltZSB1bml0cyAoMS84IG9yIDEvMTYgYml0IHRpbWUsIGRlcGVuZGluZyBvbiB0aGUKKyAgKiAgICAgICBvdmVyc2FtcGxpbmcgcmF0ZSkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlM0ODVFeF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IFBvbGFyaXR5LCB1aW50MzJfdCBBc3NlcnRpb25UaW1lLCB1aW50MzJfdCBEZWFzc2VydGlvblRpbWUpCit7CisgIHVpbnQzMl90IHRlbXA7CisKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1YXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIFVBUlQgaW5zdGFuY2UgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayB0aGUgRHJpdmVyIEVuYWJsZSBwb2xhcml0eSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9ERV9QT0xBUklUWShQb2xhcml0eSkpOworCisgIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiB0aW1lICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FTU0VSVElPTlRJTUUoQXNzZXJ0aW9uVGltZSkpOworCisgIC8qIENoZWNrIHRoZSBEcml2ZXIgRW5hYmxlIGRlYXNzZXJ0aW9uIHRpbWUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfREVBU1NFUlRJT05USU1FKERlYXNzZXJ0aW9uVGltZSkpOworCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh1YXJ0LT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBVQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHVhcnQpOworCisgICAgaWYgKGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwSW5pdDsKKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWCAqLworICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICB9CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFVBUlRfU2V0Q29uZmlnKGh1YXJ0KSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpCisgIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBEcml2ZXIgRW5hYmxlIG1vZGUgYnkgc2V0dGluZyB0aGUgREVNIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovCisgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ERU0pOworCisgIC8qIFNldCB0aGUgRHJpdmVyIEVuYWJsZSBwb2xhcml0eSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfREVQLCBQb2xhcml0eSk7CisKKyAgLyogU2V0IHRoZSBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiBhbmQgZGVhc3NlcnRpb24gdGltZXMgKi8KKyAgdGVtcCA9IChBc3NlcnRpb25UaW1lIDw8IFVBUlRfQ1IxX0RFQVRfQUREUkVTU19MU0JfUE9TKTsKKyAgdGVtcCB8PSAoRGVhc3NlcnRpb25UaW1lIDw8IFVBUlRfQ1IxX0RFRFRfQUREUkVTU19MU0JfUE9TKTsKKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9ERURUIHwgVVNBUlRfQ1IxX0RFQVQpLCB0ZW1wKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoVUFSVF9DaGVja0lkbGVTdGF0ZShodWFydCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmIEV4dGVuZGVkIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgV2FrZXVwIGFuZCBGSUZPIG1vZGUgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMuCisKKyAgICAoIykgV2FrZXVwIGZyb20gU3RvcCBtb2RlIENhbGxiYWNrOgorICAgICAgICAoKykgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjaygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBVQVJUIHdha2V1cCBmcm9tIFN0b3AgbW9kZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dIFRoaXMgc2VjdGlvbiBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgICAgKCspIEhBTF9VQVJURXhfRW5hYmxlQ2xvY2tTdG9wTW9kZSgpIEFQSSBlbmFibGVzIHRoZSBVQVJUIGNsb2NrIChIU0kgb3IgTFNFIG9ubHkpIGR1cmluZyBzdG9wIG1vZGUKKyAgICAgKCspIEhBTF9VQVJURXhfRGlzYWJsZUNsb2NrU3RvcE1vZGUoKSBBUEkgZGlzYWJsZXMgdGhlIGFib3ZlIGZ1bmN0aW9uYWxpdHkKKyAgICAgKCspIEhBTF9NdWx0aVByb2Nlc3NvckV4X0FkZHJlc3NMZW5ndGhfU2V0KCkgQVBJIG9wdGlvbmFsbHkgc2V0cyB0aGUgVUFSVCBub2RlIGFkZHJlc3MKKyAgICAgICAgIGRldGVjdGlvbiBsZW5ndGggdG8gbW9yZSB0aGFuIDQgYml0cyBmb3IgbXVsdGlwcm9jZXNzb3IgYWRkcmVzcyBtYXJrIHdha2UgdXAuCisgICAgICgrKSBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKCkgQVBJIGRlZmluZXMgdGhlIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUKKyAgICAgICAgIHRyaWdnZXI6IGFkZHJlc3MgbWF0Y2gsIFN0YXJ0IEJpdCBkZXRlY3Rpb24gb3IgUlhORSBiaXQgc3RhdHVzLgorICAgICAoKykgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZSgpIEFQSSBlbmFibGVzIHRoZSBVQVJUIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIHN0b3AgbW9kZQorICAgICAoKykgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoKSBBUEkgZGlzYWJsZXMgdGhlIGFib3ZlIGZ1bmN0aW9uYWxpdHkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisKKy8qKgorICAqIEBicmllZiAgS2VlcCBVQVJUIENsb2NrIGVuYWJsZWQgd2hlbiBpbiBTdG9wIE1vZGUuCisgICogQG5vdGUgICBXaGVuIHRoZSBVU0FSVCBjbG9jayBzb3VyY2UgaXMgY29uZmlndXJlZCB0byBiZSBMU0Ugb3IgSFNJLCBpdCBpcyBwb3NzaWJsZSB0byBrZWVwIGVuYWJsZWQKKyAgKiAgICAgICAgIHRoaXMgY2xvY2sgZHVyaW5nIFNUT1AgbW9kZSBieSBzZXR0aW5nIHRoZSBVQ0VTTSBiaXQgaW4gVVNBUlRfQ1IzIGNvbnRyb2wgcmVnaXN0ZXIuCisgICogQG5vdGUgICBXaGVuIExQVUFSVCBpcyB1c2VkIHRvIHdha2V1cCBmcm9tIHN0b3Agd2l0aCBMU0UgaXMgc2VsZWN0ZWQgYXMgTFBVQVJUIGNsb2NrIHNvdXJjZSwKKyAgKiAgICAgICAgIGFuZCBkZXNpcmVkIGJhdWQgcmF0ZSBpcyA5NjAwIGJhdWQsIHRoZSBiaXQgVUNFU00gYml0IGluIExQVUFSVF9DUjMgY29udHJvbCByZWdpc3RlciBtdXN0IGJlIHNldC4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVDbG9ja1N0b3BNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIC8qIFNldCBVQ0VTTSBiaXQgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1VDRVNNKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFVBUlQgQ2xvY2sgd2hlbiBpbiBTdG9wIE1vZGUuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRGlzYWJsZUNsb2NrU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgLyogQ2xlYXIgVUNFU00gYml0ICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1VDRVNNKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEJ5IGRlZmF1bHQgaW4gbXVsdGlwcm9jZXNzb3IgbW9kZSwgd2hlbiB0aGUgd2FrZSB1cCBtZXRob2QgaXMgc2V0CisgICogICAgICAgIHRvIGFkZHJlc3MgbWFyaywgdGhlIFVBUlQgaGFuZGxlcyBvbmx5IDQtYml0IGxvbmcgYWRkcmVzc2VzIGRldGVjdGlvbjsKKyAgKiAgICAgICAgdGhpcyBBUEkgYWxsb3dzIHRvIGVuYWJsZSBsb25nZXIgYWRkcmVzc2VzIGRldGVjdGlvbiAoNi0sIDctIG9yIDgtYml0CisgICogICAgICAgIGxvbmcpLgorICAqIEBub3RlICBBZGRyZXNzZXMgZGV0ZWN0aW9uIGxlbmd0aHMgYXJlOiA2LWJpdCBhZGRyZXNzIGRldGVjdGlvbiBpbiA3LWJpdCBkYXRhIG1vZGUsCisgICogICAgICAgIDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIGluIDgtYml0IGRhdGEgbW9kZSwgOC1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gaW4gOS1iaXQgZGF0YSBtb2RlLgorICAqIEBwYXJhbSBodWFydCAgICAgICAgIFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBBZGRyZXNzTGVuZ3RoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQUREUkVTU19ERVRFQ1RfNEIgNC1iaXQgbG9uZyBhZGRyZXNzCisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQUREUkVTU19ERVRFQ1RfN0IgNi0sIDctIG9yIDgtYml0IGxvbmcgYWRkcmVzcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQWRkcmVzc0xlbmd0aCkKK3sKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1YXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIGFkZHJlc3MgbGVuZ3RoIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRERSRVNTTEVOR1RIX0RFVEVDVChBZGRyZXNzTGVuZ3RoKSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgYWRkcmVzcyBsZW5ndGggKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FERE03LCBBZGRyZXNzTGVuZ3RoKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBmbGFnIHNlbGVjdGlvbi4KKyAgKiBAbm90ZSBJdCBpcyB0aGUgYXBwbGljYXRpb24gcmVzcG9uc2liaWxpdHkgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgdXNlZCBhcworICAqICAgICAgIHVzYXJ0X3drdXAgaW50ZXJydXB0IHNvdXJjZSBiZWZvcmUgZW50ZXJpbmcgbG93LXBvd2VyIG1vZGUuCisgICogQHBhcmFtIGh1YXJ0ICAgICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gV2FrZVVwU2VsZWN0aW9uIEFkZHJlc3MgbWF0Y2gsIFN0YXJ0IEJpdCBkZXRlY3Rpb24gb3IgUlhORS9SWEZORSBiaXQgc3RhdHVzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQX09OX0FERFJFU1MKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfU3RvcE1vZGVXYWtlVXBTb3VyY2VDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogY2hlY2sgdGhlIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgVUFSVCBpbnN0YW5jZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIC8qIGNoZWNrIHRoZSB3YWtlLXVwIHNlbGVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfV0FLRVVQX1NFTEVDVElPTihXYWtlVXBTZWxlY3Rpb24uV2FrZVVwRXZlbnQpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSB3YWtlLXVwIHNlbGVjdGlvbiBzY2hlbWUgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1dVUywgV2FrZVVwU2VsZWN0aW9uLldha2VVcEV2ZW50KTsKKworICBpZiAoV2FrZVVwU2VsZWN0aW9uLldha2VVcEV2ZW50ID09IFVBUlRfV0FLRVVQX09OX0FERFJFU1MpCisgIHsKKyAgICBVQVJURXhfV2FrZXVwX0FkZHJlc3NDb25maWcoaHVhcnQsIFdha2VVcFNlbGVjdGlvbik7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBSRUFDSyBmbGFnIGlzIHNldCAqLworICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVU0FSVF9JU1JfUkVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIEhBTF9VQVJUX1RJTUVPVVRfVkFMVUUpICE9IEhBTF9PSykKKyAgeworICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemUgdGhlIFVBUlQgU3RhdGUgKi8KKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBVQVJUIFN0b3AgTW9kZS4KKyAgKiBAbm90ZSBUaGUgVUFSVCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgMSBtb2RlIGFzIGxvbmcgYXMgVUFSVCBjbG9jayBpcyBIU0kgb3IgTFNFLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgLyogU2V0IFVFU00gYml0ICovCisgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgVUFSVCBTdG9wIE1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgLyogQ2xlYXIgVUVTTSBiaXQgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBJbml0aWFsaXplIHRoZSBVQVJUIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgcGFyYW1ldGVycyB3aGVuIHRyaWdnZXJlZCBieSBhZGRyZXNzIGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gaHVhcnQgICAgICAgICAgIFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBXYWtlVXBTZWxlY3Rpb24gVUFSVCB3YWtlIHVwIGZyb20gc3RvcCBtb2RlIHBhcmFtZXRlcnMuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJURXhfV2FrZXVwX0FkZHJlc3NDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbikKK3sKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQUREUkVTU0xFTkdUSF9ERVRFQ1QoV2FrZVVwU2VsZWN0aW9uLkFkZHJlc3NMZW5ndGgpKTsKKworICAvKiBTZXQgdGhlIFVTQVJUIGFkZHJlc3MgbGVuZ3RoICovCisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9BRERNNywgV2FrZVVwU2VsZWN0aW9uLkFkZHJlc3NMZW5ndGgpOworCisgIC8qIFNldCB0aGUgVVNBUlQgYWRkcmVzcyBub2RlICovCisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9BREQsICgodWludDMyX3QpV2FrZVVwU2VsZWN0aW9uLkFkZHJlc3MgPDwgVUFSVF9DUjJfQUREUkVTU19MU0JfUE9TKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9oYWxfdXNhcnQuYyBiL1NyYy9zdG0zMmwweHhfaGFsX3VzYXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3N2QzNgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX3VzYXJ0LmMKQEAgLTAsMCArMSwzMTk5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2hhbF91c2FydC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBVU0FSVCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVbml2ZXJzYWwgU3luY2hyb25vdXMvQXN5bmNocm9ub3VzIFJlY2VpdmVyIFRyYW5zbWl0dGVyCisgICogICAgICAgICAgUGVyaXBoZXJhbCAoVVNBUlQpLgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIFVTQVJUIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAgKCMpIERlY2xhcmUgYSBVU0FSVF9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUgKGVnLiBVU0FSVF9IYW5kbGVUeXBlRGVmIGh1c2FydCkuCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVVNBUlQgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9VU0FSVF9Nc3BJbml0KCkgQVBJOgorICAgICAgICAgICgrKykgRW5hYmxlIHRoZSBVU0FSVHggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAgICgrKykgVVNBUlQgcGlucyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFVTQVJUIEdQSU9zLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFVTQVJUIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCisgICAgICAgICAgKCsrKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzIChIQUxfVVNBUlRfVHJhbnNtaXRfSVQoKSwKKyAgICAgICAgICAgICAgICBIQUxfVVNBUlRfUmVjZWl2ZV9JVCgpIGFuZCBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlQgSVJRIGhhbmRsZS4KKyAgICAgICAgICAgICgrKykgVVNBUlQgaW50ZXJydXB0cyBoYW5kbGluZzoKKyAgICAgICAgICAgICAgLUBALSAgIFRoZSBzcGVjaWZpYyBVU0FSVCBpbnRlcnJ1cHRzIChUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0LAorICAgICAgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgICAgICAgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoKSBhbmQgX19IQUxfVVNBUlRfRElTQUJMRV9JVCgpIGluc2lkZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzcy4KKyAgICAgICAgICAoKyspIERNQSBDb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBETUEgcHJvY2VzcyAoSEFMX1VTQVJUX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgICBIQUxfVVNBUlRfUmVjZWl2ZV9ETUEoKSBhbmQgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoKSBBUElzKToKKyAgICAgICAgICAgICgrKyspIERlY2xhcmUgYSBETUEgaGFuZGxlIHN0cnVjdHVyZSBmb3IgdGhlIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBkZWNsYXJlZCBETUEgaGFuZGxlIHN0cnVjdHVyZSB3aXRoIHRoZSByZXF1aXJlZCBUeC9SeCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgVVNBUlQgRE1BIFR4L1J4IGhhbmRsZS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisKKyAgICAgICgjKSBQcm9ncmFtIHRoZSBCYXVkIFJhdGUsIFdvcmQgTGVuZ3RoLCBTdG9wIEJpdCwgUGFyaXR5LCBhbmQgTW9kZQorICAgICAgICAgIChSZWNlaXZlci9UcmFuc21pdHRlcikgaW4gdGhlIGh1c2FydCBoYW5kbGUgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAgICgjKSBJbml0aWFsaXplIHRoZSBVU0FSVCByZWdpc3RlcnMgYnkgY2FsbGluZyB0aGUgSEFMX1VTQVJUX0luaXQoKSBBUEk6CisgICAgICAgICAgKCsrKSBUaGlzIEFQSSBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZSBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjKQorICAgICAgICAgICAgICAgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBIQUxfVVNBUlRfTXNwSW5pdCgmaHVzYXJ0KSBBUEkuCisKKyAgICBbLi5dCisgICAgIChAKSBUbyBjb25maWd1cmUgYW5kIGVuYWJsZS9kaXNhYmxlIHRoZSBVU0FSVCB0byB3YWtlIHVwIHRoZSBNQ1UgZnJvbSBzdG9wIG1vZGUsIHJlc29ydCB0byBVQVJUIEFQSSdzCisgICAgICAgIEhBTF9VQVJURXhfU3RvcE1vZGVXYWtlVXBTb3VyY2VDb25maWcoKSwgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZSgpIGFuZAorICAgICAgICBIQUxfVUFSVEV4X0Rpc2FibGVTdG9wTW9kZSgpIGluIGNhc3RpbmcgdGhlIFVTQVJUIGhhbmRsZSB0byBVQVJUIHR5cGUgVUFSVF9IYW5kbGVUeXBlRGVmLgorCisgICAgIyMjIyMgQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICMjIyMjCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgWy4uXQorICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgICBbLi5dCisgICAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX1VTQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIHVzZXIgY2FsbGJhY2suCisgICAgRnVuY3Rpb24gQHJlZiBIQUxfVVNBUlRfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgIDogVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFR4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgIDogUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBUeFJ4Q3BsdENhbGxiYWNrICAgICAgICAgIDogVHggUnggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBFcnJvciBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICA6IEFib3J0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVVNBUlQgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFVTQVJUIE1zcERlSW5pdC4KKyAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfVVNBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLgorICAgIEByZWYgSEFMX1VTQVJUX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogVHggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogUnggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4UnhDcGx0Q2FsbGJhY2sgICAgICAgICAgOiBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBVU0FSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVVNBUlQgTXNwRGVJbml0LgorCisgICAgWy4uXQorICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9VU0FSVF9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9VU0FSVF9TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZXMgQHJlZiBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKCkuCisgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVzcGVjdGl2ZWx5CisgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX1VTQVJUX0luaXQoKQorICAgIGFuZCBAcmVmIEhBTF9VU0FSVF9EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1VTQVJUX0luaXQoKSBhbmQgQHJlZiBIQUxfVVNBUlRfRGVJbml0KCkKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1VTQVJUX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICBpbiBIQUxfVVNBUlRfU1RBVEVfUkVBRFkgb3IgSEFMX1VTQVJUX1NUQVRFX1JFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpCisgICAgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgIHVzaW5nIEByZWYgSEFMX1VTQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9VU0FSVF9EZUluaXQoKQorICAgIG9yIEByZWYgSEFMX1VTQVJUX0luaXQoKSBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlQgVVNBUlQKKyAgKiBAYnJpZWYgSEFMIFVTQVJUIFN5bmNocm9ub3VzIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX0NvbnN0YW50cyBVU0FSVCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX0RVTU1ZX0RBVEEgICAgICAgICAgKCh1aW50MTZfdCkgMHhGRkZGKSAgICAgICAgICAgLyohPCBVU0FSVCB0cmFuc21pdHRlZCBkdW1teSBkYXRhICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCAgICAgICAgICAgICAxMDAwVSAgICAgICAgICAgICAvKiE8IFVTQVJUIFRYIG9yIFJYIGVuYWJsZSBhY2tub3dsZWRnZSB0aW1lLW91dCB2YWx1ZSAqLworI2RlZmluZSBVU0FSVF9DUjFfRklFTERTICAgICAgICAgICgodWludDMyX3QpKFVTQVJUX0NSMV9NIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgIHwgVVNBUlRfQ1IxX09WRVI4KSkgICAgLyohPCBVU0FSVCBDUjEgZmllbGRzIG9mIHBhcmFtZXRlcnMgc2V0IGJ5IFVTQVJUX1NldENvbmZpZyBBUEkgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0ZJRUxEUyAgICAgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjJfQ1BIQSB8IFVTQVJUX0NSMl9DUE9MIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9MQkNMIHwgVVNBUlRfQ1IyX1NUT1ApKSAvKiE8IFVTQVJUIENSMiBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgVVNBUlRfU2V0Q29uZmlnIEFQSSAqLworCisjZGVmaW5lIFVTQVJUX0JSUl9NSU4gICAgMHgxMFUgICAgICAgIC8qIFVTQVJUIEJSUiBtaW5pbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKyNkZWZpbmUgVVNBUlRfQlJSX01BWCAgICAweEZGRkZVICAgICAgLyogVVNBUlQgQlJSIG1heGltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgVVNBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCitzdGF0aWMgdm9pZCBVU0FSVF9FbmRUcmFuc2ZlcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX1NldENvbmZpZyhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX0NoZWNrSWRsZVN0YXRlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9UeElTUl84QklUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9UeElTUl8xNkJJVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIHZvaWQgVVNBUlRfRW5kVHJhbnNtaXRfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3N0YXRpYyB2b2lkIFVTQVJUX1J4SVNSXzhCSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3N0YXRpYyB2b2lkIFVTQVJUX1J4SVNSXzE2QklUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBVU0FSVAorICAgIGluIGFzeW5jaHJvbm91cyBhbmQgaW4gc3luY2hyb25vdXMgbW9kZXMuCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSBvbmx5IHRoZXNlIHBhcmFtZXRlcnMgY2FuIGJlIGNvbmZpZ3VyZWQ6CisgICAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAgICgrKykgV29yZCBMZW5ndGgKKyAgICAgICAgKCsrKSBTdG9wIEJpdAorICAgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgICBpbiB0aGUgZGF0YSByZWdpc3RlciBpcyB0cmFuc21pdHRlZCBidXQgaXMgY2hhbmdlZCBieSB0aGUgcGFyaXR5IGJpdC4KKyAgICAgICAgKCsrKSBVU0FSVCBwb2xhcml0eQorICAgICAgICAoKyspIFVTQVJUIHBoYXNlCisgICAgICAgICgrKykgVVNBUlQgTGFzdEJpdAorICAgICAgICAoKyspIFJlY2VpdmVyL3RyYW5zbWl0dGVyIG1vZGVzCisKKyAgICBbLi5dCisgICAgVGhlIEhBTF9VU0FSVF9Jbml0KCkgZnVuY3Rpb24gZm9sbG93cyB0aGUgVVNBUlQgIHN5bmNocm9ub3VzIGNvbmZpZ3VyYXRpb24KKyAgICBwcm9jZWR1cmUgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmUgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBmcmFtZSBsZW5ndGggZGVmaW5lZCBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LAorICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVU0FSVCBmb3JtYXRzIGFyZSBsaXN0ZWQgaW4gdGhlCisgIGZvbGxvd2luZyB0YWJsZS4KKworICAgIFRhYmxlIDEuIFVTQVJUIGZyYW1lIGZvcm1hdC4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgTTEgYml0IHwgIE0wIGJpdCB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgVVNBUlQgZnJhbWUgICAgICAgICAgICAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAwICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDggYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgNyBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA5IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDggYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgNyBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA2IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgVVNBUlQgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVVNBUlRfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9Jbml0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogQ2hlY2sgdGhlIFVTQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodXNhcnQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfSU5TVEFOQ0UoaHVzYXJ0LT5JbnN0YW5jZSkpOworCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodXNhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBVU0FSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGh1c2FydCk7CisKKyAgICBpZiAoaHVzYXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodXNhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VU0FSVF9Nc3BJbml0OworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGh1c2FydC0+TXNwSW5pdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VTQVJUX01zcEluaXQoaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVVNBUlRfRElTQUJMRShodXNhcnQpOworCisgIC8qIFNldCB0aGUgVXNhcnQgQ29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisgIGlmIChVU0FSVF9TZXRDb25maWcoaHVzYXJ0KSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogSW4gU3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyCisgIC0gSERTRUwsIFNDRU4gYW5kIElSRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIGh1c2FydC0+SW5zdGFuY2UtPkNSMiAmPSB+VVNBUlRfQ1IyX0xJTkVOOworICBodXNhcnQtPkluc3RhbmNlLT5DUjMgJj0gfihVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCB8IFVTQVJUX0NSM19JUkVOKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVVNBUlRfRU5BQkxFKGh1c2FydCk7CisgIAorICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoVVNBUlRfQ2hlY2tJZGxlU3RhdGUoaHVzYXJ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFVTQVJUIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RlSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIENoZWNrIHRoZSBVU0FSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHVzYXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1k7CisKKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxID0gMHgwVTsKKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyID0gMHgwVTsKKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzID0gMHgwVTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHVzYXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHVzYXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9VU0FSVF9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHVzYXJ0LT5Nc3BEZUluaXRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX1VTQVJUX01zcERlSW5pdChodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRVNFVDsKKworICAvKiBQcm9jZXNzIFVubG9jayAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVVNBUlQgTVNQLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX01zcEluaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgVVNBUlQgTVNQLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX01zcERlSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9Nc3BEZUluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFVTQVJUIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHVzYXJ0IHVzYXJ0IGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1RYX0NPTVBMRVRFX0NCX0lEIFR4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1RYX1JYX0NPTVBMRVRFX0NCX0lEIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9BQk9SVF9DT01QTEVURV9DQl9JRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1JYX0ZJRk9fRlVMTF9DQl9JRCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKysgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVnaXN0ZXJDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIEhBTF9VU0FSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVVNBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+VHhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9UWF9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPkFib3J0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBVQVJUIENhbGxiYWNrCisgICogICAgICAgICBVQVJUIGNhbGxhYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh1c2FydCB1YXJ0IGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1JYX0NPTVBMRVRFX0NCX0lEIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfVFhfUlhfQ09NUExFVEVfQ0JfSUQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfUlhfRklGT19GVUxMX0NCX0lEIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9VblJlZ2lzdGVyQ2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCBIQUxfVVNBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICBpZiAoSEFMX1VTQVJUX1NUQVRFX1JFQURZID09IGh1c2FydC0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVVNBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrICBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5UeENwbHRDYWxsYmFjayA9IEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9UWF9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayA9IEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5FcnJvckNhbGxiYWNrID0gSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5BYm9ydENwbHRDYWxsYmFjayA9IEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKworICAgICAgY2FzZSBIQUxfVVNBUlRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1VTQVJUX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1VTQVJUX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfVVNBUlRfU1RBVEVfUkVTRVQgPT0gaHVzYXJ0LT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgIFVTQVJUIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBVU0FSVCBzeW5jaHJvbm91cworICAgIGRhdGEgdHJhbnNmZXJzLgorCisgICAgWy4uXSBUaGUgVVNBUlQgc3VwcG9ydHMgbWFzdGVyIG1vZGUgb25seTogaXQgY2Fubm90IHJlY2VpdmUgb3Igc2VuZCBkYXRhIHJlbGF0ZWQgdG8gYW4gaW5wdXQKKyAgICAgICAgIGNsb2NrIChTQ0xLIGlzIGFsd2F5cyBhbiBvdXRwdXQpLgorCisgICAgWy4uXQorCisgICAgKCMpIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CisgICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLgorICAgICAgICAoKyspIE5vLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgICAgb3IgRE1BLCBUaGVzZSBBUEkncyByZXR1cm4gdGhlIEhBTCBzdGF0dXMuCisgICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICAgZGVkaWNhdGVkIFVTQVJUIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjaygpIGFuZCBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2tzCisgICAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgUmVjZWl2ZSBwcm9jZXNzCisgICAgICAgICAgICAgVGhlIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBCbG9ja2luZyBtb2RlIEFQSSdzIGFyZSA6CisgICAgICAgICgrKykgSEFMX1VTQVJUX1RyYW5zbWl0KCkgaW4gc2ltcGxleCBtb2RlCisgICAgICAgICgrKykgSEFMX1VTQVJUX1JlY2VpdmUoKSBpbiBmdWxsIGR1cGxleCByZWNlaXZlIG9ubHkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlKCkgaW4gZnVsbCBkdXBsZXggbW9kZQorCisgICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIEFQSSdzIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKCkgaW4gc2ltcGxleCBtb2RlCisgICAgICAgICgrKykgSEFMX1VTQVJUX1JlY2VpdmVfSVQoKSBpbiBmdWxsIGR1cGxleCByZWNlaXZlIG9ubHkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0lUKCkgaW4gZnVsbCBkdXBsZXggbW9kZQorICAgICAgICAoKyspIEhBTF9VU0FSVF9JUlFIYW5kbGVyKCkKKworICAgICgjKSBOby1CbG9ja2luZyBtb2RlIEFQSSdzICB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9VU0FSVF9UcmFuc21pdF9ETUEoKSBpbiBzaW1wbGV4IG1vZGUKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUmVjZWl2ZV9ETUEoKSBpbiBmdWxsIGR1cGxleCByZWNlaXZlIG9ubHkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0RNQSgpIGluIGZ1bGwgZHVwbGV4IG1vZGUKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfRE1BUGF1c2UoKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9ETUFSZXN1bWUoKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9ETUFTdG9wKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIE5vbl9CbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soKQorCisgICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIHRyYW5zZmVycyBjb3VsZCBiZSBhYm9ydGVkIHVzaW5nIEFib3J0IEFQSSdzIDoKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfQWJvcnQoKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9BYm9ydF9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9VU0FSVF9BYm9ydF9JVCksIGEgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGlzIHByb3ZpZGVkOgorICAgICAgICAoKyspIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjaygpCisKKyAgICAoIykgSW4gTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzLCBwb3NzaWJsZSBlcnJvcnMgYXJlIHNwbGl0IGludG8gMiBjYXRlZ29yaWVzLgorICAgICAgICBFcnJvcnMgYXJlIGhhbmRsZWQgYXMgZm9sbG93cyA6CisgICAgICAgICgrKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcworICAgICAgICAgICAgIHRvIGJlIGV2YWx1YXRlZCBieSB1c2VyIDogdGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciwgUGFyaXR5IEVycm9yIG9yIE5vaXNlIEVycm9yIGluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiAuCisgICAgICAgICAgICAgUmVjZWl2ZWQgY2hhcmFjdGVyIGlzIHRoZW4gcmV0cmlldmVkIGFuZCBzdG9yZWQgaW4gUnggYnVmZmVyLCBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsCisgICAgICAgICAgICAgYW5kIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4gVHJhbnNmZXIgaXMga2VwdCBvbmdvaW5nIG9uIFVTQVJUIHNpZGUuCisgICAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgorICAgICAgICAoKyspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICAgIFRoaXMgY29uY2VybnMgT3ZlcnJ1biBFcnJvciBJbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gYW5kIGFsbCBlcnJvcnMgaW4gRE1BIG1vZGUuCisgICAgICAgICAgICAgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLCBhbmQgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggc2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwVHhEYXRhLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQ4X3QgICpwdHhkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwdHhkYXRhMTZiaXRzOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFR4RGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW1ldGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgdG8gYmUgZmlsbGVkIGludG8gVERSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIHRocm91Z2ggYSB1MTYgY2FzdC4gKi8KKyAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcFR4RGF0YSkgJiAxVSkgIT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBodXNhcnQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBUeERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBwdHhkYXRhOGJpdHMgID0gTlVMTDsKKyAgICAgIHB0eGRhdGExNmJpdHMgPSAodWludDE2X3QgKikgcFR4RGF0YTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHB0eGRhdGE4Yml0cyAgPSBwVHhEYXRhOworICAgICAgcHR4ZGF0YTE2Yml0cyA9IE5VTEw7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhlIHJlbWFpbmluZyBkYXRhIHRvIGJlIHNlbnQgKi8KKyAgICB3aGlsZSAoaHVzYXJ0LT5UeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYgKHB0eGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCpwdHhkYXRhMTZiaXRzICYgMHgwMUZGVSk7CisgICAgICAgIHB0eGRhdGExNmJpdHMrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpwdHhkYXRhOGJpdHMgJiAweEZGVSk7CisgICAgICAgIHB0eGRhdGE4Yml0cysrOworICAgICAgfQorCisgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorCisgICAgaWYgKFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVzYXJ0LCBVU0FSVF9GTEFHX1RDLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIENsZWFyIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBGbGFnICovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX1RDRik7CisKKyAgICAvKiBDbGVhciBvdmVycnVuIGZsYWcgYW5kIGRpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgICBfX0hBTF9VU0FSVF9DTEVBUl9PUkVGTEFHKGh1c2FydCk7CisgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgVG8gcmVjZWl2ZSBzeW5jaHJvbm91cyBkYXRhLCBkdW1teSBkYXRhIGFyZSBzaW11bHRhbmVvdXNseSB0cmFuc21pdHRlZC4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVyIGZvciBzdG9yaW5nIGRhdGEgdG8gYmUgcmVjZWl2ZWQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHJlY2VpdmVkIGRhdGEgd2lsbCBiZSBoYW5kbGVkIHVzaW5nIHUxNiBwb2ludGVyIGNhc3QpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcFJ4RGF0YS4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gcFJ4RGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQ4X3QgICpwcnhkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwcnhkYXRhMTZiaXRzOworICB1aW50MTZfdCB1aE1hc2s7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwUnhEYXRhIGJ1ZmZlciBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSByZWNlaXZlZCBmcm9tIFJEUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBSeERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaHVzYXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIFVTQVJUIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyICovCisgICAgVVNBUlRfTUFTS19DT01QVVRBVElPTihodXNhcnQpOworICAgIHVoTWFzayA9IGh1c2FydC0+TWFzazsKKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwUnhEYXRhIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYSB1aW50MTZfdCBwb2ludGVyICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgcHJ4ZGF0YThiaXRzICA9IE5VTEw7CisgICAgICBwcnhkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBSeERhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcnhkYXRhOGJpdHMgID0gcFJ4RGF0YTsKKyAgICAgIHByeGRhdGExNmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIC8qIGFzIGxvbmcgYXMgZGF0YSBoYXZlIHRvIGJlIHJlY2VpdmVkICovCisgICAgd2hpbGUgKGh1c2FydC0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0IHRvIHNlbmQgZHVtbXkgYnl0ZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUKKyAgICAgICAgKiBjbG9jayBmb3IgdGhlIHNsYXZlIHRvIHNlbmQgZGF0YS4KKyAgICAgICAgKiBXaGF0ZXZlciB0aGUgZnJhbWUgbGVuZ3RoICg3LCA4IG9yIDktYml0IGxvbmcpLCB0aGUgc2FtZSBkdW1teSB2YWx1ZQorICAgICAgICAqIGNhbiBiZSB3cml0dGVuIGZvciBhbGwgdGhlIGNhc2VzLiAqLworICAgICAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0ZMQUdfVFhFLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKFVTQVJUX0RVTU1ZX0RBVEEgJiAodWludDE2X3QpMHgwRkYpOworICAgICAgfQorCisgICAgICAvKiBXYWl0IGZvciBSWE5FIEZsYWcgKi8KKyAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19SWE5FLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKworICAgICAgaWYgKHByeGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAqcHJ4ZGF0YTE2Yml0cyA9ICh1aW50MTZfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgcHJ4ZGF0YTE2Yml0cysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqcHJ4ZGF0YThiaXRzID0gKHVpbnQ4X3QpKGh1c2FydC0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KSh1aE1hc2sgJiAweEZGVSkpOworICAgICAgICBwcnhkYXRhOGJpdHMrKzsKKyAgICAgIH0KKworICAgICAgaHVzYXJ0LT5SeFhmZXJDb3VudC0tOworCisgICAgfQorCisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBGdWxsLUR1cGxleCBTZW5kIGFuZCBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlcnMgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQvcmVjZWl2ZWQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQvcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwVHhEYXRhIGFuZCBwUnhEYXRhLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBUWCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBSWCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCAoc2FtZSBhbW91bnQgdG8gYmUgcmVjZWl2ZWQpLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQ4X3QgICpwcnhkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwcnhkYXRhMTZiaXRzOworICB1aW50OF90ICAqcHR4ZGF0YThiaXRzOworICB1aW50MTZfdCAqcHR4ZGF0YTE2Yml0czsKKyAgdWludDE2X3QgdWhNYXNrOworICB1aW50MTZfdCByeGRhdGFjb3VudDsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBUeERhdGEgYW5kIHBSeERhdGEgYnVmZmVycyBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSBmaWxsZWQgaW50byBURFIvcmV0cmlldmVkIGZyb20gUkRSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIHRocm91Z2ggYSB1MTYgY2FzdC4gKi8KKyAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgoKHVpbnQzMl90KXBUeERhdGEpICYgMVUpICE9IDBVKSB8fCAoKCgodWludDMyX3QpcFJ4RGF0YSkgJiAxVSkgIT0gMFUpKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaHVzYXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSBTaXplOworICAgIGh1c2FydC0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ29tcHV0YXRpb24gb2YgVVNBUlQgbWFzayB0byBhcHBseSB0byBSRFIgcmVnaXN0ZXIgKi8KKyAgICBVU0FSVF9NQVNLX0NPTVBVVEFUSU9OKGh1c2FydCk7CisgICAgdWhNYXNrID0gaHVzYXJ0LT5NYXNrOworCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBSeERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBwcnhkYXRhOGJpdHMgID0gTlVMTDsKKyAgICAgIHB0eGRhdGE4Yml0cyAgPSBOVUxMOworICAgICAgcHR4ZGF0YTE2Yml0cyA9ICh1aW50MTZfdCAqKSBwVHhEYXRhOworICAgICAgcHJ4ZGF0YTE2Yml0cyA9ICh1aW50MTZfdCAqKSBwUnhEYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcHJ4ZGF0YThiaXRzICA9IHBSeERhdGE7CisgICAgICBwdHhkYXRhOGJpdHMgID0gcFR4RGF0YTsKKyAgICAgIHB0eGRhdGExNmJpdHMgPSBOVUxMOworICAgICAgcHJ4ZGF0YTE2Yml0cyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGh1c2FydC0+VHhYZmVyQ291bnQgPT0gMHgwMVUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgdG8gc2VuZCBkYXRhICovCisgICAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0ZMQUdfVFhFLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIGlmIChwdHhkYXRhOGJpdHMgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQxNl90KSgqcHR4ZGF0YTE2Yml0cyAmIHVoTWFzayk7CisgICAgICAgIHB0eGRhdGExNmJpdHMrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpwdHhkYXRhOGJpdHMgJiAodWludDhfdCkodWhNYXNrICYgMHhGRlUpKTsKKyAgICAgICAgcHR4ZGF0YThiaXRzKys7CisgICAgICB9CisKKyAgICAgIGh1c2FydC0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisKKyAgICAvKiBDaGVjayB0aGUgcmVtYWluIGRhdGEgdG8gYmUgc2VudCAqLworICAgIC8qIHJ4ZGF0YWNvdW50IGlzIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBNSVNSQUMyMDEyLVJ1bGUtMTMuNSAqLworICAgIHJ4ZGF0YWNvdW50ID0gaHVzYXJ0LT5SeFhmZXJDb3VudDsKKyAgICB3aGlsZSAoKGh1c2FydC0+VHhYZmVyQ291bnQgPiAwVSkgfHwgKHJ4ZGF0YWNvdW50ID4gMFUpKQorICAgIHsKKyAgICAgIGlmIChodXNhcnQtPlR4WGZlckNvdW50ID4gMFUpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0IHRvIHNlbmQgZGF0YSAqLworICAgICAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0ZMQUdfVFhFLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB0eGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQxNl90KSgqcHR4ZGF0YTE2Yml0cyAmIHVoTWFzayk7CisgICAgICAgICAgcHR4ZGF0YTE2Yml0cysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqcHR4ZGF0YThiaXRzICYgKHVpbnQ4X3QpKHVoTWFzayAmIDB4RkZVKSk7CisgICAgICAgICAgcHR4ZGF0YThiaXRzKys7CisgICAgICAgIH0KKworICAgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgICB9CisKKyAgICAgIGlmIChodXNhcnQtPlJ4WGZlckNvdW50ID4gMFUpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgZm9yIFJYTkUgRmxhZyAqLworICAgICAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0ZMQUdfUlhORSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByeGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgKnByeGRhdGExNmJpdHMgPSAodWludDE2X3QpKGh1c2FydC0+SW5zdGFuY2UtPlJEUiAmIHVoTWFzayk7CisgICAgICAgICAgcHJ4ZGF0YTE2Yml0cysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICpwcnhkYXRhOGJpdHMgPSAodWludDhfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpKHVoTWFzayAmIDB4RkZVKSk7CisgICAgICAgICAgcHJ4ZGF0YThiaXRzKys7CisgICAgICAgIH0KKworICAgICAgICBodXNhcnQtPlJ4WGZlckNvdW50LS07CisgICAgICB9CisgICAgICByeGRhdGFjb3VudCA9IGh1c2FydC0+UnhYZmVyQ291bnQ7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFR4UnggcHJvY2VzcywgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgZGF0YSB0byBiZSBzZW50LCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIGhhbGYgd29yZCBmcm9udGllciAoMTYgYml0cykKKyAgKiAgICAgICAgIChhcyBzZW50IGRhdGEgd2lsbCBiZSBoYW5kbGVkIHVzaW5nIHUxNiBwb2ludGVyIGNhc3QpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcFR4RGF0YS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtICBwVHhEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBUeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBUeERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIHRvIGJlIGZpbGxlZCBpbnRvIFREUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBUeERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFR4QnVmZlB0ciAgPSBwVHhEYXRhOworICAgIGh1c2FydC0+VHhYZmVyU2l6ZSAgPSBTaXplOworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSBTaXplOworICAgIGh1c2FydC0+VHhJU1IgICAgICAgPSBOVUxMOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlICAgICA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYOworCisgICAgLyogVGhlIFVTQVJUIEVycm9yIEludGVycnVwdHM6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICAgYXJlIG5vdCBtYW5hZ2VkIGJ5IHRoZSBVU0FSVCBUcmFuc21pdCBQcm9jZXNzIHRvIGF2b2lkIHRoZSBvdmVycnVuIGludGVycnVwdAorICAgIHdoZW4gdGhlIHVzYXJ0IG1vZGUgaXMgY29uZmlndXJlZCBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUgIlVTQVJUX01PREVfVFhfUlgiCisgICAgdG8gYmVuZWZpdCBmb3IgdGhlIGZyYW1lIGVycm9yIGFuZCBub2lzZSBpbnRlcnJ1cHRzIHRoZSB1c2FydCBtb2RlIHNob3VsZCBiZQorICAgIGNvbmZpZ3VyZWQgb25seSBmb3IgdHJhbnNtaXQgIlVTQVJUX01PREVfVFgiICovCisKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFR4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIGh1c2FydC0+VHhJU1IgPSBVU0FSVF9UeElTUl8xNkJJVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5UeElTUiA9IFVTQVJUX1R4SVNSXzhCSVQ7CisgICAgICB9CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UWEUpOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICBUbyByZWNlaXZlIHN5bmNocm9ub3VzIGRhdGEsIGR1bW15IGRhdGEgYXJlIHNpbXVsdGFuZW91c2x5IHRyYW5zbWl0dGVkLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgZm9yIHN0b3JpbmcgZGF0YSB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwUnhEYXRhLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwUnhEYXRhIGJ1ZmZlciBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSByZWNlaXZlZCBmcm9tIFJEUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBSeERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFJ4QnVmZlB0ciAgPSBwUnhEYXRhOworICAgIGh1c2FydC0+UnhYZmVyU2l6ZSAgPSBTaXplOworICAgIGh1c2FydC0+UnhYZmVyQ291bnQgPSBTaXplOworICAgIGh1c2FydC0+UnhJU1IgICAgICAgPSBOVUxMOworCisgICAgVVNBUlRfTUFTS19DT01QVVRBVElPTihodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFJ4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIGh1c2FydC0+UnhJU1IgPSBVU0FSVF9SeElTUl8xNkJJVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5SeElTUiA9IFVTQVJUX1J4SVNSXzhCSVQ7CisgICAgICB9CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBhbmQgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0cyAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRSk7CisgICAgfQorCisgICAgeworICAgICAgLyogU2VuZCBkdW1teSBkYXRhIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFNsYXZlIHRvIHNlbmQgdGhlIG5leHQgZGF0YS4KKyAgICAgICovCisgICAgICB7CisgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIEZ1bGwtRHVwbGV4IFNlbmQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlcnMgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQvcmVjZWl2ZWQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQvcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwVHhEYXRhIGFuZCBwUnhEYXRhLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBUWCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBSWCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCAoc2FtZSBhbW91bnQgdG8gYmUgcmVjZWl2ZWQpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsICB1aW50MTZfdCBTaXplKQoreworCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFR4RGF0YSBhbmQgcFJ4RGF0YSBidWZmZXJzIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIHRvIGJlIGZpbGxlZCBpbnRvIFREUi9yZXRyaWV2ZWQgZnJvbSBSRFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgJiYgKGh1c2FydC0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIGlmICgoKCgodWludDMyX3QpcFR4RGF0YSkgJiAxVSkgIT0gMFUpIHx8ICgoKCh1aW50MzJfdClwUnhEYXRhKSAmIDFVKSAhPSAwVSkpCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5wUnhCdWZmUHRyID0gcFJ4RGF0YTsKKyAgICBodXNhcnQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+UnhYZmVyQ291bnQgPSBTaXplOworICAgIGh1c2FydC0+cFR4QnVmZlB0ciA9IHBUeERhdGE7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIFVTQVJUIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyICovCisgICAgVVNBUlRfTUFTS19DT01QVVRBVElPTihodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlg7CisKKyAgICB7CisgICAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5UeElTUiA9IFVTQVJUX1R4SVNSXzE2QklUOworICAgICAgICBodXNhcnQtPlJ4SVNSID0gVVNBUlRfUnhJU1JfMTZCSVQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1c2FydC0+VHhJU1IgPSBVU0FSVF9UeElTUl84QklUOworICAgICAgICBodXNhcnQtPlJ4SVNSID0gVVNBUlRfUnhJU1JfOEJJVDsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgYW5kIFVTQVJUIERhdGEgUmVnaXN0ZXIgbm90IGVtcHR5IEludGVycnVwdHMgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SWE5FSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgZGF0YSB0byBiZSBzZW50LCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIGhhbGYgd29yZCBmcm9udGllciAoMTYgYml0cykKKyAgKiAgICAgICAgIChhcyBzZW50IGRhdGEgd2lsbCBiZSBoYW5kbGVkIGJ5IERNQSBmcm9tIGhhbGZ3b3JkIGZyb250aWVyKS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBUeERhdGEuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgKnRtcDsKKworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBUeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBUeERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIGNvcHkgaW50byBURFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgYnkgRE1BIGZyb20gYSB1MTYgZnJvbnRpZXIuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBUeERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFR4QnVmZlB0ciA9IHBUeERhdGE7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYOworCisgICAgaWYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gVVNBUlRfRE1BVHJhbnNtaXRDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFUeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gVVNBUlRfRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICAgIHRtcCA9ICh1aW50MzJfdCAqKSZwVHhEYXRhOworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWF0eCwgKih1aW50MzJfdCAqKXRtcCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5URFIsIFNpemUpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBUQyBmbGFnIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoaHVzYXJ0LCBVU0FSVF9DTEVBUl9UQ0YpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICAgIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byByZWFkeSAqLworICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGUgVVNBUlQgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBjb250YWluCisgICogICAgICAgICB0aGUgcGFyaXR5IGJpdCAoTVNCIHBvc2l0aW9uKS4KKyAgKiBAbm90ZSBUaGUgVVNBUlQgRE1BIHRyYW5zbWl0IGNoYW5uZWwgbXVzdCBiZSBjb25maWd1cmVkIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIHNsYXZlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgZm9yIHN0b3JpbmcgZGF0YSB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgYnkgRE1BIGZyb20gaGFsZndvcmQgZnJvbnRpZXIpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcFJ4RGF0YS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1JlY2VpdmVfRE1BKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCAqdG1wID0gKHVpbnQzMl90ICopJnBSeERhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBSeERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIGNvcHkgZnJvbSBSRFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgYnkgRE1BIGZyb20gYSB1MTYgZnJvbnRpZXIuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBSeERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFJ4QnVmZlB0ciA9IHBSeERhdGE7CisgICAgaHVzYXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgPSBwUnhEYXRhOworICAgIGh1c2FydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIFJ4IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVJlY2VpdmVDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFSeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBSeCB0cmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gVVNBUlRfRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgcmVjZWl2ZSBETUEgY2hhbm5lbCAqLworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5SRFIsICoodWludDMyX3QgKil0bXAsIFNpemUpOworICAgIH0KKworICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgdHJhbnNtaXQgRE1BIGNoYW5uZWw6IHRoZSB0cmFuc21pdCBjaGFubmVsIGlzIHVzZWQgaW4gb3JkZXIKKyAgICAgICAgIHRvIGdlbmVyYXRlIGluIHRoZSBub24tYmxvY2tpbmcgbW9kZSB0aGUgY2xvY2sgdG8gdGhlIHNsYXZlIGRldmljZSwKKyAgICAgICAgIHRoaXMgbW9kZSBpc24ndCBhIHNpbXBsZXggcmVjZWl2ZSBtb2RlIGJ1dCBhIGZ1bGwtZHVwbGV4IHJlY2VpdmUgbW9kZSAqLworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBUeCBDb21wbGV0ZSBhbmQgRXJyb3IgY2FsbGJhY2sgdG8gTnVsbCAqLworICAgICAgaWYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWF0eCwgKih1aW50MzJfdCAqKXRtcCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5URFIsIFNpemUpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICAgIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaHVzYXJ0LT5oZG1hcngpOworICAgICAgfQorCisgICAgICAvKiBObyBuZWVkIHRvIGNoZWNrIG9uIGVycm9yIGNvZGUgKi8KKyAgICAgIFVOVVNFRChzdGF0dXMpOworCisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byByZWFkeSAqLworICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBGdWxsLUR1cGxleCBUcmFuc21pdCBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGUgVVNBUlQgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpIHRoZSBkYXRhIHJlY2VpdmVkIGNvbnRhaW4gdGhlIHBhcml0eSBiaXQuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlcnMgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQvcmVjZWl2ZWQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQvcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgYnkgRE1BIGZyb20gaGFsZndvcmQgZnJvbnRpZXIpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcFR4RGF0YSBhbmQgcFJ4RGF0YS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtICBwVHhEYXRhIHBvaW50ZXIgdG8gVFggZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gUlggZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkL3NlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgKnRtcDsKKworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBUeERhdGEgPT0gTlVMTCkgfHwgKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBUeERhdGEgYW5kIHBSeERhdGEgYnVmZmVycyBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSBjb3B5IHRvL2Zyb20gVERSL1JEUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCBieSBETUEgZnJvbSBhIHUxNiBmcm9udGllci4gKi8KKyAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgoKHVpbnQzMl90KXBUeERhdGEpICYgMVUpICE9IDBVKSB8fCAoKCgodWludDMyX3QpcFJ4RGF0YSkgJiAxVSkgIT0gMFUpKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFJ4QnVmZlB0ciA9IHBSeERhdGE7CisgICAgaHVzYXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgPSBwVHhEYXRhOworICAgIGh1c2FydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWDsKKworICAgIGlmICgoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkgJiYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIFJ4IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVJlY2VpdmVDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFSeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBUeCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFUcmFuc21pdENwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVR4SGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIFR4IHRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVU0FSVF9ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgUnggdHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFVTQVJUX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIHJlY2VpdmUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIHRtcCA9ICh1aW50MzJfdCAqKSZwUnhEYXRhOworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5SRFIsICoodWludDMyX3QgKil0bXAsIFNpemUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIHRyYW5zbWl0IERNQSBjaGFubmVsICovCisgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgdG1wID0gKHVpbnQzMl90ICopJnBUeERhdGE7CisgICAgICAgIHN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaHVzYXJ0LT5oZG1hdHgsICoodWludDMyX3QgKil0bXAsICh1aW50MzJfdCkmaHVzYXJ0LT5JbnN0YW5jZS0+VERSLCBTaXplKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZihzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBDbGVhciB0aGUgVEMgZmxhZyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKGh1c2FydCwgVVNBUlRfQ0xFQVJfVENGKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGh1c2FydC0+aGRtYXJ4KTsKKyAgICAgIH0KKworICAgICAgLyogTm8gbmVlZCB0byBjaGVjayBvbiBlcnJvciBjb2RlICovCisgICAgICBVTlVTRUQoc3RhdHVzKTsKKworICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBSZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gcmVhZHkgKi8KKyAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUGF1c2UgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BUGF1c2UoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICBjb25zdCBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIHN0YXRlID0gaHVzYXJ0LT5TdGF0ZTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgaWYgKChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgJiYKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgVHggcmVxdWVzdCAqLworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBlbHNlIGlmICgoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpIHx8CisgICAgICAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgICB9CisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVJlc3VtZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIGNvbnN0IEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICBpZiAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIERNQSBUeCByZXF1ZXN0ICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBlbHNlIGlmICgoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpIHx8CisgICAgICAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICAvKiBDbGVhciB0aGUgT3ZlcnJ1biBmbGFnIGJlZm9yZSByZXN1bWluZyB0aGUgUnggdHJhbnNmZXIqLworICAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoaHVzYXJ0LCBVU0FSVF9DTEVBUl9PUkVGKTsKKworICAgIC8qIFJlZW5hYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBETUEgUnggcmVxdWVzdCAgYmVmb3JlIHRoZSBETUEgVHggcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIERNQSBUeCByZXF1ZXN0ICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBTdG9wIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVN0b3AoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBUaGUgTG9jayBpcyBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBBUEkgdG8gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24KKyAgICAgdG8gY2FsbCB0aGUgSEFMIFVTQVJUIEFQSSB1bmRlciBjYWxsYmFja3MgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrKCkgLyBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soKSAvCisgICAgIEhBTF9VU0FSVF9UeEhhbGZDcGx0Q2FsbGJhY2sgLyBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOgorICAgICBpbmRlZWQsIHdoZW4gSEFMX0RNQV9BYm9ydCgpIEFQSSBpcyBjYWxsZWQsIHRoZSBETUEgVFgvUlggVHJhbnNmZXIgb3IgSGFsZiBUcmFuc2ZlciBjb21wbGV0ZQorICAgICBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGlmIHRoZSBETUEgdHJhbnNmZXIgaW50ZXJydXB0aW9uIG9jY3VycyBhdCB0aGUgbWlkZGxlIG9yIGF0IHRoZSBlbmQgb2YKKyAgICAgdGhlIHN0cmVhbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCBiYWNrIGlzIGV4ZWN1dGVkLiAqLworCisgIC8qIERpc2FibGUgdGhlIFVTQVJUIFR4L1J4IERNQSByZXF1ZXN0cyAqLworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIHR4IGNoYW5uZWwgKi8KKyAgaWYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoSEFMX0RNQV9BYm9ydChodXNhcnQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1c2FydC0+aGRtYXR4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIHJ4IGNoYW5uZWwgKi8KKyAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoSEFMX0RNQV9BYm9ydChodXNhcnQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1c2FydC0+aGRtYXJ4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFVTQVJUX0VuZFRyYW5zZmVyKGh1c2FydCk7CisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVU0FSVCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0Fib3J0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIFVTQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodXNhcnQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihodXNhcnQtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfRE1BOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4KKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1c2FydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1c2FydC0+aGRtYXJ4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYgfCBVU0FSVF9DTEVBUl9ORUYgfCBVU0FSVF9DTEVBUl9QRUYgfCBVU0FSVF9DTEVBUl9GRUYpOworCisKKyAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICBfX0hBTF9VU0FSVF9TRU5EX1JFUShodXNhcnQsIFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAvKiBSZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVzYXJ0LT5TdGF0ZSAgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVzZXQgSGFuZGxlIEVycm9yQ29kZSB0byBObyBFcnJvciAqLworICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVTQVJUIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9BYm9ydF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOworCisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBJZiBETUEgVHggYW5kL29yIERNQSBSeCBIYW5kbGVzIGFyZSBhc3NvY2lhdGVkIHRvIFVTQVJUIEhhbmRsZSwgRE1BIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQKKyAgICAgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydCBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHVzYXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVVNBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVTQVJUX0RNQVR4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIC8qIERNQSBSeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVTQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVU0FSVF9ETUFSeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFVTQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgVHggYXQgVVNBUlQgbGV2ZWwgKi8KKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVTQVJUIFR4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHVzYXJ0LT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVTQVJUIFJ4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHVzYXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYWJvcnRjcGx0ID0gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGlmIG5vIERNQSBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24gaXMgcmVxdWlyZWQgPT4gY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGlmIChhYm9ydGNwbHQgPT0gMVUpCisgIHsKKyAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYgfCBVU0FSVF9DTEVBUl9ORUYgfCBVU0FSVF9DTEVBUl9QRUYgfCBVU0FSVF9DTEVBUl9GRUYpOworCisKKyAgICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAvKiBSZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodXNhcnQtPlN0YXRlICA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBodXNhcnQtPkFib3J0Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgVVNBUlQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfVVNBUlRfSVJRSGFuZGxlcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQzMl90IGlzcmZsYWdzICAgPSBSRUFEX1JFRyhodXNhcnQtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBjcjFpdHMgICAgID0gUkVBRF9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgY3IzaXRzICAgICA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMyk7CisKKyAgdWludDMyX3QgZXJyb3JmbGFnczsKKyAgdWludDMyX3QgZXJyb3Jjb2RlOworCisgIC8qIElmIG5vIGVycm9yIG9jY3VycyAqLworICBlcnJvcmZsYWdzID0gKGlzcmZsYWdzICYgKHVpbnQzMl90KShVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfT1JFIHwgVVNBUlRfSVNSX05FKSk7CisgIGlmIChlcnJvcmZsYWdzID09IDBVKQorICB7CisgICAgLyogVVNBUlQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkUpICE9IDBVKQorICAgICAgICAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBpZiAoaHVzYXJ0LT5SeElTUiAhPSBOVUxMKQorICAgICAgeworICAgICAgICBodXNhcnQtPlJ4SVNSKGh1c2FydCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogSWYgc29tZSBlcnJvcnMgb2NjdXIgKi8KKyAgaWYgKChlcnJvcmZsYWdzICE9IDBVKQorICAgICAgJiYgKCgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpCisgICAgICAgICAgfHwgKChjcjFpdHMgJiAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSkgIT0gMFUpKSkKKyAgeworICAgIC8qIFVTQVJUIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUEUpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9QRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfVVNBUlRfQ0xFQVJfSVQoaHVzYXJ0LCBVU0FSVF9DTEVBUl9QRUYpOworCisgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfUEU7CisgICAgfQorCisgICAgLyogVVNBUlQgZnJhbWUgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9GRSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX0lUKGh1c2FydCwgVVNBUlRfQ0xFQVJfRkVGKTsKKworICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX0ZFOworICAgIH0KKworICAgIC8qIFVTQVJUIG5vaXNlIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfTkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9JVChodXNhcnQsIFVTQVJUX0NMRUFSX05FRik7CisKKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9ORTsKKyAgICB9CisKKyAgICAvKiBVU0FSVCBPdmVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX09SRSkgIT0gMFUpCisgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IDBVKSB8fAorICAgICAgICAgICAgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpKQorICAgIHsKKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX0lUKGh1c2FydCwgVVNBUlRfQ0xFQVJfT1JFRik7CisKKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9PUkU7CisgICAgfQorCisKKyAgICAvKiBDYWxsIFVTQVJUIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoaHVzYXJ0LT5FcnJvckNvZGUgIT0gSEFMX1VTQVJUX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogVVNBUlQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORSkgIT0gMFUpCisgICAgICAgICAgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSAwVSkpCisgICAgICB7CisgICAgICAgIGlmIChodXNhcnQtPlJ4SVNSICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBodXNhcnQtPlJ4SVNSKGh1c2FydCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogSWYgT3ZlcnJ1biBlcnJvciBvY2N1cnMsIG9yIGlmIGFueSBlcnJvciBvY2N1cnMgaW4gRE1BIG1vZGUgcmVjZXB0aW9uLAorICAgICAgICAgY29uc2lkZXIgZXJyb3IgYXMgYmxvY2tpbmcgKi8KKyAgICAgIGVycm9yY29kZSA9IGh1c2FydC0+RXJyb3JDb2RlICYgSEFMX1VTQVJUX0VSUk9SX09SRTsKKyAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHx8CisgICAgICAgICAgKGVycm9yY29kZSAhPSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgaXMgYWJvcnRlZAorICAgICAgICAgICBTZXQgdGhlIFVTQVJUIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgSW50ZXJydXB0cywgYW5kIGRpc2FibGUgRE1BIHJlcXVlc3RzLCBpZiBvbmdvaW5nICovCisgICAgICAgIFVTQVJUX0VuZFRyYW5zZmVyKGh1c2FydCk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgICAgIHsKKyAgICAgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUiB8IFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgVHggY2hhbm5lbCAqLworICAgICAgICAgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgVVNBUlQgVHggRE1BIEFib3J0IGNhbGxiYWNrIHRvIE5VTEwgOiBubyBjYWxsYmFjaworICAgICAgICAgICAgICAgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgICAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodXNhcnQtPmhkbWF0eCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBVU0FSVCBSeCBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVVNBUlRfRE1BQWJvcnRPbkVycm9yOworCisgICAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1c2FydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGh1c2FydC0+aGRtYXJ4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEVycm9yIENhbGxiYWNrICovCisgICAgICAgICAgICBodXNhcnQtPkVycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBFcnJvciBDYWxsYmFjayAqLworICAgICAgICAgIGh1c2FydC0+RXJyb3JDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovCisgICAgICAgICAgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vbiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGNvdWxkIGdvIG9uLgorICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHVzYXJ0LT5FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovCisgICAgICAgIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCisgIH0gLyogRW5kIGlmIHNvbWUgZXJyb3Igb2NjdXJzICovCisKKworICAvKiBVU0FSVCBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRSkgIT0gMFUpCisgICAgICAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UWEVJRSkgIT0gMFUpKQorICB7CisgICAgaWYgKGh1c2FydC0+VHhJU1IgIT0gTlVMTCkKKyAgICB7CisgICAgICBodXNhcnQtPlR4SVNSKGh1c2FydCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVTQVJUIGluIG1vZGUgVHJhbnNtaXR0ZXIgKHRyYW5zbWlzc2lvbiBlbmQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVEMpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UQ0lFKSAhPSAwVSkpCisgIHsKKyAgICBVU0FSVF9FbmRUcmFuc21pdF9JVChodXNhcnQpOworICAgIHJldHVybjsKKyAgfQorCit9CisKKy8qKgorICAqIEBicmllZiBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIFJ4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBUeC9SeCBUcmFuc2ZlcnMgY29tcGxldGVkIGNhbGxiYWNrIGZvciB0aGUgbm9uLWJsb2NraW5nIHByb2Nlc3MuCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgVVNBUlQgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgVVNBUlQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIDoKKyAgICAgICgrKSBSZXR1cm4gdGhlIFVTQVJUIGhhbmRsZSBzdGF0ZQorICAgICAgKCspIFJldHVybiB0aGUgVVNBUlQgaGFuZGxlIGVycm9yIGNvZGUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIHRoZSBVU0FSVCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtIGh1c2FydCBwb2ludGVyIHRvIGEgVVNBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0FSVC4KKyAgKiBAcmV0dmFsIFVTQVJUIGhhbmRsZSBzdGF0ZQorICAqLworSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBIQUxfVVNBUlRfR2V0U3RhdGUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICByZXR1cm4gaHVzYXJ0LT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgVVNBUlQgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gaHVzYXJ0IHBvaW50ZXIgdG8gYSBVU0FSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJULgorICAqIEByZXR2YWwgVVNBUlQgaGFuZGxlIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9VU0FSVF9HZXRFcnJvcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHJldHVybiBodXNhcnQtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX0Z1bmN0aW9ucyBVU0FSVCBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBub25lCisgICovCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIFVTQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBJbml0IHRoZSBVU0FSVCBDYWxsYmFjayBzZXR0aW5ncyAqLworICBodXNhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBodXNhcnQtPlR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBodXNhcnQtPlJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBodXNhcnQtPlJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2sgICAgICAgICAgPSBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjazsgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhSeENwbHRDYWxsYmFjayAgICAgICAgICAqLworICBodXNhcnQtPkVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgPSBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAqLworICBodXNhcnQtPkFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgPSBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICAqLworfQorI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgdHJhbnNmZXIgb24gVVNBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBUcmFuc2ZlciBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9FbmRUcmFuc2ZlcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIERpc2FibGUgVFhFSUUsIFRDSUUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogQXQgZW5kIG9mIHByb2Nlc3MsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVTQVJUIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCA9IChVU0FSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgLyogRE1BIE5vcm1hbCBtb2RlICovCisgIGlmIChIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpKQorICB7CisgICAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFgpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICAgIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RDKTsKKyAgICB9CisgIH0KKyAgLyogRE1BIENpcmN1bGFyIG1vZGUgKi8KKyAgZWxzZQorICB7CisgICAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFgpCisgICAgeworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBodXNhcnQtPlR4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIERNQSBVU0FSVCB0cmFuc21pdCBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICovCisgIGh1c2FydC0+VHhIYWxmQ3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiBETUEgVVNBUlQgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCA9IChVU0FSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgLyogRE1BIE5vcm1hbCBtb2RlICovCisgIGlmIChIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpKQorICB7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgUlggdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICBpbiBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisgICAgLyogc2ltaWxhcmx5LCBkaXNhYmxlIHRoZSBETUEgVFggdHJhbnNmZXIgdGhhdCB3YXMgc3RhcnRlZCB0byBwcm92aWRlIHRoZQorICAgICAgIGNsb2NrIHRvIHRoZSBzbGF2ZSBkZXZpY2UgKi8KKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkKKyAgICB7CisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICAvKiBUaGUgVVNBUlQgc3RhdGUgaXMgSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlggKi8KKyAgICBlbHNlCisgICAgeworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisgIH0KKyAgLyogRE1BIGNpcmN1bGFyIG1vZGUgKi8KKyAgZWxzZQorICB7CisgICAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpCisgICAgeworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBodXNhcnQtPlJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgLyogVGhlIFVTQVJUIHN0YXRlIGlzIEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYICovCisgICAgZWxzZQorICAgIHsKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVTQVJUIHJlY2VpdmUgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAqLworICBodXNhcnQtPlJ4SGFsZkNwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICovCisgIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVTQVJUIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisgIGh1c2FydC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgVVNBUlRfRW5kVHJhbnNmZXIoaHVzYXJ0KTsKKworICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfRE1BOworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBFcnJvciBDYWxsYmFjayAqLworICBodXNhcnQtPkVycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVU0FSVCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSBIQUwgc2VydmljZXMgb24gRXJyb3IKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVuY2UpLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisgIGh1c2FydC0+VHhYZmVyQ291bnQgPSAwVTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgaHVzYXJ0LT5FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovCisgIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgVVNBUlQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFJ4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCA9IChVU0FSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgY2hhbm5lbHMgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1c2FydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKGh1c2FydCwgVVNBUlRfQ0xFQVJfT1JFRiB8IFVTQVJUX0NMRUFSX05FRiB8IFVTQVJUX0NMRUFSX1BFRiB8IFVTQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBodXNhcnQtPkFib3J0Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICovCisgIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBVU0FSVCBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHVzYXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIGlmIChodXNhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGh1c2FydC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoaHVzYXJ0LCBVU0FSVF9DTEVBUl9PUkVGIHwgVVNBUlRfQ0xFQVJfTkVGIHwgVVNBUlRfQ0xFQVJfUEVGIHwgVVNBUlRfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVzYXJ0LT5TdGF0ZSAgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBodXNhcnQtPkFib3J0Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICovCisgIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgVVNBUlQgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIEZsYWcgU3BlY2lmaWVzIHRoZSBVU0FSVCBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgU3RhdHVzIHRoZSBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKS4KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHBhcmFtICBUaW1lb3V0IHRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KKyAgd2hpbGUgKChfX0hBTF9VU0FSVF9HRVRfRkxBRyhodXNhcnQsIEZsYWcpID8gU0VUIDogUkVTRVQpID09IFN0YXR1cykKKyAgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIFVTQVJUIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfU2V0Q29uZmlnKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgdWludDMyX3QgdG1wcmVnOworICBVU0FSVF9DbG9ja1NvdXJjZVR5cGVEZWYgY2xvY2tzb3VyY2U7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCAgICAgICAgICAgICAgICA9IEhBTF9PSzsKKyAgdWludDE2X3QgYnJydGVtcDsKKyAgdWludDMyX3QgdXNhcnRkaXYgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfUE9MQVJJVFkoaHVzYXJ0LT5Jbml0LkNMS1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9QSEFTRShodXNhcnQtPkluaXQuQ0xLUGhhc2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0xBU1RCSVQoaHVzYXJ0LT5Jbml0LkNMS0xhc3RCaXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0JBVURSQVRFKGh1c2FydC0+SW5pdC5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfV09SRF9MRU5HVEgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1NUT1BCSVRTKGh1c2FydC0+SW5pdC5TdG9wQml0cykpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfUEFSSVRZKGh1c2FydC0+SW5pdC5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX01PREUoaHVzYXJ0LT5Jbml0Lk1vZGUpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2xlYXIgTSwgUENFLCBQUywgVEUgYW5kIFJFIGJpdHMgYW5kIGNvbmZpZ3VyZQorICAqICB0aGUgVVNBUlQgV29yZCBMZW5ndGgsIFBhcml0eSBhbmQgTW9kZToKKyAgKiAgc2V0IHRoZSBNIGJpdHMgYWNjb3JkaW5nIHRvIGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoIHZhbHVlCisgICogIHNldCBQQ0UgYW5kIFBTIGJpdHMgYWNjb3JkaW5nIHRvIGh1c2FydC0+SW5pdC5QYXJpdHkgdmFsdWUKKyAgKiAgc2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuTW9kZSB2YWx1ZQorICAqICBmb3JjZSBPVkVSOCB0byAxIHRvIGFsbG93IHRvIHJlYWNoIHRoZSBtYXhpbXVtIHNwZWVkIChGY2xvY2svOCkgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KWh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoIHwgaHVzYXJ0LT5Jbml0LlBhcml0eSB8IGh1c2FydC0+SW5pdC5Nb2RlIHwgVVNBUlRfQ1IxX09WRVI4OworICBNT0RJRllfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2xlYXIgYW5kIGNvbmZpZ3VyZSB0aGUgVVNBUlQgQ2xvY2ssIENQT0wsIENQSEEsIExCQ0wgYW5kIFNUT1AgYml0czoKKyAgICogc2V0IENQT0wgYml0IGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuQ0xLUG9sYXJpdHkgdmFsdWUKKyAgICogc2V0IENQSEEgYml0IGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuQ0xLUGhhc2UgdmFsdWUKKyAgICogc2V0IExCQ0wgYml0IGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuQ0xLTGFzdEJpdCB2YWx1ZSAodXNlZCBpbiBTUEkgbWFzdGVyIG1vZGUgb25seSkKKyAgICogc2V0IFNUT1BbMTM6MTJdIGJpdHMgYWNjb3JkaW5nIHRvIGh1c2FydC0+SW5pdC5TdG9wQml0cyB2YWx1ZSAqLworICB0bXByZWcgPSAodWludDMyX3QpKFVTQVJUX0NMT0NLX0VOQUJMRSk7CisgIHRtcHJlZyB8PSAodWludDMyX3QpaHVzYXJ0LT5Jbml0LkNMS0xhc3RCaXQ7CisgIHRtcHJlZyB8PSAoKHVpbnQzMl90KWh1c2FydC0+SW5pdC5DTEtQb2xhcml0eSB8ICh1aW50MzJfdClodXNhcnQtPkluaXQuQ0xLUGhhc2UpOworICB0bXByZWcgfD0gKHVpbnQzMl90KWh1c2FydC0+SW5pdC5TdG9wQml0czsKKyAgTU9ESUZZX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9GSUVMRFMsIHRtcHJlZyk7CisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQlJSIGlzIGZpbGxlZC11cCBhY2NvcmRpbmcgdG8gT1ZFUjggYml0IHNldHRpbmcgd2hpY2ggaXMgZm9yY2VkIHRvIDEgICAgICovCisgIFVTQVJUX0dFVENMT0NLU09VUkNFKGh1c2FydCwgY2xvY2tzb3VyY2UpOworCisgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCisgIHsKKyAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVTQVJUX0RJVl9TQU1QTElORzgoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSwgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX1BDTEsyOgorICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVTQVJUX0RJVl9TQU1QTElORzgoSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSwgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX0hTSToKKyAgICAgIGlmIChfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNJRElWKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVTQVJUX0RJVl9TQU1QTElORzgoKEhTSV9WQUxVRSA+PiAyVSksIGh1c2FydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB1c2FydGRpdiA9ICh1aW50MzJfdCkoVVNBUlRfRElWX1NBTVBMSU5HOChIU0lfVkFMVUUsIGh1c2FydC0+SW5pdC5CYXVkUmF0ZSkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBVU0FSVF9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICB1c2FydGRpdiA9ICh1aW50MzJfdCkoVVNBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBodXNhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVVNBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVTQVJUX0RJVl9TQU1QTElORzgoTFNFX1ZBTFVFLCBodXNhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFVTQVJURElWIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBkMTYgYW5kIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBmZmZmICovCisgIGlmICgodXNhcnRkaXYgPj0gVVNBUlRfQlJSX01JTikgJiYgKHVzYXJ0ZGl2IDw9IFVTQVJUX0JSUl9NQVgpKQorICB7CisgICAgYnJydGVtcCA9ICh1aW50MTZfdCkodXNhcnRkaXYgJiAweEZGRjBVKTsKKyAgICBicnJ0ZW1wIHw9ICh1aW50MTZfdCkoKHVzYXJ0ZGl2ICYgKHVpbnQxNl90KTB4MDAwRlUpID4+IDFVKTsKKyAgICBodXNhcnQtPkluc3RhbmNlLT5CUlIgPSBicnJ0ZW1wOworICB9CisgIGVsc2UKKyAgeworICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgfQorCisKKyAgLyogQ2xlYXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgIGh1c2FydC0+UnhJU1IgICA9IE5VTEw7CisgIGh1c2FydC0+VHhJU1IgICA9IE5VTEw7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmIENoZWNrIHRoZSBVU0FSVCBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX0NoZWNrSWRsZVN0YXRlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXRpYWxpemUgdGhlIFVTQVJUIEVycm9yQ29kZSAqLworICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodXNhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfVEUpID09IFVTQVJUX0NSMV9URSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgVEVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgLyogQ2hlY2sgaWYgdGhlIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodXNhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBVU0FSVCBzdGF0ZSovCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggc2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVVNBUlRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAbm90ZSAgIFRoZSBVU0FSVCBlcnJvcnMgYXJlIG5vdCBtYW5hZ2VkIHRvIGF2b2lkIHRoZSBvdmVycnVuIGVycm9yLgorICAqIEBub3RlICAgSVNSIGZ1bmN0aW9uIGV4ZWN1dGVkIHdoZW4gZGF0YSB3b3JkIGxlbmd0aCBpcyBsZXNzIHRoYW4gOSBiaXRzIGxvbmcuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfVHhJU1JfOEJJVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIGNvbnN0IEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdCAqLworICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UQyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKmh1c2FydC0+cFR4QnVmZlB0ciAmICh1aW50OF90KTB4RkYpOworICAgICAgaHVzYXJ0LT5wVHhCdWZmUHRyKys7CisgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCBzZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9UcmFuc21pdF9JVCgpLgorICAqIEBub3RlICAgVGhlIFVTQVJUIGVycm9ycyBhcmUgbm90IG1hbmFnZWQgdG8gYXZvaWQgdGhlIG92ZXJydW4gZXJyb3IuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBkYXRhIHdvcmQgbGVuZ3RoIGlzIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1R4SVNSXzE2QklUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgY29uc3QgSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGh1c2FydC0+U3RhdGU7CisgIHVpbnQxNl90ICp0bXA7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdCAqLworICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UQyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0bXAgPSAodWludDE2X3QgKikgaHVzYXJ0LT5wVHhCdWZmUHRyOworICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQxNl90KSgqdG1wICYgMHgwMUZGVSk7CisgICAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorICB9Cit9CisKKworLyoqCisgICogQGJyaWVmICBXcmFwcyB1cCB0cmFuc21pc3Npb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBodXNhcnQgUG9pbnRlciB0byBhIFVTQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0FSVCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9FbmRUcmFuc21pdF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIERpc2FibGUgdGhlIFVTQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFX0lUKGh1c2FydCwgVVNBUlRfSVRfVEMpOworCisgIC8qIERpc2FibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX0VSUik7CisKKyAgLyogQ2xlYXIgVHhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICBodXNhcnQtPlR4SVNSID0gTlVMTDsKKworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBhbmQgZGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICAgIF9fSEFMX1VTQVJUX0NMRUFSX09SRUZMQUcoaHVzYXJ0KTsKKyAgICBfX0hBTF9VU0FSVF9TRU5EX1JFUShodXNhcnQsIFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAgIC8qIFR4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaHVzYXJ0LT5UeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlIGlmIChodXNhcnQtPlJ4WGZlckNvdW50ID09IDBVKQorICB7CisgICAgLyogVHhSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorfQorCisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCByZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9SZWNlaXZlX0lUKCkuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBkYXRhIHdvcmQgbGVuZ3RoIGlzIGxlc3MgdGhhbiA5IGJpdHMgbG9uZy4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1J4SVNSXzhCSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICBjb25zdCBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIHN0YXRlID0gaHVzYXJ0LT5TdGF0ZTsKKyAgdWludDE2X3QgdHhkYXRhY291bnQ7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1c2FydC0+TWFzazsKKworICBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgICpodXNhcnQtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICBodXNhcnQtPnBSeEJ1ZmZQdHIrKzsKKyAgICBodXNhcnQtPlJ4WGZlckNvdW50LS07CisKKyAgICBpZiAoaHVzYXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdCovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBodXNhcnQtPlJ4SVNSID0gTlVMTDsKKworICAgICAgLyogdHhkYXRhY291bnQgaXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIE1JU1JBQzIwMTItUnVsZS0xMy41ICovCisgICAgICB0eGRhdGFjb3VudCA9IGh1c2FydC0+VHhYZmVyQ291bnQ7CisKKyAgICAgIGlmIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkKKyAgICAgIHsKKworICAgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChSRUFEX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSAhPSBVU0FSVF9DUjFfVENJRSkgJiYKKyAgICAgICAgICAgICAgICh0eGRhdGFjb3VudCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFR4UnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKQorICAgIHsKKyAgICAgIC8qIFNlbmQgZHVtbXkgYnl0ZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBTbGF2ZSB0byBTZW5kIHRoZSBuZXh0IGRhdGEgKi8KKyAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCByZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9SZWNlaXZlX0lUKCkuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBkYXRhIHdvcmQgbGVuZ3RoIGlzIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfUnhJU1JfMTZCSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICBjb25zdCBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIHN0YXRlID0gaHVzYXJ0LT5TdGF0ZTsKKyAgdWludDE2X3QgdHhkYXRhY291bnQ7CisgIHVpbnQxNl90ICp0bXA7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1c2FydC0+TWFzazsKKworICBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgIHRtcCA9ICh1aW50MTZfdCAqKSBodXNhcnQtPnBSeEJ1ZmZQdHI7CisgICAgKnRtcCA9ICh1aW50MTZfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICBodXNhcnQtPnBSeEJ1ZmZQdHIgKz0gMlU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudC0tOworCisgICAgaWYgKGh1c2FydC0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCBhbmQgUlhORSBpbnRlcnJ1cHQqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVzYXJ0LT5SeElTUiA9IE5VTEw7CisKKyAgICAgIC8qIHR4ZGF0YWNvdW50IGlzIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBNSVNSQUMyMDEyLVJ1bGUtMTMuNSAqLworICAgICAgdHhkYXRhY291bnQgPSBodXNhcnQtPlR4WGZlckNvdW50OworCisgICAgICBpZiAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpCisgICAgICB7CisKKyAgICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBodXNhcnQtPlJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICBlbHNlIGlmICgoUkVBRF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSkgIT0gVVNBUlRfQ1IxX1RDSUUpICYmCisgICAgICAgICAgICAgICAodHhkYXRhY291bnQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBUeFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHVzYXJ0LT5UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkKKyAgICB7CisgICAgICAvKiBTZW5kIGR1bW15IGJ5dGUgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgU2xhdmUgdG8gU2VuZCB0aGUgbmV4dCBkYXRhICovCisgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAoVVNBUlRfRFVNTVlfREFUQSAmICh1aW50MTZfdCkweDAwRkYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorfQorCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVVNBUlRfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2hhbF93d2RnLmMgYi9TcmMvc3RtMzJsMHh4X2hhbF93d2RnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlNGEyYgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfaGFsX3d3ZGcuYwpAQCAtMCwwICsxLDQwOSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9oYWxfd3dkZy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBXV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFdpbmRvdyBXYXRjaGRvZyAoV1dERykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBXV0RHIFNwZWNpZmljIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgT25jZSBlbmFibGVkIHRoZSBXV0RHIGdlbmVyYXRlcyBhIHN5c3RlbSByZXNldCBvbiBleHBpcnkgb2YgYSBwcm9ncmFtbWVkCisgICAgdGltZSBwZXJpb2QsIHVubGVzcyB0aGUgcHJvZ3JhbSByZWZyZXNoZXMgdGhlIGNvdW50ZXIgKFRbNjswXSBkb3duY291bnRlcikKKyAgICBiZWZvcmUgcmVhY2hpbmcgMHgzRiB2YWx1ZSAoaS5lLiBhIHJlc2V0IGlzIGdlbmVyYXRlZCB3aGVuIHRoZSBjb3VudGVyCisgICAgdmFsdWUgcm9sbHMgZG93biBmcm9tIDB4NDAgdG8gMHgzRikuCisKKyAgICAoKykgQW4gTUNVIHJlc2V0IGlzIGFsc28gZ2VuZXJhdGVkIGlmIHRoZSBjb3VudGVyIHZhbHVlIGlzIHJlZnJlc2hlZAorICAgICAgICBiZWZvcmUgdGhlIGNvdW50ZXIgaGFzIHJlYWNoZWQgdGhlIHJlZnJlc2ggd2luZG93IHZhbHVlLiBUaGlzCisgICAgICAgIGltcGxpZXMgdGhhdCB0aGUgY291bnRlciBtdXN0IGJlIHJlZnJlc2hlZCBpbiBhIGxpbWl0ZWQgd2luZG93LgorICAgICgrKSBPbmNlIGVuYWJsZWQgdGhlIFdXREcgY2Fubm90IGJlIGRpc2FibGVkIGV4Y2VwdCBieSBhIHN5c3RlbSByZXNldC4KKyAgICAoKykgV1dER1JTVCBmbGFnIGluIFJDQyBDU1IgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIHdoZW4gYSBXV0RHCisgICAgICAgIHJlc2V0IG9jY3Vycy4KKyAgICAoKykgVGhlIFdXREcgY291bnRlciBpbnB1dCBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIEFQQiBjbG9jayBkaXZpZGVkCisgICAgICAgIGJ5IGEgcHJvZ3JhbW1hYmxlIHByZXNjYWxlci4KKyAgICAoKykgV1dERyBjbG9jayAoSHopID0gUENMSzEgLyAoNDA5NiAqIFByZXNjYWxlcikKKyAgICAoKykgV1dERyB0aW1lb3V0IChtUykgPSAxMDAwICogKFRbNTswXSArIDEpIC8gV1dERyBjbG9jayAoSHopCisgICAgICAgIHdoZXJlIFRbNTswXSBhcmUgdGhlIGxvd2VzdCA2IGJpdHMgb2YgQ291bnRlci4KKyAgICAoKykgV1dERyBDb3VudGVyIHJlZnJlc2ggaXMgYWxsb3dlZCBiZXR3ZWVuIHRoZSBmb2xsb3dpbmcgbGltaXRzIDoKKyAgICAgICAgKCsrKSBtaW4gdGltZSAobVMpID0gMTAwMCAqIChDb3VudGVyIC0gV2luZG93KSAvIFdXREcgY2xvY2sKKyAgICAgICAgKCsrKSBtYXggdGltZSAobVMpID0gMTAwMCAqIChDb3VudGVyIC0gMHg0MCkgLyBXV0RHIGNsb2NrCisgICAgKCspIFR5cGljYWwgdmFsdWVzOgorICAgICAgICAoKyspIENvdW50ZXIgbWluIChUWzU7MF0gPSAweDAwKSBANTYgTUh6KFBDTEsxKSB3aXRoIHplcm8gcHJlc2NhbGVyOgorICAgICAgICAgICAgIG1heCB0aW1lb3V0IGJlZm9yZSByZXNldDogfjczLjE0ILVzCisgICAgICAgICgrKykgQ291bnRlciBtYXggKFRbNTswXSA9IDB4M0YpIEA1NiBNSHooUENMSzEpIHdpdGggcHJlc2NhbGVyIGRpdmlkaW5nIGJ5IDEyODoKKyAgICAgICAgICAgICBtYXggdGltZW91dCBiZWZvcmUgcmVzZXQ6IH41OTkuMTggbXMKKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAqKiogQ29tbW9uIGRyaXZlciB1c2FnZSAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAoKykgRW5hYmxlIFdXREcgQVBCMSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFKCkuCisgICAgKCspIFNldCB0aGUgV1dERyBwcmVzY2FsZXIsIHJlZnJlc2ggd2luZG93IGFuZCBjb3VudGVyIHZhbHVlCisgICAgICAgIHVzaW5nIEhBTF9XV0RHX0luaXQoKSBmdW5jdGlvbi4KKyAgICAoKykgU3RhcnQgdGhlIFdXREcgdXNpbmcgSEFMX1dXREdfU3RhcnQoKSBmdW5jdGlvbi4KKyAgICAgICAgV2hlbiB0aGUgV1dERyBpcyBlbmFibGVkIHRoZSBjb3VudGVyIHZhbHVlIHNob3VsZCBiZSBjb25maWd1cmVkIHRvCisgICAgICAgIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDB4NDAgdG8gcHJldmVudCBnZW5lcmF0aW5nIGFuIGltbWVkaWF0ZSByZXNldC4KKyAgICAoKykgT3B0aW9uYWxseSB5b3UgY2FuIGVuYWJsZSB0aGUgRWFybHkgV2FrZXVwIEludGVycnVwdCAoRVdJKSB3aGljaCBpcworICAgICAgICBnZW5lcmF0ZWQgd2hlbiB0aGUgY291bnRlciByZWFjaGVzIDB4NDAsIGFuZCB0aGVuIHN0YXJ0IHRoZSBXV0RHIHVzaW5nCisgICAgICAgIEhBTF9XV0RHX1N0YXJ0X0lUKCkuIEF0IEVXSSBIQUxfV1dER19XYWtldXBDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGNhbGxiYWNrIEhBTF9XV0RHX1dha2V1cENhbGxiYWNrLgorICAgICAgICBPbmNlIGVuYWJsZWQsIEVXSSBpbnRlcnJ1cHQgY2Fubm90IGJlIGRpc2FibGVkIGV4Y2VwdCBieSBhIHN5c3RlbSByZXNldC4KKyAgICAoKykgVGhlbiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSBtdXN0IHJlZnJlc2ggdGhlIFdXREcgY291bnRlciBhdCByZWd1bGFyCisgICAgICAgIGludGVydmFscyBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiB0byBwcmV2ZW50IGFuIE1DVSByZXNldCwgdXNpbmcKKyAgICAgICAgSEFMX1dXREdfUmVmcmVzaCgpIGZ1bmN0aW9uLiBUaGlzIG9wZXJhdGlvbiBtdXN0IG9jY3VyIG9ubHkgd2hlbgorICAgICAgICB0aGUgY291bnRlciBpcyBsb3dlciB0aGFuIHRoZSByZWZyZXNoIHdpbmRvdyB2YWx1ZSBhbHJlYWR5IHByb2dyYW1tZWQuCisKKyAgWy4uXQorICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEgYWxsb3dzCisgICAgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLiBVc2UgRnVuY3Rpb25zCisgICAgQHJlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorCisgICAgKCspIEZ1bmN0aW9uIEByZWYgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcKKyAgICAgICAgY2FsbGJhY2tzOgorICAgICAgICAoKyspIEV3aUNhbGxiYWNrIDogY2FsbGJhY2sgZm9yIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCisgICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrIDogV1dERyBNc3BJbml0LgorICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgKCspIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8KKyAgICB0aGUgZGVmYXVsdCB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbi4gQHJlZiBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soKQorICAgIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgICgrKykgRXdpQ2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCisgICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrIDogV1dERyBNc3BJbml0LgorCisgICAgV2hlbiBjYWxsaW5nIEByZWYgSEFMX1dXREdfSW5pdCBmdW5jdGlvbiwgY2FsbGJhY2tzIGFyZSByZXNldCB0byB0aGUKKyAgICBjb3JyZXNwb25kaW5nIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6IAorICAgIEByZWYgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjaygpIGFuZCBIQUxfV1dER19Nc3BJbml0KCkgb25seSBpZiB0aGV5IGhhdmUKKyAgICBub3QgYmVlbiByZWdpc3RlcmVkIGJlZm9yZS4KKworICAgIFdoZW4gY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSAKKyAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisgICAgKioqIFdXREcgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gV1dERyBIQUwgZHJpdmVyLgorICAgICAgKCspIF9fSEFMX1dXREdfRU5BQkxFOiBFbmFibGUgdGhlIFdXREcgcGVyaXBoZXJhbAorICAgICAgKCspIF9fSEFMX1dXREdfR0VUX0ZMQUc6IEdldCB0aGUgc2VsZWN0ZWQgV1dERydzIGZsYWcgc3RhdHVzCisgICAgICAoKykgX19IQUxfV1dER19DTEVBUl9GTEFHOiBDbGVhciB0aGUgV1dERydzIHBlbmRpbmcgZmxhZ3MKKyAgICAgICgrKSBfX0hBTF9XV0RHX0VOQUJMRV9JVDogRW5hYmxlIHRoZSBXV0RHIGVhcmx5IHdha2V1cCBpbnRlcnJ1cHQKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVECisvKiogQGRlZmdyb3VwIFdXREcgV1dERworICAqIEBicmllZiBXV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9ucyBXV0RHIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgc3RhcnQgdGhlIFdXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgICAgICAgIGluIHRoZSBXV0RHX0luaXRUeXBlRGVmIG9mIGFzc29jaWF0ZWQgaGFuZGxlLgorICAgICAgKCspIEluaXRpYWxpemUgdGhlIFdXREcgTVNQLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFdXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQuCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBXV0RHX0luaXRUeXBlRGVmIG9mICBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19Jbml0KFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCit7CisgIC8qIENoZWNrIHRoZSBXV0RHIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChod3dkZyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19XV0RHX0FMTF9JTlNUQU5DRShod3dkZy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1dXREdfUFJFU0NBTEVSKGh3d2RnLT5Jbml0LlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfV1dER19XSU5ET1coaHd3ZGctPkluaXQuV2luZG93KSk7CisgIGFzc2VydF9wYXJhbShJU19XV0RHX0NPVU5URVIoaHd3ZGctPkluaXQuQ291bnRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfV1dER19FV0lfTU9ERShod3dkZy0+SW5pdC5FV0lNb2RlKSk7CisKKyNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBSZXNldCBDYWxsYmFjayBwb2ludGVycyAqLworICBpZihod3dkZy0+RXdpQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2s7CisgIH0KKworICBpZihod3dkZy0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBod3dkZy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1dXREdfTXNwSW5pdDsKKyAgfQorCisgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBod3dkZy0+TXNwSW5pdENhbGxiYWNrKGh3d2RnKTsKKyNlbHNlCisgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfV1dER19Nc3BJbml0KGh3d2RnKTsKKyNlbmRpZgorCisgIC8qIFNldCBXV0RHIENvdW50ZXIgKi8KKyAgV1JJVEVfUkVHKGh3d2RnLT5JbnN0YW5jZS0+Q1IsIChXV0RHX0NSX1dER0EgfCBod3dkZy0+SW5pdC5Db3VudGVyKSk7CisKKyAgLyogU2V0IFdXREcgUHJlc2NhbGVyIGFuZCBXaW5kb3cgKi8KKyAgV1JJVEVfUkVHKGh3d2RnLT5JbnN0YW5jZS0+Q0ZSLCAoaHd3ZGctPkluaXQuRVdJTW9kZSB8IGh3d2RnLT5Jbml0LlByZXNjYWxlciB8IGh3d2RnLT5Jbml0LldpbmRvdykpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFdXREcgTVNQLgorICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFdoZW4gcmV3cml0aW5nIHRoaXMgZnVuY3Rpb24gaW4gdXNlciBmaWxlLCBtZWNoYW5pc20gbWF5IGJlIGFkZGVkCisgICogICAgICAgICB0byBhdm9pZCBtdWx0aXBsZSBpbml0aWFsaXplIHdoZW4gSEFMX1dXREdfSW5pdCBmdW5jdGlvbiBpcyBjYWxsZWQKKyAgKiAgICAgICAgIGFnYWluIHRvIGNoYW5nZSBwYXJhbWV0ZXJzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1dXREdfTXNwSW5pdChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChod3dkZyk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfV1dER19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKworI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBXV0RHIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh3d2RnIFdXREcgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfRVdJX0NCX0lEIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1JlZ2lzdGVyQ2FsbGJhY2soV1dER19IYW5kbGVUeXBlRGVmICpod3dkZywgSEFMX1dXREdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFdXREdfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIHN3aXRjaChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1dXREdfRVdJX0NCX0lEOgorICAgICAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQ6CisgICAgICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGEgV1dERyBDYWxsYmFjaworICAqICAgICAgICAgV1dERyBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrIAorICAqIEBwYXJhbSAgaHd3ZGcgV1dERyBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfV1dER19FV0lfQ0JfSUQgRWFybHkgV2FrZVVwIEludGVycnVwdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnLCBIQUxfV1dER19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgc3dpdGNoKENhbGxiYWNrSUQpCisgIHsKKyAgICBjYXNlIEhBTF9XV0RHX0VXSV9DQl9JRDoKKyAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1dXREdfTVNQSU5JVF9DQl9JRDoKKyAgICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfV1dER19Nc3BJbml0OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgUmVmcmVzaCB0aGUgV1dERy4KKyAgICAoKykgSGFuZGxlIFdXREcgaW50ZXJydXB0IHJlcXVlc3QgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb24gY2FsbGJhY2suCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVmcmVzaCB0aGUgV1dERy4KKyAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19SZWZyZXNoKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCit7CisgIC8qIFdyaXRlIHRvIFdXREcgQ1IgdGhlIFdXREcgQ291bnRlciB2YWx1ZSB0byByZWZyZXNoIHdpdGggKi8KKyAgV1JJVEVfUkVHKGh3d2RnLT5JbnN0YW5jZS0+Q1IsIChod3dkZy0+SW5pdC5Db3VudGVyKSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBXV0RHIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBub3RlICAgVGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgKEVXSSkgY2FuIGJlIHVzZWQgaWYgc3BlY2lmaWMgc2FmZXR5IG9wZXJhdGlvbnMKKyAgKiAgICAgICAgIG9yIGRhdGEgbG9nZ2luZyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGFjdHVhbCByZXNldCBpcyBnZW5lcmF0ZWQuCisgICogICAgICAgICBUaGUgRVdJIGludGVycnVwdCBpcyBlbmFibGVkIGJ5IGNhbGxpbmcgSEFMX1dXREdfSW5pdCBmdW5jdGlvbiB3aXRoCisgICogICAgICAgICBFV0lNb2RlIHNldCB0byBXV0RHX0VXSV9FTkFCTEUuCisgICogICAgICAgICBXaGVuIHRoZSBkb3duY291bnRlciByZWFjaGVzIHRoZSB2YWx1ZSAweDQwLCBhbmQgRVdJIGludGVycnVwdCBpcworICAqICAgICAgICAgZ2VuZXJhdGVkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lIChJU1IpIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byB0cmlnZ2VyIHNwZWNpZmljIGFjdGlvbnMgKHN1Y2ggYXMgY29tbXVuaWNhdGlvbnMgb3IgZGF0YQorICAqICAgICAgICAgbG9nZ2luZyksIGJlZm9yZSByZXNldHRpbmcgdGhlIGRldmljZS4KKyAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9XV0RHX0lSUUhhbmRsZXIoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKK3sKKyAgLyogQ2hlY2sgaWYgRWFybHkgV2FrZXVwIEludGVycnVwdCBpcyBlbmFibGUgKi8KKyAgaWYgKF9fSEFMX1dXREdfR0VUX0lUX1NPVVJDRShod3dkZywgV1dER19JVF9FV0kpICE9IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgaWYgV1dERyBFYXJseSBXYWtldXAgSW50ZXJydXB0IG9jY3VycmVkICovCisgICAgaWYgKF9fSEFMX1dXREdfR0VUX0ZMQUcoaHd3ZGcsIFdXREdfRkxBR19FV0lGKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgV1dERyBFYXJseSBXYWtldXAgZmxhZyAqLworICAgICAgX19IQUxfV1dER19DTEVBUl9GTEFHKGh3d2RnLCBXV0RHX0ZMQUdfRVdJRik7CisKKyNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogRWFybHkgV2FrZXVwIHJlZ2lzdGVyZWQgY2FsbGJhY2sgKi8KKyAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayhod3dkZyk7CisjZWxzZQorICAgICAgLyogRWFybHkgV2FrZXVwIGNhbGxiYWNrICovCisgICAgICBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKGh3d2RnKTsKKyNlbmRpZgorICAgIH0KKyAgfQorfQorCisKKy8qKgorICAqIEBicmllZiAgV1dERyBFYXJseSBXYWtldXAgY2FsbGJhY2suCisgICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChod3dkZyk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfbGxfYWRjLmMgYi9TcmMvc3RtMzJsMHh4X2xsX2FkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMWZiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2xsX2FkYy5jCkBAIC0wLDAgKzEsNjY1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX2FkYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBBREMgTEwgbW9kdWxlIGRyaXZlcgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfYWRjLmgiCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX2J1cy5oIgorCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorICAjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoQURDMSkKKworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTCBBREMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogRGVmaW5pdGlvbnMgb2YgQURDIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cyAqLworLyogTm90ZTogT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsICAgKi8KKy8qICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaW1lb3V0IHZhbHVlcyBmb3IgQURDIG9wZXJhdGlvbnMgYXJlIGRlcGVuZGVudCB0byBkZXZpY2UgY2xvY2sgICAgICAqLworLyogICAgICAgY29uZmlndXJhdGlvbiAoc3lzdGVtIGNsb2NrIHZlcnN1cyBBREMgY2xvY2spLCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBkZWZpbmVkIGluIHVzZXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBSZWZlciB0byBAcmVmIEFEQ19MTF9FQ19IV19ERUxBWVMgZm9yIGRlc2NyaXB0aW9uIG9mIEFEQyB0aW1lb3V0ICAgICAqLworLyogICAgICAgdmFsdWVzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IEFEQyB0aW1lb3V0IHZhbHVlcyBhcmUgZGVmaW5lZCBoZXJlIGluIENQVSBjeWNsZXMgdG8gYmUgaW5kZXBlbmRlbnQgICovCisvKiAgICAgICBvZiBkZXZpY2UgY2xvY2sgc2V0dGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSW4gdXNlciBhcHBsaWNhdGlvbiwgQURDIHRpbWVvdXQgdmFsdWVzIHNob3VsZCBiZSBkZWZpbmVkIHdpdGggICAgICAgKi8KKy8qICAgICAgIHRlbXBvcmFsIHZhbHVlcywgaW4gZnVuY3Rpb24gb2YgZGV2aWNlIGNsb2NrIHNldHRpbmdzLiAgICAgICAgICAgICAgICovCisvKiAgICAgICBIaWdoZXN0IHJhdGlvIENQVSBjbG9jayBmcmVxdWVuY3kgdnMgQURDIGNsb2NrIGZyZXF1ZW5jeTogICAgICAgICAgICAqLworLyogICAgICAgIC0gQURDIGNsb2NrIGZyb20gc3luY2hyb25vdXMgY2xvY2sgd2l0aCBBSEIgcHJlc2NhbGVyIDUxMiwgICAgICAgICAgKi8KKy8qICAgICAgICAgIEFQQiBwcmVzY2FsZXIgMTYsIEFEQyBwcmVzY2FsZXIgNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBBREMgY2xvY2sgZnJvbSBhc3luY2hyb25vdXMgY2xvY2sgKEhTSSkgd2l0aCBwcmVzY2FsZXIgMSwgICAgICAgICAqLworLyogICAgICAgICAgd2l0aCBoaWdoZXN0IHJhdGlvIENQVSBjbG9jayBmcmVxdWVuY3kgdnMgSFNJIGNsb2NrIGZyZXF1ZW5jeTogICAgKi8KKy8qICAgICAgICAgIENQVSBjbG9jayBmcmVxdWVuY3kgbWF4IDMyTUh6LCBIU0kgZnJlcXVlbmN5IDE2TUh6OiByYXRpbyAyLiAgICAgICovCisvKiBVbml0OiBDUFUgY3ljbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ0xPQ0tfUkFUSU9fVlNfQ1BVX0hJR0hFU1QgICAgICAgICAgKCh1aW50MzJfdCkgNTEyVSAqIDE2VSAqIDRVKQorI2RlZmluZSBBRENfVElNRU9VVF9ESVNBQkxFX0NQVV9DWUNMRVMgICAgICAgICAgKEFEQ19DTE9DS19SQVRJT19WU19DUFVfSElHSEVTVCAqIDFVKQorI2RlZmluZSBBRENfVElNRU9VVF9TVE9QX0NPTlZFUlNJT05fQ1BVX0NZQ0xFUyAgKEFEQ19DTE9DS19SQVRJT19WU19DUFVfSElHSEVTVCAqIDFVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0FEQ19DT01NT05fQ0xPQ0soX19DTE9DS19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVY2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVY2NCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjI1NikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX0NMT0NLX0ZSRVFfTU9ERShfX0NMT0NLX0ZSRVFfTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fQ0xPQ0tfRlJFUV9NT0RFX18pID09IExMX0FEQ19DTE9DS19GUkVRX01PREVfSElHSCkgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX0ZSRVFfTU9ERV9fKSA9PSBMTF9BRENfQ0xPQ0tfRlJFUV9NT0RFX0xPVykgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogQURDIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNfTExfQURDX0NMT0NLKF9fQ0xPQ0tfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFU09MVVRJT04oX19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl8xMkIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFU09MVVRJT05fXykgPT0gTExfQURDX1JFU09MVVRJT05fMTBCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRVNPTFVUSU9OX18pID09IExMX0FEQ19SRVNPTFVUSU9OXzhCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl82QikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX0RBVEFfQUxJR04oX19EQVRBX0FMSUdOX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fREFUQV9BTElHTl9fKSA9PSBMTF9BRENfREFUQV9BTElHTl9SSUdIVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0RBVEFfQUxJR05fXykgPT0gTExfQURDX0RBVEFfQUxJR05fTEVGVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19MT1dfUE9XRVIoX19MT1dfUE9XRVJfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0xPV19QT1dFUl9fKSA9PSBMTF9BRENfTFBfTU9ERV9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19MT1dfUE9XRVJfXykgPT0gTExfQURDX0xQX0FVVE9XQUlUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fTE9XX1BPV0VSX18pID09IExMX0FEQ19MUF9BVVRPUE9XRVJPRkYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0xPV19QT1dFUl9fKSA9PSBMTF9BRENfTFBfQVVUT1dBSVRfQVVUT1BPV0VST0ZGKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFEQyBncm91cCByZWd1bGFyIGV4dGVybmFsIHRyaWdnZXIgVElNMl9DQzMgYXZhaWxhYmxlIG9ubHkgb24gICAgICAgICAgICAgICovCisvKiBTVE0zMkwwIGRldmljZXMgY2F0ZWdvcmllczogQ2F0LjEsIENhdC4yLCBDYXQuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQgKFNUTTMyTDAxMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwMjF4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDAzMXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNDF4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMyTDA3MXh4KSB8fCBkZWZpbmVkIChTVE0zMkwwNzJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDczeHgpIHx8IFwKKyAgICBkZWZpbmVkIChTVE0zMkwwODF4eCkgfHwgZGVmaW5lZCAoU1RNMzJMMDgyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDA4M3h4KQorI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fUkVHX1RSSUdfU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIxX0NIMikgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDQpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTIyX1RSR08pICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMykgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExKSAgICAgICAgICAgICAgIFwKKyAgKQorI2Vsc2UKKyNkZWZpbmUgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShfX1JFR19UUklHX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMV9DSDIpICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0g0KSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0yMl9UUkdPKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExKSAgICAgICAgICAgICAgIFwKKyAgKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19DT05USU5VT1VTX01PREUoX19SRUdfQ09OVElOVU9VU19NT0RFX18pICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX0NPTlRJTlVPVVNfTU9ERV9fKSA9PSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19DT05USU5VT1VTX01PREVfXykgPT0gTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMpICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfRE1BX1RSQU5TRkVSKF9fUkVHX0RNQV9UUkFOU0ZFUl9fKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1JFR19ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORSkgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfRE1BX1RSQU5TRkVSX18pID09IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX0xJTUlURUQpICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9VTkxJTUlURUQpICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19PVlJfREFUQV9CRUhBVklPUihfX1JFR19PVlJfREFUQV9CRUhBVklPUl9fKSAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX09WUl9EQVRBX0JFSEFWSU9SX18pID09IExMX0FEQ19SRUdfT1ZSX0RBVEFfUFJFU0VSVkVEKSAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19PVlJfREFUQV9CRUhBVklPUl9fKSA9PSBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOKSAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfU0VRX1NDQU5fRElTQ09OVF9NT0RFKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgICAgICAgICAgXAorICAoICAgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRSkgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LKSAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgcmVnaXN0ZXJzIG9mIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0bworICAqICAgICAgICAgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgcGVyZm9ybWluZyBhIGhhcmQgcmVzZXQsIHVzaW5nIGhpZ2ggbGV2ZWwKKyAgKiAgICAgICAgIGNsb2NrIHNvdXJjZSBSQ0MgQURDIHJlc2V0LgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfQ29tbW9uRGVJbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NPTU1PTl9JTlNUQU5DRShBREN4eV9DT01NT04pKTsKKyAgCisgIC8qIEZvcmNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8KKyAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9BREMxKTsKKyAgCisgIC8qIFJlbGVhc2UgcmVzZXQgb2YgQURDIGNsb2NrIChjb3JlIGNsb2NrKSAqLworICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfQURDMSk7CisgIAorICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzCisgICogICAgICAgICAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpCisgICogICAgICAgICBhbmQgbXVsdGltb2RlIChmb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDIGluc3RhbmNlcyBhdmFpbGFibGUpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgaW5zdGFuY2VzIHN0YXRlOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIG11c3QgYmUgZGlzYWJsZWQuCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcGFyYW0gIEFEQ19Db21tb25Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19Db21tb25Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIGNvbW1vbiByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQURDIGNvbW1vbiByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfQURDX0NvbW1vbkluaXQoQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NPTU1PTl9JTlNUQU5DRShBREN4eV9DT01NT04pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19DT01NT05fQ0xPQ0soQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrKSk7CisgIAorICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbnMgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIkxMX0FEQ19TZXRDb21tb25YWFgoKSI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhlc2UgZmVhdHVyZXMgaXMgY29uZGl0aW9uZWQgdG8gICAqLworICAvKiAgICAgICBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICovCisgIGlmKF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShBREN4eV9DT01NT04pID09IDBVKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIGNvbW1vbiB0byBzZXZlcmFsIEFEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGNsb2NrIChjb252ZXJzaW9uIGNsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExMX0FEQ19TZXRDb21tb25DbG9jayhBREN4eV9DT01NT04sIEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jayk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3I6IE9uZSBvciBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvICAgICAgICAqLworICAgIC8qIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UgYXJlIG5vdCBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0FEQ19Db21tb25Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgQURDX0NvbW1vbkluaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX0NvbW1vbkluaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9BRENfQ29tbW9uU3RydWN0SW5pdChMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgKkFEQ19Db21tb25Jbml0U3RydWN0KQoreworICAvKiBTZXQgQURDX0NvbW1vbkluaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIC8qIFNldCBmaWVsZHMgb2YgQURDIGNvbW1vbiAqLworICAvKiAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpICovCisgIEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jayA9IExMX0FEQ19DTE9DS19BU1lOQ19ESVYyOworICAKK30KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHJlZ2lzdGVycyBvZiB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlCisgICogICAgICAgICB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIFRvIHJlc2V0IGFsbCBBREMgaW5zdGFuY2VzIHF1aWNrbHkgKHBlcmZvcm0gYSBoYXJkIHJlc2V0KSwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db21tb25EZUluaXQoKS4KKyAgKiBAbm90ZSAgIElmIHRoaXMgZnVuY3Rpb25zIHJldHVybnMgZXJyb3Igc3RhdHVzLCBpdCBtZWFucyB0aGF0IEFEQyBpbnN0YW5jZQorICAqICAgICAgICAgaXMgaW4gYW4gdW5rbm93biBzdGF0ZS4KKyAgKiAgICAgICAgIEluIHRoaXMgY2FzZSwgcGVyZm9ybSBhIGhhcmQgcmVzZXQgdXNpbmcgaGlnaCBsZXZlbAorICAqICAgICAgICAgY2xvY2sgc291cmNlIFJDQyBBREMgcmVzZXQuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db21tb25EZUluaXQoKS4KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQURDIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfRGVJbml0KEFEQ19UeXBlRGVmICpBREN4KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgX19JTyB1aW50MzJfdCB0aW1lb3V0X2NwdV9jeWNsZXMgPSAwVTsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKEFEQ3gpKTsKKyAgCisgIC8qIERpc2FibGUgQURDIGluc3RhbmNlIGlmIG5vdCBhbHJlYWR5IGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihMTF9BRENfSXNFbmFibGVkKEFEQ3gpID09IDFVKQorICB7CisgICAgLyogU2V0IEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlIHRvIFNXIHN0YXJ0IHRvIGVuc3VyZSB0byBub3QgICAgICAqLworICAgIC8qIGhhdmUgYW4gZXh0ZXJuYWwgdHJpZ2dlciBldmVudCBvY2N1cnJpbmcgZHVyaW5nIHRoZSBjb252ZXJzaW9uIHN0b3AgICAgKi8KKyAgICAvKiBBREMgZGlzYWJsZSBwcm9jZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTExfQURDX1JFR19TZXRUcmlnZ2VyU291cmNlKEFEQ3gsIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSk7CisgICAgCisgICAgLyogU3RvcCBwb3RlbnRpYWwgQURDIGNvbnZlcnNpb24gb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIuICAgICAgICAgICAqLworICAgIGlmKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhBREN4KSAhPSAwVSkKKyAgICB7CisgICAgICBpZihMTF9BRENfUkVHX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nKEFEQ3gpID09IDBVKQorICAgICAgeworICAgICAgICBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKEFEQ3gpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBXYWl0IGZvciBBREMgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdGltZW91dF9jcHVfY3ljbGVzID0gQURDX1RJTUVPVVRfU1RPUF9DT05WRVJTSU9OX0NQVV9DWUNMRVM7CisgICAgd2hpbGUgKExMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgPT0gMVUpCisgICAgeworICAgICAgaWYodGltZW91dF9jcHVfY3ljbGVzLS0gPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIFRpbWUtb3V0IGVycm9yICovCisgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBEaXNhYmxlIHRoZSBBREMgaW5zdGFuY2UgKi8KKyAgICBMTF9BRENfRGlzYWJsZShBREN4KTsKKyAgICAKKyAgICAvKiBXYWl0IGZvciBBREMgaW5zdGFuY2UgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICB0aW1lb3V0X2NwdV9jeWNsZXMgPSBBRENfVElNRU9VVF9ESVNBQkxFX0NQVV9DWUNMRVM7CisgICAgd2hpbGUgKExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKEFEQ3gpID09IDFVKQorICAgIHsKKyAgICAgIGlmKHRpbWVvdXRfY3B1X2N5Y2xlcy0tID09IDBVKQorICAgICAgeworICAgICAgICAvKiBUaW1lLW91dCBlcnJvciAqLworICAgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIENoZWNrIHdoZXRoZXIgQURDIHN0YXRlIGlzIGNvbXBsaWFudCB3aXRoIGV4cGVjdGVkIHN0YXRlICovCisgIGlmKFJFQURfQklUKEFEQ3gtPkNSLAorICAgICAgICAgICAgICAoICBBRENfQ1JfQURTVFAgfCBBRENfQ1JfQURTVEFSVAorICAgICAgICAgICAgICAgfCBBRENfQ1JfQURESVMgfCBBRENfQ1JfQURFTiAgICkKKyAgICAgICAgICAgICApCisgICAgID09IDBVKQorICB7CisgICAgLyogPT09PT09PT09PSBSZXNldCBBREMgcmVnaXN0ZXJzID09PT09PT09PT0gKi8KKyAgICAvKiBSZXNldCByZWdpc3RlciBJRVIgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+SUVSLAorICAgICAgICAgICAgICAoICBMTF9BRENfSVRfQURSRFkKKyAgICAgICAgICAgICAgIHwgTExfQURDX0lUX0VPQworICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfRU9TCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9PVlIKKyAgICAgICAgICAgICAgIHwgTExfQURDX0lUX0VPU01QCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9BV0QxICkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIElTUiAqLworICAgIFNFVF9CSVQoQURDeC0+SVNSLAorICAgICAgICAgICAgKCAgTExfQURDX0ZMQUdfQURSRFkKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0VPQworICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfRU9TCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19PVlIKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0VPU01QCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19BV0QxICkKKyAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDUiAqLworICAgIC8qIEJpdHMgQURDX0NSX0FEQ0FMLCBBRENfQ1JfQURTVFAsIEFEQ19DUl9BRFNUQVJUIGFyZSBpbiBhY2Nlc3MgbW9kZSAgICAgKi8KKyAgICAvKiAicmVhZC1zZXQiOiBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURWUkVHRU4pOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IxICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNGR1IxLAorICAgICAgICAgICAgICAoICBBRENfQ0ZHUjFfQVdEQ0ggICB8IEFEQ19DRkdSMV9BV0RFTiAgfCBBRENfQ0ZHUjFfQVdEU0dMICB8IEFEQ19DRkdSMV9ESVNDRU4KKyAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0FVVE9GRiAgfCBBRENfQ0ZHUjFfV0FJVCAgIHwgQURDX0NGR1IxX0NPTlQgICAgfCBBRENfQ0ZHUjFfT1ZSTU9ECisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9FWFRFTiAgIHwgQURDX0NGR1IxX0VYVFNFTCB8IEFEQ19DRkdSMV9BTElHTiAgIHwgQURDX0NGR1IxX1JFUworICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfU0NBTkRJUiB8IEFEQ19DRkdSMV9ETUFDRkcgfCBBRENfQ0ZHUjFfRE1BRU4gICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDRkdSMiAqLworICAgIC8qIE5vdGU6IFVwZGF0ZSBvZiBBREMgY2xvY2sgbW9kZSBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUgZGlzYWJsZWQ6ICAgKi8KKyAgICAvKiAgICAgICBhbHJlYWR5IGRvbmUgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNGR1IyLAorICAgICAgICAgICAgICAoICBBRENfQ0ZHUjJfQ0tNT0RFCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMl9UT1ZTICAgfCBBRENfQ0ZHUjJfT1ZTUyAgfCBBRENfQ0ZHUjJfT1ZTUgorICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjJfT1ZTRSAgIHwgQURDX0NGR1IyX0NLTU9ERSAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBTTVBSICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIsIEFEQ19TTVBSX1NNUCk7CisKKyAgICAvKiBSZXNldCByZWdpc3RlciBUUiAqLworICAgIE1PRElGWV9SRUcoQURDeC0+VFIsIEFEQ19UUl9IVCB8IEFEQ19UUl9MVCwgQURDX1RSX0hUKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDSFNFTFIgKi8KKyNpZiBkZWZpbmVkKEFEQ19DQ1JfVkxDREVOKQorICAgIENMRUFSX0JJVChBREN4LT5DSFNFTFIsCisgICAgICAgICAgICAgICggIEFEQ19DSFNFTFJfQ0hTRUwxOCB8IEFEQ19DSFNFTFJfQ0hTRUwxNyB8IEFEQ19DSFNFTFJfQ0hTRUwxNgorICAgICAgICAgICAgICAgfCBBRENfQ0hTRUxSX0NIU0VMMTUgfCBBRENfQ0hTRUxSX0NIU0VMMTQgfCBBRENfQ0hTRUxSX0NIU0VMMTMgfCBBRENfQ0hTRUxSX0NIU0VMMTIKKyAgICAgICAgICAgICAgIHwgQURDX0NIU0VMUl9DSFNFTDExIHwgQURDX0NIU0VMUl9DSFNFTDEwIHwgQURDX0NIU0VMUl9DSFNFTDkgIHwgQURDX0NIU0VMUl9DSFNFTDgKKyAgICAgICAgICAgICAgIHwgQURDX0NIU0VMUl9DSFNFTDcgIHwgQURDX0NIU0VMUl9DSFNFTDYgIHwgQURDX0NIU0VMUl9DSFNFTDUgIHwgQURDX0NIU0VMUl9DSFNFTDQKKyAgICAgICAgICAgICAgIHwgQURDX0NIU0VMUl9DSFNFTDMgIHwgQURDX0NIU0VMUl9DSFNFTDIgIHwgQURDX0NIU0VMUl9DSFNFTDEgIHwgQURDX0NIU0VMUl9DSFNFTDAgKQorICAgICAgICAgICAgICk7CisjZWxzZQorICAgIENMRUFSX0JJVChBREN4LT5DSFNFTFIsCisgICAgICAgICAgICAgICggIEFEQ19DSFNFTFJfQ0hTRUwxOCB8IEFEQ19DSFNFTFJfQ0hTRUwxNworICAgICAgICAgICAgICAgfCBBRENfQ0hTRUxSX0NIU0VMMTUgfCBBRENfQ0hTRUxSX0NIU0VMMTQgfCBBRENfQ0hTRUxSX0NIU0VMMTMgfCBBRENfQ0hTRUxSX0NIU0VMMTIKKyAgICAgICAgICAgICAgIHwgQURDX0NIU0VMUl9DSFNFTDExIHwgQURDX0NIU0VMUl9DSFNFTDEwIHwgQURDX0NIU0VMUl9DSFNFTDkgIHwgQURDX0NIU0VMUl9DSFNFTDgKKyAgICAgICAgICAgICAgIHwgQURDX0NIU0VMUl9DSFNFTDcgIHwgQURDX0NIU0VMUl9DSFNFTDYgIHwgQURDX0NIU0VMUl9DSFNFTDUgIHwgQURDX0NIU0VMUl9DSFNFTDQKKyAgICAgICAgICAgICAgIHwgQURDX0NIU0VMUl9DSFNFTDMgIHwgQURDX0NIU0VMUl9DSFNFTDIgIHwgQURDX0NIU0VMUl9DSFNFTDEgIHwgQURDX0NIU0VMUl9DSFNFTDAgKQorICAgICAgICAgICAgICk7CisjZW5kaWYKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBEUiAqLworICAgIC8qIGJpdHMgaW4gYWNjZXNzIG1vZGUgcmVhZCBvbmx5LCBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZSAqLworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENBTEZBQ1QgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+Q0FMRkFDVCwgQURDX0NBTEZBQ1RfQ0FMRkFDVCk7CisgICAgCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQURDIGluc3RhbmNlIGlzIGluIGFuIHVua25vd24gc3RhdGUgKi8KKyAgICAvKiBOZWVkIHRvIHBlcmZvcm1pbmcgYSBoYXJkIHJlc2V0IG9mIEFEQyBpbnN0YW5jZSwgdXNpbmcgaGlnaCBsZXZlbCAgICAgICovCisgICAgLyogY2xvY2sgc291cmNlIFJDQyBBREMgcmVzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIENhdXRpb246IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGlmIHNldmVyYWwgQURDIGluc3RhbmNlcyBhcmUgYXZhaWxhYmxlICAgKi8KKyAgICAvKiAgICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLCBSQ0MgQURDIHJlc2V0IHdpbGwgcmVzZXQgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBjb21tb24gQURDIGluc3RhbmNlLiAgICAgICAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19JbnN0YW5jZSAuCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogQG5vdGUgICBBZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uLCBzb21lIG90aGVyIGZlYXR1cmVzIG11c3QgYmUgY29uZmlndXJlZAorICAqICAgICAgICAgdXNpbmcgTEwgdW5pdGFyeSBmdW5jdGlvbnMuCisgICogICAgICAgICBUaGUgbWluaW11bSBjb25maWd1cmF0aW9uIHJlbWFpbmluZyB0byBiZSBkb25lIGlzOgorICAqICAgICAgICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlcjoKKyAgKiAgICAgICAgICAgIG1hcCBjaGFubmVsIG9uIHJhbmsgY29ycmVzcG9uZGluZyB0byBjaGFubmVsIG51bWJlci4KKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVscygpOworICAqICAgICAgICAgIC0gU2V0IEFEQyBjaGFubmVsIHNhbXBsaW5nIHRpbWUKKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKCk7CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQURDX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Jbml0KEFEQ19UeXBlRGVmICpBREN4LCBMTF9BRENfSW5pdFR5cGVEZWYgKkFEQ19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworICAKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19DTE9DSyhBRENfSW5pdFN0cnVjdC0+Q2xvY2spKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRVNPTFVUSU9OKEFEQ19Jbml0U3RydWN0LT5SZXNvbHV0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfREFUQV9BTElHTihBRENfSW5pdFN0cnVjdC0+RGF0YUFsaWdubWVudCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0xPV19QT1dFUihBRENfSW5pdFN0cnVjdC0+TG93UG93ZXJNb2RlKSk7CisgIAorICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uKTogICAgICAgKi8KKyAgLyogICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKExMX0FEQ19Jc0VuYWJsZWQoQURDeCkgPT0gMFUpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gQURDIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBkYXRhIHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGxvdyBwb3dlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9SRVMKKyAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0FMSUdOCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9XQUlUCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9BVVRPRkYKKyAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfSW5pdFN0cnVjdC0+UmVzb2x1dGlvbgorICAgICAgICAgICAgICAgfCBBRENfSW5pdFN0cnVjdC0+RGF0YUFsaWdubWVudAorICAgICAgICAgICAgICAgfCBBRENfSW5pdFN0cnVjdC0+TG93UG93ZXJNb2RlCisgICAgICAgICAgICAgICk7CisgICAgCisgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMiwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMl9DS01PREUKKyAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgQURDX0luaXRTdHJ1Y3QtPkNsb2NrCisgICAgICAgICAgICAgICk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3I6IEFEQyBpbnN0YW5jZSBpcyBub3QgZGlzYWJsZWQuICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0FEQ19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgQURDX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9BRENfU3RydWN0SW5pdChMTF9BRENfSW5pdFR5cGVEZWYgKkFEQ19Jbml0U3RydWN0KQoreworICAvKiBTZXQgQURDX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIC8qIFNldCBmaWVsZHMgb2YgQURDIGluc3RhbmNlICovCisgIEFEQ19Jbml0U3RydWN0LT5DbG9jayAgICAgICAgID0gTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyOworICBBRENfSW5pdFN0cnVjdC0+UmVzb2x1dGlvbiAgICA9IExMX0FEQ19SRVNPTFVUSU9OXzEyQjsKKyAgQURDX0luaXRTdHJ1Y3QtPkRhdGFBbGlnbm1lbnQgPSBMTF9BRENfREFUQV9BTElHTl9SSUdIVDsKKyAgQURDX0luaXRTdHJ1Y3QtPkxvd1Bvd2VyTW9kZSAgPSBMTF9BRENfTFBfTU9ERV9OT05FOworICAKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIHJlZ3VsYXIuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIlJFRyIpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAgKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zCisgICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24KKyAgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkCisgICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyOgorICAqICAgICAgICAgICAgbWFwIGNoYW5uZWwgb24gcmFuayBjb3JyZXNwb25kaW5nIHRvIGNoYW5uZWwgbnVtYmVyLgorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCk7CisgICogICAgICAgICAgLSBTZXQgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZQorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoKTsKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBRENfUkVHX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19SRUdfSW5pdChBRENfVHlwZURlZiAqQURDeCwgTExfQURDX1JFR19Jbml0VHlwZURlZiAqQURDX1JFR19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfU0VRX1NDQU5fRElTQ09OVF9NT0RFKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19DT05USU5VT1VTX01PREUoQURDX1JFR19Jbml0U3RydWN0LT5Db250aW51b3VzTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19ETUFfVFJBTlNGRVIoQURDX1JFR19Jbml0U3RydWN0LT5ETUFUcmFuc2ZlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19PVlJfREFUQV9CRUhBVklPUihBRENfUkVHX0luaXRTdHJ1Y3QtPk92ZXJydW4pKTsKKyAgCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAwVSkKKyAgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBBREMgZ3JvdXAgcmVndWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvciAgICAqLworICAgIC8qICAgICAgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuIGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIHRyaWdnZXIgZWRnZSBpcyBzZXQgdG8gdmFsdWUgMHgwIGJ5ICAgICAqLworICAgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IxLAorICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfRVhUU0VMCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9FWFRFTgorICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRElTQ0VOCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9DT05UCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9ETUFFTgorICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRE1BQ0ZHCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9PVlJNT0QKKyAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UKKyAgICAgICAgICAgICAgIHwgQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250CisgICAgICAgICAgICAgICB8IEFEQ19SRUdfSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUKKyAgICAgICAgICAgICAgIHwgQURDX1JFR19Jbml0U3RydWN0LT5ETUFUcmFuc2ZlcgorICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPk92ZXJydW4KKyAgICAgICAgICAgICAgKTsKKworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBBREMgaW5zdGFuY2UgaXMgbm90IGRpc2FibGVkLiAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9BRENfUkVHX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBBRENfUkVHX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0FEQ19SRUdfU3RydWN0SW5pdChMTF9BRENfUkVHX0luaXRUeXBlRGVmICpBRENfUkVHX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBBRENfUkVHX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIC8qIFNldCBmaWVsZHMgb2YgQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIHRyaWdnZXIgZWRnZSBpcyBzZXQgdG8gdmFsdWUgMHgwIGJ5ICAgICAgICovCisgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgICAgPSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkU7CisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udCA9IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRTsKKyAgQURDX1JFR19Jbml0U3RydWN0LT5Db250aW51b3VzTW9kZSAgID0gTExfQURDX1JFR19DT05WX1NJTkdMRTsKKyAgQURDX1JFR19Jbml0U3RydWN0LT5ETUFUcmFuc2ZlciAgICAgID0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORTsKKyAgQURDX1JFR19Jbml0U3RydWN0LT5PdmVycnVuICAgICAgICAgID0gTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTjsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEFEQzEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9sbF9jb21wLmMgYi9TcmMvc3RtMzJsMHh4X2xsX2NvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2I2NDEwCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9sbF9jb21wLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfY29tcC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDT01QIExMIG1vZHVsZSBkcml2ZXIKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX2NvbXAuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyAgI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyAgI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKENPTVAxKSB8fCBkZWZpbmVkIChDT01QMikKKworLyoqIEBhZGR0b2dyb3VwIENPTVBfTEwgQ09NUAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBDT01QX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBDT01QIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgKi8KKy8qIENPTVAgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgSVNfTExfQ09NUF9QT1dFUl9NT0RFKF9fUE9XRVJfTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUE9XRVJfTU9ERV9fKSA9PSBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1BPV0VSX01PREVfXykgPT0gTExfQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUikgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjaWYgZGVmaW5lZCAoU1RNMzJMMDExeHgpIHx8IGRlZmluZWQgKFNUTTMyTDAyMXh4KQorI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX1BMVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfUExVU19fKSAgICAgICAgICAgICAgIFwKKyAgKCgoX19DT01QX0lOU1RBTkNFX18pID09IENPTVAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChfX0lOUFVUX1BMVVNfXykgPT0gTExfQ09NUF9JTlBVVF9QTFVTX0lPMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU8xKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX1BMVVNfXykgPT0gTExfQ09NUF9JTlBVVF9QTFVTX0lPMikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU80KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX1BMVVNfXykgPT0gTExfQ09NUF9JTlBVVF9QTFVTX0lPNSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzYpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKyNlbHNlCisjZGVmaW5lIElTX0xMX0NPTVBfSU5QVVRfUExVUyhfX0NPTVBfSU5TVEFOQ0VfXywgX19JTlBVVF9QTFVTX18pICAgICAgICAgICAgICAgXAorICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX1BMVVNfXykgPT0gTExfQ09NUF9JTlBVVF9QTFVTX0lPMykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU81KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisjZW5kaWYKKworLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgY29tcGFyYXRvciBpbnB1dCBtaW51cyBwYXJhbWV0ZXJzIGFyZSAgICAgICAgICAgKi8KKy8qICAgICAgIHRoZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIENPTVAgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0NPTVBfSU5QVVRfTUlOVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfTUlOVVNfXykgICAgICAgICAgICAgXAorICAoKChfX0NPTVBfSU5TVEFOQ0VfXykgPT0gQ09NUDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gxKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMikgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU8xKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQpICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UKSAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVCkgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19JTzIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQ09NUF9PVVRQVVRfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUE9MQVJJVFlfXykgPT0gTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1BPTEFSSVRZX18pID09IExMX0NPTVBfT1VUUFVUUE9MX0lOVkVSVEVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHJlZ2lzdGVycyBvZiB0aGUgc2VsZWN0ZWQgQ09NUCBpbnN0YW5jZQorICAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQG5vdGUgICBJZiBjb21wYXJhdG9yIGlzIGxvY2tlZCwgZGUtaW5pdGlhbGl6YXRpb24gYnkgc29mdHdhcmUgaXMKKyAgKiAgICAgICAgIG5vdCBwb3NzaWJsZS4KKyAgKiAgICAgICAgIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuCisgICogQHBhcmFtICBDT01QeCBDT01QIGluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IENPTVAgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IENPTVAgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0NPTVBfRGVJbml0KENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoQ09NUHgpKTsKKyAgCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBDT01QIGluc3RhbmNlIG11c3Qgbm90IGJlIGxvY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfQ09NUF9Jc0xvY2tlZChDT01QeCkgPT0gMFUpCisgIHsKKyAgICBpZihDT01QeCA9PSBDT01QMSkKKyAgICB7CisgICAgICBDTEVBUl9CSVQoQ09NUHgtPkNTUiwKKyAgICAgICAgICAgICAgICAoICBDT01QX0NTUl9DT01QMUVOCisgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDFJTk5TRUwKKyAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMVdNCisgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDFMUFRJTTFJTjEKKyAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMVBPTEFSSVRZCisgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDFMT0NLCisgICAgICAgICAgICAgICAgKSAKKyAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBDTEVBUl9CSVQoQ09NUHgtPkNTUiwKKyAgICAgICAgICAgICAgICAoICBDT01QX0NTUl9DT01QMkVOCisgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDJTUEVFRAorICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAySU5OU0VMCisgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDJJTlBTRUwKKyAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMkxQVElNMUlOMgorICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAyTFBUSU0xSU4xCisgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQ09NUDJQT0xBUklUWQorICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAyTE9DSworICAgICAgICAgICAgICAgICkgCisgICAgICAgICAgICAgICApOworICAgIH0KKworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENvbXBhcmF0b3IgaW5zdGFuY2UgaXMgbG9ja2VkOiBkZS1pbml0aWFsaXphdGlvbiBieSBzb2Z0d2FyZSBpcyAgICAgICAgICovCisgICAgLyogbm90IHBvc3NpYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LiAgICAgICAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBDT01QIGluc3RhbmNlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIGZlYXR1cmVzIG9mIHRoZSBzZWxlY3RlZCBDT01QIGluc3RhbmNlLgorICAqICAgICAgICAgU29tZSBmZWF0dXJlcyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgc2NvcGUgQ09NUCBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjb21tb24gdG8gc2V2ZXJhbCBDT01QIGluc3RhbmNlcykuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJDT01QeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBDT01QeCBDT01QIGluc3RhbmNlCisgICogQHBhcmFtICBDT01QX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQ09NUF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQ09NUCByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQ09NUCByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfQ09NUF9Jbml0KENPTVBfVHlwZURlZiAqQ09NUHgsIExMX0NPTVBfSW5pdFR5cGVEZWYgKkNPTVBfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShDT01QeCkpOworICBpZihDT01QeCA9PSBDT01QMikKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9DT01QX1BPV0VSX01PREUoQ09NUF9Jbml0U3RydWN0LT5Qb3dlck1vZGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfQ09NUF9JTlBVVF9QTFVTKENPTVB4LCBDT01QX0luaXRTdHJ1Y3QtPklucHV0UGx1cykpOworICB9CisgIGFzc2VydF9wYXJhbShJU19MTF9DT01QX0lOUFVUX01JTlVTKENPTVB4LCBDT01QX0luaXRTdHJ1Y3QtPklucHV0TWludXMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfT1VUUFVUX1BPTEFSSVRZKENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0UG9sYXJpdHkpKTsKKyAgCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pICAgICAgICAqLworICAvKiAgICAgICBDT01QIGluc3RhbmNlIG11c3Qgbm90IGJlIGxvY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfQ09NUF9Jc0xvY2tlZChDT01QeCkgPT0gMFUpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIGNvbXBhcmF0b3IgaW5zdGFuY2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gUG93ZXJNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIElucHV0UGx1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBJbnB1dE1pbnVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gT3V0cHV0UG9sYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIE5vdGU6IENvbm5lY3Rpb24gc3dpdGNoIGlzIGFwcGxpY2FibGUgb25seSB0byBDT01QIGluc3RhbmNlIENPTVAxLCAgICAgKi8KKyAgICAvKiAgICAgICB0aGVyZWZvcmUgaXMgQ09NUDIgaXMgc2VsZWN0ZWQgdGhlIGVxdWl2YWxlbnQgYml0IGlzICAgICAgICAgICAgICovCisgICAgLyogICAgICAga2VwdCB1bm1vZGlmaWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmKENPTVB4ID09IENPTVAxKQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwKKyAgICAgICAgICAgICAgICAgKCBDT01QX0NTUl9DT01QMUlOTlNFTAorICAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9DT01QMVBPTEFSSVRZCisgICAgICAgICAgICAgICAgICkgCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAoICBDT01QX0luaXRTdHJ1Y3QtPklucHV0TWludXMKKyAgICAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRQb2xhcml0eQorICAgICAgICAgICAgICAgICApIAorICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBNT0RJRllfUkVHKENPTVB4LT5DU1IsCisgICAgICAgICAgICAgICAgICggIENPTVBfQ1NSX0NPTVAyU1BFRUQgICAgICAgCisgICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAySU5QU0VMICAgICAgCisgICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAySU5OU0VMICAgICAgCisgICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0NPTVAyUE9MQVJJVFkKKyAgICAgICAgICAgICAgICAgKSAKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICggIENPTVBfSW5pdFN0cnVjdC0+UG93ZXJNb2RlCisgICAgICAgICAgICAgICAgICB8IENPTVBfSW5pdFN0cnVjdC0+SW5wdXRQbHVzCisgICAgICAgICAgICAgICAgICB8IENPTVBfSW5pdFN0cnVjdC0+SW5wdXRNaW51cworICAgICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPk91dHB1dFBvbGFyaXR5CisgICAgICAgICAgICAgICAgICkgCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQ09NUCBpbnN0YW5jZSBpcyBsb2NrZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBAcmVmIExMX0NPTVBfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gQ09NUF9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgQHJlZiBMTF9DT01QX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfQ09NUF9TdHJ1Y3RJbml0KExMX0NPTVBfSW5pdFR5cGVEZWYgKkNPTVBfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IENPTVBfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgQ09NUF9Jbml0U3RydWN0LT5Qb3dlck1vZGUgICAgICAgICAgICA9IExMX0NPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVEOworICBDT01QX0luaXRTdHJ1Y3QtPklucHV0UGx1cyAgICAgICAgICAgID0gTExfQ09NUF9JTlBVVF9QTFVTX0lPMTsKKyAgQ09NUF9Jbml0U3RydWN0LT5JbnB1dE1pbnVzICAgICAgICAgICA9IExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVDsKKyAgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRQb2xhcml0eSAgICAgICA9IExMX0NPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQ09NUDEgfHwgQ09NUDIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9sbF9jcmMuYyBiL1NyYy9zdG0zMmwweHhfbGxfY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1YjIyYgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfY3JjLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfY3JjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENSQyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX2NyYy5oIgorI2luY2x1ZGUgInN0bTMybDB4eF9sbF9idXMuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoQ1JDKQorCisvKiogQGFkZHRvZ3JvdXAgQ1JDX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ1JDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUkNfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSBDUkMgcmVnaXN0ZXJzIChSZWdpc3RlcnMgcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQ1JDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBDUkMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0NSQ19EZUluaXQoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19BTExfSU5TVEFOQ0UoQ1JDeCkpOworCisgIGlmIChDUkN4ID09IENSQykKKyAgeworICAgIC8qIEZvcmNlIENSQyByZXNldCAqLworICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDKTsKKworICAgIC8qIFJlbGVhc2UgQ1JDIHJlc2V0ICovCisgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChDUkMpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9sbF9jcnMuYyBiL1NyYy9zdG0zMmwweHhfbGxfY3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjMDNhOQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfY3JzLmMKQEAgLTAsMCArMSw4NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9jcnMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQ1JTIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9sbF9jcnMuaCIKKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfYnVzLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoQ1JTKQorCisvKiogQGRlZmdyb3VwIENSU19MTCBDUlMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDUlNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSU19MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1Jbml0aWFsaXplcyBDUlMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IENSUyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0NSU19EZUluaXQodm9pZCkKK3sKKyAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9DUlMpOworICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTKTsKKworICByZXR1cm4gIFNVQ0NFU1M7Cit9CisKKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChDUlMpICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9sbF9kYWMuYyBiL1NyYy9zdG0zMmwweHhfbGxfZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmMGZjNgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfZGFjLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfZGFjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIERBQyBMTCBtb2R1bGUgZHJpdmVyCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9sbF9kYWMuaCIKKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfYnVzLmgiCisKKyNpZmRlZiBVU0VfRlVMTF9BU1NFUlQKKyAgI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyAgI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKERBQzEpCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfTEwgREFDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIERBQ19MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKERBQ19DSEFOTkVMMl9TVVBQT1JUKQorI2RlZmluZSBJU19MTF9EQUNfQ0hBTk5FTChfX0RBQ1hfXywgX19EQUNfQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKF9fREFDX0NIQU5ORUxfXykgPT0gTExfREFDX0NIQU5ORUxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0RBQ19DSEFOTkVMX18pID09IExMX0RBQ19DSEFOTkVMXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2Vsc2UKKyNkZWZpbmUgSVNfTExfREFDX0NIQU5ORUwoX19EQUNYX18sIF9fREFDX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0RBQ19DSEFOTkVMX18pID09IExMX0RBQ19DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorI2VuZGlmIC8qIERBQ19DSEFOTkVMMl9TVVBQT1JUICovCisKKyNkZWZpbmUgSVNfTExfREFDX1RSSUdHRVJfU09VUkNFKF9fVFJJR0dFUl9TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU0yX1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTNfQ0gzKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU02X1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNN19UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTIxX1RSR08pICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9FWFRJX0xJTkU5KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0RBQ19XQVZFX0FVVE9fR0VORVJfTU9ERShfX1dBVkVfQVVUT19HRU5FUkFUSU9OX01PREVfXykgICAgICAgICAgIFwKKyAgKCAgICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9NT0RFX18pID09IExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT05FKSAgICAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX01PREVfXykgPT0gTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PSVNFKSAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fTU9ERV9fKSA9PSBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fVFJJQU5HTEUpIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0RBQ19XQVZFX0FVVE9fR0VORVJfQ09ORklHKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pICAgICAgXAorICAoICAgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUMCkgICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxXzApICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMl8wKSAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzNfMCkgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM0XzApICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNV8wKSAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzZfMCkgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM3XzApICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTOF8wKSAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzlfMCkgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxMF8wKSBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTFfMCkgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEpICAgICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zKSAgICAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNykgICAgICAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzE1KSAgICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zMSkgICAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNjMpICAgICAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEyNykgICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yNTUpICAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNTExKSAgICAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzEwMjMpICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yMDQ3KSAgICBcCisgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNDA5NSkgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfREFDX09VVFBVVF9CVUZGRVIoX19PVVRQVVRfQlVGRkVSX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fT1VUUFVUX0JVRkZFUl9fKSA9PSBMTF9EQUNfT1VUUFVUX0JVRkZFUl9FTkFCTEUpICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9CVUZGRVJfXykgPT0gTExfREFDX09VVFBVVF9CVUZGRVJfRElTQUJMRSkgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgREFDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgdGhlIHNlbGVjdGVkIERBQyBpbnN0YW5jZQorICAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBEQUMgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9EQUNfRGVJbml0KERBQ19UeXBlRGVmICpEQUN4KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMTF9JTlNUQU5DRShEQUN4KSk7CisgIAorICAvKiBGb3JjZSByZXNldCBvZiBEQUMgY2xvY2sgKi8KKyAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxKTsKKyAgCisgIC8qIFJlbGVhc2UgcmVzZXQgb2YgREFDIGNsb2NrICovCisgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxKTsKKyAgCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBEQUMgaW5zdGFuY2UuCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfREFDX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gREFDIHN0YXRlOgorICAqICAgICAgICAgREFDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMiAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzLgorICAqICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAcGFyYW0gIERBQ19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0RBQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogREFDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBEQUMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0RBQ19Jbml0KERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgTExfREFDX0luaXRUeXBlRGVmICpEQUNfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQUxMX0lOU1RBTkNFKERBQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RBQ19DSEFOTkVMKERBQ3gsIERBQ19DaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9EQUNfVFJJR0dFUl9TT1VSQ0UoREFDX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RBQ19PVVRQVVRfQlVGRkVSKERBQ19Jbml0U3RydWN0LT5PdXRwdXRCdWZmZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RBQ19XQVZFX0FVVE9fR0VORVJfTU9ERShEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uKSk7CisgIGlmIChEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uICE9IExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT05FKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0RBQ19XQVZFX0FVVE9fR0VORVJfQ09ORklHKERBQ19Jbml0U3RydWN0LT5XYXZlQXV0b0dlbmVyYXRpb25Db25maWcpKTsKKyAgfQorICAKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbikgICAgICAgICovCisgIC8qICAgICAgIERBQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihMTF9EQUNfSXNFbmFibGVkKERBQ3gsIERBQ19DaGFubmVsKSA9PSAwVSkKKyAgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgREFDIGNoYW5uZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBUcmlnZ2VyU291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gV2F2ZUF1dG9HZW5lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIE91dHB1dEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoREFDX0luaXRTdHJ1Y3QtPldhdmVBdXRvR2VuZXJhdGlvbiAhPSBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9ORSkKKyAgICB7CisgICAgICBNT0RJRllfUkVHKERBQ3gtPkNSLAorICAgICAgICAgICAgICAgICAoICBEQUNfQ1JfVFNFTDEKKyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX1dBVkUxCisgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMQorICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfQk9GRjEKKyAgICAgICAgICAgICAgICAgKSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgKCAgREFDX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UKKyAgICAgICAgICAgICAgICAgIHwgREFDX0luaXRTdHJ1Y3QtPldhdmVBdXRvR2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAgfCBEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uQ29uZmlnCisgICAgICAgICAgICAgICAgICB8IERBQ19Jbml0U3RydWN0LT5PdXRwdXRCdWZmZXIKKyAgICAgICAgICAgICAgICAgKSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBNT0RJRllfUkVHKERBQ3gtPkNSLAorICAgICAgICAgICAgICAgICAoICBEQUNfQ1JfVFNFTDEKKyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX1dBVkUxCisgICAgICAgICAgICAgICAgICB8IERBQ19DUl9CT0ZGMQorICAgICAgICAgICAgICAgICApIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAoICBEQUNfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZQorICAgICAgICAgICAgICAgICAgfCBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9ORQorICAgICAgICAgICAgICAgICAgfCBEQUNfSW5pdFN0cnVjdC0+T3V0cHV0QnVmZmVyCisgICAgICAgICAgICAgICAgICkgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICApOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogREFDIGluc3RhbmNlIGlzIG5vdCBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBlYWNoIEByZWYgTExfREFDX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtIERBQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0RBQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9EQUNfU3RydWN0SW5pdChMTF9EQUNfSW5pdFR5cGVEZWYgKkRBQ19Jbml0U3RydWN0KQoreworICAvKiBTZXQgREFDX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIERBQ19Jbml0U3RydWN0LT5UcmlnZ2VyU291cmNlICAgICAgICAgICAgPSBMTF9EQUNfVFJJR19TT0ZUV0FSRTsKKyAgREFDX0luaXRTdHJ1Y3QtPldhdmVBdXRvR2VuZXJhdGlvbiAgICAgICA9IExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT05FOworICAvKiBOb3RlOiBQYXJhbWV0ZXIgZGlzY2FyZGVkIGlmIHdhdmUgYXV0byBnZW5lcmF0aW9uIGlzIGRpc2FibGVkLCAgICAgICAgICAgKi8KKyAgLyogICAgICAgc2V0IGFueXdheSB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERBQ19Jbml0U3RydWN0LT5XYXZlQXV0b0dlbmVyYXRpb25Db25maWcgPSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUMDsKKyAgREFDX0luaXRTdHJ1Y3QtPk91dHB1dEJ1ZmZlciAgICAgICAgICAgICA9IExMX0RBQ19PVVRQVVRfQlVGRkVSX0VOQUJMRTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIERBQzEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9sbF9kbWEuYyBiL1NyYy9zdG0zMmwweHhfbGxfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3NjY1ZAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfZG1hLmMKQEAgLTAsMCArMSwzNzkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfZG1hLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIERNQSBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfZG1hLmgiCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX2J1cy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRE1BMSkKKworLyoqIEBkZWZncm91cCBETUFfTEwgRE1BCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBETUFfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9ETUFfRElSRUNUSU9OKF9fVkFMVUVfXykgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSkpCisKKyNkZWZpbmUgSVNfTExfRE1BX01PREUoX19WQUxVRV9fKSAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX01PREVfTk9STUFMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9NT0RFX0NJUkNVTEFSKSkKKworI2RlZmluZSBJU19MTF9ETUFfUEVSSVBISU5DTU9ERShfX1ZBTFVFX18pICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUEVSSVBIX0lOQ1JFTUVOVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UKSkKKworI2RlZmluZSBJU19MTF9ETUFfTUVNT1JZSU5DTU9ERShfX1ZBTFVFX18pICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTUVNT1JZX0lOQ1JFTUVOVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UKSkKKworI2RlZmluZSBJU19MTF9ETUFfUEVSSVBIREFUQVNJWkUoX19WQUxVRV9fKSAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUERBVEFBTElHTl9CWVRFKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9QREFUQUFMSUdOX1dPUkQpKQorCisjZGVmaW5lIElTX0xMX0RNQV9NRU1PUllEQVRBU0laRShfX1ZBTFVFX18pICAgICAoKChfX1ZBTFVFX18pID09IExMX0RNQV9NREFUQUFMSUdOX0JZVEUpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX01EQVRBQUxJR05fV09SRCkpCisKKyNkZWZpbmUgSVNfTExfRE1BX05CREFUQShfX1ZBTFVFX18pICAgICAgICAgICAgICgoX19WQUxVRV9fKSAgPD0gIDB4MDAwMEZGRkZVKQorCisjZGVmaW5lIElTX0xMX0RNQV9QRVJJUEhSRVFVRVNUKF9fVkFMVUVfXykgICAgICAoKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzApICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzkpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzEwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzEyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzEzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzE0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9SRVFVRVNUXzE1KSkKKworI2RlZmluZSBJU19MTF9ETUFfUFJJT1JJVFkoX19WQUxVRV9fKSAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUFJJT1JJVFlfTE9XKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9QUklPUklUWV9NRURJVU0pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BSSU9SSVRZX0hJR0gpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0gpKQorCisjaWYgZGVmaW5lZCAoRE1BMV9DaGFubmVsNikgJiYgZGVmaW5lZCAoRE1BMV9DaGFubmVsNykKKyNkZWZpbmUgSVNfTExfRE1BX0FMTF9DSEFOTkVMX0lOU1RBTkNFKElOU1RBTkNFLCBDSEFOTkVMKSAgKCgoKElOU1RBTkNFKSA9PSBETUExKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gTExfRE1BX0NIQU5ORUxfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gTExfRE1BX0NIQU5ORUxfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzcpKSkpCisjZWxpZiBkZWZpbmVkIChETUExX0NoYW5uZWw2KQorI2RlZmluZSBJU19MTF9ETUFfQUxMX0NIQU5ORUxfSU5TVEFOQ0UoSU5TVEFOQ0UsIENIQU5ORUwpICAoKCgoSU5TVEFOQ0UpID09IERNQTEpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzEpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gTExfRE1BX0NIQU5ORUxfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzYpKSkpCisjZWxzZQorI2RlZmluZSBJU19MTF9ETUFfQUxMX0NIQU5ORUxfSU5TVEFOQ0UoSU5TVEFOQ0UsIENIQU5ORUwpICAoKCgoSU5TVEFOQ0UpID09IERNQTEpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzEpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gTExfRE1BX0NIQU5ORUxfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSkpKQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDYgJiYgRE1BMV9DaGFubmVsNyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBETUFfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHRoZSBETUEgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfQUxMCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBETUEgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IERNQSByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfRE1BX0RlSW5pdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgRE1BX0NoYW5uZWxfVHlwZURlZiAqdG1wID0gKERNQV9DaGFubmVsX1R5cGVEZWYgKilETUExX0NoYW5uZWwxOworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBETUEgSW5zdGFuY2UgRE1BeCBhbmQgQ2hhbm5lbCBwYXJhbWV0ZXJzKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9BTExfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSB8fCAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF9BTEwpKTsKKworICBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF9BTEwpCisgIHsKKyAgICBpZiAoRE1BeCA9PSBETUExKQorICAgIHsKKyAgICAgIC8qIEZvcmNlIHJlc2V0IG9mIERNQSBjbG9jayAqLworICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9ETUExKTsKKworICAgICAgLyogUmVsZWFzZSByZXNldCBvZiBETUEgY2xvY2sgKi8KKyAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9ETUExKTsKKyAgICB9CisjaWYgZGVmaW5lZChETUEyKQorICAgIGVsc2UgaWYgKERNQXggPT0gRE1BMikKKyAgICB7CisgICAgICAvKiBGb3JjZSByZXNldCBvZiBETUEgY2xvY2sgKi8KKyAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMik7CisKKyAgICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgRE1BIGNsb2NrICovCisgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMik7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXAgPSAoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUF4X0NoYW5uZWx5ICovCisgICAgQ0xFQVJfQklUKHRtcC0+Q0NSLCBETUFfQ0NSX0VOKTsKKworICAgIC8qIFJlc2V0IERNQXhfQ2hhbm5lbHkgY29udHJvbCByZWdpc3RlciAqLworICAgIExMX0RNQV9Xcml0ZVJlZyh0bXAsIENDUiwgMFUpOworCisgICAgLyogUmVzZXQgRE1BeF9DaGFubmVseSByZW1haW5pbmcgYnl0ZXMgcmVnaXN0ZXIgKi8KKyAgICBMTF9ETUFfV3JpdGVSZWcodG1wLCBDTkRUUiwgMFUpOworCisgICAgLyogUmVzZXQgRE1BeF9DaGFubmVseSBwZXJpcGhlcmFsIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyAgICBMTF9ETUFfV3JpdGVSZWcodG1wLCBDUEFSLCAwVSk7CisKKyAgICAvKiBSZXNldCBETUF4X0NoYW5uZWx5IG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICovCisgICAgTExfRE1BX1dyaXRlUmVnKHRtcCwgQ01BUiwgMFUpOworCisgICAgLyogUmVzZXQgUmVxdWVzdCByZWdpc3RlciBmaWVsZCBmb3IgRE1BeCBDaGFubmVsICovCisgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3QoRE1BeCwgQ2hhbm5lbCwgTExfRE1BX1JFUVVFU1RfMCk7CisKKyAgICBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF8xKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDEgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0kxKERNQXgpOworICAgIH0KKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzIpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsMiAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTIoRE1BeCk7CisgICAgfQorICAgIGVsc2UgaWYgKENoYW5uZWwgPT0gTExfRE1BX0NIQU5ORUxfMykKKyAgICB7CisgICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUF4IENoYW5uZWwzICovCisgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMyhETUF4KTsKKyAgICB9CisgICAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF80KQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDQgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k0KERNQXgpOworICAgIH0KKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzUpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsNSAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTUoRE1BeCk7CisgICAgfQorCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw2KQorICAgIGVsc2UgaWYgKENoYW5uZWwgPT0gTExfRE1BX0NIQU5ORUxfNikKKyAgICB7CisgICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUF4IENoYW5uZWw2ICovCisgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNihETUF4KTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisgICAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF83KQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDcgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k3KERNQXgpOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIERNQSByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBETUFfSW5pdFN0cnVjdC4KKyAgKiBAbm90ZSAgIFRvIGNvbnZlcnQgRE1BeF9DaGFubmVseSBJbnN0YW5jZSB0byBETUF4IEluc3RhbmNlIGFuZCBDaGFubmVseSwgdXNlIGhlbHBlciBtYWNyb3MgOgorICAqICAgICAgICAgQGFyZyBAcmVmIF9fTExfRE1BX0dFVF9JTlNUQU5DRQorICAqICAgICAgICAgQGFyZyBAcmVmIF9fTExfRE1BX0dFVF9DSEFOTkVMCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNyAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICogQHBhcmFtICBETUFfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9ETUFfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBETUEgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IE5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9ETUFfSW5pdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIERNQSBJbnN0YW5jZSBETUF4IGFuZCBDaGFubmVsIHBhcmFtZXRlcnMqLworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX0FMTF9DSEFOTkVMX0lOU1RBTkNFKERNQXgsIENoYW5uZWwpKTsKKworICAvKiBDaGVjayB0aGUgRE1BIHBhcmFtZXRlcnMgZnJvbSBETUFfSW5pdFN0cnVjdCAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX0RJUkVDVElPTihETUFfSW5pdFN0cnVjdC0+RGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9ETUFfTU9ERShETUFfSW5pdFN0cnVjdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX1BFUklQSElOQ01PREUoRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjSW5jTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX01FTU9SWUlOQ01PREUoRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0SW5jTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX1BFUklQSERBVEFTSVpFKERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0RhdGFTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9ETUFfTUVNT1JZREFUQVNJWkUoRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0RGF0YVNpemUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9OQkRBVEEoRE1BX0luaXRTdHJ1Y3QtPk5iRGF0YSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX1BFUklQSFJFUVVFU1QoRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaFJlcXVlc3QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9QUklPUklUWShETUFfSW5pdFN0cnVjdC0+UHJpb3JpdHkpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIERNQXhfQ2hhbm5lbHk6IGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uLCBkYXRhIHRyYW5zZmVyIG1vZGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsIGFuZCBtZW1vcnkgaW5jcmVtZW50IG1vZGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHNpemUgYWxpZ25tZW50IGFuZCAgcHJpb3JpdHkgbGV2ZWwgd2l0aCBwYXJhbWV0ZXJzIDoKKyAgICogLSBEaXJlY3Rpb246ICAgICAgRE1BX0NDUl9ESVIgYW5kIERNQV9DQ1JfTUVNMk1FTSBiaXRzCisgICAqIC0gTW9kZTogICAgICAgICAgIERNQV9DQ1JfQ0lSQyBiaXQKKyAgICogLSBQZXJpcGhPck0yTVNyY0luY01vZGU6ICBETUFfQ0NSX1BJTkMgYml0CisgICAqIC0gTWVtb3J5T3JNMk1Ec3RJbmNNb2RlOiAgRE1BX0NDUl9NSU5DIGJpdAorICAgKiAtIFBlcmlwaE9yTTJNU3JjRGF0YVNpemU6IERNQV9DQ1JfUFNJWkVbMTowXSBiaXRzCisgICAqIC0gTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZTogRE1BX0NDUl9NU0laRVsxOjBdIGJpdHMKKyAgICogLSBQcmlvcml0eTogICAgICAgICAgICAgICBETUFfQ0NSX1BMWzE6MF0gYml0cworICAgKi8KKyAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyKERNQXgsIENoYW5uZWwsIERNQV9Jbml0U3RydWN0LT5EaXJlY3Rpb24gICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPk1vZGUgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+UGVyaXBoT3JNMk1TcmNJbmNNb2RlICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdEluY01vZGUgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjRGF0YVNpemUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3REYXRhU2l6ZSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5Qcmlvcml0eSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUF4IENNQVIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgbWVtb3J5IG9yIGRlc3RpbmF0aW9uIGJhc2UgYWRkcmVzcyB3aXRoIHBhcmFtZXRlciA6CisgICAqIC0gTWVtb3J5T3JNMk1Ec3RBZGRyZXNzOiBETUFfQ01BUl9NQVszMTowXSBiaXRzCisgICAqLworICBMTF9ETUFfU2V0TWVtb3J5QWRkcmVzcyhETUF4LCBDaGFubmVsLCBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3RBZGRyZXNzKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQXggQ1BBUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBwZXJpcGhlcmFsIG9yIHNvdXJjZSBiYXNlIGFkZHJlc3Mgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIFBlcmlwaE9yTTJNU3JjQWRkcmVzczogRE1BX0NQQVJfUEFbMzE6MF0gYml0cworICAgKi8KKyAgTExfRE1BX1NldFBlcmlwaEFkZHJlc3MoRE1BeCwgQ2hhbm5lbCwgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjQWRkcmVzcyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeCBDTkRUUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgcGVyaXBoZXJhbCBiYXNlIGFkZHJlc3Mgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIE5iRGF0YTogRE1BX0NORFRSX05EVFsxNTowXSBiaXRzCisgICAqLworICBMTF9ETUFfU2V0RGF0YUxlbmd0aChETUF4LCBDaGFubmVsLCBETUFfSW5pdFN0cnVjdC0+TmJEYXRhKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUF4IENTRUxSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBETUEgcmVxdWVzdCBmb3IgRE1BIGluc3RhbmNlIG9uIENoYW5uZWwgeCB3aXRoIHBhcmFtZXRlciA6CisgICAqIC0gUGVyaXBoUmVxdWVzdDogRE1BX0NTRUxSWzMxOjBdIGJpdHMKKyAgICovCisgIExMX0RNQV9TZXRQZXJpcGhSZXF1ZXN0KERNQXgsIENoYW5uZWwsIERNQV9Jbml0U3RydWN0LT5QZXJpcGhSZXF1ZXN0KTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0RNQV9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgRE1BX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfRE1BX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfRE1BX1N0cnVjdEluaXQoTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IERNQV9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBETUFfSW5pdFN0cnVjdC0+UGVyaXBoT3JNMk1TcmNBZGRyZXNzICA9IDB4MDAwMDAwMDBVOworICBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3RBZGRyZXNzICA9IDB4MDAwMDAwMDBVOworICBETUFfSW5pdFN0cnVjdC0+RGlyZWN0aW9uICAgICAgICAgICAgICA9IExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWTsKKyAgRE1BX0luaXRTdHJ1Y3QtPk1vZGUgICAgICAgICAgICAgICAgICAgPSBMTF9ETUFfTU9ERV9OT1JNQUw7CisgIERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0luY01vZGUgID0gTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVDsKKyAgRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0SW5jTW9kZSAgPSBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UOworICBETUFfSW5pdFN0cnVjdC0+UGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSA9IExMX0RNQV9QREFUQUFMSUdOX0JZVEU7CisgIERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdERhdGFTaXplID0gTExfRE1BX01EQVRBQUxJR05fQllURTsKKyAgRE1BX0luaXRTdHJ1Y3QtPk5iRGF0YSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwVTsKKyAgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaFJlcXVlc3QgICAgICAgICAgPSBMTF9ETUFfUkVRVUVTVF8wOworICBETUFfSW5pdFN0cnVjdC0+UHJpb3JpdHkgICAgICAgICAgICAgICA9IExMX0RNQV9QUklPUklUWV9MT1c7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBETUExICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfbGxfZXh0aS5jIGIvU3JjL3N0bTMybDB4eF9sbF9leHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiODJmMQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfZXh0aS5jCkBAIC0wLDAgKzEsMjE0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX2V4dGkuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRVhUSSBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfZXh0aS5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRVhUSSkKKworLyoqIEBkZWZncm91cCBFWFRJX0xMIEVYVEkKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEVYVElfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xMX0VYVElfTElORV8wXzMxKF9fVkFMVUVfXykgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiB+TExfRVhUSV9MSU5FX0FMTF8wXzMxKSA9PSAweDAwMDAwMDAwVSkKKworI2RlZmluZSBJU19MTF9FWFRJX01PREUoX19WQUxVRV9fKSAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0VYVElfTU9ERV9JVCkgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfRVhUSV9NT0RFX0VWRU5UKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX01PREVfSVRfRVZFTlQpKQorCisKKyNkZWZpbmUgSVNfTExfRVhUSV9UUklHR0VSKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX1RSSUdHRVJfTk9ORSkgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0VYVElfVFJJR0dFUl9SSVNJTkcpICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfRVhUSV9UUklHR0VSX0ZBTExJTkcpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkcpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEVYVElfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEVYVElfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSB0aGUgRVhUSSByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEVYVEkgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCit1aW50MzJfdCBMTF9FWFRJX0RlSW5pdCh2b2lkKQoreworICAvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyAgTExfRVhUSV9Xcml0ZVJlZyhJTVIsICAgMHgzRjg0MDAwMFUpOworICAvKiBFdmVudCBtYXNrIHJlZ2lzdGVyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKEVNUiwgICAweDAwMDAwMDAwVSk7CisgIC8qIFJpc2luZyBUcmlnZ2VyIHNlbGVjdGlvbiByZWdpc3RlciBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyAgTExfRVhUSV9Xcml0ZVJlZyhSVFNSLCAgMHgwMDAwMDAwMFUpOworICAvKiBGYWxsaW5nIFRyaWdnZXIgc2VsZWN0aW9uIHJlZ2lzdGVyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKEZUU1IsICAweDAwMDAwMDAwVSk7CisgIC8qIFNvZnR3YXJlIGludGVycnVwdCBldmVudCByZWdpc3RlciBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyAgTExfRVhUSV9Xcml0ZVJlZyhTV0lFUiwgMHgwMDAwMDAwMFUpOworICAvKiBQZW5kaW5nIHJlZ2lzdGVyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKFBSLCAgICAweDAwN0JGRkZGVSk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgRVhUSSByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBFWFRJX0luaXRTdHJ1Y3QuCisgICogQHBhcmFtICBFWFRJX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfRVhUSV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEVYVEkgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCit1aW50MzJfdCBMTF9FWFRJX0luaXQoTExfRVhUSV9Jbml0VHlwZURlZiAqRVhUSV9Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfRVhUSV9MSU5FXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoRVhUSV9Jbml0U3RydWN0LT5MaW5lQ29tbWFuZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRVhUSV9NT0RFKEVYVElfSW5pdFN0cnVjdC0+TW9kZSkpOworCisgIC8qIEVOQUJMRSBMaW5lQ29tbWFuZCAqLworICBpZiAoRVhUSV9Jbml0U3RydWN0LT5MaW5lQ29tbWFuZCAhPSBESVNBQkxFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0VYVElfVFJJR0dFUihFWFRJX0luaXRTdHJ1Y3QtPlRyaWdnZXIpKTsKKworICAgIC8qIENvbmZpZ3VyZSBFWFRJIExpbmVzIGluIHJhbmdlIGZyb20gMCB0byAzMSAqLworICAgIGlmIChFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSAhPSBMTF9FWFRJX0xJTkVfTk9ORSkKKyAgICB7CisgICAgICBzd2l0Y2ggKEVYVElfSW5pdFN0cnVjdC0+TW9kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBMTF9FWFRJX01PREVfSVQ6CisgICAgICAgICAgLyogRmlyc3QgRGlzYWJsZSBFdmVudCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgIC8qIFRoZW4gRW5hYmxlIElUIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9FbmFibGVJVF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMTF9FWFRJX01PREVfRVZFTlQ6CisgICAgICAgICAgLyogRmlyc3QgRGlzYWJsZSBJVCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRGlzYWJsZUlUXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgIC8qIFRoZW4gRW5hYmxlIEV2ZW50IG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMTF9FWFRJX01PREVfSVRfRVZFTlQ6CisgICAgICAgICAgLyogRGlyZWN0bHkgRW5hYmxlIElUICYgRXZlbnQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoRVhUSV9Jbml0U3RydWN0LT5UcmlnZ2VyICE9IExMX0VYVElfVFJJR0dFUl9OT05FKQorICAgICAgeworICAgICAgICBzd2l0Y2ggKEVYVElfSW5pdFN0cnVjdC0+VHJpZ2dlcikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgTExfRVhUSV9UUklHR0VSX1JJU0lORzoKKyAgICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgRmFsbGluZyBUcmlnZ2VyIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAgIC8qIFRoZW4gRW5hYmxlIFJpc2luZyBUcmlnZ2VyIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIExMX0VYVElfVFJJR0dFUl9GQUxMSU5HOgorICAgICAgICAgICAgLyogRmlyc3QgRGlzYWJsZSBSaXNpbmcgVHJpZ2dlciBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAgIC8qIFRoZW4gRW5hYmxlIEZhbGxpbmcgVHJpZ2dlciBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgICAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgTExfRVhUSV9UUklHR0VSX1JJU0lOR19GQUxMSU5HOgorICAgICAgICAgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgICAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qIERJU0FCTEUgTGluZUNvbW1hbmQgKi8KKyAgZWxzZQorICB7CisgICAgLyogRGUtY29uZmlndXJlIEVYVEkgTGluZXMgaW4gcmFuZ2UgZnJvbSAwIHRvIDMxICovCisgICAgTExfRVhUSV9EaXNhYmxlSVRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0VYVElfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIEVYVElfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9FWFRJX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfRVhUSV9TdHJ1Y3RJbml0KExMX0VYVElfSW5pdFR5cGVEZWYgKkVYVElfSW5pdFN0cnVjdCkKK3sKKyAgRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEgICAgICA9IExMX0VYVElfTElORV9OT05FOworICBFWFRJX0luaXRTdHJ1Y3QtPkxpbmVDb21tYW5kICAgID0gRElTQUJMRTsKKyAgRVhUSV9Jbml0U3RydWN0LT5Nb2RlICAgICAgICAgICA9IExMX0VYVElfTU9ERV9JVDsKKyAgRVhUSV9Jbml0U3RydWN0LT5UcmlnZ2VyICAgICAgICA9IExMX0VYVElfVFJJR0dFUl9GQUxMSU5HOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoRVhUSSkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9sbF9ncGlvLmMgYi9TcmMvc3RtMzJsMHh4X2xsX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E1NGZiCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9sbF9ncGlvLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfZ3Bpby5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBHUElPIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9sbF9ncGlvLmgiCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX2J1cy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoR1BJT0EpIHx8IGRlZmluZWQgKEdQSU9CKSB8fCBkZWZpbmVkIChHUElPQykgfHwgZGVmaW5lZCAoR1BJT0QpIHx8IGRlZmluZWQgKEdQSU9FKSB8fCBkZWZpbmVkIChHUElPSCkKKworLyoqIEBhZGR0b2dyb3VwIEdQSU9fTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEdQSU9fTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9HUElPX1BJTihfX1ZBTFVFX18pICAgICAgICAgICgoKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgPCAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IChMTF9HUElPX1BJTl9BTEwpKSkKKworI2RlZmluZSBJU19MTF9HUElPX01PREUoX19WQUxVRV9fKSAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfR1BJT19NT0RFX0lOUFVUKSAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX01PREVfT1VUUFVUKSAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19NT0RFX0FOQUxPRykpCisKKyNkZWZpbmUgSVNfTExfR1BJT19PVVRQVVRfVFlQRShfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX0dQSU9fT1VUUFVUX1BVU0hQVUxMKSAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX09VVFBVVF9PUEVORFJBSU4pKQorCisjZGVmaW5lIElTX0xMX0dQSU9fU1BFRUQoX19WQUxVRV9fKSAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XKSAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0pICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19TUEVFRF9GUkVRX0hJR0gpICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdIKSkKKworI2RlZmluZSBJU19MTF9HUElPX1BVTEwoX19WQUxVRV9fKSAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfR1BJT19QVUxMX05PKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19QVUxMX1VQKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19QVUxMX0RPV04pKQorCisjZGVmaW5lIElTX0xMX0dQSU9fQUxURVJOQVRFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzAgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMSAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl8yICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzMgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfNCAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl81ICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzYgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfNyApKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBHUElPX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgR1BJTyByZWdpc3RlcnMgKFJlZ2lzdGVycyByZXN0b3JlZCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcykuCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogR1BJTyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogICBXcm9uZyBHUElPIFBvcnQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0dQSU9fRGVJbml0KEdQSU9fVHlwZURlZiAqR1BJT3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUxMX0lOU1RBTkNFKEdQSU94KSk7CisKKyAgLyogRm9yY2UgYW5kIFJlbGVhc2UgcmVzZXQgb24gY2xvY2sgb2YgR1BJT3ggUG9ydCAqLworICBpZiAoR1BJT3ggPT0gR1BJT0EpCisgIHsKKyAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQSk7CisgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQSk7CisgIH0KKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0IpCisgIHsKKyAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQik7CisgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQik7CisgIH0KKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0MpCisgIHsKKyAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQyk7CisgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQyk7CisgIH0KKyNpZiBkZWZpbmVkKEdQSU9EKQorICBlbHNlIGlmIChHUElPeCA9PSBHUElPRCkKKyAgeworICAgIExMX0lPUF9HUlAxX0ZvcmNlUmVzZXQoTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9EKTsKKyAgICBMTF9JT1BfR1JQMV9SZWxlYXNlUmVzZXQoTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9EKTsKKyAgfQorI2VuZGlmIC8qIEdQSU9EICovCisjaWYgZGVmaW5lZChHUElPRSkKKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0UpCisgIHsKKyAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPRSk7CisgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPRSk7CisgIH0KKyNlbmRpZiAvKiBHUElPRSAqLworI2lmIGRlZmluZWQoR1BJT0gpCisgIGVsc2UgaWYgKEdQSU94ID09IEdQSU9IKQorICB7CisgICAgTExfSU9QX0dSUDFfRm9yY2VSZXNldChMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0gpOworICAgIExMX0lPUF9HUlAxX1JlbGVhc2VSZXNldChMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0gpOworICB9CisjZW5kaWYgLyogR1BJT0ggKi8KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBHUElPIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIEdQSU9fSW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgR1BJT19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0dQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEdQSU8gcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogR1BJTyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkIGFjY29yZGluZyB0byBHUElPX0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6ICAgTm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0dQSU9fSW5pdChHUElPX1R5cGVEZWYgKkdQSU94LCBMTF9HUElPX0luaXRUeXBlRGVmICpHUElPX0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHBpbnBvcyAgICAgPSAweDAwMDAwMDAwVTsKKyAgdWludDMyX3QgY3VycmVudHBpbiA9IDB4MDAwMDAwMDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX0FMTF9JTlNUQU5DRShHUElPeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfR1BJT19QSU4oR1BJT19Jbml0U3RydWN0LT5QaW4pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0dQSU9fTU9ERShHUElPX0luaXRTdHJ1Y3QtPk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0dQSU9fUFVMTChHUElPX0luaXRTdHJ1Y3QtPlB1bGwpKTsKKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbmZpZ3VyZSB0aGUgcG9ydCBwaW5zIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyogSW5pdGlhbGl6ZSAgcGlucG9zIG9uIGZpcnN0IHBpbiBzZXQgKi8KKyAgLyogcGlucG9zID0gMDsgdXNlbGVzcyBhcyBhbHJlYWR5IGRvbmUgaW4gZGVmYXVsdCBpbml0aWFsaXphdGlvbiAqLworCisgIC8qIENvbmZpZ3VyZSB0aGUgcG9ydCBwaW5zICovCisgIHdoaWxlICgoKEdQSU9fSW5pdFN0cnVjdC0+UGluKSA+PiBwaW5wb3MpICE9IDB4MDAwMDAwMDBVKQorICB7CisgICAgLyogR2V0IGN1cnJlbnQgaW8gcG9zaXRpb24gKi8KKyAgICBjdXJyZW50cGluID0gKEdQSU9fSW5pdFN0cnVjdC0+UGluKSAmICgweDAwMDAwMDAxVSA8PCBwaW5wb3MpOworCisgICAgaWYgKGN1cnJlbnRwaW4pCisgICAgeworICAgICAgLyogUGluIE1vZGUgY29uZmlndXJhdGlvbiAqLworICAgICAgTExfR1BJT19TZXRQaW5Nb2RlKEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPk1vZGUpOworCisgICAgICBpZiAoKEdQSU9fSW5pdFN0cnVjdC0+TW9kZSA9PSBMTF9HUElPX01PREVfT1VUUFVUKSB8fCAoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpKQorICAgICAgeworICAgICAgICAvKiBDaGVjayBTcGVlZCBtb2RlIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0dQSU9fU1BFRUQoR1BJT19Jbml0U3RydWN0LT5TcGVlZCkpOworCisgICAgICAgIC8qIFNwZWVkIG1vZGUgY29uZmlndXJhdGlvbiAqLworICAgICAgICBMTF9HUElPX1NldFBpblNwZWVkKEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPlNwZWVkKTsKKyAgICAgIH0KKworICAgICAgLyogUHVsbC11cCBQdWxsIGRvd24gcmVzaXN0b3IgY29uZmlndXJhdGlvbiovCisgICAgICBMTF9HUElPX1NldFBpblB1bGwoR1BJT3gsIGN1cnJlbnRwaW4sIEdQSU9fSW5pdFN0cnVjdC0+UHVsbCk7CisKKyAgICAgIGlmIChHUElPX0luaXRTdHJ1Y3QtPk1vZGUgPT0gTExfR1BJT19NT0RFX0FMVEVSTkFURSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgQWx0ZXJuYXRlIHBhcmFtZXRlciAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfR1BJT19BTFRFUk5BVEUoR1BJT19Jbml0U3RydWN0LT5BbHRlcm5hdGUpKTsKKworICAgICAgICAvKiBTcGVlZCBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgaWYgKGN1cnJlbnRwaW4gPCBMTF9HUElPX1BJTl84KQorICAgICAgICB7CisgICAgICAgICAgTExfR1BJT19TZXRBRlBpbl8wXzcoR1BJT3gsIGN1cnJlbnRwaW4sIEdQSU9fSW5pdFN0cnVjdC0+QWx0ZXJuYXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBMTF9HUElPX1NldEFGUGluXzhfMTUoR1BJT3gsIGN1cnJlbnRwaW4sIEdQSU9fSW5pdFN0cnVjdC0+QWx0ZXJuYXRlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBwaW5wb3MrKzsKKyAgfQorCisgIGlmICgoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9PVVRQVVQpIHx8IChHUElPX0luaXRTdHJ1Y3QtPk1vZGUgPT0gTExfR1BJT19NT0RFX0FMVEVSTkFURSkpCisgIHsKKyAgICAvKiBDaGVjayBPdXRwdXQgbW9kZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0dQSU9fT1VUUFVUX1RZUEUoR1BJT19Jbml0U3RydWN0LT5PdXRwdXRUeXBlKSk7CisKKyAgICAvKiBPdXRwdXQgbW9kZSBjb25maWd1cmF0aW9uKi8KKyAgICBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUoR1BJT3gsIEdQSU9fSW5pdFN0cnVjdC0+UGluLCBHUElPX0luaXRTdHJ1Y3QtPk91dHB1dFR5cGUpOworCisgIH0KKyAgcmV0dXJuIChTVUNDRVNTKTsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBlYWNoIEByZWYgTExfR1BJT19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBHUElPX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBAcmVmIExMX0dQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKwordm9pZCBMTF9HUElPX1N0cnVjdEluaXQoTExfR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0U3RydWN0KQoreworICAvKiBSZXNldCBHUElPIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovCisgIEdQSU9fSW5pdFN0cnVjdC0+UGluICAgICAgICA9IExMX0dQSU9fUElOX0FMTDsKKyAgR1BJT19Jbml0U3RydWN0LT5Nb2RlICAgICAgID0gTExfR1BJT19NT0RFX0FOQUxPRzsKKyAgR1BJT19Jbml0U3RydWN0LT5TcGVlZCAgICAgID0gTExfR1BJT19TUEVFRF9GUkVRX0xPVzsKKyAgR1BJT19Jbml0U3RydWN0LT5PdXRwdXRUeXBlID0gTExfR1BJT19PVVRQVVRfUFVTSFBVTEw7CisgIEdQSU9fSW5pdFN0cnVjdC0+UHVsbCAgICAgICA9IExMX0dQSU9fUFVMTF9OTzsKKyAgR1BJT19Jbml0U3RydWN0LT5BbHRlcm5hdGUgID0gTExfR1BJT19BRl8wOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoR1BJT0EpIHx8IGRlZmluZWQgKEdQSU9CKSB8fCBkZWZpbmVkIChHUElPQykgfHwgZGVmaW5lZCAoR1BJT0QpIHx8IGRlZmluZWQgKEdQSU9FKSB8fCBkZWZpbmVkIChHUElPSCkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2xsX2kyYy5jIGIvU3JjL3N0bTMybDB4eF9sbF9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQxNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9sbF9pMmMuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9pMmMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSTJDIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfaTJjLmgiCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX2J1cy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoSTJDMSkgfHwgZGVmaW5lZCAoSTJDMikgfHwgZGVmaW5lZCAoSTJDMykKKworLyoqIEBkZWZncm91cCBJMkNfTEwgSTJDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJMkNfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xMX0kyQ19QRVJJUEhFUkFMX01PREUoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19NT0RFX0kyQykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9JMkNfTU9ERV9TTUJVU19IT1NUKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfSTJDX01PREVfU01CVVNfREVWSUNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRV9BUlApKQorCisjZGVmaW5lIElTX0xMX0kyQ19BTkFMT0dfRklMVEVSKF9fVkFMVUVfXykgICAgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19BTkFMT0dGSUxURVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19BTkFMT0dGSUxURVJfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfSTJDX0RJR0lUQUxfRklMVEVSKF9fVkFMVUVfXykgICAgICgoX19WQUxVRV9fKSA8PSAweDAwMDAwMDBGVSkKKworI2RlZmluZSBJU19MTF9JMkNfT1dOX0FERFJFU1MxKF9fVkFMVUVfXykgICAgICAgKChfX1ZBTFVFX18pIDw9IDB4MDAwMDAzRkZVKQorCisjZGVmaW5lIElTX0xMX0kyQ19UWVBFX0FDS05PV0xFREdFKF9fVkFMVUVfXykgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19BQ0spIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfSTJDX05BQ0spKQorCisjZGVmaW5lIElTX0xMX0kyQ19PV05fQUREUlNJWkUoX19WQUxVRV9fKSAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19PV05BRERSRVNTMV83QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19PV05BRERSRVNTMV8xMEJJVCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEkyQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIEkyQyByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogSTJDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBJMkMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0kyQ19EZUluaXQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIEkyQyBJbnN0YW5jZSBJMkN4ICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKEkyQ3gpKTsKKworICBpZiAoSTJDeCA9PSBJMkMxKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEpOworICB9CisjaWYgZGVmaW5lZChJMkMyKQorICBlbHNlIGlmIChJMkN4ID09IEkyQzIpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMik7CisKKyAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChJMkMzKQorICBlbHNlIGlmIChJMkN4ID09IEkyQzMpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMyk7CisgIH0KKyNlbmRpZgorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSTJDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIEkyQ19Jbml0U3RydWN0LgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBJMkNfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9JMkNfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBJMkMgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IE5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9JMkNfSW5pdChJMkNfVHlwZURlZiAqSTJDeCwgTExfSTJDX0luaXRUeXBlRGVmICpJMkNfSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIEkyQyBJbnN0YW5jZSBJMkN4ICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKEkyQ3gpKTsKKworICAvKiBDaGVjayB0aGUgSTJDIHBhcmFtZXRlcnMgZnJvbSBJMkNfSW5pdFN0cnVjdCAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJDX1BFUklQSEVSQUxfTU9ERShJMkNfSW5pdFN0cnVjdC0+UGVyaXBoZXJhbE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19BTkFMT0dfRklMVEVSKEkyQ19Jbml0U3RydWN0LT5BbmFsb2dGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19ESUdJVEFMX0ZJTFRFUihJMkNfSW5pdFN0cnVjdC0+RGlnaXRhbEZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJDX09XTl9BRERSRVNTMShJMkNfSW5pdFN0cnVjdC0+T3duQWRkcmVzczEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19UWVBFX0FDS05PV0xFREdFKEkyQ19Jbml0U3RydWN0LT5UeXBlQWNrbm93bGVkZ2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19PV05fQUREUlNJWkUoSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJTaXplKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDeCBQZXJpcGhlcmFsICovCisgIExMX0kyQ19EaXNhYmxlKEkyQ3gpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiBDb25maWd1cmUgdGhlIGFuYWxvZyBhbmQgZGlnaXRhbCBub2lzZSBmaWx0ZXJzIHdpdGggcGFyYW1ldGVycyA6CisgICAqIC0gQW5hbG9nRmlsdGVyOiBJMkNfQ1IxX0FORk9GRiBiaXQKKyAgICogLSBEaWdpdGFsRmlsdGVyOiBJMkNfQ1IxX0RORlszOjBdIGJpdHMKKyAgICovCisgIExMX0kyQ19Db25maWdGaWx0ZXJzKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5BbmFsb2dGaWx0ZXIsIEkyQ19Jbml0U3RydWN0LT5EaWdpdGFsRmlsdGVyKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBUSU1JTkdSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBTREEgc2V0dXAsIGhvbGQgdGltZSBhbmQgdGhlIFNDTCBoaWdoLCBsb3cgcGVyaW9kIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBUaW1pbmc6IEkyQ19USU1JTkdSX1BSRVNDWzM6MF0sIEkyQ19USU1JTkdSX1NDTERFTFszOjBdLCBJMkNfVElNSU5HUl9TREFERUxbMzowXSwKKyAgICogICAgICAgICAgIEkyQ19USU1JTkdSX1NDTEhbNzowXSBhbmQgSTJDX1RJTUlOR1JfU0NMTFs3OjBdIGJpdHMKKyAgICovCisgIExMX0kyQ19TZXRUaW1pbmcoSTJDeCwgSTJDX0luaXRTdHJ1Y3QtPlRpbWluZyk7CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkN4IFBlcmlwaGVyYWwgKi8KKyAgTExfSTJDX0VuYWJsZShJMkN4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBPQVIxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogRGlzYWJsZSwgQ29uZmlndXJlIGFuZCBFbmFibGUgSTJDeCBkZXZpY2Ugb3duIGFkZHJlc3MgMSB3aXRoIHBhcmFtZXRlcnMgOgorICAgKiAtIE93bkFkZHJlc3MxOiAgSTJDX09BUjFfT0ExWzk6MF0gYml0cworICAgKiAtIE93bkFkZHJTaXplOiAgSTJDX09BUjFfT0ExTU9ERSBiaXQKKyAgICovCisgIExMX0kyQ19EaXNhYmxlT3duQWRkcmVzczEoSTJDeCk7CisgIExMX0kyQ19TZXRPd25BZGRyZXNzMShJMkN4LCBJMkNfSW5pdFN0cnVjdC0+T3duQWRkcmVzczEsIEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyU2l6ZSk7CisKKyAgLyogT3duQWRyZXNzMSA9PSAwIGlzIHJlc2VydmVkIGZvciBHZW5lcmFsIENhbGwgYWRkcmVzcyAqLworICBpZiAoSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJlc3MxICE9IDBVKQorICB7CisgICAgTExfSTJDX0VuYWJsZU93bkFkZHJlc3MxKEkyQ3gpOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggTU9ERSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogQ29uZmlndXJlIEkyQ3ggcGVyaXBoZXJhbCBtb2RlIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBQZXJpcGhlcmFsTW9kZTogSTJDX0NSMV9TTUJERU4gYW5kIEkyQ19DUjFfU01CSEVOIGJpdHMKKyAgICovCisgIExMX0kyQ19TZXRNb2RlKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5QZXJpcGhlcmFsTW9kZSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgQUNLbm93bGVkZ2Ugb3IgTm9uIEFDS25vd2xlZGdlIGNvbmRpdGlvbgorICAgKiBhZnRlciB0aGUgYWRkcmVzcyByZWNlaXZlIG1hdGNoIGNvZGUgb3IgbmV4dCByZWNlaXZlZCBieXRlIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBUeXBlQWNrbm93bGVkZ2U6IEkyQ19DUjJfTkFDSyBiaXQKKyAgICovCisgIExMX0kyQ19BY2tub3dsZWRnZU5leHREYXRhKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5UeXBlQWNrbm93bGVkZ2UpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfSTJDX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBJMkNfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9JMkNfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9JMkNfU3RydWN0SW5pdChMTF9JMkNfSW5pdFR5cGVEZWYgKkkyQ19Jbml0U3RydWN0KQoreworICAvKiBTZXQgSTJDX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIEkyQ19Jbml0U3RydWN0LT5QZXJpcGhlcmFsTW9kZSAgPSBMTF9JMkNfTU9ERV9JMkM7CisgIEkyQ19Jbml0U3RydWN0LT5UaW1pbmcgICAgICAgICAgPSAwVTsKKyAgSTJDX0luaXRTdHJ1Y3QtPkFuYWxvZ0ZpbHRlciAgICA9IExMX0kyQ19BTkFMT0dGSUxURVJfRU5BQkxFOworICBJMkNfSW5pdFN0cnVjdC0+RGlnaXRhbEZpbHRlciAgID0gMFU7CisgIEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyZXNzMSAgICAgPSAwVTsKKyAgSTJDX0luaXRTdHJ1Y3QtPlR5cGVBY2tub3dsZWRnZSA9IExMX0kyQ19OQUNLOworICBJMkNfSW5pdFN0cnVjdC0+T3duQWRkclNpemUgICAgID0gTExfSTJDX09XTkFERFJFU1MxXzdCSVQ7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBJMkMxIHx8IEkyQzIgfHwgSTJDMyAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2xsX2xwdGltLmMgYi9TcmMvc3RtMzJsMHh4X2xsX2xwdGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1OTJmYwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfbHB0aW0uYwpAQCAtMCwwICsxLDMxMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9scHRpbS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBMUFRJTSBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9sbF9scHRpbS5oIgorI2luY2x1ZGUgInN0bTMybDB4eF9sbF9idXMuaCIKKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfcmNjLmgiCisKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyAgI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyAgI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKExQVElNMSkKKworLyoqIEBhZGR0b2dyb3VwIExQVElNX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBMUFRJTV9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX0xMX0xQVElNX0NMT0NLX1NPVVJDRShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fQ0xLX1NPVVJDRV9JTlRFUk5BTCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX0NMS19TT1VSQ0VfRVhURVJOQUwpKQorCisjZGVmaW5lIElTX0xMX0xQVElNX0NMT0NLX1BSRVNDQUxFUihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVYyKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNCkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjgpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVYxNikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMzIpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjY0KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVYxMjgpKQorCisjZGVmaW5lIElTX0xMX0xQVElNX1dBVkVGT1JNKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fUFdNKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fU0VUT05DRSkpCisKKyNkZWZpbmUgSVNfTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfUkVHVUxBUikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9JTlZFUlNFKSkKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfRnVuY3Rpb25zIExQVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIExQVElNX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBMUFRJTV9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgTFBUSU14IHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBMUFRJTXggTFAgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTFBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBpbnZhbGlkIExQVElNeCBpbnN0YW5jZQorICAqLworRXJyb3JTdGF0dXMgTExfTFBUSU1fRGVJbml0KExQVElNX1R5cGVEZWYqIExQVElNeCkKK3sKKyAgRXJyb3JTdGF0dXMgcmVzdWx0ID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoTFBUSU14KSk7IAorIAorICBpZiAoTFBUSU14ID09IExQVElNMSkKKyAgeworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xKTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xKTsgIAorICB9IAorI2lmIGRlZmluZWQoTFBUSU0yKQorICBlbHNlIGlmIChMUFRJTXggPT0gTFBUSU0yKQorICB7IAorICAgIExMX0FQQjFfR1JQMl9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMl9QRVJJUEhfTFBUSU0yKTsKKyAgICBMTF9BUEIxX0dSUDJfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMl9QRVJJUEhfTFBUSU0yKTsKKyAgfQorI2VuZGlmIC8qIExQVElNMiAqLworICBlbHNlCisgIHsKKyAgICByZXN1bHQgPSBFUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBmaWVsZHMgb2YgdGhlIExQVElNX0luaXRTdHJ1Y3Qgc3RydWN0dXJlIHRvIGl0cyBkZWZhdWx0CisgICogICAgICAgICB2YWx1ZS4KKyAgKiBAcGFyYW0gIExQVElNX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfTFBUSU1fSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0xQVElNX1N0cnVjdEluaXQoTExfTFBUSU1fSW5pdFR5cGVEZWYqIExQVElNX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisgIExQVElNX0luaXRTdHJ1Y3QtPkNsb2NrU291cmNlID0gTExfTFBUSU1fQ0xLX1NPVVJDRV9JTlRFUk5BTDsKKyAgTFBUSU1fSW5pdFN0cnVjdC0+UHJlc2NhbGVyICAgPSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMTsKKyAgTFBUSU1fSW5pdFN0cnVjdC0+V2F2ZWZvcm0gICAgPSBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fUFdNOworICBMUFRJTV9Jbml0U3RydWN0LT5Qb2xhcml0eSAgICA9IExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9SRUdVTEFSOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgTFBUSU14IHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgKiBAbm90ZSBMTF9MUFRJTV9Jbml0IGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSBMUFRJTXggY2FuIGJlIGRpc2FibGVkIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9MUFRJTV9EaXNhYmxlKCkuCisgICogQHBhcmFtICBMUFRJTXggTFAgVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIExQVElNX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfTFBUSU1fSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IExQVElNeCBpbnN0YW5jZSBoYXMgYmVlbiBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IExQVElNeCBpbnN0YW5jZSBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfTFBUSU1fSW5pdChMUFRJTV9UeXBlRGVmICogTFBUSU14LCBMTF9MUFRJTV9Jbml0VHlwZURlZiogTFBUSU1fSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgcmVzdWx0ID0gU1VDQ0VTUzsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKExQVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBUSU1fQ0xPQ0tfU09VUkNFKExQVElNX0luaXRTdHJ1Y3QtPkNsb2NrU291cmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFRJTV9DTE9DS19QUkVTQ0FMRVIoTFBUSU1fSW5pdFN0cnVjdC0+UHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFRJTV9XQVZFRk9STShMUFRJTV9Jbml0U3RydWN0LT5XYXZlZm9ybSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZKExQVElNX0luaXRTdHJ1Y3QtPlBvbGFyaXR5KSk7CisgIAorICAvKiBUaGUgTFBUSU14X0NGR1IgcmVnaXN0ZXIgbXVzdCBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlIExQVElNIGlzIGRpc2FibGVkIAorICAgICAoRU5BQkxFIGJpdCBpcyByZXNldCB0byAwKS4KKyAgKi8KKyAgaWYgKExMX0xQVElNX0lzRW5hYmxlZChMUFRJTXgpID09IDFVTCkKKyAgeworICAgIHJlc3VsdCA9IEVSUk9SOworICB9CisgIGVsc2UKKyAgeworICAvKiBTZXQgQ0tTRUwgYml0ZmllbGQgYWNjb3JkaW5nIHRvIENsb2NrU291cmNlIHZhbHVlICovCisgIC8qIFNldCBQUkVTQyBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gUHJlc2NhbGVyIHZhbHVlICovCisgIC8qIFNldCBXQVZFIGJpdGZpZWxkIGFjY29yZGluZyB0byBXYXZlZm9ybSB2YWx1ZSAqLworICAvKiBTZXQgV0FWRVBPTCBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gUG9sYXJpdHkgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIAorICAgICAgICAgICAgIChMUFRJTV9DRkdSX0NLU0VMIHwgTFBUSU1fQ0ZHUl9QUkVTQyB8IExQVElNX0NGR1JfV0FWRXwgTFBUSU1fQ0ZHUl9XQVZQT0wpLCAKKyAgICAgICAgICAgICBMUFRJTV9Jbml0U3RydWN0LT5DbG9ja1NvdXJjZSB8IFwKKyAgICAgICAgICAgICBMUFRJTV9Jbml0U3RydWN0LT5QcmVzY2FsZXIgfCBcCisgICAgICAgICAgICAgTFBUSU1fSW5pdFN0cnVjdC0+V2F2ZWZvcm0gfCBcCisgICAgICAgICAgICAgTFBUSU1fSW5pdFN0cnVjdC0+UG9sYXJpdHkpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBMUFRJTSBpbnN0YW5jZQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVOQUJMRSAgICAgICAgTExfTFBUSU1fRGlzYWJsZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBub3RlICAgVGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBpcyByZXF1aXJlZCB0byBzb2x2ZSBMUFRJTSBkaXNhYmxlIEhXIGxpbWl0YXRpb24uCisgICogICAgICAgICBQbGVhc2UgY2hlY2sgRXJyYXRhIFNoZWV0IEVTMDMzNSBmb3IgbW9yZSBkZXRhaWxzIHVuZGVyICJNQ1UgbWF5IHJlbWFpbgorICAqICAgICAgICAgc3R1Y2sgaW4gTFBUSU0gaW50ZXJydXB0IHdoZW4gZW50ZXJpbmcgU3RvcCBtb2RlIiBzZWN0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9MUFRJTV9EaXNhYmxlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgTExfUkNDX0Nsb2Nrc1R5cGVEZWYgcmNjX2Nsb2NrOworICB1aW50MzJfdCB0bXBjbGtzb3VyY2UgPSAwOworICB1aW50MzJfdCB0bXBJRVI7CisgIHVpbnQzMl90IHRtcENGR1I7CisgIHVpbnQzMl90IHRtcENNUDsKKyAgdWludDMyX3QgdG1wQVJSOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShMUFRJTXgpKTsKKworICBfX2Rpc2FibGVfaXJxKCk7CisKKyAgLyoqKioqKioqKiogU2F2ZSBMUFRJTSBDb25maWcgKioqKioqKioqLworICAvKiBTYXZlIExQVElNIHNvdXJjZSBjbG9jayAqLworICBzd2l0Y2ggKCh1aW50MzJfdClMUFRJTXgpCisgIHsKKyAgICAgY2FzZSBMUFRJTTFfQkFTRToKKyAgICAgICB0bXBjbGtzb3VyY2UgPSBMTF9SQ0NfR2V0TFBUSU1DbG9ja1NvdXJjZShMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRSk7CisgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChMUFRJTTIpCisgICAgIGNhc2UgTFBUSU0yX0JBU0U6CisgICAgICAgdG1wY2xrc291cmNlID0gTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UoTExfUkNDX0xQVElNMl9DTEtTT1VSQ0UpOworICAgICAgIGJyZWFrOworI2VuZGlmIC8qIExQVElNMiAqLworICAgICBkZWZhdWx0OgorICAgICAgIGJyZWFrOworICB9CisKKyAgLyogU2F2ZSBMUFRJTSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworICB0bXBJRVIgPSBMUFRJTXgtPklFUjsKKyAgdG1wQ0ZHUiA9IExQVElNeC0+Q0ZHUjsKKyAgdG1wQ01QID0gTFBUSU14LT5DTVA7CisgIHRtcEFSUiA9IExQVElNeC0+QVJSOworCisgIC8qKioqKioqKioqKioqIFJlc2V0IExQVElNICoqKioqKioqKioqKi8KKyAgKHZvaWQpTExfTFBUSU1fRGVJbml0KExQVElNeCk7CisKKyAgLyoqKioqKioqKiBSZXN0b3JlIExQVElNIENvbmZpZyAqKioqKioqLworICBMTF9SQ0NfR2V0U3lzdGVtQ2xvY2tzRnJlcSgmcmNjX2Nsb2NrKTsKKworICBpZiAoKHRtcENNUCAhPSAwVUwpIHx8ICh0bXBBUlIgIT0gMFVMKSkKKyAgeworICAgIC8qIEZvcmNlIExQVElNIHNvdXJjZSBrZXJuZWwgY2xvY2sgZnJvbSBBUEIgKi8KKyAgICBzd2l0Y2ggKCh1aW50MzJfdClMUFRJTXgpCisgICAgeworICAgICAgIGNhc2UgTFBUSU0xX0JBU0U6CisgICAgICAgICBMTF9SQ0NfU2V0TFBUSU1DbG9ja1NvdXJjZShMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9QQ0xLMSk7CisgICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKExQVElNMikKKyAgICAgICBjYXNlIExQVElNMl9CQVNFOgorICAgICAgICAgTExfUkNDX1NldExQVElNQ2xvY2tTb3VyY2UoTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfUENMSzEpOworICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFBUSU0yICovCisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0bXBDTVAgIT0gMFVMKQorICAgIHsKKyAgICAgIC8qIFJlc3RvcmUgQ01QIGFuZCBBUlIgcmVnaXN0ZXJzIChMUFRJTSBzaG91bGQgYmUgZW5hYmxlZCBmaXJzdCkgKi8KKyAgICAgIExQVElNeC0+Q1IgfD0gTFBUSU1fQ1JfRU5BQkxFOworICAgICAgTFBUSU14LT5DTVAgPSB0bXBDTVA7CisKKyAgICAgIC8qIFBvbGxpbmcgb24gQ01QIHdyaXRlIG9rIHN0YXR1cyBhZnRlciBhYm92ZSByZXN0b3JlIG9wZXJhdGlvbiAqLworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgcmNjX2Nsb2NrLlNZU0NMS19GcmVxdWVuY3ktLTsgLyogVXNlZCBmb3IgdGltZW91dCAqLworICAgICAgfSB3aGlsZSAoKChMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQ01QT0soTFBUSU14KSAhPSAxVUwpKSAmJiAoKHJjY19jbG9jay5TWVNDTEtfRnJlcXVlbmN5KSA+IDBVTCkpOworCisgICAgICBMTF9MUFRJTV9DbGVhckZsYWdfQ01QT0soTFBUSU14KTsKKyAgICB9CisKKyAgICBpZiAodG1wQVJSICE9IDBVTCkKKyAgICB7CisgICAgICBMUFRJTXgtPkNSIHw9IExQVElNX0NSX0VOQUJMRTsKKyAgICAgIExQVElNeC0+QVJSID0gdG1wQVJSOworCisgICAgICBMTF9SQ0NfR2V0U3lzdGVtQ2xvY2tzRnJlcSgmcmNjX2Nsb2NrKTsKKyAgICAgIC8qIFBvbGxpbmcgb24gQVJSIHdyaXRlIG9rIHN0YXR1cyBhZnRlciBhYm92ZSByZXN0b3JlIG9wZXJhdGlvbiAqLworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgcmNjX2Nsb2NrLlNZU0NMS19GcmVxdWVuY3ktLTsgLyogVXNlZCBmb3IgdGltZW91dCAqLworICAgICAgfSB3aGlsZSAoKChMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQVJST0soTFBUSU14KSAhPSAxVUwpKSAmJiAoKHJjY19jbG9jay5TWVNDTEtfRnJlcXVlbmN5KSA+IDBVTCkpOworCisgICAgICBMTF9MUFRJTV9DbGVhckZsYWdfQVJST0soTFBUSU14KTsKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIExQVElNIHNvdXJjZSBrZXJuZWwgY2xvY2sgKi8KKyAgICBMTF9SQ0NfU2V0TFBUSU1DbG9ja1NvdXJjZSh0bXBjbGtzb3VyY2UpOworICB9CisKKyAgLyogUmVzdG9yZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAoTFBUSU0gc2hvdWxkIGJlIGRpc2FibGVkIGZpcnN0KSAqLworICBMUFRJTXgtPkNSICY9IH4oTFBUSU1fQ1JfRU5BQkxFKTsKKyAgTFBUSU14LT5JRVIgPSB0bXBJRVI7CisgIExQVElNeC0+Q0ZHUiA9IHRtcENGR1I7CisKKyAgX19lbmFibGVfaXJxKCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBMUFRJTTEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2xsX2xwdWFydC5jIGIvU3JjL3N0bTMybDB4eF9sbF9scHVhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODhjNWMwCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9sbF9scHVhcnQuYwpAQCAtMCwwICsxLDI2MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9scHVhcnQuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgTFBVQVJUIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfbHB1YXJ0LmgiCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3JjYy5oIgorI2luY2x1ZGUgInN0bTMybDB4eF9sbF9idXMuaCIKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKExQVUFSVDEpCisKKy8qKiBAYWRkdG9ncm91cCBMUFVBUlRfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgTFBVQVJUX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIExQVUFSVF9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKy8qIENoZWNrIG9mIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyYXRpb24gb2YgTFBVQVJUIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICovCisKKy8qIF9fQkFVRFJBVEVfXyBEZXBlbmRpbmcgb24gY29uc3RyYWludHMgYXBwbGljYWJsZSBmb3IgTFBVQVJUIEJSUiByZWdpc3RlciAgICovCisvKiAgICAgICAgICAgICAgdmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgLSBmY2sgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzMgeCBiYXVkcmF0ZSwgNDA5NiB4IGJhdWRyYXRlXSAgKi8KKy8qICAgICAgICAgICAgICAgIC0gTFBVQVJUX0JSUiByZWdpc3RlciB2YWx1ZSBzaG91bGQgYmUgPj0gMHgzMDAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAtIExQVUFSVF9CUlIgcmVnaXN0ZXIgdmFsdWUgc2hvdWxkIGJlIDw9IDB4RkZGRkYgKDIwIGJpdHMpICAqLworLyogICAgICAgICAgICAgIEJhdWRyYXRlIHNwZWNpZmllZCBieSB0aGUgdXNlciBzaG91bGQgYmVsb25nIHRvIFs4LCAxMDYwMDAwMF0uKi8KKyNkZWZpbmUgSVNfTExfTFBVQVJUX0JBVURSQVRFKF9fQkFVRFJBVEVfXykgKCgoX19CQVVEUkFURV9fKSA8PSAxMDYwMDAwMFUpICYmICgoX19CQVVEUkFURV9fKSA+PSA4VSkpCisKKy8qIF9fVkFMVUVfXyBCUlIgY29udGVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAweDMwMC4gKi8KKyNkZWZpbmUgSVNfTExfTFBVQVJUX0JSUl9NSU4oX19WQUxVRV9fKSAgICgoX19WQUxVRV9fKSA+PSAweDMwMFUpCisKKy8qIF9fVkFMVUVfXyBCUlIgY29udGVudCBtdXN0IGJlIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gMHhGRkZGRi4gKi8KKyNkZWZpbmUgSVNfTExfTFBVQVJUX0JSUl9NQVgoX19WQUxVRV9fKSAgICgoX19WQUxVRV9fKSA8PSAweDAwMEZGRkZGVSkKKworI2RlZmluZSBJU19MTF9MUFVBUlRfRElSRUNUSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfRElSRUNUSU9OX05PTkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0RJUkVDVElPTl9SWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfRElSRUNUSU9OX1RYKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlgpKQorCisjZGVmaW5lIElTX0xMX0xQVUFSVF9QQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QQVJJVFlfTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUEFSSVRZX0VWRU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BBUklUWV9PREQpKQorCisjZGVmaW5lIElTX0xMX0xQVUFSVF9EQVRBV0lEVEgoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9EQVRBV0lEVEhfN0IpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0RBVEFXSURUSF84QikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfREFUQVdJRFRIXzlCKSkKKworI2RlZmluZSBJU19MTF9MUFVBUlRfU1RPUEJJVFMoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9TVE9QQklUU18xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1NUT1BCSVRTXzIpKQorCisjZGVmaW5lIElTX0xMX0xQVUFSVF9IV0NPTlRST0woX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9IV0NPTlRST0xfTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9IV0NPTlRST0xfUlRTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0hXQ09OVFJPTF9DVFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfSFdDT05UUk9MX1JUU19DVFMpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIExQVUFSVF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgTFBVQVJUX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgTFBVQVJUIHJlZ2lzdGVycyAoUmVnaXN0ZXJzIHJlc3RvcmVkIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzKS4KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IExQVUFSVCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0xQVUFSVF9EZUluaXQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBVQVJUX0lOU1RBTkNFKExQVUFSVHgpKTsKKworICBpZiAoTFBVQVJUeCA9PSBMUFVBUlQxKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgTFBVQVJUIHBlcmlwaGVyYWwgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBMUFVBUlQgcGVyaXBoZXJhbCAqLworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9MUFVBUlQxKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIExQVUFSVCByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gTFBVQVJUX0luaXRTdHJ1Y3QuCisgICogQG5vdGUgICBBcyBzb21lIGJpdHMgaW4gTFBVQVJUIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgTFBVQVJUIGlzIGRpc2FibGVkIChVU0FSVF9DUjFfVUUgYml0ID0wKSwKKyAgKiAgICAgICAgIExQVUFSVCBQZXJpcGhlcmFsIHNob3VsZCBiZSBpbiBkaXNhYmxlZCBzdGF0ZSBwcmlvciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIE90aGVyd2lzZSwgRVJST1IgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQuCisgICogQG5vdGUgICBCYXVkIHJhdGUgdmFsdWUgc3RvcmVkIGluIExQVUFSVF9Jbml0U3RydWN0IEJhdWRSYXRlIGZpZWxkLCBzaG91bGQgYmUgdmFsaWQgKGRpZmZlcmVudCBmcm9tIDApLgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIExQVUFSVF9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0xQVUFSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgTFBVQVJUIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IExQVUFSVCByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkIGFjY29yZGluZyB0byBMUFVBUlRfSW5pdFN0cnVjdCBjb250ZW50CisgICogICAgICAgICAgLSBFUlJPUjogUHJvYmxlbSBvY2N1cnJlZCBkdXJpbmcgTFBVQVJUIFJlZ2lzdGVycyBpbml0aWFsaXphdGlvbgorICAqLworRXJyb3JTdGF0dXMgTExfTFBVQVJUX0luaXQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgTExfTFBVQVJUX0luaXRUeXBlRGVmICpMUFVBUlRfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisgIHVpbnQzMl90IHBlcmlwaGNsayA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFVBUlRfSU5TVEFOQ0UoTFBVQVJUeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX0JBVURSQVRFKExQVUFSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX0RBVEFXSURUSChMUFVBUlRfSW5pdFN0cnVjdC0+RGF0YVdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFVBUlRfU1RPUEJJVFMoTFBVQVJUX0luaXRTdHJ1Y3QtPlN0b3BCaXRzKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFVBUlRfUEFSSVRZKExQVUFSVF9Jbml0U3RydWN0LT5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVUFSVF9ESVJFQ1RJT04oTFBVQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFVBUlRfSFdDT05UUk9MKExQVUFSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sKSk7CisKKyAgLyogTFBVQVJUIG5lZWRzIHRvIGJlIGluIGRpc2FibGVkIHN0YXRlLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBzb21lIGJpdHMgaW4KKyAgICAgQ1J4IHJlZ2lzdGVycy4gT3RoZXJ3aXNlIChMUFVBUlQgbm90IGluIERpc2FibGVkIHN0YXRlKSA9PiByZXR1cm4gRVJST1IgKi8KKyAgaWYgKExMX0xQVUFSVF9Jc0VuYWJsZWQoTFBVQVJUeCkgPT0gMFUpCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBVQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIExQVUFSVHggQ1IxIChMUFVBUlQgV29yZCBMZW5ndGgsIFBhcml0eSBhbmQgVHJhbnNmZXIgRGlyZWN0aW9uIGJpdHMpIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIERhdGFXaWR0aDogICAgICAgICAgVVNBUlRfQ1IxX00gYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCB2YWx1ZQorICAgICAqIC0gUGFyaXR5OiAgICAgICAgICAgICBVU0FSVF9DUjFfUENFLCBVU0FSVF9DUjFfUFMgYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPlBhcml0eSB2YWx1ZQorICAgICAqIC0gVHJhbnNmZXJEaXJlY3Rpb246ICBVU0FSVF9DUjFfVEUsIFVTQVJUX0NSMV9SRSBiaXRzIGFjY29yZGluZyB0byBMUFVBUlRfSW5pdFN0cnVjdC0+VHJhbnNmZXJEaXJlY3Rpb24gdmFsdWUKKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwKKyAgICAgICAgICAgICAgIChVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpLAorICAgICAgICAgICAgICAgKExQVUFSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggfCBMUFVBUlRfSW5pdFN0cnVjdC0+UGFyaXR5IHwgTFBVQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBVQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIExQVUFSVHggQ1IyIChTdG9wIGJpdHMpIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIFN0b3AgQml0czogICAgICAgICAgVVNBUlRfQ1IyX1NUT1AgYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPlN0b3BCaXRzIHZhbHVlLgorICAgICAqLworICAgIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aChMUFVBUlR4LCBMUFVBUlRfSW5pdFN0cnVjdC0+U3RvcEJpdHMpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVUFSVCBDUjMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBMUFVBUlR4IENSMyAoSGFyZHdhcmUgRmxvdyBDb250cm9sKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICogLSBIYXJkd2FyZUZsb3dDb250cm9sOiBVU0FSVF9DUjNfUlRTRSwgVVNBUlRfQ1IzX0NUU0UgYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wgdmFsdWUuCisgICAgICovCisgICAgTExfTFBVQVJUX1NldEhXRmxvd0N0cmwoTFBVQVJUeCwgTFBVQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVUFSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFJldHJpZXZlIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBMUFVBUlQgUGVyaXBoZXJhbAorICAgICAqLworICAgIHBlcmlwaGNsayA9IExMX1JDQ19HZXRMUFVBUlRDbG9ja0ZyZXEoTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgTFBVQVJUIEJhdWQgUmF0ZSA6CisgICAgICAgLSB2YWxpZCBiYXVkIHJhdGUgdmFsdWUgKGRpZmZlcmVudCBmcm9tIDApIGlzIHJlcXVpcmVkCisgICAgICAgLSBQZXJpcGhlcmFsIGNsb2NrIGFzIHJldHVybmVkIGJ5IFJDQyBzZXJ2aWNlLCBzaG91bGQgYmUgdmFsaWQgKGRpZmZlcmVudCBmcm9tIDApLgorICAgICovCisgICAgaWYgKChwZXJpcGhjbGsgIT0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8pCisgICAgICAgICYmIChMUFVBUlRfSW5pdFN0cnVjdC0+QmF1ZFJhdGUgIT0gMFUpKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgICAgICBMTF9MUFVBUlRfU2V0QmF1ZFJhdGUoTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpcGhjbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBVQVJUX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKTsKKworICAgICAgLyogQ2hlY2sgQlJSIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAweDMwMCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVUFSVF9CUlJfTUlOKExQVUFSVHgtPkJSUikpOworCisgICAgICAvKiBDaGVjayBCUlIgaXMgbG93ZXIgdGhhbiBvciBlcXVhbCB0byAweEZGRkZGICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX0JSUl9NQVgoTFBVQVJUeC0+QlJSKSk7CisgICAgfQorCisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBAcmVmIExMX0xQVUFSVF9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBMUFVBUlRfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9MUFVBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKwordm9pZCBMTF9MUFVBUlRfU3RydWN0SW5pdChMTF9MUFVBUlRfSW5pdFR5cGVEZWYgKkxQVUFSVF9Jbml0U3RydWN0KQoreworICAvKiBTZXQgTFBVQVJUX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIExQVUFSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSAgICAgICAgICAgID0gOTYwMFU7CisgIExQVUFSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggICAgICAgICAgID0gTExfTFBVQVJUX0RBVEFXSURUSF84QjsKKyAgTFBVQVJUX0luaXRTdHJ1Y3QtPlN0b3BCaXRzICAgICAgICAgICAgPSBMTF9MUFVBUlRfU1RPUEJJVFNfMTsKKyAgTFBVQVJUX0luaXRTdHJ1Y3QtPlBhcml0eSAgICAgICAgICAgICAgPSBMTF9MUFVBUlRfUEFSSVRZX05PTkUgOworICBMUFVBUlRfSW5pdFN0cnVjdC0+VHJhbnNmZXJEaXJlY3Rpb24gICA9IExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlg7CisgIExQVUFSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sID0gTExfTFBVQVJUX0hXQ09OVFJPTF9OT05FOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoTFBVQVJUMSkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2xsX3B3ci5jIGIvU3JjL3N0bTMybDB4eF9sbF9wd3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MThmMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9sbF9wd3IuYwpAQCAtMCwwICsxLDg1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3B3ci5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBQV1IgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3B3ci5oIgorI2luY2x1ZGUgInN0bTMybDB4eF9sbF9idXMuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChQV1IpCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMIFBXUgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBXUl9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIFBXUiByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFBXUiByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1BXUl9EZUluaXQodm9pZCkKK3sKKyAgLyogRm9yY2UgcmVzZXQgb2YgUFdSIGNsb2NrICovCisgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSKTsKKworICAvKiBSZWxlYXNlIHJlc2V0IG9mIFBXUiBjbG9jayAqLworICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKFBXUikgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfbGxfcmNjLmMgYi9TcmMvc3RtMzJsMHh4X2xsX3JjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzIzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2xsX3JjYy5jCkBAIC0wLDAgKzEsNjk4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3JjYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBSQ0MgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3JjYy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyAgI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyAgI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmIC8qIFVTRV9GVUxMX0FTU0VSVCAqLworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSQ0MpCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMIFJDQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1VTQVJUMVNFTCkgJiYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQyU0VMKQorI2RlZmluZSBJU19MTF9SQ0NfVVNBUlRfQ0xLU09VUkNFKF9fVkFMVUVfXykgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFKSkKKyNlbGlmIGRlZmluZWQoUkNDX0NDSVBSX1VTQVJUMVNFTCkgJiYgIWRlZmluZWQoUkNDX0NDSVBSX1VTQVJUMlNFTCkKKyNkZWZpbmUgSVNfTExfUkNDX1VTQVJUX0NMS1NPVVJDRShfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFKSkKKyNlbHNlCisjZGVmaW5lIElTX0xMX1JDQ19VU0FSVF9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRSkpCisjZW5kaWYgLyogUkNDX0NDSVBSX1VTQVJUMVNFTCAmJiBSQ0NfQ0NJUFJfVVNBUlQyU0VMICovCisKKyNkZWZpbmUgSVNfTExfUkNDX0xQVUFSVF9DTEtTT1VSQ0UoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRSkpCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9JMkMzU0VMKQorI2RlZmluZSBJU19MTF9SQ0NfSTJDX0NMS1NPVVJDRShfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX0kyQzFfQ0xLU09VUkNFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0UpKQorI2Vsc2UKKyNkZWZpbmUgSVNfTExfUkNDX0kyQ19DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAgKChfX1ZBTFVFX18pID09IExMX1JDQ19JMkMxX0NMS1NPVVJDRSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfSTJDM1NFTCAqLworCisjZGVmaW5lIElTX0xMX1JDQ19MUFRJTV9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgKChfX1ZBTFVFX18pID09IExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFKQorCisjaWYgZGVmaW5lZChVU0IpCisjZGVmaW5lIElTX0xMX1JDQ19VU0JfQ0xLU09VUkNFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVVNCX0NMS1NPVVJDRSkpCisjZW5kaWYgLyogVVNCICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19MTF9Qcml2YXRlX0Z1bmN0aW9ucyBSQ0MgUHJpdmF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLwordWludDMyX3QgUkNDX0dldFN5c3RlbUNsb2NrRnJlcSh2b2lkKTsKK3VpbnQzMl90IFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3kpOwordWludDMyX3QgUkNDX0dldFBDTEsxQ2xvY2tGcmVxKHVpbnQzMl90IEhDTEtfRnJlcXVlbmN5KTsKK3VpbnQzMl90IFJDQ19HZXRQQ0xLMkNsb2NrRnJlcSh1aW50MzJfdCBIQ0xLX0ZyZXF1ZW5jeSk7Cit1aW50MzJfdCBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKHZvaWQpOworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBSQ0MgY2xvY2sgY29uZmlndXJhdGlvbiB0byB0aGUgZGVmYXVsdCByZXNldCBzdGF0ZS4KKyAgKiBAbm90ZSAgIFRoZSBkZWZhdWx0IHJlc2V0IHN0YXRlIG9mIHRoZSBjbG9jayBjb25maWd1cmF0aW9uIGlzIGdpdmVuIGJlbG93OgorICAqICAgICAgICAgLSBNU0kgIE9OIGFuZCB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgIC0gSFNFLCBIU0kgYW5kIFBMTCBPRkYKKyAgKiAgICAgICAgIC0gQUhCLCBBUEIxIGFuZCBBUEIyIHByZXNjYWxlciBzZXQgdG8gMS4KKyAgKiAgICAgICAgIC0gQ1NTLCBNQ08gT0ZGCisgICogICAgICAgICAtIEFsbCBpbnRlcnJ1cHRzIGRpc2FibGVkCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZQorICAqICAgICAgICAgLSBQZXJpcGhlcmFsIGNsb2NrcworICAqICAgICAgICAgLSBMU0ksIExTRSBhbmQgUlRDIGNsb2NrcworICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSQ0MgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9SQ0NfRGVJbml0KHZvaWQpCit7CisgIHVpbnQzMl90IHZsX21hc2s7CisKKyAgLyogU2V0IE1TSU9OIGJpdCAqLworICBMTF9SQ0NfTVNJX0VuYWJsZSgpOworCisgIC8qIEluc3VyZSBNU0lSRFkgYml0IGlzIHNldCBiZWZvcmUgd3JpdGluZyBkZWZhdWx0IE1TSVJBTkdFIHZhbHVlICovCisgIHdoaWxlIChMTF9SQ0NfTVNJX0lzUmVhZHkoKSA9PSAwVSkKKyAgeworICAgIF9fTk9QKCk7CisgIH0KKworICAvKiBTZXQgTVNJUkFOR0UgZGVmYXVsdCB2YWx1ZSAqLworICBMTF9SQ0NfTVNJX1NldFJhbmdlKExMX1JDQ19NU0lSQU5HRV81KTsKKyAgLyogU2V0IE1TSVRSSU0gYml0cyB0byB0aGUgcmVzZXQgdmFsdWUqLworICBMTF9SQ0NfTVNJX1NldENhbGliVHJpbW1pbmcoMFUpOworCisgIC8qIFNldCBIU0lUUklNIGJpdHMgdG8gdGhlIHJlc2V0IHZhbHVlKi8KKyAgTExfUkNDX0hTSV9TZXRDYWxpYlRyaW1taW5nKDB4MTBVKTsKKworICAvKiBSZXNldCBTVywgSFBSRSwgUFBSRTEsIFBQUkUyLCBNQ09TRUwgYW5kIE1DT1BSRSBiaXRzICovCisgIHZsX21hc2sgPSAweEZGRkZGRkZGVTsKKyAgQ0xFQVJfQklUKHZsX21hc2ssIFJDQ19DRkdSX1NXIHwgUkNDX0NGR1JfSFBSRSB8IFJDQ19DRkdSX1BQUkUxIHwgUkNDX0NGR1JfUFBSRTIgfCBcCisgICAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09TRUwgfCBSQ0NfQ0ZHUl9NQ09QUkUpOworICBMTF9SQ0NfV3JpdGVSZWcoQ0ZHUiwgdmxfbWFzayk7CisKKyAgLyogUmVzZXQgSFNJLCBIU0UsIFBMTCAqLworICB2bF9tYXNrID0gTExfUkNDX1JlYWRSZWcoQ1IpOworI2lmIGRlZmluZWQoUkNDX0NSX0hTSU9VVEVOKQorICBDTEVBUl9CSVQodmxfbWFzaywgUkNDX0NSX0hTSU9OfCBSQ0NfQ1JfSFNJS0VST058IFJDQ19DUl9IU0lESVZFTiB8IFJDQ19DUl9IU0lPVVRFTiB8IFwKKyAgICAgICAgICAgICAgICAgICAgIFJDQ19DUl9IU0VPTiB8IFJDQ19DUl9QTExPTik7CisjZWxzZQorICBDTEVBUl9CSVQodmxfbWFzaywgUkNDX0NSX0hTSU9OfCBSQ0NfQ1JfSFNJS0VST058IFJDQ19DUl9IU0lESVZFTiB8IFwKKyAgICAgICAgICAgICAgICAgICAgIFJDQ19DUl9IU0VPTiB8IFJDQ19DUl9QTExPTik7CisjZW5kaWYKKyAgTExfUkNDX1dyaXRlUmVnKENSLCB2bF9tYXNrKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgdmxfbWFzayA9IExMX1JDQ19SZWFkUmVnKENSKTsKKworICAvKiBSZXNldCBIU0VCWVAgYml0ICovCisgIExMX1JDQ19IU0VfRGlzYWJsZUJ5cGFzcygpOworCisgIC8qIFNldCBSQ0NfQ1JfUlRDUFJFIHRvIDBiMDAqLworICBDTEVBUl9CSVQodmxfbWFzaywgUkNDX0NSX1JUQ1BSRSk7CisgIExMX1JDQ19Xcml0ZVJlZyhDUiwgdmxfbWFzayk7CisKKyAgLyogSW5zdXJlIFBMTCBpcyBkaXNhYmxlZCBiZWZvcmUgdG8gcmVzZXQgUExMU1JDL1BMTE1VTC9QTExESVYgaW4gQ0ZHUiByZWdpc3RlciAqLworICB3aGlsZShMTF9SQ0NfUExMX0lzUmVhZHkoKSAhPSAwVSkge307CisKKyAgLyogUmVzZXQgQ0ZHUiByZWdpc3RlciAqLworICBMTF9SQ0NfV3JpdGVSZWcoQ0ZHUiwgMHgwMDAwMDAwMFUpOworCisjaWYgZGVmaW5lZChSQ0NfSFNJNDhfU1VQUE9SVCkKKworICAvKiBSZXNldCBDUlJDUiByZWdpc3RlciB0byBkaXNhYmxlIEhTSTQ4ICovCisjaWYgZGVmaW5lZChSQ0NfQ1JSQ1JfSFNJNDhESVY2T1VURU4pCisgIENMRUFSX0JJVChSQ0MtPkNSUkNSLCAoUkNDX0NSUkNSX0hTSTQ4T04gfCBSQ0NfQ1JSQ1JfSFNJNDhESVY2T1VURU4pKTsKKyNlbHNlCisgIENMRUFSX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhPTik7CisjZW5kaWYKKworI2VuZGlmIC8qUkNDX0hTSTQ4X1NVUFBPUlQqLworCisgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKyAgTExfUkNDX1dyaXRlUmVnKENJRVIsIDB4MDAwMDAwMDBVKTsKKworICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgZmxhZ3MgKi8KKyAgTExfUkNDX1dyaXRlUmVnKENJQ1IsIDB4RkZGRkZGRkZVKTsKKworICAvKiBDbGVhciByZXNldCBmbGFncyAqLworICBMTF9SQ0NfQ2xlYXJSZXNldEZsYWdzKCk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfTExfRUZfR2V0X0ZyZXEKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgZnJlcXVlbmNpZXMgb2YgZGlmZmVyZW50IG9uIGNoaXAgY2xvY2tzOyAgU3lzdGVtLCBBSEIsIEFQQjEgYW5kIEFQQjIgYnVzZXMgY2xvY2tzCisgICogICAgICAgICBhbmQgZGlmZmVyZW50IHBlcmlwaGVyYWwgY2xvY2tzIGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlLgorICAqIEBub3RlICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBNU0ksIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIE1TSSBjbG9jaygqKQorICAqIEBub3RlICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0ksIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTSV9WQUxVRSgqKikKKyAgKiBAbm90ZSAgIElmIFNZU0NMSyBzb3VyY2UgaXMgSFNFLCBmdW5jdGlvbiByZXR1cm5zIHZhbHVlcyBiYXNlZCBvbiBIU0VfVkFMVUUoKioqKQorICAqIEBub3RlICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBQTEwsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uCisgICogICAgICAgICBIU0lfVkFMVUUoKiopIG9yIEhTRV9WQUxVRSgqKiopIG11bHRpcGxpZWQvZGl2aWRlZCBieSB0aGUgUExMIGZhY3RvcnMuCisgICogQG5vdGUgICAoKikgTVNJIGNsb2NrIGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkIE1TSSByYW5nZSBidXQgdGhlIHJlYWwgdmFsdWUKKyAgKiAgICAgICAgICAgICBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHZhcmlhdGlvbnMgaW4gdm9sdGFnZSBhbmQgdGVtcGVyYXR1cmUuCisgICogQG5vdGUgICAoKiopIEhTSV9WQUxVRSBpcyBhIGRlZmluZWQgY29uc3RhbnQgYnV0IHRoZSByZWFsIHZhbHVlIG1heSB2YXJ5CisgICogICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgdmFyaWF0aW9ucyBpbiB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZS4KKyAgKiBAbm90ZSAgICgqKiopIEhTRV9WQUxVRSBpcyBhIGRlZmluZWQgY29uc3RhbnQsIHVzZXIgaGFzIHRvIGVuc3VyZSB0aGF0CisgICogICAgICAgICAgICAgICBIU0VfVkFMVUUgaXMgc2FtZSBhcyB0aGUgcmVhbCBmcmVxdWVuY3kgb2YgdGhlIGNyeXN0YWwgdXNlZC4KKyAgKiAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiBtYXkgaGF2ZSB3cm9uZyByZXN1bHQuCisgICogQG5vdGUgICBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgaW5jb3JyZWN0IHdoZW4gdXNpbmcgZnJhY3Rpb25hbAorICAqICAgICAgICAgdmFsdWUgZm9yIEhTRSBjcnlzdGFsLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBjb21wdXRlIHRoZQorICAqICAgICAgICAgYmF1ZC1yYXRlIGZvciB0aGUgY29tbXVuaWNhdGlvbiBwZXJpcGhlcmFscyBvciBjb25maWd1cmUgb3RoZXIgcGFyYW1ldGVycy4KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgZnJlcXVlbmNpZXMgb2YgZGlmZmVyZW50IG9uIGNoaXAgY2xvY2tzOyAgU3lzdGVtLCBBSEIsIEFQQjEgYW5kIEFQQjIgYnVzZXMgY2xvY2tzCisgICogQG5vdGUgICBFYWNoIHRpbWUgU1lTQ0xLLCBIQ0xLLCBQQ0xLMSBhbmQvb3IgUENMSzIgY2xvY2sgY2hhbmdlcywgdGhpcyBmdW5jdGlvbgorICAqICAgICAgICAgbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHN0cnVjdHVyZSBmaWVsZHMuIE90aGVyd2lzZSwgYW55CisgICogICAgICAgICBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbmNvcnJlY3QuCisgICogQHBhcmFtICBSQ0NfQ2xvY2tzIHBvaW50ZXIgdG8gYSBAcmVmIExMX1JDQ19DbG9ja3NUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsIGhvbGQgdGhlIGNsb2NrcyBmcmVxdWVuY2llcworICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9SQ0NfR2V0U3lzdGVtQ2xvY2tzRnJlcShMTF9SQ0NfQ2xvY2tzVHlwZURlZiAqUkNDX0Nsb2NrcykKK3sKKyAgLyogR2V0IFNZU0NMSyBmcmVxdWVuY3kgKi8KKyAgUkNDX0Nsb2Nrcy0+U1lTQ0xLX0ZyZXF1ZW5jeSA9IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKTsKKworICAvKiBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBSQ0NfQ2xvY2tzLT5IQ0xLX0ZyZXF1ZW5jeSAgID0gUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0Nsb2Nrcy0+U1lTQ0xLX0ZyZXF1ZW5jeSk7CisKKyAgLyogUENMSzEgY2xvY2sgZnJlcXVlbmN5ICovCisgIFJDQ19DbG9ja3MtPlBDTEsxX0ZyZXF1ZW5jeSAgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0Nsb2Nrcy0+SENMS19GcmVxdWVuY3kpOworCisgIC8qIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAqLworICBSQ0NfQ2xvY2tzLT5QQ0xLMl9GcmVxdWVuY3kgID0gUkNDX0dldFBDTEsyQ2xvY2tGcmVxKFJDQ19DbG9ja3MtPkhDTEtfRnJlcXVlbmN5KTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gVVNBUlR4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgVVNBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRSAoKikKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzLgorICAqIEByZXR2YWwgVVNBUlQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9yIChIU0kgb3IgTFNFKSBpcyBub3QgcmVhZHkKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRVU0FSVENsb2NrRnJlcSh1aW50MzJfdCBVU0FSVHhTb3VyY2UpCit7CisgIHVpbnQzMl90IHVzYXJ0X2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX1VTQVJUX0NMS1NPVVJDRShVU0FSVHhTb3VyY2UpKTsKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9VU0FSVDFTRUwpCisgIGlmIChVU0FSVHhTb3VyY2UgPT0gTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0UpCisgIHsKKyAgICAvKiBVU0FSVDFDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgICAgc3dpdGNoIChMTF9SQ0NfR2V0VVNBUlRDbG9ja1NvdXJjZShVU0FSVHhTb3VyY2UpKQorICAgIHsKKyAgICAgIGNhc2UgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLOiAvKiBVU0FSVDEgQ2xvY2sgaXMgU3lzdGVtIENsb2NrICovCisgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfSFNJOiAgICAvKiBVU0FSVDEgQ2xvY2sgaXMgSFNJIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19IU0lfSXNSZWFkeSgpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNJRElWKCkgIT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgdXNhcnRfZnJlcXVlbmN5ID0gKEhTSV9WQUxVRSA+PiAyVSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0xTRTogICAgLyogVVNBUlQxIENsb2NrIGlzIExTRSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfTFNFX0lzUmVhZHkoKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9QQ0xLMjogIC8qIFVTQVJUMSBDbG9jayBpcyBQQ0xLMiAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdXNhcnRfZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsyQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQxU0VMICAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQyU0VMKQorICBpZiAoVVNBUlR4U291cmNlID09IExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFKQorICB7CisgICAgLyogVVNBUlQyQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldFVTQVJUQ2xvY2tTb3VyY2UoVVNBUlR4U291cmNlKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1NZU0NMSzogLyogVVNBUlQyIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0hTSTogICAgLyogVVNBUlQyIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSURJVigpICE9IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IChIU0lfVkFMVUUgPj4gMlUpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgdXNhcnRfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9MU0U6ICAgIC8qIFVTQVJUMiBDbG9jayBpcyBMU0UgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfUENMSzE6ICAvKiBVU0FSVDIgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcShSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisjZW5kaWYgLyogUkNDX0NDSVBSX1VTQVJUMlNFTCAqLworCisgIHJldHVybiB1c2FydF9mcmVxdWVuY3k7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIEkyQ3ggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBJMkN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFICgqKQorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIEkyQyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05PIGluZGljYXRlcyB0aGF0IEhTSSBvc2NpbGxhdG9yIGlzIG5vdCByZWFkeQorICAqLwordWludDMyX3QgTExfUkNDX0dldEkyQ0Nsb2NrRnJlcSh1aW50MzJfdCBJMkN4U291cmNlKQoreworICB1aW50MzJfdCBpMmNfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19MTF9SQ0NfSTJDX0NMS1NPVVJDRShJMkN4U291cmNlKSk7CisKKyAgLyogSTJDMSBDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIGlmIChJMkN4U291cmNlID09IExMX1JDQ19JMkMxX0NMS1NPVVJDRSkKKyAgeworICAgIHN3aXRjaCAoTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlKEkyQ3hTb3VyY2UpKQorICAgIHsKKyAgICAgIGNhc2UgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSzogLyogSTJDMSBDbG9jayBpcyBTeXN0ZW0gQ2xvY2sgKi8KKyAgICAgICAgaTJjX2ZyZXF1ZW5jeSA9IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0kyQzFfQ0xLU09VUkNFX0hTSTogICAgLyogSTJDMSBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoTExfUkNDX0lzQWN0aXZlRmxhZ19IU0lESVYoKSAhPSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpMmNfZnJlcXVlbmN5ID0gKEhTSV9WQUxVRSA+PiAyVSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpMmNfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfUENMSzE6ICAvKiBJMkMxIENsb2NrIGlzIFBDTEsxICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBpMmNfZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsxQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0kyQzNTRUwpCisgIC8qIEkyQzMgQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBpZiAoSTJDeFNvdXJjZSA9PSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0UpCisgIHsKKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRJMkNDbG9ja1NvdXJjZShJMkN4U291cmNlKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9TWVNDTEs6IC8qIEkyQzMgQ2xvY2sgaXMgU3lzdGVtIENsb2NrICovCisgICAgICAgIGkyY19mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9IU0k6ICAgIC8qIEkyQzMgQ2xvY2sgaXMgSFNJIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19IU0lfSXNSZWFkeSgpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNJRElWKCkgIT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgaTJjX2ZyZXF1ZW5jeSA9IChIU0lfVkFMVUUgPj4gMlUpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaTJjX2ZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0kyQzNfQ0xLU09VUkNFX1BDTEsxOiAgLyogSTJDMyBDbG9jayBpcyBQQ0xLMSAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaTJjX2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcShSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisjZW5kaWYgLypSQ0NfQ0NJUFJfSTJDM1NFTCovCisKKyAgcmV0dXJuIGkyY19mcmVxdWVuY3k7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIExQVUFSVHggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBMUFVBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFCisgICogQHJldHZhbCBMUFVBUlQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9yIChIU0kgb3IgTFNFKSBpcyBub3QgcmVhZHkKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRMUFVBUlRDbG9ja0ZyZXEodWludDMyX3QgTFBVQVJUeFNvdXJjZSkKK3sKKyAgdWludDMyX3QgbHB1YXJ0X2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX0xQVUFSVF9DTEtTT1VSQ0UoTFBVQVJUeFNvdXJjZSkpOworCisgIC8qIExQVUFSVDFDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIHN3aXRjaCAoTExfUkNDX0dldExQVUFSVENsb2NrU291cmNlKExQVUFSVHhTb3VyY2UpKQorICB7CisgICAgY2FzZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLOiAvKiBMUFVBUlQxIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgbHB1YXJ0X2ZyZXF1ZW5jeSA9IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJOiAgICAvKiBMUFVBUlQxIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICB7CisgICAgICAgIGlmIChMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSURJVigpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgbHB1YXJ0X2ZyZXF1ZW5jeSA9IChIU0lfVkFMVUUgPj4gMlUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGxwdWFydF9mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfTFNFOiAgICAvKiBMUFVBUlQxIENsb2NrIGlzIExTRSBPc2MuICovCisgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICB7CisgICAgICAgIGxwdWFydF9mcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1BDTEsxOiAgLyogTFBVQVJUMSBDbG9jayBpcyBQQ0xLMSAqLworICAgIGRlZmF1bHQ6CisgICAgICBscHVhcnRfZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsxQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gbHB1YXJ0X2ZyZXF1ZW5jeTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gTFBUSU14IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgTFBUSU14U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIExQVElNIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoSFNJIG9yIExTRSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0TFBUSU1DbG9ja0ZyZXEodWludDMyX3QgTFBUSU14U291cmNlKQoreworICB1aW50MzJfdCBscHRpbV9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19MUFRJTV9DTEtTT1VSQ0UoTFBUSU14U291cmNlKSk7CisKKyAgaWYgKExQVElNeFNvdXJjZSA9PSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRSkKKyAgeworICAgIC8qIExQVElNMUNMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRMUFRJTUNsb2NrU291cmNlKExQVElNeFNvdXJjZSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0k6ICAgIC8qIExQVElNMSBDbG9jayBpcyBMU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0xTSV9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBscHRpbV9mcmVxdWVuY3kgPSBMU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfSFNJOiAgICAvKiBMUFRJTTEgQ2xvY2sgaXMgSFNJIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19IU0lfSXNSZWFkeSgpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNJRElWKCkgIT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgbHB0aW1fZnJlcXVlbmN5ID0gKEhTSV9WQUxVRSA+PiAyVSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBscHRpbV9mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTRTogICAgLyogTFBUSU0xIENsb2NrIGlzIExTRSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfTFNFX0lzUmVhZHkoKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGxwdGltX2ZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9QQ0xLMTogIC8qIExQVElNMSBDbG9jayBpcyBQQ0xLMSAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbHB0aW1fZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsxQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gbHB0aW1fZnJlcXVlbmN5OworfQorCisjaWYgZGVmaW5lZChVU0IpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBVU0J4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgVVNCeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFCisgICogQHJldHZhbCBVU0IgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9yIChIU0k0OCkgb3IgUExMIGlzIG5vdCByZWFkeQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05BIGluZGljYXRlcyB0aGF0IG5vIGNsb2NrIHNvdXJjZSBzZWxlY3RlZAorICAqLwordWludDMyX3QgTExfUkNDX0dldFVTQkNsb2NrRnJlcSh1aW50MzJfdCBVU0J4U291cmNlKQoreworICB1aW50MzJfdCB1c2JfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19MTF9SQ0NfVVNCX0NMS1NPVVJDRShVU0J4U291cmNlKSk7CisKKyAgLyogVVNCQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBzd2l0Y2ggKExMX1JDQ19HZXRVU0JDbG9ja1NvdXJjZShVU0J4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX1VTQl9DTEtTT1VSQ0VfUExMOiAgICAgICAgLyogUExMIGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpICE9IDBVKQorICAgICAgeworICAgICAgICB1c2JfZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NZUygpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19VU0JfQ0xLU09VUkNFX0hTSTQ4OiAgICAgIC8qIEhTSTQ4IGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoTExfUkNDX0hTSTQ4X0lzUmVhZHkoKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgdXNiX2ZyZXF1ZW5jeSA9IEhTSTQ4X1ZBTFVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdXNiX2ZyZXF1ZW5jeTsKK30KKyNlbmRpZiAvKiBVU0IgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ19MTF9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFNZU1RFTSBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcmV0dmFsIFNZU1RFTSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX0dldFN5c3RlbUNsb2NrRnJlcSh2b2lkKQoreworICB1aW50MzJfdCBmcmVxdWVuY3k7CisKKyAgLyogR2V0IFNZU0NMSyBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHN3aXRjaCAoTExfUkNDX0dldFN5c0Nsa1NvdXJjZSgpKQorICB7CisgICAgY2FzZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfTVNJOiAgLyogTVNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSAqLworICAgICAgZnJlcXVlbmN5ID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0k6ICAvKiBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgICBpZiAoTExfUkNDX0lzQWN0aXZlRmxhZ19IU0lESVYoKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gKEhTSV9WQUxVRSA+PiAyVSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfSFNFOiAgLyogSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSAqLworICAgICAgZnJlcXVlbmN5ID0gSFNFX1ZBTFVFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19QTEw6ICAvKiBQTEwgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgIHNvdXJjZSAqLworICAgICAgZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NZUygpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZnJlcXVlbmN5ID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBIQ0xLIGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgU1lTQ0xLX0ZyZXF1ZW5jeSBTWVNDTEsgY2xvY2sgZnJlcXVlbmN5CisgICogQHJldHZhbCBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfR2V0SENMS0Nsb2NrRnJlcSh1aW50MzJfdCBTWVNDTEtfRnJlcXVlbmN5KQoreworICAvKiBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19IQ0xLX0ZSRVEoU1lTQ0xLX0ZyZXF1ZW5jeSwgTExfUkNDX0dldEFIQlByZXNjYWxlcigpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUENMSzEgY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBIQ0xLX0ZyZXF1ZW5jeSBIQ0xLIGNsb2NrIGZyZXF1ZW5jeQorICAqIEByZXR2YWwgUENMSzEgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcSh1aW50MzJfdCBIQ0xLX0ZyZXF1ZW5jeSkKK3sKKyAgLyogUENMSzEgY2xvY2sgZnJlcXVlbmN5ICovCisgIHJldHVybiBfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoSENMS19GcmVxdWVuY3ksIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQQ0xLMiBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIEhDTEtfRnJlcXVlbmN5IEhDTEsgY2xvY2sgZnJlcXVlbmN5CisgICogQHJldHZhbCBQQ0xLMiBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX0dldFBDTEsyQ2xvY2tGcmVxKHVpbnQzMl90IEhDTEtfRnJlcXVlbmN5KQoreworICAvKiBQQ0xLMiBjbG9jayBmcmVxdWVuY3kgKi8KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUENMSzJfRlJFUShIQ0xLX0ZyZXF1ZW5jeSwgTExfUkNDX0dldEFQQjJQcmVzY2FsZXIoKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBMTCBjbG9jayBmcmVxdWVuY3kgdXNlZCBmb3Igc3lzdGVtIGRvbWFpbgorICAqIEByZXR2YWwgUExMIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTF9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSAvIFBMTCBkaXZpZGVyKSAqIFBMTCBNdWx0aXBsaWNhdG9yICovCisKKyAgLyogR2V0IFBMTCBzb3VyY2UgKi8KKyAgcGxsc291cmNlID0gTExfUkNDX1BMTF9HZXRNYWluU291cmNlKCk7CisKKyAgc3dpdGNoIChwbGxzb3VyY2UpCisgIHsKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNJOiAgICAgICAvKiBIU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICBpZiAoTExfUkNDX0lzQWN0aXZlRmxhZ19IU0lESVYoKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgcGxsaW5wdXRmcmVxID0gKEhTSV9WQUxVRSA+PiAyVSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBsbGlucHV0ZnJlcSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogICAgICAgLyogSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gSFNFX1ZBTFVFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEocGxsaW5wdXRmcmVxLCBMTF9SQ0NfUExMX0dldE11bHRpcGxpY2F0b3IoKSwgTExfUkNDX1BMTF9HZXREaXZpZGVyKCkpOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUkNDKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2xsX3JuZy5jIGIvU3JjL3N0bTMybDB4eF9sbF9ybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2M5YTZiCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9sbF9ybmcuYwpAQCAtMCwwICsxLDk2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3JuZy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBSTkcgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3JuZy5oIgorI2luY2x1ZGUgInN0bTMybDB4eF9sbF9idXMuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoUk5HKQorCisvKiogQGFkZHRvZ3JvdXAgUk5HX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUk5HX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSTkdfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSBSTkcgcmVnaXN0ZXJzIChSZWdpc3RlcnMgcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUk5HIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfUk5HX0RlSW5pdChSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JOR19BTExfSU5TVEFOQ0UoUk5HeCkpOworICAvKiBFbmFibGUgUk5HIHJlc2V0IHN0YXRlICovCisgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfUk5HKTsKKworICAvKiBSZWxlYXNlIFJORyBmcm9tIHJlc2V0IHN0YXRlICovCisgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9STkcpOworICByZXR1cm4gKFNVQ0NFU1MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogUk5HICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9sbF9ydGMuYyBiL1NyYy9zdG0zMmwweHhfbGxfcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjNjk5YgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfcnRjLmMKQEAgLTAsMCArMSw4NzkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfcnRjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFJUQyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3J0Yy5oIgorI2luY2x1ZGUgInN0bTMybDB4eF9sbF9jb3J0ZXguaCIKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUlRDKQorCisvKiogQGFkZHRvZ3JvdXAgUlRDX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJUQ19MTF9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisvKiBEZWZhdWx0IHZhbHVlcyB1c2VkIGZvciBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgUlRDX0FTWU5DSF9QUkVTQ19ERUZBVUxUICAgICAweDAwMDAwMDdGVQorI2RlZmluZSBSVENfU1lOQ0hfUFJFU0NfREVGQVVMVCAgICAgIDB4MDAwMDAwRkZVCisKKy8qIFZhbHVlcyB1c2VkIGZvciB0aW1lb3V0ICovCisjZGVmaW5lIFJUQ19JTklUTU9ERV9USU1FT1VUICAgICAgICAgMTAwMFUgLyogMXMgd2hlbiB0aWNrIHNldCB0byAxbXMgKi8KKyNkZWZpbmUgUlRDX1NZTkNIUk9fVElNRU9VVCAgICAgICAgICAxMDAwVSAvKiAxcyB3aGVuIHRpY2sgc2V0IHRvIDFtcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSVENfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xMX1JUQ19IT1VSRk9STUFUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19IT1VSRk9STUFUX0FNUE0pKQorCisjZGVmaW5lIElTX0xMX1JUQ19BU1lOQ0hfUFJFRElWKF9fVkFMVUVfXykgICAoKF9fVkFMVUVfXykgPD0gMHg3RlUpCisKKyNkZWZpbmUgSVNfTExfUlRDX1NZTkNIX1BSRURJVihfX1ZBTFVFX18pICAgICgoX19WQUxVRV9fKSA8PSAweDdGRkZVKQorCisjZGVmaW5lIElTX0xMX1JUQ19GT1JNQVQoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JUQ19GT1JNQVRfQklOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19GT1JNQVRfQkNEKSkKKworI2RlZmluZSBJU19MTF9SVENfVElNRV9GT1JNQVQoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JUQ19USU1FX0ZPUk1BVF9BTV9PUl8yNCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19USU1FX0ZPUk1BVF9QTSkpCisKKyNkZWZpbmUgSVNfTExfUlRDX0hPVVIxMihfX0hPVVJfXykgICAgICAgICAgICAoKChfX0hPVVJfXykgPiAwVSkgJiYgKChfX0hPVVJfXykgPD0gMTJVKSkKKyNkZWZpbmUgSVNfTExfUlRDX0hPVVIyNChfX0hPVVJfXykgICAgICAgICAgICAoKF9fSE9VUl9fKSA8PSAyM1UpCisjZGVmaW5lIElTX0xMX1JUQ19NSU5VVEVTKF9fTUlOVVRFU19fKSAgICAgICAgKChfX01JTlVURVNfXykgPD0gNTlVKQorI2RlZmluZSBJU19MTF9SVENfU0VDT05EUyhfX1NFQ09ORFNfXykgICAgICAgICgoX19TRUNPTkRTX18pIDw9IDU5VSkKKworI2RlZmluZSBJU19MTF9SVENfV0VFS0RBWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX1dFRUtEQVlfTU9OREFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfV0VFS0RBWV9UVUVTREFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX1RIVVJTREFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfV0VFS0RBWV9GUklEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX1NBVFVSREFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfV0VFS0RBWV9TVU5EQVkpKQorCisjZGVmaW5lIElTX0xMX1JUQ19EQVkoX19EQVlfXykgICAgKCgoX19EQVlfXykgPj0gMVUpICYmICgoX19EQVlfXykgPD0gMzFVKSkKKworI2RlZmluZSBJU19MTF9SVENfTU9OVEgoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9KQU5VQVJZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX0ZFQlJVQVJZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX01BUkNIKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX0FQUklMKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX01BWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9KVU5FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX0pVTFkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfQVVHVVNUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX1NFUFRFTUJFUikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9PQ1RPQkVSKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX05PVkVNQkVSKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX0RFQ0VNQkVSKSkKKworI2RlZmluZSBJU19MTF9SVENfWUVBUihfX1lFQVJfXykgKChfX1lFQVJfXykgPD0gOTlVKQorCisjZGVmaW5lIElTX0xMX1JUQ19BTE1BX01BU0soX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1BX01BU0tfTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQV9NQVNLX0RBVEVXRUVLREFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1BX01BU0tfSE9VUlMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUFfTUFTS19NSU5VVEVTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1BX01BU0tfU0VDT05EUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQV9NQVNLX0FMTCkpCisKKyNkZWZpbmUgSVNfTExfUlRDX0FMTUJfTUFTSyhfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUJfTUFTS19OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1CX01BU0tfREFURVdFRUtEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUJfTUFTS19IT1VSUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQl9NQVNLX01JTlVURVMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUJfTUFTS19TRUNPTkRTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1CX01BU0tfQUxMKSkKKworCisjZGVmaW5lIElTX0xMX1JUQ19BTE1BX0RBVEVfV0VFS0RBWV9TRUwoX19TRUxfXykgKCgoX19TRUxfXykgPT0gTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfREFURSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMX18pID09IExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX1dFRUtEQVkpKQorCisjZGVmaW5lIElTX0xMX1JUQ19BTE1CX0RBVEVfV0VFS0RBWV9TRUwoX19TRUxfXykgKCgoX19TRUxfXykgPT0gTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfREFURSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMX18pID09IExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX1dFRUtEQVkpKQorCisKKy8qKgorICAqIEB9CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSVENfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ19MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1Jbml0aWFsaXplcyB0aGUgUlRDIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZXNldCB0aGUgUlRDIENsb2NrIHNvdXJjZSBhbmQgUlRDIEJhY2t1cCBEYXRhCisgICogICAgICAgICByZWdpc3RlcnMuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFJUQyByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX0RlSW5pdChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICAvKiBTZXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBpZiAoTExfUlRDX0VudGVySW5pdE1vZGUoUlRDeCkgIT0gRVJST1IpCisgIHsKKyAgICAvKiBSZXNldCBUUiwgRFIgYW5kIENSIHJlZ2lzdGVycyAqLworICAgIFdSSVRFX1JFRyhSVEN4LT5UUiwgICAgICAgMHgwMDAwMDAwMFUpOworI2lmIGRlZmluZWQoUlRDX1dBS0VVUF9TVVBQT1JUKQorICAgIFdSSVRFX1JFRyhSVEN4LT5XVVRSLCAgICAgUlRDX1dVVFJfV1VUKTsKKyNlbmRpZiAvKiBSVENfV0FLRVVQX1NVUFBPUlQgKi8KKyAgICBXUklURV9SRUcoUlRDeC0+RFIsIChSVENfRFJfV0RVXzAgfCBSVENfRFJfTVVfMCB8IFJUQ19EUl9EVV8wKSk7CisgICAgLyogUmVzZXQgQWxsIENSIGJpdHMgZXhjZXB0IENSWzI6MF0gKi8KKyNpZiBkZWZpbmVkKFJUQ19XQUtFVVBfU1VQUE9SVCkKKyAgICBXUklURV9SRUcoUlRDeC0+Q1IsIChSRUFEX1JFRyhSVEN4LT5DUikgJiBSVENfQ1JfV1VDS1NFTCkpOworI2Vsc2UKKyAgICBXUklURV9SRUcoUlRDeCwgQ1IsIDB4MDAwMDAwMDBVKTsKKyNlbmRpZiAvKiBSVENfV0FLRVVQX1NVUFBPUlQgKi8KKyAgICBXUklURV9SRUcoUlRDeC0+UFJFUiwgKFJUQ19QUkVSX1BSRURJVl9BIHwgUlRDX1NZTkNIX1BSRVNDX0RFRkFVTFQpKTsKKyAgICBXUklURV9SRUcoUlRDeC0+QUxSTUFSLCAgIDB4MDAwMDAwMDBVKTsKKyAgICBXUklURV9SRUcoUlRDeC0+QUxSTUJSLCAgIDB4MDAwMDAwMDBVKTsKKyAgICBXUklURV9SRUcoUlRDeC0+U0hJRlRSLCAgIDB4MDAwMDAwMDBVKTsKKyAgICBXUklURV9SRUcoUlRDeC0+Q0FMUiwgICAgIDB4MDAwMDAwMDBVKTsKKyAgICBXUklURV9SRUcoUlRDeC0+QUxSTUFTU1IsIDB4MDAwMDAwMDBVKTsKKyAgICBXUklURV9SRUcoUlRDeC0+QUxSTUJTU1IsIDB4MDAwMDAwMDBVKTsKKworICAgIC8qIFJlc2V0IElTUiByZWdpc3RlciBhbmQgZXhpdCBpbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgICAgICAweDAwMDAwMDAwVSk7CisKKyAgICAvKiBSZXNldCBUYW1wZXIgYW5kIGFsdGVybmF0ZSBmdW5jdGlvbnMgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworICAgIFdSSVRFX1JFRyhSVEN4LT5UQU1QQ1IsIDB4MDAwMDAwMDBVKTsKKworICAgIC8qIFJlc2V0IE9wdGlvbiByZWdpc3RlciAqLworICAgIFdSSVRFX1JFRyhSVEN4LT5PUiwgMHgwMDAwMDAwMFUpOworCisgICAgLyogV2FpdCB0aWxsIHRoZSBSVEMgUlNGIGZsYWcgaXMgc2V0ICovCisgICAgc3RhdHVzID0gTExfUlRDX1dhaXRGb3JTeW5jaHJvKFJUQ3gpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUlRDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiBSVENfSW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBSVENfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUlRDIHBlcmlwaGVyYWwuCisgICogQG5vdGUgICBUaGUgUlRDIFByZXNjYWxlciByZWdpc3RlciBpcyB3cml0ZSBwcm90ZWN0ZWQgYW5kIGNhbiBiZSB3cml0dGVuIGluCisgICogICAgICAgICBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgTExfUlRDX0luaXRUeXBlRGVmICpSVENfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVJGT1JNQVQoUlRDX0luaXRTdHJ1Y3QtPkhvdXJGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19BU1lOQ0hfUFJFRElWKFJUQ19Jbml0U3RydWN0LT5Bc3luY2hQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TWU5DSF9QUkVESVYoUlRDX0luaXRTdHJ1Y3QtPlN5bmNoUHJlc2NhbGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICAvKiBTZXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBpZiAoTExfUlRDX0VudGVySW5pdE1vZGUoUlRDeCkgIT0gRVJST1IpCisgIHsKKyAgICAvKiBTZXQgSG91ciBGb3JtYXQgKi8KKyAgICBMTF9SVENfU2V0SG91ckZvcm1hdChSVEN4LCBSVENfSW5pdFN0cnVjdC0+SG91ckZvcm1hdCk7CisKKyAgICAvKiBDb25maWd1cmUgU3luY2hyb25vdXMgYW5kIEFzeW5jaHJvbm91cyBwcmVzY2FsZXIgZmFjdG9yICovCisgICAgTExfUlRDX1NldFN5bmNoUHJlc2NhbGVyKFJUQ3gsIFJUQ19Jbml0U3RydWN0LT5TeW5jaFByZXNjYWxlcik7CisgICAgTExfUlRDX1NldEFzeW5jaFByZXNjYWxlcihSVEN4LCBSVENfSW5pdFN0cnVjdC0+QXN5bmNoUHJlc2NhbGVyKTsKKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIExMX1JUQ19EaXNhYmxlSW5pdE1vZGUoUlRDeCk7CisKKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIFJUQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUlRDX1N0cnVjdEluaXQoTExfUlRDX0luaXRUeXBlRGVmICpSVENfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IFJUQ19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBSVENfSW5pdFN0cnVjdC0+SG91ckZvcm1hdCAgICAgID0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSOworICBSVENfSW5pdFN0cnVjdC0+QXN5bmNoUHJlc2NhbGVyID0gUlRDX0FTWU5DSF9QUkVTQ19ERUZBVUxUOworICBSVENfSW5pdFN0cnVjdC0+U3luY2hQcmVzY2FsZXIgID0gUlRDX1NZTkNIX1BSRVNDX0RFRkFVTFQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBSVEMgY3VycmVudCB0aW1lLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJUQ19Gb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfRk9STUFUX0JJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQkNECisgICogQHBhcmFtICBSVENfVGltZVN0cnVjdCBwb2ludGVyIHRvIGEgUlRDX1RpbWVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGltZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUlRDLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgVGltZSByZWdpc3RlciBpcyBjb25maWd1cmVkCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIFRpbWUgcmVnaXN0ZXIgaXMgbm90IGNvbmZpZ3VyZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19USU1FX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFJUQ19Gb3JtYXQsIExMX1JUQ19UaW1lVHlwZURlZiAqUlRDX1RpbWVTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19GT1JNQVQoUlRDX0Zvcm1hdCkpOworCisgIGlmIChSVENfRm9ybWF0ID09IExMX1JUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihSVENfVGltZVN0cnVjdC0+SG91cnMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfVElNRV9GT1JNQVQoUlRDX1RpbWVTdHJ1Y3QtPlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJUQ19UaW1lU3RydWN0LT5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIyNChSVENfVGltZVN0cnVjdC0+SG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NSU5VVEVTKFJUQ19UaW1lU3RydWN0LT5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKFJUQ19UaW1lU3RydWN0LT5TZWNvbmRzKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX1RpbWVTdHJ1Y3QtPkhvdXJzKSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19USU1FX0ZPUk1BVChSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX1RpbWVTdHJ1Y3QtPlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfVGltZVN0cnVjdC0+SG91cnMpKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTUlOVVRFUyhfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfVGltZVN0cnVjdC0+U2Vjb25kcykpKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYgKExMX1JUQ19FbnRlckluaXRNb2RlKFJUQ3gpICE9IEVSUk9SKQorICB7CisgICAgLyogQ2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9ybWF0ICovCisgICAgaWYgKFJUQ19Gb3JtYXQgIT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgICAgeworICAgICAgTExfUlRDX1RJTUVfQ29uZmlnKFJUQ3gsIFJUQ19UaW1lU3RydWN0LT5UaW1lRm9ybWF0LCBSVENfVGltZVN0cnVjdC0+SG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMsIFJUQ19UaW1lU3RydWN0LT5TZWNvbmRzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIExMX1JUQ19USU1FX0NvbmZpZyhSVEN4LCBSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCwgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19UaW1lU3RydWN0LT5Ib3VycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19UaW1lU3RydWN0LT5NaW51dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX1RpbWVTdHJ1Y3QtPlNlY29uZHMpKTsKKyAgICB9CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBMTF9SVENfRGlzYWJsZUluaXRNb2RlKFJUQyk7CisKKyAgICAvKiBJZiAgUlRDX0NSX0JZUFNIQUQgYml0ID0gMCwgd2FpdCBmb3Igc3luY2hybyBlbHNlIHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZCAqLworICAgIGlmIChMTF9SVENfSXNTaGFkb3dSZWdCeXBhc3NFbmFibGVkKFJUQ3gpID09IDBVKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IExMX1JUQ19XYWl0Rm9yU3luY2hybyhSVEN4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgICAgfQorICB9CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfVGltZVR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZSAoVGltZSA9IDAwaDowMG1pbjowMHNlYykuCisgICogQHBhcmFtICBSVENfVGltZVN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfVGltZVR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1JUQ19USU1FX1N0cnVjdEluaXQoTExfUlRDX1RpbWVUeXBlRGVmICpSVENfVGltZVN0cnVjdCkKK3sKKyAgLyogVGltZSA9IDAwaDowMG1pbjowMHNlYyAqLworICBSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCA9IExMX1JUQ19USU1FX0ZPUk1BVF9BTV9PUl8yNDsKKyAgUlRDX1RpbWVTdHJ1Y3QtPkhvdXJzICAgICAgPSAwVTsKKyAgUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMgICAgPSAwVTsKKyAgUlRDX1RpbWVTdHJ1Y3QtPlNlY29uZHMgICAgPSAwVTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJUQyBjdXJyZW50IGRhdGUuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUlRDX0Zvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQklOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CQ0QKKyAgKiBAcGFyYW0gIFJUQ19EYXRlU3RydWN0IHBvaW50ZXIgdG8gYSBSVENfRGF0ZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBSVEMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyBEYXkgcmVnaXN0ZXIgaXMgY29uZmlndXJlZAorICAqICAgICAgICAgIC0gRVJST1I6IFJUQyBEYXkgcmVnaXN0ZXIgaXMgbm90IGNvbmZpZ3VyZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19EQVRFX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFJUQ19Gb3JtYXQsIExMX1JUQ19EYXRlVHlwZURlZiAqUlRDX0RhdGVTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19GT1JNQVQoUlRDX0Zvcm1hdCkpOworCisgIGlmICgoUlRDX0Zvcm1hdCA9PSBMTF9SVENfRk9STUFUX0JJTikgJiYgKChSVENfRGF0ZVN0cnVjdC0+TW9udGggJiAweDEwVSkgPT0gMHgxMFUpKQorICB7CisgICAgUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoID0gKFJUQ19EYXRlU3RydWN0LT5Nb250aCAmICh1aW50OF90KX4oMHgxMFUpKSArIDB4MEFVOworICB9CisgIGlmIChSVENfRm9ybWF0ID09IExMX1JUQ19GT1JNQVRfQklOKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19ZRUFSKFJUQ19EYXRlU3RydWN0LT5ZZWFyKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NT05USChSVENfRGF0ZVN0cnVjdC0+TW9udGgpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0RBWShSVENfRGF0ZVN0cnVjdC0+RGF5KSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19ZRUFSKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfRGF0ZVN0cnVjdC0+WWVhcikpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX01PTlRIKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfRGF0ZVN0cnVjdC0+TW9udGgpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19EQVkoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19EYXRlU3RydWN0LT5EYXkpKSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19XRUVLREFZKFJUQ19EYXRlU3RydWN0LT5XZWVrRGF5KSk7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICAvKiBTZXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBpZiAoTExfUlRDX0VudGVySW5pdE1vZGUoUlRDeCkgIT0gRVJST1IpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3JtYXQgKi8KKyAgICBpZiAoUlRDX0Zvcm1hdCAhPSBMTF9SVENfRk9STUFUX0JJTikKKyAgICB7CisgICAgICBMTF9SVENfREFURV9Db25maWcoUlRDeCwgUlRDX0RhdGVTdHJ1Y3QtPldlZWtEYXksIFJUQ19EYXRlU3RydWN0LT5EYXksIFJUQ19EYXRlU3RydWN0LT5Nb250aCwgUlRDX0RhdGVTdHJ1Y3QtPlllYXIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgTExfUlRDX0RBVEVfQ29uZmlnKFJUQ3gsIFJUQ19EYXRlU3RydWN0LT5XZWVrRGF5LCBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0RhdGVTdHJ1Y3QtPkRheSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19EYXRlU3RydWN0LT5Nb250aCksIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfRGF0ZVN0cnVjdC0+WWVhcikpOworICAgIH0KKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIExMX1JUQ19EaXNhYmxlSW5pdE1vZGUoUlRDKTsKKworICAgIC8qIElmICBSVENfQ1JfQllQU0hBRCBiaXQgPSAwLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYgKExMX1JUQ19Jc1NoYWRvd1JlZ0J5cGFzc0VuYWJsZWQoUlRDeCkgPT0gMFUpCisgICAgeworICAgICAgc3RhdHVzID0gTExfUlRDX1dhaXRGb3JTeW5jaHJvKFJUQ3gpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgICB9CisgIH0KKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX1JUQ19EYXRlVHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlIChkYXRlID0gTW9uZGF5LCBKYW51YXJ5IDAxIHh4MDApCisgICogQHBhcmFtICBSVENfRGF0ZVN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfRGF0ZVR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1JUQ19EQVRFX1N0cnVjdEluaXQoTExfUlRDX0RhdGVUeXBlRGVmICpSVENfRGF0ZVN0cnVjdCkKK3sKKyAgLyogTW9uZGF5LCBKYW51YXJ5IDAxIHh4MDAgKi8KKyAgUlRDX0RhdGVTdHJ1Y3QtPldlZWtEYXkgPSBMTF9SVENfV0VFS0RBWV9NT05EQVk7CisgIFJUQ19EYXRlU3RydWN0LT5EYXkgICAgID0gMVU7CisgIFJUQ19EYXRlU3RydWN0LT5Nb250aCAgID0gTExfUlRDX01PTlRIX0pBTlVBUlk7CisgIFJUQ19EYXRlU3RydWN0LT5ZZWFyICAgID0gMFU7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBSVEMgQWxhcm0gQS4KKyAgKiBAbm90ZSAgIFRoZSBBbGFybSByZWdpc3RlciBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgQWxhcm0KKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIChVc2UgQHJlZiBMTF9SVENfQUxNQV9EaXNhYmxlIGZ1bmN0aW9uKS4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBSVENfRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfRk9STUFUX0JDRAorICAqIEBwYXJhbSAgUlRDX0FsYXJtU3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19BbGFybVR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgYWxhcm0gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBBTEFSTUEgcmVnaXN0ZXJzIGFyZSBjb25maWd1cmVkCisgICogICAgICAgICAgLSBFUlJPUjogQUxBUk1BIHJlZ2lzdGVycyBhcmUgbm90IGNvbmZpZ3VyZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19BTE1BX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFJUQ19Gb3JtYXQsIExMX1JUQ19BbGFybVR5cGVEZWYgKlJUQ19BbGFybVN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0ZPUk1BVChSVENfRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfQUxNQV9NQVNLKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1NYXNrKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfQUxNQV9EQVRFX1dFRUtEQVlfU0VMKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCkpOworCisgIGlmIChSVENfRm9ybWF0ID09IExMX1JUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19USU1FX0ZPUk1BVChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIyNChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpOworICAgIH0KKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX01JTlVURVMoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcykpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfU0VDT05EUyhSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKSk7CisKKyAgICBpZiAoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID09IExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX0RBVEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19EQVkoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1dFRUtEQVkoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlmIChMTF9SVENfR2V0SG91ckZvcm1hdChSVEN4KSAhPSBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMTIoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19USU1FX0ZPUk1BVChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIyNChfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgfQorCisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NSU5VVEVTKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzKSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfU0VDT05EUyhfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcykpKTsKKworICAgIGlmIChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0RBWShfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19XRUVLREFZKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICAvKiBTZWxlY3Qgd2Vla2RheSBzZWxlY3Rpb24gKi8KKyAgaWYgKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9EQVRFKQorICB7CisgICAgLyogU2V0IHRoZSBkYXRlIGZvciBBTEFSTSAqLworICAgIExMX1JUQ19BTE1BX0Rpc2FibGVXZWVrZGF5KFJUQ3gpOworICAgIGlmIChSVENfRm9ybWF0ICE9IExMX1JUQ19GT1JNQVRfQklOKQorICAgIHsKKyAgICAgIExMX1JUQ19BTE1BX1NldERheShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgTExfUlRDX0FMTUFfU2V0RGF5KFJUQ3gsIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IHRoZSB3ZWVrIGRheSBmb3IgQUxBUk0gKi8KKyAgICBMTF9SVENfQUxNQV9FbmFibGVXZWVrZGF5KFJUQ3gpOworICAgIExMX1JUQ19BTE1BX1NldFdlZWtEYXkoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KTsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gcmVnaXN0ZXIgKi8KKyAgaWYgKFJUQ19Gb3JtYXQgIT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lKFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcywgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgTExfUlRDX0FMTUFfQ29uZmlnVGltZShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKSk7CisgIH0KKyAgLyogU2V0IEFMQVJNIG1hc2sgKi8KKyAgTExfUlRDX0FMTUFfU2V0TWFzayhSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtTWFzayk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBSVEMgQWxhcm0gQi4KKyAgKiBAbm90ZSAgIFRoZSBBbGFybSByZWdpc3RlciBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgQWxhcm0KKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIChAcmVmIExMX1JUQ19BTE1CX0Rpc2FibGUgZnVuY3Rpb24pLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJUQ19Gb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfRk9STUFUX0JJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQkNECisgICogQHBhcmFtICBSVENfQWxhcm1TdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfUlRDX0FsYXJtVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBhbGFybSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFMQVJNQiByZWdpc3RlcnMgYXJlIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBTEFSTUIgcmVnaXN0ZXJzIGFyZSBub3QgY29uZmlndXJlZAorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX0FMTUJfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfRk9STUFUKFJUQ19Gb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19BTE1CX01BU0soUlRDX0FsYXJtU3RydWN0LT5BbGFybU1hc2spKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19BTE1CX0RBVEVfV0VFS0RBWV9TRUwoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsKSk7CisKKyAgaWYgKFJUQ19Gb3JtYXQgPT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBpZiAoTExfUlRDX0dldEhvdXJGb3JtYXQoUlRDeCkgIT0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjEyKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1RJTUVfRk9STUFUKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTUlOVVRFUyhSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpKTsKKworICAgIGlmIChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0RBWShSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfV0VFS0RBWShSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1RJTUVfRk9STUFUKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICB9CisKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX01JTlVURVMoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKSkpOworCisgICAgaWYgKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfREFZKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1dFRUtEQVkoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpKTsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIC8qIFNlbGVjdCB3ZWVrZGF5IHNlbGVjdGlvbiAqLworICBpZiAoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID09IExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX0RBVEUpCisgIHsKKyAgICAvKiBTZXQgdGhlIGRhdGUgZm9yIEFMQVJNICovCisgICAgTExfUlRDX0FMTUJfRGlzYWJsZVdlZWtkYXkoUlRDeCk7CisgICAgaWYgKFJUQ19Gb3JtYXQgIT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgICAgeworICAgICAgTExfUlRDX0FMTUJfU2V0RGF5KFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBMTF9SVENfQUxNQl9TZXREYXkoUlRDeCwgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgdGhlIHdlZWsgZGF5IGZvciBBTEFSTSAqLworICAgIExMX1JUQ19BTE1CX0VuYWJsZVdlZWtkYXkoUlRDeCk7CisgICAgTExfUlRDX0FMTUJfU2V0V2Vla0RheShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpOworICB9CisKKyAgLyogQ29uZmlndXJlIHRoZSBBbGFybSByZWdpc3RlciAqLworICBpZiAoUlRDX0Zvcm1hdCAhPSBMTF9SVENfRk9STUFUX0JJTikKKyAgeworICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWUoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzLCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lKFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpKTsKKyAgfQorICAvKiBTZXQgQUxBUk0gbWFzayAqLworICBMTF9SVENfQUxNQl9TZXRNYXNrKFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1NYXNrKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0VuYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX1JUQ19BbGFybVR5cGVEZWYgb2YgQUxBUk1BIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUgKFRpbWUgPSAwMGg6MDBtbjowMHNlYyAvCisgICogICAgICAgICBEYXkgPSAxc3QgZGF5IG9mIHRoZSBtb250aC9NYXNrID0gYWxsIGZpZWxkcyBhcmUgbWFza2VkKS4KKyAgKiBAcGFyYW0gIFJUQ19BbGFybVN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfQWxhcm1UeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9SVENfQUxNQV9TdHJ1Y3RJbml0KExMX1JUQ19BbGFybVR5cGVEZWYgKlJUQ19BbGFybVN0cnVjdCkKK3sKKyAgLyogQWxhcm0gVGltZSBTZXR0aW5ncyA6IFRpbWUgPSAwMGg6MDBtbjowMHNlYyAqLworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gTExfUlRDX0FMTUFfVElNRV9GT1JNQVRfQU07CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzICAgICAgPSAwVTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcyAgICA9IDBVOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzICAgID0gMFU7CisKKyAgLyogQWxhcm0gRGF5IFNldHRpbmdzIDogRGF5ID0gMXN0IGRheSBvZiB0aGUgbW9udGggKi8KKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID0gTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfREFURTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5ICAgID0gMVU7CisKKyAgLyogQWxhcm0gTWFza3MgU2V0dGluZ3MgOiBNYXNrID0gIGFsbCBmaWVsZHMgYXJlIG5vdCBtYXNrZWQgKi8KKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybU1hc2sgICAgICAgICAgID0gTExfUlRDX0FMTUFfTUFTS19OT05FOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfUlRDX0FsYXJtVHlwZURlZiBvZiBBTEFSTUEgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZSAoVGltZSA9IDAwaDowMG1uOjAwc2VjIC8KKyAgKiAgICAgICAgIERheSA9IDFzdCBkYXkgb2YgdGhlIG1vbnRoL01hc2sgPSBhbGwgZmllbGRzIGFyZSBtYXNrZWQpLgorICAqIEBwYXJhbSAgUlRDX0FsYXJtU3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19BbGFybVR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1JUQ19BTE1CX1N0cnVjdEluaXQoTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KQoreworICAvKiBBbGFybSBUaW1lIFNldHRpbmdzIDogVGltZSA9IDAwaDowMG1uOjAwc2VjICovCisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9BTTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMgICAgICA9IDBVOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzICAgID0gMFU7CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMgICAgPSAwVTsKKworICAvKiBBbGFybSBEYXkgU2V0dGluZ3MgOiBEYXkgPSAxc3QgZGF5IG9mIHRoZSBtb250aCAqLworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9EQVRFOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkgICAgPSAxVTsKKworICAvKiBBbGFybSBNYXNrcyBTZXR0aW5ncyA6IE1hc2sgPSAgYWxsIGZpZWxkcyBhcmUgbm90IG1hc2tlZCAqLworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtTWFzayAgICAgICAgICAgPSBMTF9SVENfQUxNQl9NQVNLX05PTkU7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW50ZXJzIHRoZSBSVEMgSW5pdGlhbGl6YXRpb24gbW9kZS4KKyAgKiBAbm90ZSAgIFRoZSBSVEMgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyB3cml0ZSBwcm90ZWN0ZWQsIHVzZSB0aGUKKyAgKiAgICAgICAgIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyBpcyBpbiBJbml0IG1vZGUKKyAgKiAgICAgICAgICAtIEVSUk9SOiBSVEMgaXMgbm90IGluIEluaXQgbW9kZQorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX0VudGVySW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIF9fSU8gdWludDMyX3QgdGltZW91dCA9IFJUQ19JTklUTU9ERV9USU1FT1VUOworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgc2V0ICovCisgIGlmIChMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVQoUlRDeCkgPT0gMFUpCisgIHsKKyAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBMTF9SVENfRW5hYmxlSW5pdE1vZGUoUlRDeCk7CisKKyAgICAvKiBXYWl0IHRpbGwgUlRDIGlzIGluIElOSVQgc3RhdGUgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHRtcCA9IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSU5JVChSVEN4KTsKKyAgICB3aGlsZSAoKHRpbWVvdXQgIT0gMFUpICYmICh0bXAgIT0gMVUpKQorICAgIHsKKyAgICAgIGlmIChMTF9TWVNUSUNLX0lzQWN0aXZlQ291bnRlckZsYWcoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgdGltZW91dCAtLTsKKyAgICAgIH0KKyAgICAgIHRtcCA9IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSU5JVChSVEN4KTsKKyAgICAgIGlmICh0aW1lb3V0ID09IDBVKQorICAgICAgeworICAgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBFeGl0IHRoZSBSVEMgSW5pdGlhbGl6YXRpb24gbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGlzIGNvbXBsZXRlLCB0aGUgY2FsZW5kYXIgcmVzdGFydHMKKyAgKiAgICAgICAgIGNvdW50aW5nIGFmdGVyIDQgUlRDQ0xLIGN5Y2xlcy4KKyAgKiBAbm90ZSAgIFRoZSBSVEMgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyB3cml0ZSBwcm90ZWN0ZWQsIHVzZSB0aGUKKyAgKiAgICAgICAgIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyBleGl0ZWQgZnJvbSBpbiBJbml0IG1vZGUKKyAgKiAgICAgICAgICAtIEVSUk9SOiBOb3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX0V4aXRJbml0TW9kZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisKKyAgLyogRGlzYWJsZSBpbml0aWFsaXphdGlvbiBtb2RlICovCisgIExMX1JUQ19EaXNhYmxlSW5pdE1vZGUoUlRDeCk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FpdHMgdW50aWwgdGhlIFJUQyBUaW1lIGFuZCBEYXkgcmVnaXN0ZXJzIChSVENfVFIgYW5kIFJUQ19EUikgYXJlCisgICogICAgICAgICBzeW5jaHJvbml6ZWQgd2l0aCBSVEMgQVBCIGNsb2NrLgorICAqIEBub3RlICAgVGhlIFJUQyBSZXN5bmNocm9uaXphdGlvbiBtb2RlIGlzIHdyaXRlIHByb3RlY3RlZCwgdXNlIHRoZQorICAqICAgICAgICAgQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAqIEBub3RlICAgVG8gcmVhZCB0aGUgY2FsZW5kYXIgdGhyb3VnaCB0aGUgc2hhZG93IHJlZ2lzdGVycyBhZnRlciBDYWxlbmRhcgorICAqICAgICAgICAgaW5pdGlhbGl6YXRpb24sIGNhbGVuZGFyIHVwZGF0ZSBvciBhZnRlciB3YWtldXAgZnJvbSBsb3cgcG93ZXIgbW9kZXMKKyAgKiAgICAgICAgIHRoZSBzb2Z0d2FyZSBtdXN0IGZpcnN0IGNsZWFyIHRoZSBSU0YgZmxhZy4KKyAgKiAgICAgICAgIFRoZSBzb2Z0d2FyZSBtdXN0IHRoZW4gd2FpdCB1bnRpbCBpdCBpcyBzZXQgYWdhaW4gYmVmb3JlIHJlYWRpbmcKKyAgKiAgICAgICAgIHRoZSBjYWxlbmRhciwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY2FsZW5kYXIgcmVnaXN0ZXJzIGhhdmUgYmVlbgorICAqICAgICAgICAgY29ycmVjdGx5IGNvcGllZCBpbnRvIHRoZSBSVENfVFIgYW5kIFJUQ19EUiBzaGFkb3cgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUlRDIHJlZ2lzdGVycyBhcmUgc3luY2hyb25pc2VkCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIHJlZ2lzdGVycyBhcmUgbm90IHN5bmNocm9uaXNlZAorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX1dhaXRGb3JTeW5jaHJvKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBfX0lPIHVpbnQzMl90IHRpbWVvdXQgPSBSVENfU1lOQ0hST19USU1FT1VUOworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisKKyAgLyogQ2xlYXIgUlNGIGZsYWcgKi8KKyAgTExfUlRDX0NsZWFyRmxhZ19SUyhSVEN4KTsKKworICAvKiBXYWl0IHRoZSByZWdpc3RlcnMgdG8gYmUgc3luY2hyb25pc2VkICovCisgIHRtcCA9IExMX1JUQ19Jc0FjdGl2ZUZsYWdfUlMoUlRDeCk7CisgIHdoaWxlICgodGltZW91dCAhPSAwVSkgJiYgKHRtcCAhPSAwVSkpCisgIHsKKyAgICBpZiAoTExfU1lTVElDS19Jc0FjdGl2ZUNvdW50ZXJGbGFnKCkgPT0gMVUpCisgICAgeworICAgICAgdGltZW91dC0tOworICAgIH0KKyAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX1JTKFJUQ3gpOworICAgIGlmICh0aW1lb3V0ID09IDBVKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgIH0KKyAgfQorCisgIGlmIChzdGF0dXMgIT0gRVJST1IpCisgIHsKKyAgICB0aW1lb3V0ID0gUlRDX1NZTkNIUk9fVElNRU9VVDsKKyAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX1JTKFJUQ3gpOworICAgIHdoaWxlICgodGltZW91dCAhPSAwVSkgJiYgKHRtcCAhPSAxVSkpCisgICAgeworICAgICAgaWYgKExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZygpID09IDFVKQorICAgICAgeworICAgICAgICB0aW1lb3V0LS07CisgICAgICB9CisgICAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX1JTKFJUQ3gpOworICAgICAgaWYgKHRpbWVvdXQgPT0gMFUpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUlRDKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2xsX3NwaS5jIGIvU3JjL3N0bTMybDB4eF9sbF9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2RmNTAwCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMybDB4eF9sbF9zcGkuYwpAQCAtMCwwICsxLDUxNiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF9zcGkuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU1BJIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMybDB4eF9sbF9zcGkuaCIKKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfYnVzLmgiCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3JjYy5oIgorCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChTUEkxKSB8fCBkZWZpbmVkIChTUEkyKQorCisvKiogQGFkZHRvZ3JvdXAgU1BJX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9Qcml2YXRlX0NvbnN0YW50cyBTUEkgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogU1BJIHJlZ2lzdGVycyBNYXNrcyAqLworI2RlZmluZSBTUElfQ1IxX0NMRUFSX01BU0sgICAgICAgICAgICAgICAgIChTUElfQ1IxX0NQSEEgICAgfCBTUElfQ1IxX0NQT0wgICAgIHwgU1BJX0NSMV9NU1RSICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjFfQlIgICAgICB8IFNQSV9DUjFfTFNCRklSU1QgfCBTUElfQ1IxX1NTSSAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMV9TU00gICAgIHwgU1BJX0NSMV9SWE9OTFkgICB8IFNQSV9DUjFfREZGICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfQ1IxX0NSQ05FWFQgfCBTUElfQ1IxX0NSQ0VOICAgIHwgU1BJX0NSMV9CSURJT0UgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjFfQklESU1PREUpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfTExfUHJpdmF0ZV9NYWNyb3MgU1BJIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfU1BJX1RSQU5TRkVSX0RJUkVDVElPTihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX0ZVTExfRFVQTEVYKSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9TSU1QTEVYX1JYKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfSEFMRl9EVVBMRVhfUlgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0hBTEZfRFVQTEVYX1RYKSkKKworI2RlZmluZSBJU19MTF9TUElfTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX01PREVfTUFTVEVSKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfTU9ERV9TTEFWRSkpCisKKyNkZWZpbmUgSVNfTExfU1BJX0RBVEFXSURUSChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF84QklUKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzE2QklUKSkKKworI2RlZmluZSBJU19MTF9TUElfUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1NQSV9QT0xBUklUWV9MT1cpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX1BIQVNFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfUEhBU0VfMUVER0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfUEhBU0VfMkVER0UpKQorCisjZGVmaW5lIElTX0xMX1NQSV9OU1MoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1NQSV9OU1NfU09GVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfTlNTX0hBUkRfSU5QVVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX05TU19IQVJEX09VVFBVVCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX0JBVURSQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjQpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY2NCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTI4KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjI1NikpCisKKyNkZWZpbmUgSVNfTExfU1BJX0JJVE9SREVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfTFNCX0ZJUlNUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX01TQl9GSVJTVCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX0NSQ0NBTENVTEFUSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0xMX1NQSV9DUkNfUE9MWU5PTUlBTChfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA+PSAweDFVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNQSV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIFNQSSByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBTUEkgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFNQSSByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfU1BJX0RlSW5pdChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfSU5TVEFOQ0UoU1BJeCkpOworCisjaWYgZGVmaW5lZChTUEkxKQorICBpZiAoU1BJeCA9PSBTUEkxKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgU1BJIGNsb2NrICovCisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgU1BJIGNsb2NrICovCisgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEpOworCisgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgfQorI2VuZGlmIC8qIFNQSTEgKi8KKyNpZiBkZWZpbmVkKFNQSTIpCisgIGlmIChTUEl4ID09IFNQSTIpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBTUEkgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBTUEkgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMik7CisKKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisjZW5kaWYgLyogU1BJMiAqLworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU1BJIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIFNQSV9Jbml0U3RydWN0LgorICAqIEBub3RlICAgQXMgc29tZSBiaXRzIGluIFNQSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFNQSSBpcyBkaXNhYmxlZCAoU1BJX0NSMV9TUEUgYml0ID0wKSwKKyAgKiAgICAgICAgIFNQSSBJUCBzaG91bGQgYmUgaW4gZGlzYWJsZWQgc3RhdGUgcHJpb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UsIEVSUk9SIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNQSV9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1NQSV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlLiAoUmV0dXJuIGFsd2F5cyBTVUNDRVNTKQorICAqLworRXJyb3JTdGF0dXMgTExfU1BJX0luaXQoU1BJX1R5cGVEZWYgKlNQSXgsIExMX1NQSV9Jbml0VHlwZURlZiAqU1BJX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworCisgIC8qIENoZWNrIHRoZSBTUEkgSW5zdGFuY2UgU1BJeCovCisgIGFzc2VydF9wYXJhbShJU19TUElfQUxMX0lOU1RBTkNFKFNQSXgpKTsKKworICAvKiBDaGVjayB0aGUgU1BJIHBhcmFtZXRlcnMgZnJvbSBTUElfSW5pdFN0cnVjdCovCisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfVFJBTlNGRVJfRElSRUNUSU9OKFNQSV9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX01PREUoU1BJX0luaXRTdHJ1Y3QtPk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9EQVRBV0lEVEgoU1BJX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX1BPTEFSSVRZKFNQSV9Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfUEhBU0UoU1BJX0luaXRTdHJ1Y3QtPkNsb2NrUGhhc2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9OU1MoU1BJX0luaXRTdHJ1Y3QtPk5TUykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX0JBVURSQVRFKFNQSV9Jbml0U3RydWN0LT5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX0JJVE9SREVSKFNQSV9Jbml0U3RydWN0LT5CaXRPcmRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX0NSQ0NBTENVTEFUSU9OKFNQSV9Jbml0U3RydWN0LT5DUkNDYWxjdWxhdGlvbikpOworCisgIGlmIChMTF9TUElfSXNFbmFibGVkKFNQSXgpID09IDB4MDAwMDAwMDBVKQorICB7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggQ1IxIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIFRyYW5zZmVyRGlyZWN0aW9uOiAgU1BJX0NSMV9CSURJTU9ERSwgU1BJX0NSMV9CSURJT0UgYW5kIFNQSV9DUjFfUlhPTkxZIGJpdHMKKyAgICAgKiAtIE1hc3Rlci9TbGF2ZSBNb2RlOiAgU1BJX0NSMV9NU1RSIGJpdAorICAgICAqIC0gRGF0YVdpZHRoOiAgICAgICAgICBTUElfQ1IxX0RGRiBiaXQKKyAgICAgKiAtIENsb2NrUG9sYXJpdHk6ICAgICAgU1BJX0NSMV9DUE9MIGJpdAorICAgICAqIC0gQ2xvY2tQaGFzZTogICAgICAgICBTUElfQ1IxX0NQSEEgYml0CisgICAgICogLSBOU1MgbWFuYWdlbWVudDogICAgIFNQSV9DUjFfU1NNIGJpdAorICAgICAqIC0gQmF1ZFJhdGUgcHJlc2NhbGVyOiBTUElfQ1IxX0JSWzI6MF0gYml0cworICAgICAqIC0gQml0T3JkZXI6ICAgICAgICAgICBTUElfQ1IxX0xTQkZJUlNUIGJpdAorICAgICAqIC0gQ1JDQ2FsY3VsYXRpb246ICAgICBTUElfQ1IxX0NSQ0VOIGJpdAorICAgICAqLworICAgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLAorICAgICAgICAgICAgICAgU1BJX0NSMV9DTEVBUl9NQVNLLAorICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uIHwgU1BJX0luaXRTdHJ1Y3QtPk1vZGUgfCBTUElfSW5pdFN0cnVjdC0+RGF0YVdpZHRoIHwKKyAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHwgU1BJX0luaXRTdHJ1Y3QtPkNsb2NrUGhhc2UgfAorICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPk5TUyB8IFNQSV9Jbml0U3RydWN0LT5CYXVkUmF0ZSB8CisgICAgICAgICAgICAgICBTUElfSW5pdFN0cnVjdC0+Qml0T3JkZXIgfCBTUElfSW5pdFN0cnVjdC0+Q1JDQ2FsY3VsYXRpb24pOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggQ1IyIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIE5TUyBtYW5hZ2VtZW50OiAgICAgU1NPRSBiaXQKKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9TU09FLCAoU1BJX0luaXRTdHJ1Y3QtPk5TUyA+PiAxNlUpKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IENSQ1BSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBTUEl4IENSQ1BSIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIENSQ1BvbHk6ICAgICAgICAgICAgQ1JDUE9MWVsxNTowXSBiaXRzCisgICAgICovCisgICAgaWYgKFNQSV9Jbml0U3RydWN0LT5DUkNDYWxjdWxhdGlvbiA9PSBMTF9TUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQ1JDX1BPTFlOT01JQUwoU1BJX0luaXRTdHJ1Y3QtPkNSQ1BvbHkpKTsKKyAgICAgIExMX1NQSV9TZXRDUkNQb2x5bm9taWFsKFNQSXgsIFNQSV9Jbml0U3RydWN0LT5DUkNQb2x5KTsKKyAgICB9CisgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgfQorCisjaWYgZGVmaW5lZCAoU1BJX0kyU19TVVBQT1JUKQorICAvKiBBY3RpdmF0ZSB0aGUgU1BJIG1vZGUgKFJlc2V0IEkyU01PRCBiaXQgaW4gSTJTQ0ZHUiByZWdpc3RlcikgKi8KKyAgQ0xFQVJfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU01PRCk7CisjZW5kaWYgLyogU1BJX0kyU19TVVBQT1JUICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9TUElfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIFNQSV9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1NQSV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1NQSV9TdHJ1Y3RJbml0KExMX1NQSV9Jbml0VHlwZURlZiAqU1BJX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBTUElfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgU1BJX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uID0gTExfU1BJX0ZVTExfRFVQTEVYOworICBTUElfSW5pdFN0cnVjdC0+TW9kZSAgICAgICAgICAgICAgPSBMTF9TUElfTU9ERV9TTEFWRTsKKyAgU1BJX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCAgICAgICAgID0gTExfU1BJX0RBVEFXSURUSF84QklUOworICBTUElfSW5pdFN0cnVjdC0+Q2xvY2tQb2xhcml0eSAgICAgPSBMTF9TUElfUE9MQVJJVFlfTE9XOworICBTUElfSW5pdFN0cnVjdC0+Q2xvY2tQaGFzZSAgICAgICAgPSBMTF9TUElfUEhBU0VfMUVER0U7CisgIFNQSV9Jbml0U3RydWN0LT5OU1MgICAgICAgICAgICAgICA9IExMX1NQSV9OU1NfSEFSRF9JTlBVVDsKKyAgU1BJX0luaXRTdHJ1Y3QtPkJhdWRSYXRlICAgICAgICAgID0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjI7CisgIFNQSV9Jbml0U3RydWN0LT5CaXRPcmRlciAgICAgICAgICA9IExMX1NQSV9NU0JfRklSU1Q7CisgIFNQSV9Jbml0U3RydWN0LT5DUkNDYWxjdWxhdGlvbiAgICA9IExMX1NQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFOworICBTUElfSW5pdFN0cnVjdC0+Q1JDUG9seSAgICAgICAgICAgPSA3VTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoU1BJX0kyU19TVVBQT1JUKQorLyoqIEBhZGR0b2dyb3VwIEkyU19MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX1ByaXZhdGVfQ29uc3RhbnRzIEkyUyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiBJMlMgcmVnaXN0ZXJzIE1hc2tzICovCisjZGVmaW5lIEkyU19JMlNDRkdSX0NMRUFSX01BU0sgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0NITEVOICAgfCBTUElfSTJTQ0ZHUl9EQVRMRU4gfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9JMlNDRkdSX0NLUE9MICAgfCBTUElfSTJTQ0ZHUl9JMlNTVEQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9JMlNDRkdSX0kyU0NGRyAgfCBTUElfSTJTQ0ZHUl9JMlNNT0QgKQorCisjZGVmaW5lIEkyU19JMlNQUl9DTEVBUl9NQVNLICAgICAgICAgICAgICAgMHgwMDAyVQorLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyU19MTF9Qcml2YXRlX01hY3JvcyBJMlMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xMX0kyU19EQVRBRk9STUFUKF9fVkFMVUVfXykgICgoKF9fVkFMVUVfXykgPT0gTExfSTJTX0RBVEFGT1JNQVRfMTZCKSAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVEKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX0RBVEFGT1JNQVRfMjRCKSAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX0RBVEFGT1JNQVRfMzJCKSkKKworI2RlZmluZSBJU19MTF9JMlNfQ1BPTChfX1ZBTFVFX18pICAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0kyU19QT0xBUklUWV9MT1cpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX1BPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX0xMX0kyU19TVEFOREFSRChfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfSTJTX1NUQU5EQVJEX1BISUxJUFMpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19TVEFOREFSRF9NU0IpICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfU1RBTkRBUkRfTFNCKSAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX1NUQU5EQVJEX1BDTV9TSE9SVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19TVEFOREFSRF9QQ01fTE9ORykpCisKKyNkZWZpbmUgSVNfTExfSTJTX01PREUoX19WQUxVRV9fKSAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9JMlNfTU9ERV9TTEFWRV9UWCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfTU9ERV9TTEFWRV9SWCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfTU9ERV9NQVNURVJfVFgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfTU9ERV9NQVNURVJfUlgpKQorCisjZGVmaW5lIElTX0xMX0kyU19NQ0xLX09VVFBVVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfSTJTX01DTEtfT1VUUFVUX0VOQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19NQ0xLX09VVFBVVF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19MTF9JMlNfQVVESU9fRlJFUShfX1ZBTFVFX18pICgoKChfX1ZBTFVFX18pID49IExMX0kyU19BVURJT0ZSRVFfOEspICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoX19WQUxVRV9fKSA8PSBMTF9JMlNfQVVESU9GUkVRXzE5MkspKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX0FVRElPRlJFUV9ERUZBVUxUKSkKKworI2RlZmluZSBJU19MTF9JMlNfUFJFU0NBTEVSX0xJTkVBUihfX1ZBTFVFX18pICAoKF9fVkFMVUVfXykgPj0gMHgyVSkKKworI2RlZmluZSBJU19MTF9JMlNfUFJFU0NBTEVSX1BBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfRVZFTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9PREQpKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJMlNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyU19MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHRoZSBTUEkvSTJTIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFNQSSByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogU1BJIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9JMlNfRGVJbml0KFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0RlSW5pdChTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU1BJL0kyUyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBJMlNfSW5pdFN0cnVjdC4KKyAgKiBAbm90ZSAgIEFzIHNvbWUgYml0cyBpbiBTUEkgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBTUEkgaXMgZGlzYWJsZWQgKFNQSV9DUjFfU1BFIGJpdCA9MCksCisgICogICAgICAgICBTUEkgSVAgc2hvdWxkIGJlIGluIGRpc2FibGVkIHN0YXRlIHByaW9yIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBFUlJPUiByZXN1bHQgd2lsbCBiZSByZXR1cm5lZC4KKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBJMlNfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9JMlNfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFNQSSByZWdpc3RlcnMgYXJlIEluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogU1BJIHJlZ2lzdGVycyBhcmUgbm90IEluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9JMlNfSW5pdChTUElfVHlwZURlZiAqU1BJeCwgTExfSTJTX0luaXRUeXBlRGVmICpJMlNfSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgaTJzZGl2ID0gMlUsIGkyc29kZCA9IDBVLCBwYWNrZXRsZW5ndGggPSAxVTsKKyAgdWludDMyX3QgdG1wOworICBMTF9SQ0NfQ2xvY2tzVHlwZURlZiByY2NfY2xvY2tzOworICB1aW50MzJfdCBzb3VyY2VjbG9jazsKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIEkyUyBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMlNfQUxMX0lOU1RBTkNFKFNQSXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyU19NT0RFKEkyU19Jbml0U3RydWN0LT5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfU1RBTkRBUkQoSTJTX0luaXRTdHJ1Y3QtPlN0YW5kYXJkKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfREFUQUZPUk1BVChJMlNfSW5pdFN0cnVjdC0+RGF0YUZvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX01DTEtfT1VUUFVUKEkyU19Jbml0U3RydWN0LT5NQ0xLT3V0cHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfQVVESU9fRlJFUShJMlNfSW5pdFN0cnVjdC0+QXVkaW9GcmVxKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfQ1BPTChJMlNfSW5pdFN0cnVjdC0+Q2xvY2tQb2xhcml0eSkpOworCisgIGlmIChMTF9JMlNfSXNFbmFibGVkKFNQSXgpID09IDB4MDAwMDAwMDBVKQorICB7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggSTJTQ0ZHUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggSTJTQ0ZHUiB3aXRoIHBhcmFtZXRlcnM6CisgICAgICogLSBNb2RlOiAgICAgICAgICBTUElfSTJTQ0ZHUl9JMlNDRkdbMTowXSBiaXQKKyAgICAgKiAtIFN0YW5kYXJkOiAgICAgIFNQSV9JMlNDRkdSX0kyU1NURFsxOjBdIGFuZCBTUElfSTJTQ0ZHUl9QQ01TWU5DIGJpdHMKKyAgICAgKiAtIERhdGFGb3JtYXQ6ICAgIFNQSV9JMlNDRkdSX0NITEVOIGFuZCBTUElfSTJTQ0ZHUl9EQVRMRU4gYml0cworICAgICAqIC0gQ2xvY2tQb2xhcml0eTogU1BJX0kyU0NGR1JfQ0tQT0wgYml0CisgICAgICovCisKKyAgICAvKiBXcml0ZSB0byBTUEl4IEkyU0NGR1IgKi8KKyAgICBNT0RJRllfUkVHKFNQSXgtPkkyU0NGR1IsCisgICAgICAgICAgICAgICBJMlNfSTJTQ0ZHUl9DTEVBUl9NQVNLLAorICAgICAgICAgICAgICAgSTJTX0luaXRTdHJ1Y3QtPk1vZGUgfCBJMlNfSW5pdFN0cnVjdC0+U3RhbmRhcmQgfAorICAgICAgICAgICAgICAgSTJTX0luaXRTdHJ1Y3QtPkRhdGFGb3JtYXQgfCBJMlNfSW5pdFN0cnVjdC0+Q2xvY2tQb2xhcml0eSB8CisgICAgICAgICAgICAgICBTUElfSTJTQ0ZHUl9JMlNNT0QpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggSTJTUFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggSTJTUFIgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gTUNMS091dHB1dDogICAgU1BJX0kyU1BSX01DS09FIGJpdAorICAgICAqIC0gQXVkaW9GcmVxOiAgICAgU1BJX0kyU1BSX0kyU0RJVls3OjBdIGFuZCBTUElfSTJTUFJfT0REIGJpdHMKKyAgICAgKi8KKworICAgIC8qIElmIHRoZSByZXF1ZXN0ZWQgYXVkaW8gZnJlcXVlbmN5IGlzIG5vdCB0aGUgZGVmYXVsdCwgY29tcHV0ZSB0aGUgcHJlc2NhbGVyIChpMnNvZGQsIGkyc2RpdikKKyAgICAgKiBlbHNlLCBkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZDogIGkyc29kZCA9IDBVLCBpMnNkaXYgPSAyVS4KKyAgICAgKi8KKyAgICBpZiAoSTJTX0luaXRTdHJ1Y3QtPkF1ZGlvRnJlcSAhPSBMTF9JMlNfQVVESU9GUkVRX0RFRkFVTFQpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIGZyYW1lIGxlbmd0aCAoRm9yIHRoZSBQcmVzY2FsZXIgY29tcHV0aW5nKQorICAgICAgICogRGVmYXVsdCB2YWx1ZTogTExfSTJTX0RBVEFGT1JNQVRfMTZCIChwYWNrZXRsZW5ndGggPSAxVSkuCisgICAgICAgKi8KKyAgICAgIGlmIChJMlNfSW5pdFN0cnVjdC0+RGF0YUZvcm1hdCAhPSBMTF9JMlNfREFUQUZPUk1BVF8xNkIpCisgICAgICB7CisgICAgICAgIC8qIFBhY2tldCBsZW5ndGggaXMgMzIgYml0cyAqLworICAgICAgICBwYWNrZXRsZW5ndGggPSAyVTsKKyAgICAgIH0KKworICAgICAgLyogSTJTIENsb2NrIHNvdXJjZSBpcyBTeXN0ZW0gY2xvY2s6IEdldCBTeXN0ZW0gQ2xvY2sgZnJlcXVlbmN5ICovCisgICAgICBMTF9SQ0NfR2V0U3lzdGVtQ2xvY2tzRnJlcSgmcmNjX2Nsb2Nrcyk7CisKKyAgICAgIC8qIEdldCB0aGUgc291cmNlIGNsb2NrIHZhbHVlOiBiYXNlZCBvbiBTeXN0ZW0gQ2xvY2sgdmFsdWUgKi8KKyAgICAgIHNvdXJjZWNsb2NrID0gcmNjX2Nsb2Nrcy5TWVNDTEtfRnJlcXVlbmN5OworCisgICAgICAvKiBDb21wdXRlIHRoZSBSZWFsIGRpdmlkZXIgZGVwZW5kaW5nIG9uIHRoZSBNQ0xLIG91dHB1dCBzdGF0ZSB3aXRoIGEgZmxvYXRpbmcgcG9pbnQgKi8KKyAgICAgIGlmIChJMlNfSW5pdFN0cnVjdC0+TUNMS091dHB1dCA9PSBMTF9JMlNfTUNMS19PVVRQVVRfRU5BQkxFKQorICAgICAgeworICAgICAgICAvKiBNQ0xLIG91dHB1dCBpcyBlbmFibGVkICovCisgICAgICAgIHRtcCA9ICgoKCgoc291cmNlY2xvY2sgLyAyNTZVKSAqIDEwVSkgLyBJMlNfSW5pdFN0cnVjdC0+QXVkaW9GcmVxKSkgKyA1VSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE1DTEsgb3V0cHV0IGlzIGRpc2FibGVkICovCisgICAgICAgIHRtcCA9ICgoKCgoc291cmNlY2xvY2sgLyAoMzJVICogcGFja2V0bGVuZ3RoKSkgKiAxMFUpIC8gSTJTX0luaXRTdHJ1Y3QtPkF1ZGlvRnJlcSkpICsgNVUpOworICAgICAgfQorCisgICAgICAvKiBSZW1vdmUgdGhlIGZsb2F0aW5nIHBvaW50ICovCisgICAgICB0bXAgPSB0bXAgLyAxMFU7CisKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJpdHkgb2YgdGhlIGRpdmlkZXIgKi8KKyAgICAgIGkyc29kZCA9ICh0bXAgJiAodWludDE2X3QpMHgwMDAxVSk7CisKKyAgICAgIC8qIENvbXB1dGUgdGhlIGkyc2RpdiBwcmVzY2FsZXIgKi8KKyAgICAgIGkyc2RpdiA9ICgodG1wIC0gaTJzb2RkKSAvIDJVKTsKKworICAgICAgLyogR2V0IHRoZSBNYXNrIGZvciB0aGUgT2RkIGJpdCAoU1BJX0kyU1BSWzhdKSByZWdpc3RlciAqLworICAgICAgaTJzb2RkID0gKGkyc29kZCA8PCA4VSk7CisgICAgfQorCisgICAgLyogVGVzdCBpZiB0aGUgZGl2aWRlciBpcyAxIG9yIDAgb3IgZ3JlYXRlciB0aGFuIDB4RkYgKi8KKyAgICBpZiAoKGkyc2RpdiA8IDJVKSB8fCAoaTJzZGl2ID4gMHhGRlUpKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICAgIGkyc2RpdiA9IDJVOworICAgICAgaTJzb2RkID0gMFU7CisgICAgfQorCisgICAgLyogV3JpdGUgdG8gU1BJeCBJMlNQUiByZWdpc3RlciB0aGUgY29tcHV0ZWQgdmFsdWUgKi8KKyAgICBXUklURV9SRUcoU1BJeC0+STJTUFIsIGkyc2RpdiB8IGkyc29kZCB8IEkyU19Jbml0U3RydWN0LT5NQ0xLT3V0cHV0KTsKKworICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0kyU19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgSTJTX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfSTJTX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9JMlNfU3RydWN0SW5pdChMTF9JMlNfSW5pdFR5cGVEZWYgKkkyU19Jbml0U3RydWN0KQoreworICAvKi0tLS0tLS0tLS0tLS0tLSBSZXNldCBJMlMgaW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLS0qLworICBJMlNfSW5pdFN0cnVjdC0+TW9kZSAgICAgICAgICAgICAgPSBMTF9JMlNfTU9ERV9TTEFWRV9UWDsKKyAgSTJTX0luaXRTdHJ1Y3QtPlN0YW5kYXJkICAgICAgICAgID0gTExfSTJTX1NUQU5EQVJEX1BISUxJUFM7CisgIEkyU19Jbml0U3RydWN0LT5EYXRhRm9ybWF0ICAgICAgICA9IExMX0kyU19EQVRBRk9STUFUXzE2QjsKKyAgSTJTX0luaXRTdHJ1Y3QtPk1DTEtPdXRwdXQgICAgICAgID0gTExfSTJTX01DTEtfT1VUUFVUX0RJU0FCTEU7CisgIEkyU19Jbml0U3RydWN0LT5BdWRpb0ZyZXEgICAgICAgICA9IExMX0kyU19BVURJT0ZSRVFfREVGQVVMVDsKKyAgSTJTX0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkgICAgID0gTExfSTJTX1BPTEFSSVRZX0xPVzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgbGluZWFyIGFuZCBwYXJpdHkgcHJlc2NhbGVyLgorICAqIEBub3RlICAgVG8gY2FsY3VsYXRlIHZhbHVlIG9mIFByZXNjYWxlckxpbmVhcihJMlNESVZbNzowXSBiaXRzKSBhbmQgUHJlc2NhbGVyUGFyaXR5KE9ERCBiaXQpXG4KKyAgKiAgICAgICAgIENoZWNrIEF1ZGlvIGZyZXF1ZW5jeSB0YWJsZSBhbmQgZm9ybXVsYXMgaW5zaWRlIFJlZmVyZW5jZSBNYW51YWwgKFNQSS9JMlMpLgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlckxpbmVhciB2YWx1ZSBNaW5fRGF0YT0weDAyIGFuZCBNYXhfRGF0YT0weEZGLgorICAqIEBwYXJhbSAgUHJlc2NhbGVyUGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfRVZFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QUkVTQ0FMRVJfUEFSSVRZX09ERAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9JMlNfQ29uZmlnUHJlc2NhbGVyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBQcmVzY2FsZXJMaW5lYXIsIHVpbnQzMl90IFByZXNjYWxlclBhcml0eSkKK3sKKyAgLyogQ2hlY2sgdGhlIEkyUyBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMlNfQUxMX0lOU1RBTkNFKFNQSXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyU19QUkVTQ0FMRVJfTElORUFSKFByZXNjYWxlckxpbmVhcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX1BSRVNDQUxFUl9QQVJJVFkoUHJlc2NhbGVyUGFyaXR5KSk7CisKKyAgLyogV3JpdGUgdG8gU1BJeCBJMlNQUiAqLworICBNT0RJRllfUkVHKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfSTJTRElWIHwgU1BJX0kyU1BSX09ERCwgUHJlc2NhbGVyTGluZWFyIHwgKFByZXNjYWxlclBhcml0eSA8PCA4VSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFNQSV9JMlNfU1VQUE9SVCAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoU1BJMSkgfHwgZGVmaW5lZCAoU1BJMikgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMybDB4eF9sbF90aW0uYyBiL1NyYy9zdG0zMmwweHhfbGxfdGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyYTA0YQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfdGltLmMKQEAgLTAsMCArMSw4NDcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmwweHhfbGxfdGltLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRJTSBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfdGltLmgiCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX2J1cy5oIgorCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChUSU0yKSB8fCBkZWZpbmVkIChUSU0zKSB8fCBkZWZpbmVkIChUSU0yMSkgfHwgZGVmaW5lZCAoVElNMjIpIHx8IGRlZmluZWQgKFRJTTYpIHx8IGRlZmluZWQgKFRJTTcpCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX0xMX1RJTV9DT1VOVEVSTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX1VQKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0RPV04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9ET1dOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUF9ET1dOKSkKKworI2RlZmluZSBJU19MTF9USU1fQ0xPQ0tESVZJU0lPTihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWNCkpCisKKyNkZWZpbmUgSVNfTExfVElNX09DTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9GUk9aRU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9BQ1RJVkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9JTkFDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1RPR0dMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9QV00xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfUFdNMikpCisKKyNkZWZpbmUgSVNfTExfVElNX09DU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1NUQVRFX0RJU0FCTEUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1NUQVRFX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfVElNX09DUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1BPTEFSSVRZX0hJR0gpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1BPTEFSSVRZX0xPVykpCisKKyNkZWZpbmUgSVNfTExfVElNX0FDVElWRUlOUFVUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQUNUSVZFSU5QVVRfSU5ESVJFQ1RUSSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMpKQorCisjZGVmaW5lIElTX0xMX1RJTV9JQ1BTQyhfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDUFNDX0RJVjEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNQU0NfRElWMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ1BTQ19ESVY0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDUFNDX0RJVjgpKQorCisjZGVmaW5lIElTX0xMX1RJTV9JQ19GSUxURVIoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX040KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYyX044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVY4X042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjgpKQorCisjZGVmaW5lIElTX0xMX1RJTV9JQ19QT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFKSkKKworI2RlZmluZSBJU19MTF9USU1fRU5DT0RFUk1PREUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fRU5DT0RFUk1PREVfWDJfVEkyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0VOQ09ERVJNT0RFX1g0X1RJMTIpKQorCisjZGVmaW5lIElTX0xMX1RJTV9JQ19QT0xBUklUWV9FTkNPREVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORykpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9Qcml2YXRlX0Z1bmN0aW9ucyBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIEVycm9yU3RhdHVzIE9DMUNvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBPQzJDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgT0MzQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIE9DNENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBJQzFDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgSUMyQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIElDM0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBJQzRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBUSU14IHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IGludmFsaWQgVElNeCBpbnN0YW5jZQorICAqLworRXJyb3JTdGF0dXMgTExfVElNX0RlSW5pdChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgRXJyb3JTdGF0dXMgcmVzdWx0ID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKFRJTXgpKTsKKworICBpZiAoVElNeCA9PSBUSU0yKQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU0yKTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMik7CisgIH0KKyNpZiBkZWZpbmVkKFRJTTMpCisgIGVsc2UgaWYgKFRJTXggPT0gVElNMykKKyAgeworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMyk7CisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMpOworICB9CisjZW5kaWYgLyogVElNMyAqLworI2lmIGRlZmluZWQoVElNNikKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU02KQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU02KTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNik7CisgIH0KKyNlbmRpZiAvKiBUSU02ICovCisjaWYgZGVmaW5lZChUSU03KQorICBlbHNlIGlmIChUSU14ID09IFRJTTcpCisgIHsKKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcpOworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU03KTsKKyAgfQorI2VuZGlmIC8qIFRJTTcgKi8KKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0yMSkKKyAgeworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMjEpOworICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMSk7CisgIH0KKyNpZiBkZWZpbmVkKFRJTTIyKQorICBlbHNlIGlmIChUSU14ID09IFRJTTIyKQorICB7CisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0yMik7CisgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTIyKTsKKyAgfQorI2VuZGlmIC8qIFRJTTIyICovCisgIGVsc2UKKyAgeworICAgIHJlc3VsdCA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGZpZWxkcyBvZiB0aGUgdGltZSBiYXNlIHVuaXQgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU1fSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fSW5pdFR5cGVEZWYgc3RydWN0dXJlICh0aW1lIGJhc2UgdW5pdCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fU3RydWN0SW5pdChMTF9USU1fSW5pdFR5cGVEZWYgKlRJTV9Jbml0U3RydWN0KQoreworICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBUSU1fSW5pdFN0cnVjdC0+UHJlc2NhbGVyICAgICAgICAgPSAodWludDE2X3QpMHgwMDAwOworICBUSU1fSW5pdFN0cnVjdC0+Q291bnRlck1vZGUgICAgICAgPSBMTF9USU1fQ09VTlRFUk1PREVfVVA7CisgIFRJTV9Jbml0U3RydWN0LT5BdXRvcmVsb2FkICAgICAgICA9IDB4RkZGRkZGRkZVOworICBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tEaXZpc2lvbiAgICAgPSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCB0aW1lIGJhc2UgdW5pdC4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKFRJTXggdGltZSBiYXNlIHVuaXQgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1RJTV9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSW5pdFR5cGVEZWYgKlRJTV9Jbml0U3RydWN0KQoreworICB1aW50MzJfdCB0bXBjcjE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQ09VTlRFUk1PREUoVElNX0luaXRTdHJ1Y3QtPkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQ0xPQ0tESVZJU0lPTihUSU1fSW5pdFN0cnVjdC0+Q2xvY2tEaXZpc2lvbikpOworCisgIHRtcGNyMSA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENSMSk7CisKKyAgaWYgKElTX1RJTV9DT1VOVEVSX01PREVfU0VMRUNUX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgLyogU2VsZWN0IHRoZSBDb3VudGVyIE1vZGUgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNyMSwgKFRJTV9DUjFfRElSIHwgVElNX0NSMV9DTVMpLCBUSU1fSW5pdFN0cnVjdC0+Q291bnRlck1vZGUpOworICB9CisKKyAgaWYgKElTX1RJTV9DTE9DS19ESVZJU0lPTl9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFNldCB0aGUgY2xvY2sgZGl2aXNpb24gKi8KKyAgICBNT0RJRllfUkVHKHRtcGNyMSwgVElNX0NSMV9DS0QsIFRJTV9Jbml0U3RydWN0LT5DbG9ja0RpdmlzaW9uKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IxICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDUjEsIHRtcGNyMSk7CisKKyAgLyogU2V0IHRoZSBBdXRvcmVsb2FkIHZhbHVlICovCisgIExMX1RJTV9TZXRBdXRvUmVsb2FkKFRJTXgsIFRJTV9Jbml0U3RydWN0LT5BdXRvcmVsb2FkKTsKKworICAvKiBTZXQgdGhlIFByZXNjYWxlciB2YWx1ZSAqLworICBMTF9USU1fU2V0UHJlc2NhbGVyKFRJTXgsIFRJTV9Jbml0U3RydWN0LT5QcmVzY2FsZXIpOworICAvKiBHZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQgdG8gcmVsb2FkIHRoZSBQcmVzY2FsZXIKKyAgICAgYW5kIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUgKGlmIGFwcGxpY2FibGUpIGltbWVkaWF0ZWx5ICovCisgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X1VQREFURShUSU14KTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGZpZWxkcyBvZiB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEKKyAgKiAgICAgICAgIHN0cnVjdHVyZSB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIFRJTV9PQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9PQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKHRoZSBvdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fT0NfU3RydWN0SW5pdChMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ19Jbml0U3RydWN0KQoreworICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NNb2RlICAgICAgID0gTExfVElNX09DTU9ERV9GUk9aRU47CisgIFRJTV9PQ19Jbml0U3RydWN0LT5PQ1N0YXRlICAgICAgPSBMTF9USU1fT0NTVEFURV9ESVNBQkxFOworICBUSU1fT0NfSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlID0gMHgwMDAwMDAwMFU7CisgIFRJTV9PQ19Jbml0U3RydWN0LT5PQ1BvbGFyaXR5ICAgPSBMTF9USU1fT0NQT0xBUklUWV9ISUdIOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcGFyYW0gIFRJTV9PQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9PQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKFRJTXggb3V0cHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCBvdXRwdXQgY2hhbm5lbCBpcyBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFRJTXggb3V0cHV0IGNoYW5uZWwgaXMgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9USU1fT0NfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgcmVzdWx0ID0gRVJST1I7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDE6CisgICAgICByZXN1bHQgPSBPQzFDb25maWcoVElNeCwgVElNX09DX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDI6CisgICAgICByZXN1bHQgPSBPQzJDb25maWcoVElNeCwgVElNX09DX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDM6CisgICAgICByZXN1bHQgPSBPQzNDb25maWcoVElNeCwgVElNX09DX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDQ6CisgICAgICByZXN1bHQgPSBPQzRDb25maWcoVElNeCwgVElNX09DX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGZpZWxkcyBvZiB0aGUgVElNeCBpbnB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZGF0YQorICAqICAgICAgICAgc3RydWN0dXJlIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBwYXJhbSAgVElNX0lDSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fSUNfSW5pdFR5cGVEZWYgc3RydWN0dXJlICh0aGUgaW5wdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fSUNfU3RydWN0SW5pdChMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisgIFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkgICAgPSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HOworICBUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0ID0gTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJOworICBUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlciAgID0gTExfVElNX0lDUFNDX0RJVjE7CisgIFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyICAgICAgPSBMTF9USU1fSUNfRklMVEVSX0ZESVYxOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEBwYXJhbSAgVElNX0lDX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0lDX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoVElNeCBpbnB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggb3V0cHV0IGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBUSU14IG91dHB1dCBjaGFubmVsIGlzIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfVElNX0lDX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHJlc3VsdCA9IEVSUk9SOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0gxOgorICAgICAgcmVzdWx0ID0gSUMxQ29uZmlnKFRJTXgsIFRJTV9JQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0gyOgorICAgICAgcmVzdWx0ID0gSUMyQ29uZmlnKFRJTXgsIFRJTV9JQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0gzOgorICAgICAgcmVzdWx0ID0gSUMzQ29uZmlnKFRJTXgsIFRJTV9JQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0g0OgorICAgICAgcmVzdWx0ID0gSUM0Q29uZmlnKFRJTXgsIFRJTV9JQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgRmlsbHMgZWFjaCBUSU1fRW5jb2RlckluaXRTdHJ1Y3QgZmllbGQgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZQorICAqIEBwYXJhbSAgVElNX0VuY29kZXJJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoZW5jb2RlciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfVElNX0VOQ09ERVJfU3RydWN0SW5pdChMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiAqVElNX0VuY29kZXJJbml0U3RydWN0KQoreworICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPkVuY29kZXJNb2RlICAgID0gTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMTsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFQb2xhcml0eSAgICA9IExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkc7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxQWN0aXZlSW5wdXQgPSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEk7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxUHJlc2NhbGVyICAgPSBMTF9USU1fSUNQU0NfRElWMTsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFGaWx0ZXIgICAgICA9IExMX1RJTV9JQ19GSUxURVJfRkRJVjE7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyUG9sYXJpdHkgICAgPSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMkFjdGl2ZUlucHV0ID0gTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMlByZXNjYWxlciAgID0gTExfVElNX0lDUFNDX0RJVjE7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyRmlsdGVyICAgICAgPSBMTF9USU1fSUNfRklMVEVSX0ZESVYxOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgZW5jb2RlciBpbnRlcmZhY2Ugb2YgdGhlIHRpbWVyIGluc3RhbmNlLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0VuY29kZXJJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoVElNeCBlbmNvZGVyIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfVElNX0VOQ09ERVJfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgKlRJTV9FbmNvZGVySW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fRU5DT0RFUk1PREUoVElNX0VuY29kZXJJbml0U3RydWN0LT5FbmNvZGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZX0VOQ09ERVIoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMVByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMUZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZX0VOQ09ERVIoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMkZpbHRlcikpOworCisgIC8qIERpc2FibGUgdGhlIENDMSBhbmQgQ0MyOiBSZXNldCB0aGUgQ0MxRSBhbmQgQ0MyRSBCaXRzICovCisgIFRJTXgtPkNDRVIgJj0gKHVpbnQzMl90KX4oVElNX0NDRVJfQ0MxRSB8IFRJTV9DQ0VSX0NDMkUpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMSA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIxKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogQ29uZmlndXJlIFRJMSAqLworICB0bXBjY21yMSAmPSAodWludDMyX3QpfihUSU1fQ0NNUjFfQ0MxUyB8IFRJTV9DQ01SMV9JQzFGICB8IFRJTV9DQ01SMV9JQzFQU0MpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxQWN0aXZlSW5wdXQgPj4gMTZVKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMUZpbHRlciA+PiAxNlUpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxUHJlc2NhbGVyID4+IDE2VSk7CisKKyAgLyogQ29uZmlndXJlIFRJMiAqLworICB0bXBjY21yMSAmPSAodWludDMyX3QpfihUSU1fQ0NNUjFfQ0MyUyB8IFRJTV9DQ01SMV9JQzJGICB8IFRJTV9DQ01SMV9JQzJQU0MpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyQWN0aXZlSW5wdXQgPj4gOFUpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyRmlsdGVyID4+IDhVKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMlByZXNjYWxlciA+PiA4VSk7CisKKyAgLyogU2V0IFRJMSBhbmQgVEkyIHBvbGFyaXR5IGFuZCBlbmFibGUgVEkxIGFuZCBUSTIgKi8KKyAgdG1wY2NlciAmPSAodWludDMyX3QpfihUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlAgfCBUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApOworICB0bXBjY2VyIHw9ICh1aW50MzJfdCkoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFQb2xhcml0eSk7CisgIHRtcGNjZXIgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMlBvbGFyaXR5IDw8IDRVKTsKKyAgdG1wY2NlciB8PSAodWludDMyX3QpKFRJTV9DQ0VSX0NDMUUgfCBUSU1fQ0NFUl9DQzJFKTsKKworICAvKiBTZXQgZW5jb2RlciBtb2RlICovCisgIExMX1RJTV9TZXRFbmNvZGVyTW9kZShUSU14LCBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPkVuY29kZXJNb2RlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMSwgdG1wY2NtcjEpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NFUiwgdG1wY2Nlcik7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fTExfUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCisgKiAgQGJyaWVmICAgUHJpdmF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgMS4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgMSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgT0MxQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DTU9ERShUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgVElNX0NDRVJfQ0MxRSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ1IyKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjEgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ01SMSk7CisKKyAgLyogUmVzZXQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIENMRUFSX0JJVCh0bXBjY21yMSwgVElNX0NDTVIxX0NDMVMpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICBNT0RJRllfUkVHKHRtcGNjbXIxLCBUSU1fQ0NNUjFfT0MxTSwgVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MxUCwgVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgU3RhdGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzFFLCBUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IyLCB0bXBjcjIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIxLCB0bXBjY21yMSk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDEoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAyLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAyIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzJDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NNT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSkpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBUSU1fQ0NFUl9DQzJFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gIExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ1IyKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjEgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ01SMSk7CisKKyAgLyogUmVzZXQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIENMRUFSX0JJVCh0bXBjY21yMSwgVElNX0NDTVIxX0NDMlMpOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICBNT0RJRllfUkVHKHRtcGNjbXIxLCBUSU1fQ0NNUjFfT0MyTSwgVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MyUCwgVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSA8PCA0VSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgU3RhdGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzJFLCBUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlIDw8IDRVKTsKKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IyLCB0bXBjcjIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIxLCB0bXBjY21yMSk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDIoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAzLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAzIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzNDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjI7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NNT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSkpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDM0UgQml0ICovCisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBUSU1fQ0NFUl9DQzNFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gIExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ1IyKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ01SMik7CisKKyAgLyogUmVzZXQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIENMRUFSX0JJVCh0bXBjY21yMiwgVElNX0NDTVIyX0NDM1MpOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICBNT0RJRllfUkVHKHRtcGNjbXIyLCBUSU1fQ0NNUjJfT0MzTSwgVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MzUCwgVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSA8PCA4VSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgU3RhdGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzNFLCBUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlIDw8IDhVKTsKKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IyLCB0bXBjcjIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIyLCB0bXBjY21yMik7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDMoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCA0LgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCA0IGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjI7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NNT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSkpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNDogUmVzZXQgdGhlIENDNEUgQml0ICovCisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBUSU1fQ0NFUl9DQzRFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSAgTExfVElNX1JlYWRSZWcoVElNeCwgQ1IyKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ01SMik7CisKKyAgLyogUmVzZXQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIENMRUFSX0JJVCh0bXBjY21yMiwgVElNX0NDTVIyX0NDNFMpOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICBNT0RJRllfUkVHKHRtcGNjbXIyLCBUSU1fQ0NNUjJfT0M0TSwgVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0M0UCwgVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSA8PCAxMlUpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0M0RSwgVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSA8PCAxMlUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDUjIsIHRtcGNyMik7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NNUjIsIHRtcGNjbXIyKTsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINChUSU14LCBUSU1fT0NJbml0U3RydWN0LT5Db21wYXJlVmFsdWUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NFUiwgdG1wY2Nlcik7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCAxLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0lDSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDEgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIElDMUNvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlcikpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzFFOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyIGFuZCB0aGUgcHJlc2NhbGVyIHZhbHVlICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NNUjEsCisgICAgICAgICAgICAgKFRJTV9DQ01SMV9DQzFTIHwgVElNX0NDTVIxX0lDMUYgfCBUSU1fQ0NNUjFfSUMxUFNDKSwKKyAgICAgICAgICAgICAoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyIHwgVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpID4+IDE2VSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzFFIEJpdCAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsCisgICAgICAgICAgICAgKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCksCisgICAgICAgICAgICAgKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkgfCBUSU1fQ0NFUl9DQzFFKSk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgMi4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCAyIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBJQzJDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9BQ1RJVkVJTlBVVChUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNQU0MoVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19GSUxURVIoVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLworICBUSU14LT5DQ0VSICY9ICh1aW50MzJfdCl+VElNX0NDRVJfQ0MyRTsKKworICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciBhbmQgdGhlIHByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDTVIxLAorICAgICAgICAgICAgIChUSU1fQ0NNUjFfQ0MyUyB8IFRJTV9DQ01SMV9JQzJGIHwgVElNX0NDTVIxX0lDMlBTQyksCisgICAgICAgICAgICAgKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQgfCBUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlciB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyKSA+PiA4VSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsCisgICAgICAgICAgICAgKFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCksCisgICAgICAgICAgICAgKChUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5IDw8IDRVKSB8IFRJTV9DQ0VSX0NDMkUpKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCAzLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0lDSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDMgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIElDM0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlcikpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDM0UgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzNFOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyIGFuZCB0aGUgcHJlc2NhbGVyIHZhbHVlICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NNUjIsCisgICAgICAgICAgICAgKFRJTV9DQ01SMl9DQzNTIHwgVElNX0NDTVIyX0lDM0YgfCBUSU1fQ0NNUjJfSUMzUFNDKSwKKyAgICAgICAgICAgICAoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyIHwgVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpID4+IDE2VSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzNFIEJpdCAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsCisgICAgICAgICAgICAgKFRJTV9DQ0VSX0NDM1AgfCBUSU1fQ0NFUl9DQzNOUCksCisgICAgICAgICAgICAgKChUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5IDw8IDhVKSB8IFRJTV9DQ0VSX0NDM0UpKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCA0LgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0lDSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDQgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIElDNENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlcikpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNDogUmVzZXQgdGhlIENDNEUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzRFOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyIGFuZCB0aGUgcHJlc2NhbGVyIHZhbHVlICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NNUjIsCisgICAgICAgICAgICAgKFRJTV9DQ01SMl9DQzRTIHwgVElNX0NDTVIyX0lDNEYgfCBUSU1fQ0NNUjJfSUM0UFNDKSwKKyAgICAgICAgICAgICAoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyIHwgVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpID4+IDhVKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMkUgQml0ICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwKKyAgICAgICAgICAgICAoVElNX0NDRVJfQ0M0UCB8IFRJTV9DQ0VSX0NDNE5QKSwKKyAgICAgICAgICAgICAoKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkgPDwgMTJVKSB8IFRJTV9DQ0VSX0NDNEUpKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVElNMSB8fCBUSU0zIHx8IFRJTTIxIHx8IFRJTTIyIHx8IFRJTTYgfHwgVElNNyAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2xsX3VzYXJ0LmMgYi9TcmMvc3RtMzJsMHh4X2xsX3VzYXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxY2ZkMwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfdXNhcnQuYwpAQCAtMCwwICsxLDQyOCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF91c2FydC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBVU0FSVCBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3VzYXJ0LmgiCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3JjYy5oIgorI2luY2x1ZGUgInN0bTMybDB4eF9sbF9idXMuaCIKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkwweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFVTQVJUMSkgfHwgZGVmaW5lZCAoVVNBUlQyKSB8fCBkZWZpbmVkIChVU0FSVDQpIHx8IGRlZmluZWQgKFVTQVJUNSkKKworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKy8qIF9fQkFVRFJBVEVfXyBUaGUgbWF4aW11bSBCYXVkIFJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIGNsb2NrIGF2YWlsYWJsZQorICogICAgICAgICAgICAgIGRpdmlkZWQgYnkgdGhlIHNtYWxsZXN0IG92ZXJzYW1wbGluZyB1c2VkIG9uIHRoZSBVU0FSVCAoaS5lLiA4KSAgICAqLworI2RlZmluZSBJU19MTF9VU0FSVF9CQVVEUkFURShfX0JBVURSQVRFX18pICgoX19CQVVEUkFURV9fKSA8PSA0MDAwMDAwVSkKKworLyogX19WQUxVRV9fIEluIGNhc2Ugb2Ygb3ZlcnNhbXBsaW5nIGJ5IDE2IGFuZCA4LCBCUlIgY29udGVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNmQuICovCisjZGVmaW5lIElTX0xMX1VTQVJUX0JSUl9NSU4oX19WQUxVRV9fKSAoKF9fVkFMVUVfXykgPj0gMTZVKQorCisvKiBfX1ZBTFVFX18gQlJSIGNvbnRlbnQgbXVzdCBiZSBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIDB4RkZGRi4gKi8KKyNkZWZpbmUgSVNfTExfVVNBUlRfQlJSX01BWChfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSAweDAwMDBGRkZGVSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9ESVJFQ1RJT04oX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RJUkVDVElPTl9OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX1JYKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX1RYKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9QQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BBUklUWV9OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEFSSVRZX0VWRU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QQVJJVFlfT0REKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9EQVRBV0lEVEgoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RBVEFXSURUSF83QikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RBVEFXSURUSF84QikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RBVEFXSURUSF85QikpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfT1ZFUlNBTVBMSU5HKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfTEFTVEJJVENMS09VVFBVVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9DTE9DS1BIQVNFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QSEFTRV8xRURHRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QSEFTRV8yRURHRSkpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfQ0xPQ0tQT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUE9MQVJJVFlfTE9XKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX0NMT0NLT1VUUFVUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9DTE9DS19FTkFCTEUpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX1NUT1BCSVRTKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9TVE9QQklUU18wXzUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzFfNSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfU1RPUEJJVFNfMikpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfSFdDT05UUk9MKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0hXQ09OVFJPTF9SVFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIFVTQVJUIHJlZ2lzdGVycyAoUmVnaXN0ZXJzIHJlc3RvcmVkIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzKS4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBVU0FSVCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogVVNBUlQgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1VTQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisKKyNpZiBkZWZpbmVkKFVTQVJUMSkKKyAgaWYgKFVTQVJUeCA9PSBVU0FSVDEpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBVU0FSVCBjbG9jayAqLworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgVVNBUlQgY2xvY2sgKi8KKyAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxKTsKKyAgfQorI2VuZGlmIC8qIFVTQVJUMSAqLworI2lmIGRlZmluZWQoVVNBUlQxKQorICBlbHNlIGlmIChVU0FSVHggPT0gVVNBUlQyKQorI2Vsc2UKKyAgaWYgKFVTQVJUeCA9PSBVU0FSVDIpCisjZW5kaWYKKyAgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIFVTQVJUIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBVU0FSVCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIpOworICB9CisjaWYgZGVmaW5lZChVU0FSVDQpCisgIGVsc2UgaWYgKFVTQVJUeCA9PSBVU0FSVDQpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBVU0FSVCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQ0KTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgVVNBUlQgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQ0KTsKKyAgfQorI2VuZGlmIC8qIFVTQVJUNCAqLworI2lmIGRlZmluZWQoVVNBUlQ1KQorICBlbHNlIGlmIChVU0FSVHggPT0gVVNBUlQ1KQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgVVNBUlQgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNSk7CisKKyAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIFVTQVJUIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNSk7CisgIH0KKyNlbmRpZiAvKiBVU0FSVDUgKi8KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBVU0FSVCByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gVVNBUlRfSW5pdFN0cnVjdC4KKyAgKiBAbm90ZSAgIEFzIHNvbWUgYml0cyBpbiBVU0FSVCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFVTQVJUIGlzIGRpc2FibGVkIChVU0FSVF9DUjFfVUUgYml0ID0wKSwKKyAgKiAgICAgICAgIFVTQVJUIFBlcmlwaGVyYWwgc2hvdWxkIGJlIGluIGRpc2FibGVkIHN0YXRlIHByaW9yIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBFUlJPUiByZXN1bHQgd2lsbCBiZSByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIEJhdWQgcmF0ZSB2YWx1ZSBzdG9yZWQgaW4gVVNBUlRfSW5pdFN0cnVjdCBCYXVkUmF0ZSBmaWVsZCwgc2hvdWxkIGJlIHZhbGlkIChkaWZmZXJlbnQgZnJvbSAwKS4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVVNBUlRfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgTExfVVNBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJUIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFVTQVJUIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIFVTQVJUIFJlZ2lzdGVycyBpbml0aWFsaXphdGlvbgorICAqLworRXJyb3JTdGF0dXMgTExfVVNBUlRfSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIExMX1VTQVJUX0luaXRUeXBlRGVmICpVU0FSVF9Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsKKyAgdWludDMyX3QgcGVyaXBoY2xrID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisjaWYgZGVmaW5lZChVU0FSVDQpIHx8IGRlZmluZWQoVVNBUlQ1KQorICBMTF9SQ0NfQ2xvY2tzVHlwZURlZiBSQ0NfQ2xvY2tzOworI2VuZGlmCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9CQVVEUkFURShVU0FSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfREFUQVdJRFRIKFVTQVJUX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfU1RPUEJJVFMoVVNBUlRfSW5pdFN0cnVjdC0+U3RvcEJpdHMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX1BBUklUWShVU0FSVF9Jbml0U3RydWN0LT5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0RJUkVDVElPTihVU0FSVF9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfSFdDT05UUk9MKFVTQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX09WRVJTQU1QTElORyhVU0FSVF9Jbml0U3RydWN0LT5PdmVyU2FtcGxpbmcpKTsKKworICAvKiBVU0FSVCBuZWVkcyB0byBiZSBpbiBkaXNhYmxlZCBzdGF0ZSwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjb25maWd1cmUgc29tZSBiaXRzIGluCisgICAgIENSeCByZWdpc3RlcnMgKi8KKyAgaWYgKExMX1VTQVJUX0lzRW5hYmxlZChVU0FSVHgpID09IDBVKQorICB7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBVU0FSVHggQ1IxIChVU0FSVCBXb3JkIExlbmd0aCwgUGFyaXR5LCBNb2RlIGFuZCBPdmVyc2FtcGxpbmcgYml0cykgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gRGF0YVdpZHRoOiAgICAgICAgICBVU0FSVF9DUjFfTSBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggdmFsdWUKKyAgICAgKiAtIFBhcml0eTogICAgICAgICAgICAgVVNBUlRfQ1IxX1BDRSwgVVNBUlRfQ1IxX1BTIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPlBhcml0eSB2YWx1ZQorICAgICAqIC0gVHJhbnNmZXJEaXJlY3Rpb246ICBVU0FSVF9DUjFfVEUsIFVTQVJUX0NSMV9SRSBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbiB2YWx1ZQorICAgICAqIC0gT3ZlcnNhbXBsaW5nOiAgICAgICBVU0FSVF9DUjFfT1ZFUjggYml0IGFjY29yZGluZyB0byBVU0FSVF9Jbml0U3RydWN0LT5PdmVyU2FtcGxpbmcgdmFsdWUuCisgICAgICovCisgICAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwKKyAgICAgICAgICAgICAgIChVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMgfAorICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9PVkVSOCksCisgICAgICAgICAgICAgICAoVVNBUlRfSW5pdFN0cnVjdC0+RGF0YVdpZHRoIHwgVVNBUlRfSW5pdFN0cnVjdC0+UGFyaXR5IHwKKyAgICAgICAgICAgICAgICBVU0FSVF9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbiB8IFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZykpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBVU0FSVHggQ1IyIChTdG9wIGJpdHMpIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIFN0b3AgQml0czogICAgICAgICAgVVNBUlRfQ1IyX1NUT1AgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfSW5pdFN0cnVjdC0+U3RvcEJpdHMgdmFsdWUuCisgICAgICogLSBDTEtFTiwgQ1BPTCwgQ1BIQSBhbmQgTEJDTCBiaXRzIGFyZSB0byBiZSBjb25maWd1cmVkIHVzaW5nIExMX1VTQVJUX0Nsb2NrSW5pdCgpLgorICAgICAqLworICAgIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKFVTQVJUeCwgVVNBUlRfSW5pdFN0cnVjdC0+U3RvcEJpdHMpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBVU0FSVHggQ1IzIChIYXJkd2FyZSBGbG93IENvbnRyb2wpIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIEhhcmR3YXJlRmxvd0NvbnRyb2w6IFVTQVJUX0NSM19SVFNFLCBVU0FSVF9DUjNfQ1RTRSBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sIHZhbHVlLgorICAgICAqLworICAgIExMX1VTQVJUX1NldEhXRmxvd0N0cmwoVVNBUlR4LCBVU0FSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBSZXRyaWV2ZSBDbG9jayBmcmVxdWVuY3kgdXNlZCBmb3IgVVNBUlQgUGVyaXBoZXJhbAorICAgICAqLworI2lmIGRlZmluZWQoVVNBUlQxKQorICAgIGlmIChVU0FSVHggPT0gVVNBUlQxKQorICAgIHsKKyAgICAgIHBlcmlwaGNsayA9IExMX1JDQ19HZXRVU0FSVENsb2NrRnJlcShMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRSk7CisgICAgfQorI2VuZGlmIC8qIFVTQVJUMSAqLworI2lmIGRlZmluZWQoVVNBUlQxKQorICAgIGVsc2UgaWYgKFVTQVJUeCA9PSBVU0FSVDIpCisjZWxzZQorICAgIGlmIChVU0FSVHggPT0gVVNBUlQyKQorI2VuZGlmCisgICAgeworICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFKTsKKyAgICB9CisjaWYgZGVmaW5lZChVU0FSVDQpCisgICAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUNCkKKyAgICB7CisgICAgICAvKiBVU0FSVDQgY2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKCZSQ0NfQ2xvY2tzKTsKKyAgICAgIHBlcmlwaGNsayA9IFJDQ19DbG9ja3MuUENMSzFfRnJlcXVlbmN5OworICAgIH0KKyNlbmRpZiAvKiBVU0FSVDQgKi8KKyNpZiBkZWZpbmVkKFVTQVJUNSkKKyAgICBlbHNlIGlmIChVU0FSVHggPT0gVVNBUlQ1KQorICAgIHsKKyAgICAgIC8qIFVTQVJUNSBjbG9jayBpcyBQQ0xLMSAqLworICAgICAgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEoJlJDQ19DbG9ja3MpOworICAgICAgcGVyaXBoY2xrID0gUkNDX0Nsb2Nrcy5QQ0xLMV9GcmVxdWVuY3k7CisgICAgfQorI2VuZGlmIC8qIFVTQVJUNSAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvLCBhcyBlcnJvciBjb2RlIGlzIGFscmVhZHkgYXNzaWduZWQgdG8gRVJST1IgdmFsdWUgKi8KKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIEJhdWQgUmF0ZSA6CisgICAgICAgLSB2YWxpZCBiYXVkIHJhdGUgdmFsdWUgKGRpZmZlcmVudCBmcm9tIDApIGlzIHJlcXVpcmVkCisgICAgICAgLSBQZXJpcGhlcmFsIGNsb2NrIGFzIHJldHVybmVkIGJ5IFJDQyBzZXJ2aWNlLCBzaG91bGQgYmUgdmFsaWQgKGRpZmZlcmVudCBmcm9tIDApLgorICAgICovCisgICAgaWYgKChwZXJpcGhjbGsgIT0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8pCisgICAgICAgICYmIChVU0FSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSAhPSAwVSkpCisgICAgeworICAgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgICAgIExMX1VTQVJUX1NldEJhdWRSYXRlKFVTQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlwaGNsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKTsKKworICAgICAgLyogQ2hlY2sgQlJSIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNmQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9CUlJfTUlOKFVTQVJUeC0+QlJSKSk7CisKKyAgICAgIC8qIENoZWNrIEJSUiBpcyBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIDB4RkZGRiAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0JSUl9NQVgoVVNBUlR4LT5CUlIpKTsKKyAgICB9CisgIH0KKyAgLyogRW5kaWYgKD0+IFVTQVJUIG5vdCBpbiBEaXNhYmxlZCBzdGF0ZSA9PiByZXR1cm4gRVJST1IpICovCisKKyAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgU2V0IGVhY2ggQHJlZiBMTF9VU0FSVF9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBVU0FSVF9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VTQVJUX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKwordm9pZCBMTF9VU0FSVF9TdHJ1Y3RJbml0KExMX1VTQVJUX0luaXRUeXBlRGVmICpVU0FSVF9Jbml0U3RydWN0KQoreworICAvKiBTZXQgVVNBUlRfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgVVNBUlRfSW5pdFN0cnVjdC0+QmF1ZFJhdGUgICAgICAgICAgICA9IDk2MDBVOworICBVU0FSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggICAgICAgICAgID0gTExfVVNBUlRfREFUQVdJRFRIXzhCOworICBVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cyAgICAgICAgICAgID0gTExfVVNBUlRfU1RPUEJJVFNfMTsKKyAgVVNBUlRfSW5pdFN0cnVjdC0+UGFyaXR5ICAgICAgICAgICAgICA9IExMX1VTQVJUX1BBUklUWV9OT05FIDsKKyAgVVNBUlRfSW5pdFN0cnVjdC0+VHJhbnNmZXJEaXJlY3Rpb24gICA9IExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWDsKKyAgVVNBUlRfSW5pdFN0cnVjdC0+SGFyZHdhcmVGbG93Q29udHJvbCA9IExMX1VTQVJUX0hXQ09OVFJPTF9OT05FOworICBVU0FSVF9Jbml0U3RydWN0LT5PdmVyU2FtcGxpbmcgICAgICAgID0gTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2OworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgVVNBUlQgQ2xvY2sgcmVsYXRlZCBzZXR0aW5ncyBhY2NvcmRpbmcgdG8gdGhlCisgICogICAgICAgICBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgVVNBUlRfQ2xvY2tJbml0U3RydWN0LgorICAqIEBub3RlICAgQXMgc29tZSBiaXRzIGluIFVTQVJUIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgVVNBUlQgaXMgZGlzYWJsZWQgKFVTQVJUX0NSMV9VRSBiaXQgPTApLAorICAqICAgICAgICAgVVNBUlQgUGVyaXBoZXJhbCBzaG91bGQgYmUgaW4gZGlzYWJsZWQgc3RhdGUgcHJpb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UsIEVSUk9SIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIENsb2NrIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVVNBUlQgcmVnaXN0ZXJzIHJlbGF0ZWQgdG8gQ2xvY2sgc2V0dGluZ3MgYXJlIGluaXRpYWxpemVkIGFjY29yZGluZyB0byBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIFVTQVJUIFJlZ2lzdGVycyBpbml0aWFsaXphdGlvbgorICAqLworRXJyb3JTdGF0dXMgTExfVVNBUlRfQ2xvY2tJbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiAqVVNBUlRfQ2xvY2tJbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIFVTQVJUIEluc3RhbmNlIGFuZCBDbG9jayBzaWduYWwgb3V0cHV0IHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9DTE9DS09VVFBVVChVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrT3V0cHV0KSk7CisKKyAgLyogVVNBUlQgbmVlZHMgdG8gYmUgaW4gZGlzYWJsZWQgc3RhdGUsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY29uZmlndXJlIHNvbWUgYml0cyBpbgorICAgICBDUnggcmVnaXN0ZXJzICovCisgIGlmIChMTF9VU0FSVF9Jc0VuYWJsZWQoVVNBUlR4KSA9PSAwVSkKKyAgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogSWYgQ2xvY2sgc2lnbmFsIGhhcyB0byBiZSBvdXRwdXQgKi8KKyAgICBpZiAoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja091dHB1dCA9PSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFKQorICAgIHsKKyAgICAgIC8qIERlYWN0aXZhdGUgQ2xvY2sgc2lnbmFsIGRlbGl2ZXJ5IDoKKyAgICAgICAqIC0gRGlzYWJsZSBDbG9jayBPdXRwdXQ6ICAgICAgICBVU0FSVF9DUjJfQ0xLRU4gY2xlYXJlZAorICAgICAgICovCisgICAgICBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dChVU0FSVHgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5zdXJlIFVTQVJUIGluc3RhbmNlIGlzIFVTQVJUIGNhcGFibGUgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpKTsKKworICAgICAgLyogQ2hlY2sgY2xvY2sgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfQ0xPQ0tQT0xBUklUWShVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9DTE9DS1BIQVNFKFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+Q2xvY2tQaGFzZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0xBU1RCSVRDTEtPVVRQVVQoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSkpOworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAqIENvbmZpZ3VyZSBVU0FSVHggQ1IyIChDbG9jayBzaWduYWwgcmVsYXRlZCBiaXRzKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICAgKiAtIEVuYWJsZSBDbG9jayBPdXRwdXQ6ICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOIHNldAorICAgICAgICogLSBDbG9jayBQb2xhcml0eTogICAgICAgICAgICAgIFVTQVJUX0NSMl9DUE9MIGJpdCBhY2NvcmRpbmcgdG8gVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHZhbHVlCisgICAgICAgKiAtIENsb2NrIFBoYXNlOiAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NQSEEgYml0IGFjY29yZGluZyB0byBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrUGhhc2UgdmFsdWUKKyAgICAgICAqIC0gTGFzdCBCaXQgQ2xvY2sgUHVsc2UgT3V0cHV0OiBVU0FSVF9DUjJfTEJDTCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+TGFzdEJpdENsb2NrUHVsc2UgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsCisgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9DUEhBIHwgVVNBUlRfQ1IyX0NQT0wgfCBVU0FSVF9DUjJfTEJDTCwKKyAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHwKKyAgICAgICAgICAgICAgICAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BoYXNlIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSk7CisgICAgfQorICB9CisgIC8qIEVsc2UgKFVTQVJUIG5vdCBpbiBEaXNhYmxlZCBzdGF0ZSA9PiByZXR1cm4gRVJST1IgKi8KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBmaWVsZCBvZiBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiB0eXBlIHN0cnVjdHVyZSB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfVVNBUlRfQ2xvY2tTdHJ1Y3RJbml0KExMX1VTQVJUX0Nsb2NrSW5pdFR5cGVEZWYgKlVTQVJUX0Nsb2NrSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IExMX1VTQVJUX0Nsb2NrSW5pdFN0cnVjdCBmaWVsZHMgd2l0aCBkZWZhdWx0IHZhbHVlcyAqLworICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrT3V0cHV0ICAgICAgID0gTExfVVNBUlRfQ0xPQ0tfRElTQUJMRTsKKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5ICAgICA9IExMX1VTQVJUX1BPTEFSSVRZX0xPVzsgICAgICAgICAgICAvKiBOb3QgcmVsZXZhbnQgd2hlbiBDbG9ja091dHB1dCA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgKi8KKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BoYXNlICAgICAgICA9IExMX1VTQVJUX1BIQVNFXzFFREdFOyAgICAgICAgICAgICAvKiBOb3QgcmVsZXZhbnQgd2hlbiBDbG9ja091dHB1dCA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgKi8KKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSA9IExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQ7ICAvKiBOb3QgcmVsZXZhbnQgd2hlbiBDbG9ja091dHB1dCA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTQVJUMSB8fCBVU0FSVDIgfHwgVVNBUlQ0IHx8IFVTQVJUNSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmwweHhfbGxfdXNiLmMgYi9TcmMvc3RtMzJsMHh4X2xsX3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMGM2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJsMHh4X2xsX3VzYi5jCkBAIC0wLDAgKzEsODY3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJsMHh4X2xsX3VzYi5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBVU0IgTG93IExheWVyIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoIykgRmlsbCBwYXJhbWV0ZXJzIG9mIEluaXQgc3RydWN0dXJlIGluIFVTQl9PVEdfQ2ZnVHlwZURlZiBzdHJ1Y3R1cmUuCisKKyAgICAgICgjKSBDYWxsIFVTQl9Db3JlSW5pdCgpIEFQSSB0byBpbml0aWFsaXplIHRoZSBVU0IgQ29yZSBwZXJpcGhlcmFsLgorCisgICAgICAoIykgVGhlIHVwcGVyIEhBTCBIQ0QvUENEIGRyaXZlciB3aWxsIGNhbGwgdGhlIHJpZ2h0IHJvdXRpbmVzIGZvciBpdHMgaW50ZXJuYWwgcHJvY2Vzc2VzLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX1VTQl9EUklWRVIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCkgfHwgZGVmaW5lZCAoSEFMX0hDRF9NT0RVTEVfRU5BQkxFRCkKKyNpZiBkZWZpbmVkIChVU0IpCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVVNCIENvcmUKKyAgKiBAcGFyYW0gIFVTQng6IFVTQiBJbnN0YW5jZQorICAqIEBwYXJhbSAgY2ZnIDogcG9pbnRlciB0byBhIFVTQl9DZmdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0J4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfQ29yZUluaXQoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9DZmdUeXBlRGVmIGNmZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChjZmcpOworCisgIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMgdXNlZAorICAgICAgICAgICAgICBvbmx5IGJ5IFVTQiBPVEcgRlMgcGVyaXBoZXJhbC4KKyAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zLgorICAgKi8KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9FbmFibGVHbG9iYWxJbnQKKyAgKiAgICAgICAgIEVuYWJsZXMgdGhlIGNvbnRyb2xsZXIncyBHbG9iYWwgSW50IGluIHRoZSBBSEIgQ29uZmlnIHJlZworICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VuYWJsZUdsb2JhbEludChVU0JfVHlwZURlZiAqVVNCeCkKK3sKKyAgdWludDE2X3Qgd2ludGVycnVwdG1hc2s7CisKKyAgLyogU2V0IHdpbnRlcnJ1cHRtYXNrIHZhcmlhYmxlICovCisgIHdpbnRlcnJ1cHRtYXNrID0gVVNCX0NOVFJfQ1RSTSAgfCBVU0JfQ05UUl9XS1VQTSB8CisgICAgICAgICAgICAgICAgICAgVVNCX0NOVFJfU1VTUE0gfCBVU0JfQ05UUl9FUlJNIHwKKyAgICAgICAgICAgICAgICAgICBVU0JfQ05UUl9TT0ZNIHwgVVNCX0NOVFJfRVNPRk0gfAorICAgICAgICAgICAgICAgICAgIFVTQl9DTlRSX1JFU0VUTSB8IFVTQl9DTlRSX0wxUkVRTTsKKworICAvKiBTZXQgaW50ZXJydXB0IG1hc2sgKi8KKyAgVVNCeC0+Q05UUiB8PSB3aW50ZXJydXB0bWFzazsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9EaXNhYmxlR2xvYmFsSW50CisgICogICAgICAgICBEaXNhYmxlIHRoZSBjb250cm9sbGVyJ3MgR2xvYmFsIEludCBpbiB0aGUgQUhCIENvbmZpZyByZWcKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGlzYWJsZUdsb2JhbEludChVU0JfVHlwZURlZiAqVVNCeCkKK3sKKyAgdWludDE2X3Qgd2ludGVycnVwdG1hc2s7CisKKyAgLyogU2V0IHdpbnRlcnJ1cHRtYXNrIHZhcmlhYmxlICovCisgIHdpbnRlcnJ1cHRtYXNrID0gVVNCX0NOVFJfQ1RSTSAgfCBVU0JfQ05UUl9XS1VQTSB8CisgICAgICAgICAgICAgICAgICAgVVNCX0NOVFJfU1VTUE0gfCBVU0JfQ05UUl9FUlJNIHwKKyAgICAgICAgICAgICAgICAgICBVU0JfQ05UUl9TT0ZNIHwgVVNCX0NOVFJfRVNPRk0gfAorICAgICAgICAgICAgICAgICAgIFVTQl9DTlRSX1JFU0VUTSB8IFVTQl9DTlRSX0wxUkVRTTsKKworICAvKiBDbGVhciBpbnRlcnJ1cHQgbWFzayAqLworICBVU0J4LT5DTlRSICY9IH53aW50ZXJydXB0bWFzazsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9TZXRDdXJyZW50TW9kZSA6IFNldCBmdW5jdGlvbmFsIG1vZGUKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIG1vZGUgOiAgY3VycmVudCBjb3JlIG1vZGUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSB0aGVzZSB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFVTQl9ERVZJQ0VfTU9ERTogUGVyaXBoZXJhbCBtb2RlIG1vZGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXRDdXJyZW50TW9kZShVU0JfVHlwZURlZiAqVVNCeCwgVVNCX01vZGVUeXBlRGVmIG1vZGUpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKFVTQngpOworICBVTlVTRUQobW9kZSk7CisKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9EZXZJbml0IDogSW5pdGlhbGl6ZXMgdGhlIFVTQiBjb250cm9sbGVyIHJlZ2lzdGVycworICAqICAgICAgICAgZm9yIGRldmljZSBtb2RlCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHBhcmFtICBjZmcgIDogcG9pbnRlciB0byBhIFVTQl9DZmdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0J4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGV2SW5pdChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0NmZ1R5cGVEZWYgY2ZnKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChjZmcpOworCisgIC8qIEluaXQgRGV2aWNlICovCisgIC8qQ05UUl9GUkVTID0gMSovCisgIFVTQngtPkNOVFIgPSBVU0JfQ05UUl9GUkVTOworCisgIC8qQ05UUl9GUkVTID0gMCovCisgIFVTQngtPkNOVFIgPSAwOworCisgIC8qQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzKi8KKyAgVVNCeC0+SVNUUiA9IDA7CisKKyAgLypTZXQgQnRhYmxlIEFkZHJlc3MqLworICBVU0J4LT5CVEFCTEUgPSBCVEFCTEVfQUREUkVTUzsKKworICAvKiBFbmFibGUgVVNCIERldmljZSBJbnRlcnJ1cHQgbWFzayAqLworICAodm9pZClVU0JfRW5hYmxlR2xvYmFsSW50KFVTQngpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX1NldERldlNwZWVkIDpJbml0aWFsaXplcyB0aGUgZGV2aWNlIHNwZWVkCisgICogICAgICAgICBkZXBlbmRpbmcgb24gdGhlIFBIWSB0eXBlIGFuZCB0aGUgZW51bWVyYXRpb24gc3BlZWQgb2YgdGhlIGRldmljZS4KKyAgKiBAcGFyYW0gIFVTQnggIFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgc3BlZWQgIGRldmljZSBzcGVlZAorICAqIEByZXR2YWwgIEhhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXREZXZTcGVlZChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCBzcGVlZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChzcGVlZCk7CisKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworCisgICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9GbHVzaFR4RmlmbyA6IEZsdXNoIGEgVHggRklGTworICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgbnVtIDogRklGTyBudW1iZXIKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGZyb20gMSB0byAxNQorICAgICAgICAgICAgMTUgbWVhbnMgRmx1c2ggYWxsIFR4IEZJRk9zCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRmx1c2hUeEZpZm8oVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQzMl90IG51bSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChudW0pOworCisgIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMgdXNlZAorICAgICAgICAgICAgICBvbmx5IGJ5IFVTQiBPVEcgRlMgcGVyaXBoZXJhbC4KKyAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zLgorICAgKi8KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9GbHVzaFJ4RmlmbyA6IEZsdXNoIFJ4IEZJRk8KKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9GbHVzaFJ4RmlmbyhVU0JfVHlwZURlZiAqVVNCeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWN0aXZhdGUgYW5kIGNvbmZpZ3VyZSBhbiBlbmRwb2ludAorICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgZXA6IHBvaW50ZXIgdG8gZW5kcG9pbnQgc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfQWN0aXZhdGVFbmRwb2ludChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCA9IEhBTF9PSzsKKyAgdWludDE2X3Qgd0VwUmVnVmFsOworCisgIHdFcFJlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoVVNCeCwgZXAtPm51bSkgJiBVU0JfRVBfVF9NQVNLOworCisgIC8qIGluaXRpYWxpemUgRW5kcG9pbnQgKi8KKyAgc3dpdGNoIChlcC0+dHlwZSkKKyAgeworICAgIGNhc2UgRVBfVFlQRV9DVFJMOgorICAgICAgd0VwUmVnVmFsIHw9IFVTQl9FUF9DT05UUk9MOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVQX1RZUEVfQlVMSzoKKyAgICAgIHdFcFJlZ1ZhbCB8PSBVU0JfRVBfQlVMSzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUF9UWVBFX0lOVFI6CisgICAgICB3RXBSZWdWYWwgfD0gVVNCX0VQX0lOVEVSUlVQVDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUF9UWVBFX0lTT0M6CisgICAgICB3RXBSZWdWYWwgfD0gVVNCX0VQX0lTT0NIUk9OT1VTOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBQQ0RfU0VUX0VORFBPSU5UKFVTQngsIGVwLT5udW0sIHdFcFJlZ1ZhbCB8IFVTQl9FUF9DVFJfUlggfCBVU0JfRVBfQ1RSX1RYKTsKKworICBQQ0RfU0VUX0VQX0FERFJFU1MoVVNCeCwgZXAtPm51bSwgZXAtPm51bSk7CisKKyAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpCisgIHsKKyAgICBpZiAoZXAtPmlzX2luICE9IDBVKQorICAgIHsKKyAgICAgIC8qU2V0IHRoZSBlbmRwb2ludCBUcmFuc21pdCBidWZmZXIgYWRkcmVzcyAqLworICAgICAgUENEX1NFVF9FUF9UWF9BRERSRVNTKFVTQngsIGVwLT5udW0sIGVwLT5wbWFhZHJlc3MpOworICAgICAgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7CisKKyAgICAgIGlmIChlcC0+dHlwZSAhPSBFUF9UWVBFX0lTT0MpCisgICAgICB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBOQUsgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQgKi8KKyAgICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX05BSyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBUWCBFbmRwb2ludCB0byBkaXNhYmxlZCBzdGF0ZSAqLworICAgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfRElTKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qU2V0IHRoZSBlbmRwb2ludCBSZWNlaXZlIGJ1ZmZlciBhZGRyZXNzICovCisgICAgICBQQ0RfU0VUX0VQX1JYX0FERFJFU1MoVVNCeCwgZXAtPm51bSwgZXAtPnBtYWFkcmVzcyk7CisgICAgICAvKlNldCB0aGUgZW5kcG9pbnQgUmVjZWl2ZSBidWZmZXIgY291bnRlciovCisgICAgICBQQ0RfU0VUX0VQX1JYX0NOVChVU0J4LCBlcC0+bnVtLCBlcC0+bWF4cGFja2V0KTsKKyAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgICAgLyogQ29uZmlndXJlIFZBTElEIHN0YXR1cyBmb3IgdGhlIEVuZHBvaW50Ki8KKyAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9WQUxJRCk7CisgICAgfQorICB9CisgIC8qRG91YmxlIEJ1ZmZlciovCisgIGVsc2UKKyAgeworICAgIC8qIFNldCB0aGUgZW5kcG9pbnQgYXMgZG91YmxlIGJ1ZmZlcmVkICovCisgICAgUENEX1NFVF9FUF9EQlVGKFVTQngsIGVwLT5udW0pOworICAgIC8qIFNldCBidWZmZXIgYWRkcmVzcyBmb3IgZG91YmxlIGJ1ZmZlcmVkIG1vZGUgKi8KKyAgICBQQ0RfU0VUX0VQX0RCVUZfQUREUihVU0J4LCBlcC0+bnVtLCBlcC0+cG1hYWRkcjAsIGVwLT5wbWFhZGRyMSk7CisKKyAgICBpZiAoZXAtPmlzX2luID09IDBVKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgSU4vT1VUICovCisgICAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKyAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGVwLT5udW0pOworCisgICAgICAvKiBSZXNldCB2YWx1ZSBvZiB0aGUgZGF0YSB0b2dnbGUgYml0cyBmb3IgdGhlIGVuZHBvaW50IG91dCAqLworICAgICAgUENEX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7CisKKyAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9WQUxJRCk7CisgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfRElTKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgSU4vT1VUICovCisgICAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKyAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgICAgUENEX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisKKyAgICAgIGlmIChlcC0+dHlwZSAhPSBFUF9UWVBFX0lTT0MpCisgICAgICB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBOQUsgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQgKi8KKyAgICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX05BSyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBUWCBFbmRwb2ludCB0byBkaXNhYmxlZCBzdGF0ZSAqLworICAgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfRElTKTsKKyAgICAgIH0KKworICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX0RJUyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmICBEZS1hY3RpdmF0ZSBhbmQgZGUtaW5pdGlhbGl6ZSBhbiBlbmRwb2ludAorICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgZXA6IHBvaW50ZXIgdG8gZW5kcG9pbnQgc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGVhY3RpdmF0ZUVuZHBvaW50KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCkKK3sKKyAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpCisgIHsKKyAgICBpZiAoZXAtPmlzX2luICE9IDBVKQorICAgIHsKKyAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgICAgLyogQ29uZmlndXJlIERJU0FCTEUgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQqLworICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKyAgICAgIC8qIENvbmZpZ3VyZSBESVNBQkxFIHN0YXR1cyBmb3IgdGhlIEVuZHBvaW50Ki8KKyAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9ESVMpOworICAgIH0KKyAgfQorICAvKkRvdWJsZSBCdWZmZXIqLworICBlbHNlCisgIHsKKyAgICBpZiAoZXAtPmlzX2luID09IDBVKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgSU4vT1VUKi8KKyAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgICAgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7CisKKyAgICAgIC8qIFJlc2V0IHZhbHVlIG9mIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgb3V0Ki8KKyAgICAgIFBDRF9UWF9EVE9HKFVTQngsIGVwLT5udW0pOworCisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfRElTKTsKKyAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBJTi9PVVQqLworICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisgICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKyAgICAgIFBDRF9SWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgICAgLyogQ29uZmlndXJlIERJU0FCTEUgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQqLworICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUyk7CisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfRElTKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9FUFN0YXJ0WGZlciA6IHNldHVwIGFuZCBzdGFydHMgYSB0cmFuc2ZlciBvdmVyIGFuIEVQCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHBhcmFtICBlcDogcG9pbnRlciB0byBlbmRwb2ludCBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUFN0YXJ0WGZlcihVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApCit7CisgIHVpbnQxNl90IHBtYWJ1ZmZlcjsKKyAgdWludDMyX3QgbGVuOworCisgIC8qIElOIGVuZHBvaW50ICovCisgIGlmIChlcC0+aXNfaW4gPT0gMVUpCisgIHsKKyAgICAvKk11bHRpIHBhY2tldCB0cmFuc2ZlciovCisgICAgaWYgKGVwLT54ZmVyX2xlbiA+IGVwLT5tYXhwYWNrZXQpCisgICAgeworICAgICAgbGVuID0gZXAtPm1heHBhY2tldDsKKyAgICAgIGVwLT54ZmVyX2xlbiAtPSBsZW47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBsZW4gPSBlcC0+eGZlcl9sZW47CisgICAgICBlcC0+eGZlcl9sZW4gPSAwVTsKKyAgICB9CisKKyAgICAvKiBjb25maWd1cmUgYW5kIHZhbGlkYXRlIFR4IGVuZHBvaW50ICovCisgICAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpCisgICAgeworICAgICAgVVNCX1dyaXRlUE1BKFVTQngsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZHJlc3MsICh1aW50MTZfdClsZW4pOworICAgICAgUENEX1NFVF9FUF9UWF9DTlQoVVNCeCwgZXAtPm51bSwgbGVuKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBVU0IgZW5kcG9pbnQgKi8KKyAgICAgIGlmICgoUENEX0dFVF9FTkRQT0lOVChVU0J4LCBlcC0+bnVtKSAmIFVTQl9FUF9EVE9HX1RYKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBEb3VibGUgYnVmZmVyIGNvdW50ZXIgZm9yIHBtYWJ1ZmZlcjEgKi8KKyAgICAgICAgUENEX1NFVF9FUF9EQlVGMV9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBsZW4pOworICAgICAgICBwbWFidWZmZXIgPSBlcC0+cG1hYWRkcjE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFNldCB0aGUgRG91YmxlIGJ1ZmZlciBjb3VudGVyIGZvciBwbWFidWZmZXIwICovCisgICAgICAgIFBDRF9TRVRfRVBfREJVRjBfQ05UKFVTQngsIGVwLT5udW0sIGVwLT5pc19pbiwgbGVuKTsKKyAgICAgICAgcG1hYnVmZmVyID0gZXAtPnBtYWFkZHIwOworICAgICAgfQorICAgICAgVVNCX1dyaXRlUE1BKFVTQngsIGVwLT54ZmVyX2J1ZmYsIHBtYWJ1ZmZlciwgKHVpbnQxNl90KWxlbik7CisgICAgICBQQ0RfRnJlZVVzZXJCdWZmZXIoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luKTsKKyAgICB9CisKKyAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfVkFMSUQpOworICB9CisgIGVsc2UgLyogT1VUIGVuZHBvaW50ICovCisgIHsKKyAgICAvKiBNdWx0aSBwYWNrZXQgdHJhbnNmZXIqLworICAgIGlmIChlcC0+eGZlcl9sZW4gPiBlcC0+bWF4cGFja2V0KQorICAgIHsKKyAgICAgIGxlbiA9IGVwLT5tYXhwYWNrZXQ7CisgICAgICBlcC0+eGZlcl9sZW4gLT0gbGVuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbGVuID0gZXAtPnhmZXJfbGVuOworICAgICAgZXAtPnhmZXJfbGVuID0gMFU7CisgICAgfQorCisgICAgLyogY29uZmlndXJlIGFuZCB2YWxpZGF0ZSBSeCBlbmRwb2ludCAqLworICAgIGlmIChlcC0+ZG91YmxlYnVmZmVyID09IDBVKQorICAgIHsKKyAgICAgIC8qU2V0IFJYIGJ1ZmZlciBjb3VudCovCisgICAgICBQQ0RfU0VUX0VQX1JYX0NOVChVU0J4LCBlcC0+bnVtLCBsZW4pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLypTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciovCisgICAgICBQQ0RfU0VUX0VQX0RCVUZfQ05UKFVTQngsIGVwLT5udW0sIGVwLT5pc19pbiwgbGVuKTsKKyAgICB9CisKKyAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfVkFMSUQpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfV3JpdGVQYWNrZXQgOiBXcml0ZXMgYSBwYWNrZXQgaW50byB0aGUgVHggRklGTyBhc3NvY2lhdGVkCisgICogICAgICAgICB3aXRoIHRoZSBFUC9jaGFubmVsCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHBhcmFtICBzcmMgOiAgcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisgICogQHBhcmFtICBjaF9lcF9udW0gOiBlbmRwb2ludCBvciBob3N0IGNoYW5uZWwgbnVtYmVyCisgICogQHBhcmFtICBsZW4gOiBOdW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9Xcml0ZVBhY2tldChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCAqc3JjLCB1aW50OF90IGNoX2VwX251bSwgdWludDE2X3QgbGVuKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKyAgVU5VU0VEKHNyYyk7CisgIFVOVVNFRChjaF9lcF9udW0pOworICBVTlVTRUQobGVuKTsKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9SZWFkUGFja2V0IDogcmVhZCBhIHBhY2tldCBmcm9tIHRoZSBUeCBGSUZPIGFzc29jaWF0ZWQKKyAgKiAgICAgICAgIHdpdGggdGhlIEVQL2NoYW5uZWwKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIGRlc3QgOiBkZXN0aW5hdGlvbiBwb2ludGVyCisgICogQHBhcmFtICBsZW4gOiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAqIEByZXR2YWwgcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKyAgKi8KK3ZvaWQgKlVTQl9SZWFkUGFja2V0KFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90ICpkZXN0LCB1aW50MTZfdCBsZW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKFVTQngpOworICBVTlVTRUQoZGVzdCk7CisgIFVOVVNFRChsZW4pOworICAvKiBOT1RFIDogLSBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCBieSBVU0IgRGV2aWNlIEZTIHBlcmlwaGVyYWwsIGl0IGlzIHVzZWQKKyAgICAgICAgICAgICAgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuCisgICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICovCisgIHJldHVybiAoKHZvaWQgKilOVUxMKTsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfRVBTZXRTdGFsbCA6IHNldCBhIHN0YWxsIGNvbmRpdGlvbiBvdmVyIGFuIEVQCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHBhcmFtICBlcDogcG9pbnRlciB0byBlbmRwb2ludCBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUFNldFN0YWxsKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCkKK3sKKyAgaWYgKGVwLT5pc19pbiAhPSAwVSkKKyAgeworICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9TVEFMTCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX1NUQUxMKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX0VQQ2xlYXJTdGFsbCA6IENsZWFyIGEgc3RhbGwgY29uZGl0aW9uIG92ZXIgYW4gRVAKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIGVwOiBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VQQ2xlYXJTdGFsbChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0VQVHlwZURlZiAqZXApCit7CisgIGlmIChlcC0+aXNfaW4gIT0gMFUpCisgIHsKKyAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKyAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfVkFMSUQpOworICB9CisgIGVsc2UKKyAgeworICAgIFBDRF9DTEVBUl9SWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9WQUxJRCk7CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfU3RvcERldmljZSA6IFN0b3AgdGhlIHVzYiBkZXZpY2UgbW9kZQorICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX1N0b3BEZXZpY2UoVVNCX1R5cGVEZWYgKlVTQngpCit7CisgIC8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIGZvcmNlIFVTQiByZXNldCAqLworICBVU0J4LT5DTlRSID0gVVNCX0NOVFJfRlJFUzsKKworICAvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisgIFVTQngtPklTVFIgPSAwOworCisgIC8qIHN3aXRjaC1vZmYgZGV2aWNlICovCisgIFVTQngtPkNOVFIgPSAoVVNCX0NOVFJfRlJFUyB8IFVTQl9DTlRSX1BEV04pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX1NldERldkFkZHJlc3MgOiBTdG9wIHRoZSB1c2IgZGV2aWNlIG1vZGUKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIGFkZHJlc3MgOiBuZXcgZGV2aWNlIGFkZHJlc3MgdG8gYmUgYXNzaWduZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMjU1CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgVVNCX1NldERldkFkZHJlc3MoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgYWRkcmVzcykKK3sKKyAgaWYgKGFkZHJlc3MgPT0gMFUpCisgIHsKKyAgICAvKiBzZXQgZGV2aWNlIGFkZHJlc3MgYW5kIGVuYWJsZSBmdW5jdGlvbiAqLworICAgIFVTQngtPkRBRERSID0gVVNCX0RBRERSX0VGOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfRGV2Q29ubmVjdCA6IENvbm5lY3QgdGhlIFVTQiBkZXZpY2UgYnkgZW5hYmxpbmcgdGhlIHB1bGwtdXAvcHVsbC1kb3duCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgVVNCX0RldkNvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpCit7CisgIC8qIEVuYWJsaW5nIERQIFB1bGwtVVAgYml0IHRvIENvbm5lY3QgaW50ZXJuYWwgUFUgcmVzaXN0b3Igb24gVVNCIERQIGxpbmUgKi8KKyAgVVNCeC0+QkNEUiB8PSBVU0JfQkNEUl9EUFBVOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX0RldkRpc2Nvbm5lY3QgOiBEaXNjb25uZWN0IHRoZSBVU0IgZGV2aWNlIGJ5IGRpc2FibGluZyB0aGUgcHVsbC11cC9wdWxsLWRvd24KKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBVU0JfRGV2RGlzY29ubmVjdChVU0JfVHlwZURlZiAqVVNCeCkKK3sKKyAgLyogRGlzYWJsZSBEUCBQdWxsLVVwIGJpdCB0byBkaXNjb25uZWN0IHRoZSBJbnRlcm5hbCBQVSByZXNpc3RvciBvbiBVU0IgRFAgbGluZSAqLworICBVU0J4LT5CQ0RSICY9ICh1aW50MTZfdCkofihVU0JfQkNEUl9EUFBVKSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfUmVhZEludGVycnVwdHM6IHJldHVybiB0aGUgZ2xvYmFsIFVTQiBpbnRlcnJ1cHQgc3RhdHVzCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCit1aW50MzJfdCAgVVNCX1JlYWRJbnRlcnJ1cHRzKFVTQl9UeXBlRGVmICpVU0J4KQoreworICB1aW50MzJfdCB0bXByZWc7CisKKyAgdG1wcmVnID0gVVNCeC0+SVNUUjsKKyAgcmV0dXJuIHRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfUmVhZERldkFsbE91dEVwSW50ZXJydXB0OiByZXR1cm4gdGhlIFVTQiBkZXZpY2UgT1VUIGVuZHBvaW50cyBpbnRlcnJ1cHQgc3RhdHVzCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCit1aW50MzJfdCBVU0JfUmVhZERldkFsbE91dEVwSW50ZXJydXB0KFVTQl9UeXBlRGVmICpVU0J4KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworICByZXR1cm4gKDApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9SZWFkRGV2QWxsSW5FcEludGVycnVwdDogcmV0dXJuIHRoZSBVU0IgZGV2aWNlIElOIGVuZHBvaW50cyBpbnRlcnJ1cHQgc3RhdHVzCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCit1aW50MzJfdCBVU0JfUmVhZERldkFsbEluRXBJbnRlcnJ1cHQoVVNCX1R5cGVEZWYgKlVTQngpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKFVTQngpOworICAvKiBOT1RFIDogLSBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCBieSBVU0IgRGV2aWNlIEZTIHBlcmlwaGVyYWwsIGl0IGlzIHVzZWQKKyAgICAgICAgICAgICAgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuCisgICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICovCisgIHJldHVybiAoMCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyBEZXZpY2UgT1VUIEVQIEludGVycnVwdCByZWdpc3RlcgorICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgZXBudW0gOiBlbmRwb2ludCBudW1iZXIKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMTUKKyAgKiBAcmV0dmFsIERldmljZSBPVVQgRVAgSW50ZXJydXB0IHJlZ2lzdGVyCisgICovCit1aW50MzJfdCBVU0JfUmVhZERldk91dEVQSW50ZXJydXB0KFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90IGVwbnVtKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKyAgVU5VU0VEKGVwbnVtKTsKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworICByZXR1cm4gKDApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgRGV2aWNlIElOIEVQIEludGVycnVwdCByZWdpc3RlcgorICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgZXBudW0gOiBlbmRwb2ludCBudW1iZXIKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMTUKKyAgKiBAcmV0dmFsIERldmljZSBJTiBFUCBJbnRlcnJ1cHQgcmVnaXN0ZXIKKyAgKi8KK3VpbnQzMl90IFVTQl9SZWFkRGV2SW5FUEludGVycnVwdChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCBlcG51bSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChlcG51bSk7CisgIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMgdXNlZAorICAgICAgICAgICAgICBvbmx5IGJ5IFVTQiBPVEcgRlMgcGVyaXBoZXJhbC4KKyAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zLgorICAgKi8KKyAgcmV0dXJuICgwKTsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfQ2xlYXJJbnRlcnJ1cHRzOiBjbGVhciBhIFVTQiBpbnRlcnJ1cHQKKyAgKiBAcGFyYW0gIFVTQnggIFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgaW50ZXJydXB0ICBpbnRlcnJ1cHQgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCAgVVNCX0NsZWFySW50ZXJydXB0cyhVU0JfVHlwZURlZiAqVVNCeCwgdWludDMyX3QgaW50ZXJydXB0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKyAgVU5VU0VEKGludGVycnVwdCk7CisgIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMgdXNlZAorICAgICAgICAgICAgICBvbmx5IGJ5IFVTQiBPVEcgRlMgcGVyaXBoZXJhbC4KKyAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBQcmVwYXJlIHRoZSBFUDAgdG8gc3RhcnQgdGhlIGZpcnN0IGNvbnRyb2wgc2V0dXAKKyAgKiBAcGFyYW0gIFVTQnggIFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgcHNldHVwICBwb2ludGVyIHRvIHNldHVwIHBhY2tldAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VQMF9PdXRTdGFydChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCAqcHNldHVwKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKyAgVU5VU0VEKHBzZXR1cCk7CisgIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMgdXNlZAorICAgICAgICAgICAgICBvbmx5IGJ5IFVTQiBPVEcgRlMgcGVyaXBoZXJhbC4KKyAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zLgorICAgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfQWN0aXZhdGVSZW1vdGVXYWtldXAgOiBhY3RpdmUgcmVtb3RlIHdha2V1cCBzaWduYWxsaW5nCisgICogQHBhcmFtICBVU0J4ICBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9BY3RpdmF0ZVJlbW90ZVdha2V1cChVU0JfVHlwZURlZiAqVVNCeCkKK3sKKyAgVVNCeC0+Q05UUiB8PSBVU0JfQ05UUl9SRVNVTUU7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cCA6IGRlLWFjdGl2ZSByZW1vdGUgd2FrZXVwIHNpZ25hbGxpbmcKKyAgKiBAcGFyYW0gIFVTQnggIFNlbGVjdGVkIGRldmljZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoVVNCX1R5cGVEZWYgKlVTQngpCit7CisgIFVTQngtPkNOVFIgJj0gfihVU0JfQ05UUl9SRVNVTUUpOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgQ29weSBhIGJ1ZmZlciBmcm9tIHVzZXIgbWVtb3J5IGFyZWEgdG8gcGFja2V0IG1lbW9yeSBhcmVhIChQTUEpCisgICogQHBhcmFtICAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgIHBiVXNyQnVmIHBvaW50ZXIgdG8gdXNlciBtZW1vcnkgYXJlYS4KKyAgKiBAcGFyYW0gICB3UE1BQnVmQWRkciBhZGRyZXNzIGludG8gUE1BLgorICAqIEBwYXJhbSAgIHdOQnl0ZXM6IG5vLiBvZiBieXRlcyB0byBiZSBjb3BpZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFVTQl9Xcml0ZVBNQShVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCAqcGJVc3JCdWYsIHVpbnQxNl90IHdQTUFCdWZBZGRyLCB1aW50MTZfdCB3TkJ5dGVzKQoreworICB1aW50MzJfdCBuID0gKCh1aW50MzJfdCl3TkJ5dGVzICsgMVUpID4+IDE7CisgIHVpbnQzMl90IEJhc2VBZGRyID0gKHVpbnQzMl90KVVTQng7CisgIHVpbnQzMl90IGksIHRlbXAxLCB0ZW1wMjsKKyAgdWludDE2X3QgKnBkd1ZhbDsKKyAgdWludDhfdCAqcEJ1ZiA9IHBiVXNyQnVmOworCisgIHBkd1ZhbCA9ICh1aW50MTZfdCAqKShCYXNlQWRkciArIDB4NDAwVSArICgodWludDMyX3Qpd1BNQUJ1ZkFkZHIgKiBQTUFfQUNDRVNTKSk7CisKKyAgZm9yIChpID0gbjsgaSAhPSAwVTsgaS0tKQorICB7CisgICAgdGVtcDEgPSAodWludDE2X3QpICogcEJ1ZjsKKyAgICBwQnVmKys7CisgICAgdGVtcDIgPSB0ZW1wMSB8ICgodWludDE2X3QpKCh1aW50MTZfdCkgKiBwQnVmIDw8IDgpKTsKKyAgICAqcGR3VmFsID0gKHVpbnQxNl90KXRlbXAyOworICAgIHBkd1ZhbCsrOworCisjaWYgUE1BX0FDQ0VTUyA+IDFVCisgICAgcGR3VmFsKys7CisjZW5kaWYKKworICAgIHBCdWYrKzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgQ29weSBhIGJ1ZmZlciBmcm9tIHVzZXIgbWVtb3J5IGFyZWEgdG8gcGFja2V0IG1lbW9yeSBhcmVhIChQTUEpCisgICogQHBhcmFtICAgVVNCeDogVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gICBwYlVzckJ1ZiBwb2ludGVyIHRvIHVzZXIgbWVtb3J5IGFyZWEuCisgICogQHBhcmFtICAgd1BNQUJ1ZkFkZHIgYWRkcmVzcyBpbnRvIFBNQS4KKyAgKiBAcGFyYW0gICB3TkJ5dGVzOiBuby4gb2YgYnl0ZXMgdG8gYmUgY29waWVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBVU0JfUmVhZFBNQShVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCAqcGJVc3JCdWYsIHVpbnQxNl90IHdQTUFCdWZBZGRyLCB1aW50MTZfdCB3TkJ5dGVzKQoreworICB1aW50MzJfdCBuID0gKHVpbnQzMl90KXdOQnl0ZXMgPj4gMTsKKyAgdWludDMyX3QgQmFzZUFkZHIgPSAodWludDMyX3QpVVNCeDsKKyAgdWludDMyX3QgaSwgdGVtcDsKKyAgdWludDE2X3QgKnBkd1ZhbDsKKyAgdWludDhfdCAqcEJ1ZiA9IHBiVXNyQnVmOworCisgIHBkd1ZhbCA9ICh1aW50MTZfdCAqKShCYXNlQWRkciArIDB4NDAwVSArICgodWludDMyX3Qpd1BNQUJ1ZkFkZHIgKiBQTUFfQUNDRVNTKSk7CisKKyAgZm9yIChpID0gbjsgaSAhPSAwVTsgaS0tKQorICB7CisgICAgdGVtcCA9ICpwZHdWYWw7CisgICAgcGR3VmFsKys7CisgICAgKnBCdWYgPSAodWludDhfdCkoKHRlbXAgPj4gMCkgJiAweEZGVSk7CisgICAgcEJ1ZisrOworICAgICpwQnVmID0gKHVpbnQ4X3QpKCh0ZW1wID4+IDgpICYgMHhGRlUpOworICAgIHBCdWYrKzsKKworI2lmIFBNQV9BQ0NFU1MgPiAxVQorICAgIHBkd1ZhbCsrOworI2VuZGlmCisgIH0KKworICBpZiAoKHdOQnl0ZXMgJSAyVSkgIT0gMFUpCisgIHsKKyAgICB0ZW1wID0gKnBkd1ZhbDsKKyAgICAqcEJ1ZiA9ICh1aW50OF90KSgodGVtcCA+PiAwKSAmIDB4RkZVKTsKKyAgfQorfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLworI2VuZGlmIC8qIGRlZmluZWQgKEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQpIHx8IGRlZmluZWQgKEhBTF9IQ0RfTU9EVUxFX0VOQUJMRUQpICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJsMHh4X2xsX3V0aWxzLmMgYi9TcmMvc3RtMzJsMHh4X2xsX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5YzY3MwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmwweHhfbGxfdXRpbHMuYwpAQCAtMCwwICsxLDU2NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMybDB4eF9sbF91dGlscy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBVVElMUyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0KGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJsMHh4X2xsX3JjYy5oIgorI2luY2x1ZGUgInN0bTMybDB4eF9sbF91dGlscy5oIgorI2luY2x1ZGUgInN0bTMybDB4eF9sbF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJzdG0zMmwweHhfbGxfcHdyLmgiCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVVElMU19MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVVElMU19MTF9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFVUSUxTX01BWF9GUkVRVUVOQ1lfU0NBTEUxICAoKHVpbnQzMl90KTMyMDAwMDAwVSkgICAgICAgIC8qITwgTWF4aW11bSBmcmVxdWVuY3kgZm9yIHN5c3RlbSBjbG9jayBhdCBwb3dlciBzY2FsZTEsIGluIEh6ICovCisjZGVmaW5lIFVUSUxTX01BWF9GUkVRVUVOQ1lfU0NBTEUyICAoKHVpbnQzMl90KTE2MDAwMDAwVSkgICAgICAgIC8qITwgTWF4aW11bSBmcmVxdWVuY3kgZm9yIHN5c3RlbSBjbG9jayBhdCBwb3dlciBzY2FsZTIsIGluIEh6ICovCisjZGVmaW5lIFVUSUxTX01BWF9GUkVRVUVOQ1lfU0NBTEUzICAoKHVpbnQzMl90KTQxOTQzMDRVKSAgICAgICAgIC8qITwgTWF4aW11bSBmcmVxdWVuY3kgZm9yIHN5c3RlbSBjbG9jayBhdCBwb3dlciBzY2FsZTMsIGluIEh6ICovCisKKy8qIERlZmluZXMgdXNlZCBmb3IgUExMIHJhbmdlICovCisjZGVmaW5lIFVUSUxTX1BMTFZDT19PVVRQVVRfU0NBTEUxICAoKHVpbnQzMl90KTk2MDAwMDAwVSkgICAgICAgIC8qITwgRnJlcXVlbmN5IG1heCBmb3IgUExMVkNPIG91dHB1dCBhdCBwb3dlciBzY2FsZTEsIGluIEh6ICAqLworI2RlZmluZSBVVElMU19QTExWQ09fT1VUUFVUX1NDQUxFMiAgKCh1aW50MzJfdCk0ODAwMDAwMFUpICAgICAgICAvKiE8IEZyZXF1ZW5jeSBtYXggZm9yIFBMTFZDTyBvdXRwdXQgYXQgcG93ZXIgc2NhbGUyLCBpbiBIeiAgKi8KKyNkZWZpbmUgVVRJTFNfUExMVkNPX09VVFBVVF9TQ0FMRTMgICgodWludDMyX3QpMjQwMDAwMDBVKSAgICAgICAgLyohPCBGcmVxdWVuY3kgbWF4IGZvciBQTExWQ08gb3V0cHV0IGF0IHBvd2VyIHNjYWxlMywgaW4gSHogICovCisKKy8qIERlZmluZXMgdXNlZCBmb3IgSFNFIHJhbmdlICovCisjZGVmaW5lIFVUSUxTX0hTRV9GUkVRVUVOQ1lfTUlOICAgICAoKHVpbnQzMl90KTEwMDAwMDBVKSAgICAgICAgIC8qITwgRnJlcXVlbmN5IG1pbiBmb3IgSFNFIGZyZXF1ZW5jeSwgaW4gSHogICAqLworI2RlZmluZSBVVElMU19IU0VfRlJFUVVFTkNZX01BWCAgICAgKCh1aW50MzJfdCkyNDAwMDAwMFUpICAgICAgICAvKiE8IEZyZXF1ZW5jeSBtYXggZm9yIEhTRSBmcmVxdWVuY3ksIGluIEh6ICAgKi8KKworLyogRGVmaW5lcyB1c2VkIGZvciBGTEFTSCBsYXRlbmN5IGFjY29yZGluZyB0byBIQ0xLIEZyZXF1ZW5jeSAqLworI2RlZmluZSBVVElMU19TQ0FMRTFfTEFURU5DWTFfRlJFUSAgKCh1aW50MzJfdCkxNjAwMDAwMFUpICAgICAgICAvKiE8IEhDTEsgZnJlcXVlbmN5IHRvIHNldCBGTEFTSCBsYXRlbmN5IDEgaW4gcG93ZXIgc2NhbGUgMSAqLworI2RlZmluZSBVVElMU19TQ0FMRTJfTEFURU5DWTFfRlJFUSAgKCh1aW50MzJfdCk4MDAwMDAwVSkgICAgICAgICAvKiE8IEhDTEsgZnJlcXVlbmN5IHRvIHNldCBGTEFTSCBsYXRlbmN5IDEgaW4gcG93ZXIgc2NhbGUgMiAqLworI2RlZmluZSBVVElMU19TQ0FMRTNfTEFURU5DWTFfRlJFUSAgKCh1aW50MzJfdCkyMDAwMDAwVSkgICAgICAgICAvKiE8IEhDTEsgZnJlcXVlbmN5IHRvIHNldCBGTEFTSCBsYXRlbmN5IDEgaW4gcG93ZXIgc2NhbGUgMyAqLworLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9VVElMU19TWVNDTEtfRElWKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl8xKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzQpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl84KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMTYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzY0KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMjU2KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzUxMikpCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfQVBCMV9ESVYoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIxX0RJVl8xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMV9ESVZfMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjFfRElWXzQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIxX0RJVl84KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMV9ESVZfMTYpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX0FQQjJfRElWKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMl9ESVZfMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjJfRElWXzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIyX0RJVl80KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMl9ESVZfOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjJfRElWXzE2KSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExNVUxfVkFMVUUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfTVVMXzMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMX01VTF80KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTF9NVUxfNikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfTVVMXzgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMX01VTF8xMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfTVVMXzE2KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTF9NVUxfMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMX01VTF8zMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfTVVMXzQ4KSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExESVZfVkFMVUUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExfRElWXzIpIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMX0RJVl8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTF9ESVZfNCkpCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfUExMVkNPX09VVFBVVChfX1ZBTFVFX18pICgoTExfUFdSX0dldFJlZ3VsVm9sdGFnZVNjYWxpbmcoKSA9PSBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMSkgPyAoKF9fVkFMVUVfXykgPD0gVVRJTFNfUExMVkNPX09VVFBVVF9TQ0FMRTEpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMTF9QV1JfR2V0UmVndWxWb2x0YWdlU2NhbGluZygpID09IExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUyKSA/ICgoX19WQUxVRV9fKSA8PSBVVElMU19QTExWQ09fT1VUUFVUX1NDQUxFMikgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPD0gVVRJTFNfUExMVkNPX09VVFBVVF9TQ0FMRTMpKSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExfRlJFUVVFTkNZKF9fVkFMVUVfXykgKChMTF9QV1JfR2V0UmVndWxWb2x0YWdlU2NhbGluZygpID09IExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUxKSA/ICgoX19WQUxVRV9fKSA8PSBVVElMU19NQVhfRlJFUVVFTkNZX1NDQUxFMSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExMX1BXUl9HZXRSZWd1bFZvbHRhZ2VTY2FsaW5nKCkgPT0gTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTIpID8gKChfX1ZBTFVFX18pIDw9IFVUSUxTX01BWF9GUkVRVUVOQ1lfU0NBTEUyKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA8PSBVVElMU19NQVhfRlJFUVVFTkNZX1NDQUxFMykpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX0hTRV9CWVBBU1MoX19TVEFURV9fKSAoKChfX1NUQVRFX18pID09IExMX1VUSUxTX0hTRUJZUEFTU19PTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19TVEFURV9fKSA9PSBMTF9VVElMU19IU0VCWVBBU1NfT0ZGKSkKKworI2RlZmluZSBJU19MTF9VVElMU19IU0VfRlJFUVVFTkNZKF9fRlJFUVVFTkNZX18pICgoKF9fRlJFUVVFTkNZX18pID49IFVUSUxTX0hTRV9GUkVRVUVOQ1lfTUlOKSAmJiAoKF9fRlJFUVVFTkNZX18pIDw9IFVUSUxTX0hTRV9GUkVRVUVOQ1lfTUFYKSkKKy8qKgorICAqIEB9CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9Qcml2YXRlX0Z1bmN0aW9ucyBVVElMUyBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdWludDMyX3QgICAgVVRJTFNfR2V0UExMT3V0cHV0RnJlcXVlbmN5KHVpbnQzMl90IFBMTF9JbnB1dEZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIFVUSUxTX1NldEZsYXNoTGF0ZW5jeSh1aW50MzJfdCBGcmVxdWVuY3kpOworc3RhdGljIEVycm9yU3RhdHVzIFVUSUxTX0VuYWJsZVBMTEFuZFN3aXRjaFN5c3RlbSh1aW50MzJfdCBTWVNDTEtfRnJlcXVlbmN5LCBMTF9VVElMU19DbGtJbml0VHlwZURlZiAqVVRJTFNfQ2xrSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgVVRJTFNfUExMX0lzQnVzeSh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVUSUxTX0xMX0VGX0RFTEFZCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIENvcnRleC1NIFN5c1RpY2sgc291cmNlIHRvIGhhdmUgMW1zIHRpbWUgYmFzZS4KKyAgKiBAbm90ZSAgIFdoZW4gYSBSVE9TIGlzIHVzZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBTeXN0aWNrCisgICogICAgICAgICBjb25maWd1cmF0aW9uIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgZm9yIGEgZGVsYXkgdXNlIHJhdGhlciBvc0RlbGF5IFJUT1Mgc2VydmljZS4KKyAgKiBAcGFyYW0gIEhDTEtGcmVxdWVuY3kgSENMSyBmcmVxdWVuY3kgaW4gSHoKKyAgKiBAbm90ZSAgIEhDTEsgZnJlcXVlbmN5IGNhbiBiZSBjYWxjdWxhdGVkIHRoYW5rcyB0byBSQ0MgaGVscGVyIG1hY3JvIG9yIGZ1bmN0aW9uIEByZWYgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfSW5pdDFtc1RpY2sodWludDMyX3QgSENMS0ZyZXF1ZW5jeSkKK3sKKyAgLyogVXNlIGZyZXF1ZW5jeSBwcm92aWRlZCBpbiBhcmd1bWVudCAqLworICBMTF9Jbml0VGljayhIQ0xLRnJlcXVlbmN5LCAxMDAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhY2N1cmF0ZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiYXNlZAorICAqICAgICAgICAgb24gU3lzVGljayBjb3VudGVyIGZsYWcKKyAgKiBAbm90ZSAgIFdoZW4gYSBSVE9TIGlzIHVzZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIHVzaW5nIGJsb2NraW5nIGRlbGF5CisgICogICAgICAgICBhbmQgdXNlIHJhdGhlciBvc0RlbGF5IHNlcnZpY2UuCisgICogQG5vdGUgICBUbyByZXNwZWN0IDFtcyB0aW1lYmFzZSwgdXNlciBzaG91bGQgY2FsbCBAcmVmIExMX0luaXQxbXNUaWNrIGZ1bmN0aW9uIHdoaWNoCisgICogICAgICAgICB3aWxsIGNvbmZpZ3VyZSBTeXN0aWNrIHRvIDFtcworICAqIEBwYXJhbSAgRGVsYXkgc3BlY2lmaWVzIHRoZSBkZWxheSB0aW1lIGxlbmd0aCwgaW4gbWlsbGlzZWNvbmRzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9tRGVsYXkodWludDMyX3QgRGVsYXkpCit7CisgIF9fSU8gdWludDMyX3QgIHRtcCA9IFN5c1RpY2stPkNUUkw7ICAvKiBDbGVhciB0aGUgQ09VTlRGTEFHIGZpcnN0ICovCisgIC8qIEFkZCB0aGlzIGNvZGUgdG8gaW5kaWNhdGUgdGhhdCBsb2NhbCB2YXJpYWJsZSBpcyBub3QgdXNlZCAqLworICAoKHZvaWQpdG1wKTsKKworICAvKiBBZGQgYSBwZXJpb2QgdG8gZ3VhcmFudHkgbWluaW11bSB3YWl0ICovCisgIGlmIChEZWxheSA8IExMX01BWF9ERUxBWSkKKyAgeworICAgIERlbGF5Kys7CisgIH0KKworICB3aGlsZSAoRGVsYXkpCisgIHsKKyAgICBpZiAoKFN5c1RpY2stPkNUUkwgJiBTeXNUaWNrX0NUUkxfQ09VTlRGTEFHX01zaykgIT0gMFUpCisgICAgeworICAgICAgRGVsYXktLTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVUSUxTX0VGX1NZU1RFTQorICAqICBAYnJpZWYgICAgU3lzdGVtIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAjIyMjIyBTeXN0ZW0gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgICAgU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNlcyBjbG9ja3MgY29uZmlndXJhdGlvbgorCisgICAgICAgICAoKykgVGhlIG1heGltdW0gZnJlcXVlbmN5IG9mIHRoZSBTWVNDTEssIEhDTEssIFBDTEsxIGFuZCBQQ0xLMiBpcyAzMjAwMDAwMCBIei4KKyAgQGVuZHZlcmJhdGltCisgIEBpbnRlcm5hbAorICAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHZvbHRhZ2UgcmFuZ2UsIHRoZSBtYXhpbXVtIGZyZXF1ZW5jeSBzaG91bGQgYmUKKyAgICAgICAgICAgICBhZGFwdGVkIGFjY29yZGluZ2x5OgorICAgICAgICAgICAgICgrKykgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgKCsrKSB8ICBXYWl0IHN0YXRlcyAgfCAgICAgICAgICAgICAgICBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoTUh6KSAgICAgIHwKKyAgICAgICAgICAgICAoKyspIHwgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgICAgICgrKykgfCAgIChMYXRlbmN5KSAgIHwgICAgICAgICAgICB2b2x0YWdlIHJhbmdlICAgICAgIHwgdm9sdGFnZSByYW5nZSB8CisgICAgICAgICAgICAgKCsrKSB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgIDEuNjUgViAtIDMuNiBWICAgICAgfCAyLjAgViAtIDMuNiBWIHwKKyAgICAgICAgICAgICAoKyspIHwgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgICAgICgrKykgfCAgICAgICAgICAgICAgIHwgIFZDT1JFID0gMS4yIFYgfCBWQ09SRSA9IDEuNSBWIHwgVkNPUkUgPSAxLjggViB8CisgICAgICAgICAgICAgKCsrKSB8LS0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgICAgICAoKyspIHwwV1MoMUNQVSBjeWNsZSl8MCA8IEhDTEsgPD0gMiAgIHwwIDwgSENMSyA8PSA4ICB8MCA8IEhDTEsgPD0gMTYgfAorICAgICAgICAgICAgICgrKykgfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSB8MVdTKDJDUFUgY3ljbGUpfDIgPCBIQ0xLIDw9IDQgICB8OCA8IEhDTEsgPD0gMTYgfDE2IDwgSENMSyA8PSAzMnwKKyAgICAgICAgICAgICAoKyspICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICBAZW5kaW50ZXJuYWwKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gc2V0cyBkaXJlY3RseSBTeXN0ZW1Db3JlQ2xvY2sgQ01TSVMgdmFyaWFibGUuCisgICogQG5vdGUgICBWYXJpYWJsZSBjYW4gYmUgY2FsY3VsYXRlZCBhbHNvIHRocm91Z2ggU3lzdGVtQ29yZUNsb2NrVXBkYXRlIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgSENMS0ZyZXF1ZW5jeSBIQ0xLIGZyZXF1ZW5jeSBpbiBIeiAoY2FuIGJlIGNhbGN1bGF0ZWQgdGhhbmtzIHRvIFJDQyBoZWxwZXIgbWFjcm8pCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1NldFN5c3RlbUNvcmVDbG9jayh1aW50MzJfdCBIQ0xLRnJlcXVlbmN5KQoreworICAvKiBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBTeXN0ZW1Db3JlQ2xvY2sgPSBIQ0xLRnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBzeXN0ZW0gY2xvY2sgd2l0aCBIU0kgYXMgY2xvY2sgc291cmNlIG9mIHRoZSBQTEwKKyAgKiBAbm90ZSAgIFRoZSBhcHBsaWNhdGlvbiBuZWVkIHRvIGVuc3VyZSB0aGF0IFBMTCBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKyAgKiAgICAgICAgIC0gUExMIG91dHB1dCBmcmVxdWVuY3kgPSAoKEhTSSBmcmVxdWVuY3kgKiBQTExNdWwpIC8gUExMRGl2KQorICAqICAgICAgICAgLSBQTExNdWw6IFRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBtdXN0IHNldCBjb3JyZWN0bHkgdGhlIFBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgdG8gZW5zdXJlCisgICogICAgICAgICAgIC0gUExMVkNPIGRvZXMgbm90IGV4Y2VlZCA5NiBNSHogd2hlbiB0aGUgcHJvZHVjdCBpcyBpbiByYW5nZSAxLAorICAqICAgICAgICAgICAtIFBMTFZDTyBkb2VzIG5vdCBleGNlZWQgNDggTUh6IHdoZW4gdGhlIHByb2R1Y3QgaXMgaW4gcmFuZ2UgMiwKKyAgKiAgICAgICAgICAgLSBQTExWQ08gZG9lcyBub3QgZXhjZWVkIDI0IE1IeiB3aGVuIHRoZSBwcm9kdWN0IGlzIGluIHJhbmdlIDMKKyAgKiBAbm90ZSAgIEZMQVNIIGxhdGVuY3kgY2FuIGJlIG1vZGlmaWVkIHRocm91Z2ggdGhpcyBmdW5jdGlvbi4gCisgICogQHBhcmFtICBVVElMU19QTExJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUExMLgorICAqIEBwYXJhbSAgVVRJTFNfQ2xrSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VVElMU19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEJVUyBwcmVzY2FsZXJzLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBNYXggZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gZG9uZQorICAqICAgICAgICAgIC0gRVJST1I6IE1heCBmcmVxdWVuY3kgY29uZmlndXJhdGlvbiBub3QgZG9uZQorICAqLworRXJyb3JTdGF0dXMgTExfUExMX0NvbmZpZ1N5c3RlbUNsb2NrX0hTSShMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIHVpbnQzMl90IHBsbGZyZXEgPSAwVTsKKworICAvKiBDaGVjayBpZiBvbmUgb2YgdGhlIFBMTCBpcyBlbmFibGVkICovCisgIGlmIChVVElMU19QTExfSXNCdXN5KCkgPT0gU1VDQ0VTUykKKyAgeworICAgIC8qIENhbGN1bGF0ZSB0aGUgbmV3IFBMTCBvdXRwdXQgZnJlcXVlbmN5ICovCisgICAgcGxsZnJlcSA9IFVUSUxTX0dldFBMTE91dHB1dEZyZXF1ZW5jeShIU0lfVkFMVUUsIFVUSUxTX1BMTEluaXRTdHJ1Y3QpOworCisgICAgLyogRW5hYmxlIEhTSSBpZiBub3QgZW5hYmxlZCAqLworICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSAhPSAxVSkKKyAgICB7CisgICAgICBMTF9SQ0NfSFNJX0VuYWJsZSgpOworICAgICAgd2hpbGUgKExMX1JDQ19IU0lfSXNSZWFkeSgpICE9IDFVKQorICAgICAgeworICAgICAgICAvKiBXYWl0IGZvciBIU0kgcmVhZHkgKi8KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgUExMICovCisgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKExMX1JDQ19QTExTT1VSQ0VfSFNJLCBVVElMU19QTExJbml0U3RydWN0LT5QTExNdWwsIFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlBMTERpdik7CisKKyAgICAvKiBFbmFibGUgUExMIGFuZCBzd2l0Y2ggc3lzdGVtIGNsb2NrIHRvIFBMTCAqLworICAgIHN0YXR1cyA9IFVUSUxTX0VuYWJsZVBMTEFuZFN3aXRjaFN5c3RlbShwbGxmcmVxLCBVVElMU19DbGtJbml0U3RydWN0KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDdXJyZW50IFBMTCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgc3lzdGVtIGNsb2NrIHdpdGggSFNFIGFzIGNsb2NrIHNvdXJjZSBvZiB0aGUgUExMCisgICogQG5vdGUgICBUaGUgYXBwbGljYXRpb24gbmVlZCB0byBlbnN1cmUgdGhhdCBQTEwgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICogICAgICAgICAtIFBMTCBvdXRwdXQgZnJlcXVlbmN5ID0gKChIU0UgZnJlcXVlbmN5ICogUExMTXVsKSAvIFBMTERpdikKKyAgKiAgICAgICAgIC0gUExMTXVsOiBUaGUgYXBwbGljYXRpb24gc29mdHdhcmUgbXVzdCBzZXQgY29ycmVjdGx5IHRoZSBQTEwgbXVsdGlwbGljYXRpb24gZmFjdG9yIHRvIHRvIGVuc3VyZQorICAqICAgICAgICAgICAtIFBMTFZDTyBkb2VzIG5vdCBleGNlZWQgOTYgTUh6IHdoZW4gdGhlIHByb2R1Y3QgaXMgaW4gcmFuZ2UgMSwKKyAgKiAgICAgICAgICAgLSBQTExWQ08gZG9lcyBub3QgZXhjZWVkIDQ4IE1IeiB3aGVuIHRoZSBwcm9kdWN0IGlzIGluIHJhbmdlIDIsCisgICogICAgICAgICAgIC0gUExMVkNPIGRvZXMgbm90IGV4Y2VlZCAyNCBNSHogd2hlbiB0aGUgcHJvZHVjdCBpcyBpbiByYW5nZSAzCisgICogQG5vdGUgICBGTEFTSCBsYXRlbmN5IGNhbiBiZSBtb2RpZmllZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uIAorICAqIEBwYXJhbSAgSFNFRnJlcXVlbmN5IFZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAxMDAwMDAwIGFuZCBNYXhfRGF0YSA9IDI0MDAwMDAwCisgICogQHBhcmFtICBIU0VCeXBhc3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19IU0VCWVBBU1NfT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19IU0VCWVBBU1NfT0ZGCisgICogQHBhcmFtICBVVElMU19QTExJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUExMLgorICAqIEBwYXJhbSAgVVRJTFNfQ2xrSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VVElMU19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEJVUyBwcmVzY2FsZXJzLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBNYXggZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gZG9uZQorICAqICAgICAgICAgIC0gRVJST1I6IE1heCBmcmVxdWVuY3kgY29uZmlndXJhdGlvbiBub3QgZG9uZQorICAqLworRXJyb3JTdGF0dXMgTExfUExMX0NvbmZpZ1N5c3RlbUNsb2NrX0hTRSh1aW50MzJfdCBIU0VGcmVxdWVuY3ksIHVpbnQzMl90IEhTRUJ5cGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QsIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICB1aW50MzJfdCBwbGxmcmVxID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX0hTRV9GUkVRVUVOQ1koSFNFRnJlcXVlbmN5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19IU0VfQllQQVNTKEhTRUJ5cGFzcykpOworCisgIC8qIENoZWNrIGlmIG9uZSBvZiB0aGUgUExMIGlzIGVuYWJsZWQgKi8KKyAgaWYgKFVUSUxTX1BMTF9Jc0J1c3koKSA9PSBTVUNDRVNTKQorICB7CisgICAgLyogQ2FsY3VsYXRlIHRoZSBuZXcgUExMIG91dHB1dCBmcmVxdWVuY3kgKi8KKyAgICBwbGxmcmVxID0gVVRJTFNfR2V0UExMT3V0cHV0RnJlcXVlbmN5KEhTRUZyZXF1ZW5jeSwgVVRJTFNfUExMSW5pdFN0cnVjdCk7CisKKyAgICAvKiBFbmFibGUgSFNFIGlmIG5vdCBlbmFibGVkICovCisgICAgaWYgKExMX1JDQ19IU0VfSXNSZWFkeSgpICE9IDFVKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIG5lZWQgdG8gZW5hYmxlIEhTRSBieXBhc3MgZmVhdHVyZSBvciBub3QgKi8KKyAgICAgIGlmIChIU0VCeXBhc3MgPT0gTExfVVRJTFNfSFNFQllQQVNTX09OKQorICAgICAgeworICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZUJ5cGFzcygpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3MoKTsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIEhTRSAqLworICAgICAgTExfUkNDX0hTRV9FbmFibGUoKTsKKyAgICAgIHdoaWxlIChMTF9SQ0NfSFNFX0lzUmVhZHkoKSAhPSAxVSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCBmb3IgSFNFIHJlYWR5ICovCisgICAgICB9CisgICAgfQorCisgICAgICAvKiBDb25maWd1cmUgUExMICovCisgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVMoTExfUkNDX1BMTFNPVVJDRV9IU0UsIFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlBMTE11bCwgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMRGl2KTsKKworICAgIC8qIEVuYWJsZSBQTEwgYW5kIHN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMICovCisgICAgc3RhdHVzID0gVVRJTFNfRW5hYmxlUExMQW5kU3dpdGNoU3lzdGVtKHBsbGZyZXEsIFVUSUxTX0Nsa0luaXRTdHJ1Y3QpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEN1cnJlbnQgUExMIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBVcGRhdGUgbnVtYmVyIG9mIEZsYXNoIHdhaXQgc3RhdGVzIGluIGxpbmUgd2l0aCBuZXcgZnJlcXVlbmN5IGFuZCBjdXJyZW50CisgICAgICAgICAgICB2b2x0YWdlIHJhbmdlLgorICAqIEBwYXJhbSAgRnJlcXVlbmN5ICBIQ0xLIGZyZXF1ZW5jeQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBMYXRlbmN5IGhhcyBiZWVuIG1vZGlmaWVkCisgICogICAgICAgICAgLSBFUlJPUjogTGF0ZW5jeSBjYW5ub3QgYmUgbW9kaWZpZWQKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBVVElMU19TZXRGbGFzaExhdGVuY3kodWludDMyX3QgRnJlcXVlbmN5KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIHVpbnQzMl90IGxhdGVuY3kgPSBMTF9GTEFTSF9MQVRFTkNZXzA7ICAvKiBkZWZhdWx0IHZhbHVlIDBXUyAqLworCisgIC8qIEZyZXF1ZW5jeSBjYW5ub3QgYmUgZXF1YWwgdG8gMCAqLworICBpZiAoRnJlcXVlbmN5ID09IDBVKQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKExMX1BXUl9HZXRSZWd1bFZvbHRhZ2VTY2FsaW5nKCkgPT0gTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTEpCisgICAgeworICAgICAgaWYgKEZyZXF1ZW5jeSA+IFVUSUxTX1NDQUxFMV9MQVRFTkNZMV9GUkVRKQorICAgICAgeworICAgICAgICAvKiAxNiA8IEhDTEsgPD0gMzIgPT4gMVdTICgyIENQVSBjeWNsZXMpICovCisgICAgICAgIGxhdGVuY3kgPSBMTF9GTEFTSF9MQVRFTkNZXzE7CisgICAgICB9CisgICAgICAvKiBlbHNlIEhDTEsgPCAxNk1IeiBkZWZhdWx0IExMX0ZMQVNIX0xBVEVOQ1lfMCAwV1MgKi8KKyAgICAgfQorICAgIGVsc2UgaWYgKExMX1BXUl9HZXRSZWd1bFZvbHRhZ2VTY2FsaW5nKCkgPT0gTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTIpCisgICAgeworICAgICAgaWYgKEZyZXF1ZW5jeSA+IFVUSUxTX1NDQUxFMl9MQVRFTkNZMV9GUkVRKQorICAgICAgeworICAgICAgICAvKiA4IDwgSENMSyA8PSAxNiA9PiAxV1MgKDIgQ1BVIGN5Y2xlcykgKi8KKyAgICAgICAgbGF0ZW5jeSA9IExMX0ZMQVNIX0xBVEVOQ1lfMTsKKyAgICAgIH0KKyAgICAgIC8qIGVsc2UgSENMSyA8IDhNSHogZGVmYXVsdCBMTF9GTEFTSF9MQVRFTkNZXzAgMFdTICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoRnJlcXVlbmN5ID4gVVRJTFNfU0NBTEUzX0xBVEVOQ1kxX0ZSRVEpCisgICAgICB7CisgICAgICAgIC8qIDIgPCBIQ0xLIDw9IDQgPT4gMVdTICgyIENQVSBjeWNsZXMpICovCisgICAgICAgIGxhdGVuY3kgPSBMTF9GTEFTSF9MQVRFTkNZXzE7CisgICAgICB9CisgICAgICAvKiBlbHNlIEhDTEsgPCA0TUh6IGRlZmF1bHQgTExfRkxBU0hfTEFURU5DWV8wIDBXUyAqLworICAgIH0KKworICAgIExMX0ZMQVNIX1NldExhdGVuY3kobGF0ZW5jeSk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGlzIHRha2VuIGludG8gYWNjb3VudCB0byBhY2Nlc3MgdGhlIEZsYXNoCisgICAgICAgbWVtb3J5IGJ5IHJlYWRpbmcgdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLworICAgIGlmIChMTF9GTEFTSF9HZXRMYXRlbmN5KCkgIT0gbGF0ZW5jeSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBGdW5jdGlvbiB0byBjaGVjayB0aGF0IFBMTCBjYW4gYmUgbW9kaWZpZWQKKyAgKiBAcGFyYW0gIFBMTF9JbnB1dEZyZXF1ZW5jeSAgUExMIGlucHV0IGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHBhcmFtICBVVElMU19QTExJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUExMLgorICAqIEByZXR2YWwgUExMIG91dHB1dCBmcmVxdWVuY3kgKGluIEh6KQorICAqLworc3RhdGljIHVpbnQzMl90IFVUSUxTX0dldFBMTE91dHB1dEZyZXF1ZW5jeSh1aW50MzJfdCBQTExfSW5wdXRGcmVxdWVuY3ksIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmICpVVElMU19QTExJbml0U3RydWN0KQoreworICB1aW50MzJfdCBwbGxmcmVxID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX1BMTE1VTF9WQUxVRShVVElMU19QTExJbml0U3RydWN0LT5QTExNdWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX1BMTERJVl9WQUxVRShVVElMU19QTExJbml0U3RydWN0LT5QTExEaXYpKTsKKworICAvKiBDaGVjayBkaWZmZXJlbnQgUExMIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIFJNICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgYXBwbGljYXRpb24gc29mdHdhcmUgbXVzdCBzZXQgY29ycmVjdGx5IHRoZSBQTEwgbXVsdGlwbGljYXRpb24gZmFjdG9yIHRvIGF2b2lkIGV4Y2VlZGluZworICAgICA5NiBNSHogYXMgUExMVkNPIHdoZW4gdGhlIHByb2R1Y3QgaXMgaW4gcmFuZ2UgMSwKKyAgICAgNDggTUh6IGFzIFBMTFZDTyB3aGVuIHRoZSBwcm9kdWN0IGlzIGluIHJhbmdlIDIsCisgICAgIDI0IE1IeiB3aGVuIHRoZSBwcm9kdWN0IGlzIGluIHJhbmdlIDMuICovCisgIHBsbGZyZXEgPSBQTExfSW5wdXRGcmVxdWVuY3kgKiAoUExMTXVsVGFibGVbVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTXVsID4+IFJDQ19DRkdSX1BMTE1VTF9Qb3NdKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX1BMTFZDT19PVVRQVVQocGxsZnJlcSkpOworCisgIC8qIFRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBtdXN0IHNldCBjb3JyZWN0bHkgdGhlIFBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgdG8gYXZvaWQgZXhjZWVkaW5nIAorICAgICBtYXhpbXVtIGZyZXF1ZW5jeSAzMjAwMDAwMCBpbiByYW5nZSAxICovCisgIHBsbGZyZXEgPSBwbGxmcmVxIC8gKChVVElMU19QTExJbml0U3RydWN0LT5QTExEaXYgPj4gUkNDX0NGR1JfUExMRElWX1BvcykrMVUpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfUExMX0ZSRVFVRU5DWShwbGxmcmVxKSk7CisKKyAgcmV0dXJuIHBsbGZyZXE7Cit9CisKKy8qKgorICAqIEBicmllZiAgRnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBQTEwgY2FuIGJlIG1vZGlmaWVkCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFBMTCBtb2RpZmljYXRpb24gY2FuIGJlIGRvbmUKKyAgKiAgICAgICAgICAtIEVSUk9SOiBQTEwgaXMgYnVzeQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIFVUSUxTX1BMTF9Jc0J1c3kodm9pZCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayBpZiBQTEwgaXMgYnVzeSovCisgIGlmIChMTF9SQ0NfUExMX0lzUmVhZHkoKSAhPSAwVSkKKyAgeworICAgIC8qIFBMTCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZ1bmN0aW9uIHRvIGVuYWJsZSBQTEwgYW5kIHN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMCisgICogQHBhcmFtICBTWVNDTEtfRnJlcXVlbmN5IFNZU0NMSyBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIFVUSUxTX0Nsa0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBCVVMgcHJlc2NhbGVycy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTm8gcHJvYmxlbSB0byBzd2l0Y2ggc3lzdGVtIHRvIFBMTAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gdG8gc3dpdGNoIHN5c3RlbSB0byBQTEwKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBVVElMU19FbmFibGVQTExBbmRTd2l0Y2hTeXN0ZW0odWludDMyX3QgU1lTQ0xLX0ZyZXF1ZW5jeSwgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIHVpbnQzMl90IGhjbGtfZnJlcXVlbmN5ID0gMFU7CisKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX1NZU0NMS19ESVYoVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfQVBCMV9ESVYoVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX0FQQjJfRElWKFVUSUxTX0Nsa0luaXRTdHJ1Y3QtPkFQQjJDTEtEaXZpZGVyKSk7CisKKyAgLyogQ2FsY3VsYXRlIEhDTEsgZnJlcXVlbmN5ICovCisgIGhjbGtfZnJlcXVlbmN5ID0gX19MTF9SQ0NfQ0FMQ19IQ0xLX0ZSRVEoU1lTQ0xLX0ZyZXF1ZW5jeSwgVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlcik7CisKKyAgLyogSW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGJlY2F1c2Ugb2YgaGlnaGVyIENQVSBmcmVxdWVuY3kgKi8KKyAgaWYgKFN5c3RlbUNvcmVDbG9jayA8IGhjbGtfZnJlcXVlbmN5KQorICB7CisgICAgLyogU2V0IEZMQVNIIGxhdGVuY3kgdG8gaGlnaGVzdCBsYXRlbmN5ICovCisgICAgc3RhdHVzID0gVVRJTFNfU2V0Rmxhc2hMYXRlbmN5KGhjbGtfZnJlcXVlbmN5KTsKKyAgfQorCisgIC8qIFVwZGF0ZSBzeXN0ZW0gY2xvY2sgY29uZmlndXJhdGlvbiAqLworICBpZiAoc3RhdHVzID09IFNVQ0NFU1MpCisgIHsKKyAgICAvKiBFbmFibGUgUExMICovCisgICAgTExfUkNDX1BMTF9FbmFibGUoKTsKKyAgICB3aGlsZSAoTExfUkNDX1BMTF9Jc1JlYWR5KCkgIT0gMVUpCisgICAgeworICAgICAgLyogV2FpdCBmb3IgUExMIHJlYWR5ICovCisgICAgfQorCisgICAgLyogU3lzY2xrIGFjdGl2YXRpb24gb24gdGhlIG1haW4gUExMICovCisgICAgTExfUkNDX1NldEFIQlByZXNjYWxlcihVVElMU19DbGtJbml0U3RydWN0LT5BSEJDTEtEaXZpZGVyKTsKKyAgICBMTF9SQ0NfU2V0U3lzQ2xrU291cmNlKExMX1JDQ19TWVNfQ0xLU09VUkNFX1BMTCk7CisgICAgd2hpbGUgKExMX1JDQ19HZXRTeXNDbGtTb3VyY2UoKSAhPSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfUExMKQorICAgIHsKKyAgICAgIC8qIFdhaXQgZm9yIHN5c3RlbSBjbG9jayBzd2l0Y2ggdG8gUExMICovCisgICAgfQorCisgICAgLyogU2V0IEFQQjEgJiBBUEIyIHByZXNjYWxlciovCisgICAgTExfUkNDX1NldEFQQjFQcmVzY2FsZXIoVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpOworICAgIExMX1JDQ19TZXRBUEIyUHJlc2NhbGVyKFVUSUxTX0Nsa0luaXRTdHJ1Y3QtPkFQQjJDTEtEaXZpZGVyKTsKKyAgfQorCisgIC8qIERlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyBiZWNhdXNlIG9mIGxvd2VyIENQVSBmcmVxdWVuY3kgKi8KKyAgaWYgKFN5c3RlbUNvcmVDbG9jayA+IGhjbGtfZnJlcXVlbmN5KQorICB7CisgICAgLyogU2V0IEZMQVNIIGxhdGVuY3kgdG8gbG93ZXN0IGxhdGVuY3kgKi8KKyAgICBzdGF0dXMgPSBVVElMU19TZXRGbGFzaExhdGVuY3koaGNsa19mcmVxdWVuY3kpOworICB9CisKKyAgLyogVXBkYXRlIFN5c3RlbUNvcmVDbG9jayB2YXJpYWJsZSAqLworICBpZiAoc3RhdHVzID09IFNVQ0NFU1MpCisgIHsKKyAgICBMTF9TZXRTeXN0ZW1Db3JlQ2xvY2soaGNsa19mcmVxdWVuY3kpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL19odG1yZXNjL21pbmktc3QuY3NzIGIvX2h0bXJlc2MvbWluaS1zdC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmYmMxNAotLS0gL2Rldi9udWxsCisrKyBiL19odG1yZXNjL21pbmktc3QuY3NzCkBAIC0wLDAgKzEsMTcwMCBAQAorQGNoYXJzZXQgIlVURi04IjsKKy8qCisgIEZsYXZvciBuYW1lOiBEZWZhdWx0IChtaW5pLWRlZmF1bHQpCisgIEF1dGhvcjogQW5nZWxvcyBDaGFsYXJpcyAoY2hhbGFyYW5nZWxvQGdtYWlsLmNvbSkKKyAgTWFpbnRhaW5lcnM6IEFuZ2Vsb3MgQ2hhbGFyaXMKKyAgbWluaS5jc3MgdmVyc2lvbjogdjMuMC4wLWFscGhhLjMKKyovCisvKgorICBCcm93c2VycyByZXNldHMgYW5kIGJhc2UgdHlwb2dyYXBoeS4KKyovCisvKiBDb3JlIG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1mb3JlLWNvbG9yOiAjMTExOworICAtLXNlY29uZGFyeS1mb3JlLWNvbG9yOiAjNDQ0OworICAtLWJhY2stY29sb3I6ICNmOGY4Zjg7CisgIC0tc2Vjb25kYXJ5LWJhY2stY29sb3I6ICNmMGYwZjA7CisgIC0tYmxvY2txdW90ZS1jb2xvcjogI2Y1N2MwMDsKKyAgLS1wcmUtY29sb3I6ICMxNTY1YzA7CisgIC0tYm9yZGVyLWNvbG9yOiAjYWFhOworICAtLXNlY29uZGFyeS1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0taGVhZGluZy1yYXRpbzogMS4xOTsKKyAgLS11bml2ZXJzYWwtbWFyZ2luOiAwLjVyZW07CisgIC0tdW5pdmVyc2FsLXBhZGRpbmc6IDAuMTI1cmVtOworICAtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzOiAwLjEyNXJlbTsKKyAgLS1hLWxpbmstY29sb3I6ICMwMjc3YmQ7CisgIC0tYS12aXNpdGVkLWNvbG9yOiAjMDE1NzliOyB9CisKK2h0bWwgeworICBmb250LXNpemU6IDE0cHg7IH0KKworYSwgYiwgZGVsLCBlbSwgaSwgaW5zLCBxLCBzcGFuLCBzdHJvbmcsIHUgeworICBmb250LXNpemU6IDFlbTsgfQorCitodG1sLCAqIHsKKyAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgUm9ib3RvLCBVYnVudHUsICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKKyAgbGluZS1oZWlnaHQ6IDEuNDsKKyAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyB9CisKKyogeworICBmb250LXNpemU6IDFyZW07IH0KKworYm9keSB7CisgIG1hcmdpbjogMDsKKyAgY29sb3I6IHZhcigtLWZvcmUtY29sb3IpOworICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrLWNvbG9yKTsgfQorCitkZXRhaWxzIHsKKyAgZGlzcGxheTogYmxvY2s7IH0KKworc3VtbWFyeSB7CisgIGRpc3BsYXk6IGxpc3QtaXRlbTsgfQorCithYmJyW3RpdGxlXSB7CisgIGJvcmRlci1ib3R0b206IG5vbmU7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDsgfQorCitpbnB1dCB7CisgIG92ZXJmbG93OiB2aXNpYmxlOyB9CisKK2ltZyB7CisgIG1heC13aWR0aDogMTAwJTsKKyAgaGVpZ2h0OiBhdXRvOyB9CisKK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgeworICBsaW5lLWhlaWdodDogMS4yOworICBtYXJnaW46IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBmb250LXdlaWdodDogNTAwOyB9CisgIGgxIHNtYWxsLCBoMiBzbWFsbCwgaDMgc21hbGwsIGg0IHNtYWxsLCBoNSBzbWFsbCwgaDYgc21hbGwgeworICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktZm9yZS1jb2xvcik7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgbWFyZ2luLXRvcDogLTAuMjVyZW07IH0KKworaDEgeworICBmb250LXNpemU6IGNhbGMoMXJlbSAqIHZhcigtLWhlYWRpbmctcmF0aW8pICogdmFyKC0taGVhZGluZy1yYXRpbykgKiB2YXIoLS1oZWFkaW5nLXJhdGlvKSk7IH0KKworaDIgeworICBmb250LXNpemU6IGNhbGMoMXJlbSAqIHZhcigtLWhlYWRpbmctcmF0aW8pICogdmFyKC0taGVhZGluZy1yYXRpbyk7ICk7CisgIGJhY2tncm91bmQ6IHZhcigtLW1hcmstYmFjay1jb2xvcik7CisgIGZvbnQtd2VpZ2h0OiA2MDA7CisgIHBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuMmVtIDAuNWVtOworICBjb2xvcjogdmFyKC0tbWFyay1mb3JlLWNvbG9yKTsgfQorCitoMyB7CisgIGZvbnQtc2l6ZTogY2FsYygxcmVtICogdmFyKC0taGVhZGluZy1yYXRpbykpOworICBwYWRkaW5nLWxlZnQ6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsgCisgIC8qIGJhY2tncm91bmQ6IHZhcigtLWJvcmRlci1jb2xvcik7ICovCisgICAgfQorCitoNCB7CisgIGZvbnQtc2l6ZTogMXJlbTspOworICBwYWRkaW5nLWxlZnQ6IGNhbGMoNCAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsgIH0KKworaDUgeworICBmb250LXNpemU6IDFyZW07IH0KKworaDYgeworICBmb250LXNpemU6IGNhbGMoMXJlbSAvIHZhcigtLWhlYWRpbmctcmF0aW8pKTsgfQorCitwIHsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsgfQorCitvbCwgdWwgeworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBwYWRkaW5nLWxlZnQ6IGNhbGMoNiAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsgfQorCitiLCBzdHJvbmcgeworICBmb250LXdlaWdodDogNzAwOyB9CisKK2hyIHsKKyAgYm94LXNpemluZzogY29udGVudC1ib3g7CisgIGJvcmRlcjogMDsKKyAgbGluZS1oZWlnaHQ6IDEuMjVlbTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgaGVpZ2h0OiAwLjA2MjVyZW07CisgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQsIHZhcigtLWJvcmRlci1jb2xvcikgMjAlLCB2YXIoLS1ib3JkZXItY29sb3IpIDgwJSwgdHJhbnNwYXJlbnQpOyB9CisKK2Jsb2NrcXVvdGUgeworICBkaXNwbGF5OiBibG9jazsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBmb250LXN0eWxlOiBpdGFsaWM7CisgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktZm9yZS1jb2xvcik7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIHBhZGRpbmc6IGNhbGMoMyAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOworICBib3JkZXItbGVmdDogMC4zNzVyZW0gc29saWQgdmFyKC0tYmxvY2txdW90ZS1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IDAgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSAwOyB9CisgIGJsb2NrcXVvdGU6YmVmb3JlIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiBjYWxjKDByZW0gLSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICAgIGxlZnQ6IDA7CisgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOiAzcmVtOworICAgIGZvbnQtd2VpZ2h0OiA3MDA7CisgICAgY29udGVudDogIlwyMDFjIjsKKyAgICBjb2xvcjogdmFyKC0tYmxvY2txdW90ZS1jb2xvcik7IH0KKyAgYmxvY2txdW90ZVtjaXRlXTphZnRlciB7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtc2l6ZTogMC43NWVtOworICAgIGZvbnQtd2VpZ2h0OiA3MDA7CisgICAgY29udGVudDogIlxh4oCUICAiIGF0dHIoY2l0ZSk7CisgICAgd2hpdGUtc3BhY2U6IHByZTsgfQorCitjb2RlLCBrYmQsIHByZSwgc2FtcCB7CisgIGZvbnQtZmFtaWx5OiBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZTsKKyAgZm9udC1zaXplOiAwLjg1ZW07IH0KKworY29kZSB7CisgIGJhY2tncm91bmQ6IHZhcigtLXNlY29uZGFyeS1iYWNrLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpIGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7IH0KKwora2JkIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tZm9yZS1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1iYWNrLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpIGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7IH0KKworcHJlIHsKKyAgb3ZlcmZsb3c6IGF1dG87CisgIGJhY2tncm91bmQ6IHZhcigtLXNlY29uZGFyeS1iYWNrLWNvbG9yKTsKKyAgcGFkZGluZzogY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLWxlZnQ6IDAuMjVyZW0gc29saWQgdmFyKC0tcHJlLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogMCB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIDA7IH0KKworc3VwLCBzdWIsIGNvZGUsIGtiZCB7CisgIGxpbmUtaGVpZ2h0OiAwOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsgfQorCitzbWFsbCwgc3VwLCBzdWIsIGZpZ2NhcHRpb24geworICBmb250LXNpemU6IDAuNzVlbTsgfQorCitzdXAgeworICB0b3A6IC0wLjVlbTsgfQorCitzdWIgeworICBib3R0b206IC0wLjI1ZW07IH0KKworZmlndXJlIHsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsgfQorCitmaWdjYXB0aW9uIHsKKyAgY29sb3I6IHZhcigtLXNlY29uZGFyeS1mb3JlLWNvbG9yKTsgfQorCithIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CisgIGE6bGluayB7CisgICAgY29sb3I6IHZhcigtLWEtbGluay1jb2xvcik7IH0KKyAgYTp2aXNpdGVkIHsKKyAgICBjb2xvcjogdmFyKC0tYS12aXNpdGVkLWNvbG9yKTsgfQorICBhOmhvdmVyLCBhOmZvY3VzIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgdGhlIGdyaWQgc3lzdGVtLCBjYXJkcyBhbmQgY29udGFpbmVycy4KKyovCisuY29udGFpbmVyIHsKKyAgbWFyZ2luOiAwIGF1dG87CisgIHBhZGRpbmc6IDAgY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisKKy5yb3cgeworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICBkaXNwbGF5OiBmbGV4OworICBmbGV4OiAwIDEgYXV0bzsKKyAgZmxleC1mbG93OiByb3cgd3JhcDsgfQorCisuY29sLXNtLAorW2NsYXNzXj0nY29sLXNtLSddLAorW2NsYXNzXj0nY29sLXNtLW9mZnNldC0nXSwKKy5yb3dbY2xhc3MqPSdjb2xzLXNtLSddID4gKiB7CisgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIGZsZXg6IDAgMCBhdXRvOworICBwYWRkaW5nOiAwIGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7IH0KKworLmNvbC1zbSwKKy5yb3cuY29scy1zbSA+ICogeworICBtYXgtd2lkdGg6IDEwMCU7CisgIGZsZXgtZ3JvdzogMTsKKyAgZmxleC1iYXNpczogMDsgfQorCisuY29sLXNtLTEsCisucm93LmNvbHMtc20tMSA+ICogeworICBtYXgtd2lkdGg6IDguMzMzMzMzMzMzMyU7CisgIGZsZXgtYmFzaXM6IDguMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS1vZmZzZXQtMCB7CisgIG1hcmdpbi1sZWZ0OiAwOyB9CisKKy5jb2wtc20tMiwKKy5yb3cuY29scy1zbS0yID4gKiB7CisgIG1heC13aWR0aDogMTYuNjY2NjY2NjY2NyU7CisgIGZsZXgtYmFzaXM6IDE2LjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tb2Zmc2V0LTEgeworICBtYXJnaW4tbGVmdDogOC4zMzMzMzMzMzMzJTsgfQorCisuY29sLXNtLTMsCisucm93LmNvbHMtc20tMyA+ICogeworICBtYXgtd2lkdGg6IDI1JTsKKyAgZmxleC1iYXNpczogMjUlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTIgeworICBtYXJnaW4tbGVmdDogMTYuNjY2NjY2NjY2NyU7IH0KKworLmNvbC1zbS00LAorLnJvdy5jb2xzLXNtLTQgPiAqIHsKKyAgbWF4LXdpZHRoOiAzMy4zMzMzMzMzMzMzJTsKKyAgZmxleC1iYXNpczogMzMuMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS1vZmZzZXQtMyB7CisgIG1hcmdpbi1sZWZ0OiAyNSU7IH0KKworLmNvbC1zbS01LAorLnJvdy5jb2xzLXNtLTUgPiAqIHsKKyAgbWF4LXdpZHRoOiA0MS42NjY2NjY2NjY3JTsKKyAgZmxleC1iYXNpczogNDEuNjY2NjY2NjY2NyU7IH0KKworLmNvbC1zbS1vZmZzZXQtNCB7CisgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTsgfQorCisuY29sLXNtLTYsCisucm93LmNvbHMtc20tNiA+ICogeworICBtYXgtd2lkdGg6IDUwJTsKKyAgZmxleC1iYXNpczogNTAlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTUgeworICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7IH0KKworLmNvbC1zbS03LAorLnJvdy5jb2xzLXNtLTcgPiAqIHsKKyAgbWF4LXdpZHRoOiA1OC4zMzMzMzMzMzMzJTsKKyAgZmxleC1iYXNpczogNTguMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS1vZmZzZXQtNiB7CisgIG1hcmdpbi1sZWZ0OiA1MCU7IH0KKworLmNvbC1zbS04LAorLnJvdy5jb2xzLXNtLTggPiAqIHsKKyAgbWF4LXdpZHRoOiA2Ni42NjY2NjY2NjY3JTsKKyAgZmxleC1iYXNpczogNjYuNjY2NjY2NjY2NyU7IH0KKworLmNvbC1zbS1vZmZzZXQtNyB7CisgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTsgfQorCisuY29sLXNtLTksCisucm93LmNvbHMtc20tOSA+ICogeworICBtYXgtd2lkdGg6IDc1JTsKKyAgZmxleC1iYXNpczogNzUlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTggeworICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7IH0KKworLmNvbC1zbS0xMCwKKy5yb3cuY29scy1zbS0xMCA+ICogeworICBtYXgtd2lkdGg6IDgzLjMzMzMzMzMzMzMlOworICBmbGV4LWJhc2lzOiA4My4zMzMzMzMzMzMzJTsgfQorCisuY29sLXNtLW9mZnNldC05IHsKKyAgbWFyZ2luLWxlZnQ6IDc1JTsgfQorCisuY29sLXNtLTExLAorLnJvdy5jb2xzLXNtLTExID4gKiB7CisgIG1heC13aWR0aDogOTEuNjY2NjY2NjY2NyU7CisgIGZsZXgtYmFzaXM6IDkxLjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tb2Zmc2V0LTEwIHsKKyAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tMTIsCisucm93LmNvbHMtc20tMTIgPiAqIHsKKyAgbWF4LXdpZHRoOiAxMDAlOworICBmbGV4LWJhc2lzOiAxMDAlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTExIHsKKyAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tbm9ybWFsIHsKKyAgb3JkZXI6IGluaXRpYWw7IH0KKworLmNvbC1zbS1maXJzdCB7CisgIG9yZGVyOiAtOTk5OyB9CisKKy5jb2wtc20tbGFzdCB7CisgIG9yZGVyOiA5OTk7IH0KKworQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIHsKKyAgLmNvbC1tZCwKKyAgW2NsYXNzXj0nY29sLW1kLSddLAorICBbY2xhc3NePSdjb2wtbWQtb2Zmc2V0LSddLAorICAucm93W2NsYXNzKj0nY29scy1tZC0nXSA+ICogeworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgZmxleDogMCAwIGF1dG87CisgICAgcGFkZGluZzogMCBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKKyAgLmNvbC1tZCwKKyAgLnJvdy5jb2xzLW1kID4gKiB7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXgtZ3JvdzogMTsKKyAgICBmbGV4LWJhc2lzOiAwOyB9CisKKyAgLmNvbC1tZC0xLAorICAucm93LmNvbHMtbWQtMSA+ICogeworICAgIG1heC13aWR0aDogOC4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiA4LjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtMCB7CisgICAgbWFyZ2luLWxlZnQ6IDA7IH0KKworICAuY29sLW1kLTIsCisgIC5yb3cuY29scy1tZC0yID4gKiB7CisgICAgbWF4LXdpZHRoOiAxNi42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiAxNi42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTEgeworICAgIG1hcmdpbi1sZWZ0OiA4LjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC0zLAorICAucm93LmNvbHMtbWQtMyA+ICogeworICAgIG1heC13aWR0aDogMjUlOworICAgIGZsZXgtYmFzaXM6IDI1JTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTIgeworICAgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtNCwKKyAgLnJvdy5jb2xzLW1kLTQgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDMzLjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDMzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtMyB7CisgICAgbWFyZ2luLWxlZnQ6IDI1JTsgfQorCisgIC5jb2wtbWQtNSwKKyAgLnJvdy5jb2xzLW1kLTUgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDQxLjY2NjY2NjY2NjclOworICAgIGZsZXgtYmFzaXM6IDQxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtNCB7CisgICAgbWFyZ2luLWxlZnQ6IDMzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC02LAorICAucm93LmNvbHMtbWQtNiA+ICogeworICAgIG1heC13aWR0aDogNTAlOworICAgIGZsZXgtYmFzaXM6IDUwJTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTUgeworICAgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtNywKKyAgLnJvdy5jb2xzLW1kLTcgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDU4LjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDU4LjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtNiB7CisgICAgbWFyZ2luLWxlZnQ6IDUwJTsgfQorCisgIC5jb2wtbWQtOCwKKyAgLnJvdy5jb2xzLW1kLTggPiAqIHsKKyAgICBtYXgtd2lkdGg6IDY2LjY2NjY2NjY2NjclOworICAgIGZsZXgtYmFzaXM6IDY2LjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtNyB7CisgICAgbWFyZ2luLWxlZnQ6IDU4LjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC05LAorICAucm93LmNvbHMtbWQtOSA+ICogeworICAgIG1heC13aWR0aDogNzUlOworICAgIGZsZXgtYmFzaXM6IDc1JTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTggeworICAgIG1hcmdpbi1sZWZ0OiA2Ni42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtMTAsCisgIC5yb3cuY29scy1tZC0xMCA+ICogeworICAgIG1heC13aWR0aDogODMuMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogODMuMzMzMzMzMzMzMyU7IH0KKworICAuY29sLW1kLW9mZnNldC05IHsKKyAgICBtYXJnaW4tbGVmdDogNzUlOyB9CisKKyAgLmNvbC1tZC0xMSwKKyAgLnJvdy5jb2xzLW1kLTExID4gKiB7CisgICAgbWF4LXdpZHRoOiA5MS42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA5MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTEwIHsKKyAgICBtYXJnaW4tbGVmdDogODMuMzMzMzMzMzMzMyU7IH0KKworICAuY29sLW1kLTEyLAorICAucm93LmNvbHMtbWQtMTIgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgZmxleC1iYXNpczogMTAwJTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTExIHsKKyAgICBtYXJnaW4tbGVmdDogOTEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLW5vcm1hbCB7CisgICAgb3JkZXI6IGluaXRpYWw7IH0KKworICAuY29sLW1kLWZpcnN0IHsKKyAgICBvcmRlcjogLTk5OTsgfQorCisgIC5jb2wtbWQtbGFzdCB7CisgICAgb3JkZXI6IDk5OTsgfSB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMjgwcHgpIHsKKyAgLmNvbC1sZywKKyAgW2NsYXNzXj0nY29sLWxnLSddLAorICBbY2xhc3NePSdjb2wtbGctb2Zmc2V0LSddLAorICAucm93W2NsYXNzKj0nY29scy1sZy0nXSA+ICogeworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgZmxleDogMCAwIGF1dG87CisgICAgcGFkZGluZzogMCBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKKyAgLmNvbC1sZywKKyAgLnJvdy5jb2xzLWxnID4gKiB7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXgtZ3JvdzogMTsKKyAgICBmbGV4LWJhc2lzOiAwOyB9CisKKyAgLmNvbC1sZy0xLAorICAucm93LmNvbHMtbGctMSA+ICogeworICAgIG1heC13aWR0aDogOC4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiA4LjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtMCB7CisgICAgbWFyZ2luLWxlZnQ6IDA7IH0KKworICAuY29sLWxnLTIsCisgIC5yb3cuY29scy1sZy0yID4gKiB7CisgICAgbWF4LXdpZHRoOiAxNi42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiAxNi42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTEgeworICAgIG1hcmdpbi1sZWZ0OiA4LjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy0zLAorICAucm93LmNvbHMtbGctMyA+ICogeworICAgIG1heC13aWR0aDogMjUlOworICAgIGZsZXgtYmFzaXM6IDI1JTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTIgeworICAgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctNCwKKyAgLnJvdy5jb2xzLWxnLTQgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDMzLjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDMzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtMyB7CisgICAgbWFyZ2luLWxlZnQ6IDI1JTsgfQorCisgIC5jb2wtbGctNSwKKyAgLnJvdy5jb2xzLWxnLTUgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDQxLjY2NjY2NjY2NjclOworICAgIGZsZXgtYmFzaXM6IDQxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtNCB7CisgICAgbWFyZ2luLWxlZnQ6IDMzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy02LAorICAucm93LmNvbHMtbGctNiA+ICogeworICAgIG1heC13aWR0aDogNTAlOworICAgIGZsZXgtYmFzaXM6IDUwJTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTUgeworICAgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctNywKKyAgLnJvdy5jb2xzLWxnLTcgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDU4LjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDU4LjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtNiB7CisgICAgbWFyZ2luLWxlZnQ6IDUwJTsgfQorCisgIC5jb2wtbGctOCwKKyAgLnJvdy5jb2xzLWxnLTggPiAqIHsKKyAgICBtYXgtd2lkdGg6IDY2LjY2NjY2NjY2NjclOworICAgIGZsZXgtYmFzaXM6IDY2LjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtNyB7CisgICAgbWFyZ2luLWxlZnQ6IDU4LjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy05LAorICAucm93LmNvbHMtbGctOSA+ICogeworICAgIG1heC13aWR0aDogNzUlOworICAgIGZsZXgtYmFzaXM6IDc1JTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTggeworICAgIG1hcmdpbi1sZWZ0OiA2Ni42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctMTAsCisgIC5yb3cuY29scy1sZy0xMCA+ICogeworICAgIG1heC13aWR0aDogODMuMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogODMuMzMzMzMzMzMzMyU7IH0KKworICAuY29sLWxnLW9mZnNldC05IHsKKyAgICBtYXJnaW4tbGVmdDogNzUlOyB9CisKKyAgLmNvbC1sZy0xMSwKKyAgLnJvdy5jb2xzLWxnLTExID4gKiB7CisgICAgbWF4LXdpZHRoOiA5MS42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA5MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTEwIHsKKyAgICBtYXJnaW4tbGVmdDogODMuMzMzMzMzMzMzMyU7IH0KKworICAuY29sLWxnLTEyLAorICAucm93LmNvbHMtbGctMTIgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgZmxleC1iYXNpczogMTAwJTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTExIHsKKyAgICBtYXJnaW4tbGVmdDogOTEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLW5vcm1hbCB7CisgICAgb3JkZXI6IGluaXRpYWw7IH0KKworICAuY29sLWxnLWZpcnN0IHsKKyAgICBvcmRlcjogLTk5OTsgfQorCisgIC5jb2wtbGctbGFzdCB7CisgICAgb3JkZXI6IDk5OTsgfSB9CisvKiBDYXJkIGNvbXBvbmVudCBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1jYXJkLWJhY2stY29sb3I6ICNmOGY4Zjg7CisgIC0tY2FyZC1mb3JlLWNvbG9yOiAjMTExOworICAtLWNhcmQtYm9yZGVyLWNvbG9yOiAjZGRkOyB9CisKKy5jYXJkIHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOworICBhbGlnbi1zZWxmOiBjZW50ZXI7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgd2lkdGg6IDEwMCU7CisgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1jYXJkLWZvcmUtY29sb3IpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1jYXJkLWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsgfQorICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAzMjBweCkgeworICAgIC5jYXJkIHsKKyAgICAgIG1heC13aWR0aDogMzIwcHg7IH0gfQorICAuY2FyZCA+IC5zZWN0aW9uZSB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYWNrLWNvbG9yKTsKKyAgICBjb2xvcjogdmFyKC0tY2FyZC1mb3JlLWNvbG9yKTsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIG1hcmdpbjogMDsKKyAgICBib3JkZXI6IDA7CisgICAgYm9yZGVyLXJhZGl1czogMDsKKyAgICBib3JkZXItYm90dG9tOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tY2FyZC1ib3JkZXItY29sb3IpOworICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgICB3aWR0aDogMTAwJTsgfQorICAgIC5jYXJkID4gLnNlY3Rpb25lLm1lZGlhIHsKKyAgICAgIGhlaWdodDogMjAwcHg7CisgICAgICBwYWRkaW5nOiAwOworICAgICAgLW8tb2JqZWN0LWZpdDogY292ZXI7CisgICAgICBvYmplY3QtZml0OiBjb3ZlcjsgfQorICAuY2FyZCA+IC5zZWN0aW9uZTpsYXN0LWNoaWxkIHsKKyAgICBib3JkZXItYm90dG9tOiAwOyB9CisKKy8qCisgIEN1c3RvbSBlbGVtZW50cyBmb3IgY2FyZCBlbGVtZW50cy4KKyovCitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAyNDBweCkgeworICAuY2FyZC5zbWFsbCB7CisgICAgbWF4LXdpZHRoOiAyNDBweDsgfSB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0ODBweCkgeworICAuY2FyZC5sYXJnZSB7CisgICAgbWF4LXdpZHRoOiA0ODBweDsgfSB9CisuY2FyZC5mbHVpZCB7CisgIG1heC13aWR0aDogMTAwJTsKKyAgd2lkdGg6IGF1dG87IH0KKworLmNhcmQud2FybmluZyB7CisvKiAgLS1jYXJkLWJhY2stY29sb3I6ICNmZmNhMjg7ICovCisgIC0tY2FyZC1iYWNrLWNvbG9yOiAjZTViOGI3OworICAtLWNhcmQtYm9yZGVyLWNvbG9yOiAjZThiODI1OyB9CisKKy5jYXJkLmVycm9yIHsKKyAgLS1jYXJkLWJhY2stY29sb3I6ICNiNzFjMWM7CisgIC0tY2FyZC1mb3JlLWNvbG9yOiAjZjhmOGY4OworICAtLWNhcmQtYm9yZGVyLWNvbG9yOiAjYTcxYTFhOyB9CisKKy5jYXJkID4gLnNlY3Rpb25lLmRhcmsgeworICAtLWNhcmQtYmFjay1jb2xvcjogI2UwZTBlMDsgfQorCisuY2FyZCA+IC5zZWN0aW9uZS5kb3VibGUtcGFkZGVkIHsKKyAgcGFkZGluZzogY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisKKy8qCisgIERlZmluaXRpb25zIGZvciBmb3JtcyBhbmQgaW5wdXQgZWxlbWVudHMuCisqLworLyogSW5wdXRfY29udHJvbCBtb2R1bGUgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0tZm9ybS1iYWNrLWNvbG9yOiAjZjBmMGYwOworICAtLWZvcm0tZm9yZS1jb2xvcjogIzExMTsKKyAgLS1mb3JtLWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1pbnB1dC1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLWlucHV0LWZvcmUtY29sb3I6ICMxMTE7CisgIC0taW5wdXQtYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLWlucHV0LWZvY3VzLWNvbG9yOiAjMDI4OGQxOworICAtLWlucHV0LWludmFsaWQtY29sb3I6ICNkMzJmMmY7CisgIC0tYnV0dG9uLWJhY2stY29sb3I6ICNlMmUyZTI7CisgIC0tYnV0dG9uLWhvdmVyLWJhY2stY29sb3I6ICNkY2RjZGM7CisgIC0tYnV0dG9uLWZvcmUtY29sb3I6ICMyMTIxMjE7CisgIC0tYnV0dG9uLWJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7CisgIC0tYnV0dG9uLWhvdmVyLWJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7CisgIC0tYnV0dG9uLWdyb3VwLWJvcmRlci1jb2xvcjogcmdiYSgxMjQsIDEyNCwgMTI0LCAwLjU0KTsgfQorCitmb3JtIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tZm9ybS1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLWZvcm0tZm9yZS1jb2xvcik7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWZvcm0tYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBwYWRkaW5nOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsgfQorCitmaWVsZHNldCB7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWZvcm0tYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBtYXJnaW46IGNhbGModmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgLyA0KTsKKyAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOyB9CisKK2xlZ2VuZCB7CisgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIGRpc3BsYXk6IHRhYmxlOworICBtYXgtd2lkdGg6IDEwMCU7CisgIHdoaXRlLXNwYWNlOiBub3JtYWw7CisgIGZvbnQtd2VpZ2h0OiA3MDA7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7IH0KKworbGFiZWwgeworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsgfQorCisuaW5wdXQtZ3JvdXAgeworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH0KKyAgLmlucHV0LWdyb3VwLmZsdWlkIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH0KKyAgICAuaW5wdXQtZ3JvdXAuZmx1aWQgPiBpbnB1dCB7CisgICAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICBmbGV4LWJhc2lzOiAwcHg7IH0KKyAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0OTlweCkgeworICAgICAgLmlucHV0LWdyb3VwLmZsdWlkIHsKKyAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CisgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IH0gfQorICAuaW5wdXQtZ3JvdXAudmVydGljYWwgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CisgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfQorICAgIC5pbnB1dC1ncm91cC52ZXJ0aWNhbCA+IGlucHV0IHsKKyAgICAgIG1heC13aWR0aDogMTAwJTsKKyAgICAgIGZsZXgtZ3JvdzogMTsKKyAgICAgIGZsZXgtYmFzaXM6IDBweDsgfQorCitbdHlwZT0ibnVtYmVyIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sIFt0eXBlPSJudW1iZXIiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7CisgIGhlaWdodDogYXV0bzsgfQorCitbdHlwZT0ic2VhcmNoIl0geworICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsKKyAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IH0KKworW3R5cGU9InNlYXJjaCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLAorW3R5cGU9InNlYXJjaCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOyB9CisKK2lucHV0Om5vdChbdHlwZV0pLCBbdHlwZT0idGV4dCJdLCBbdHlwZT0iZW1haWwiXSwgW3R5cGU9Im51bWJlciJdLCBbdHlwZT0ic2VhcmNoIl0sCitbdHlwZT0icGFzc3dvcmQiXSwgW3R5cGU9InVybCJdLCBbdHlwZT0idGVsIl0sIFt0eXBlPSJjaGVja2JveCJdLCBbdHlwZT0icmFkaW8iXSwgdGV4dGFyZWEsIHNlbGVjdCB7CisgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0taW5wdXQtZm9yZS1jb2xvcik7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWlucHV0LWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgbWFyZ2luOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pIC8gMik7CisgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7IH0KKworaW5wdXQ6bm90KFt0eXBlPSJidXR0b24iXSk6bm90KFt0eXBlPSJzdWJtaXQiXSk6bm90KFt0eXBlPSJyZXNldCJdKTpob3ZlciwgaW5wdXQ6bm90KFt0eXBlPSJidXR0b24iXSk6bm90KFt0eXBlPSJzdWJtaXQiXSk6bm90KFt0eXBlPSJyZXNldCJdKTpmb2N1cywgdGV4dGFyZWE6aG92ZXIsIHRleHRhcmVhOmZvY3VzLCBzZWxlY3Q6aG92ZXIsIHNlbGVjdDpmb2N1cyB7CisgIGJvcmRlci1jb2xvcjogdmFyKC0taW5wdXQtZm9jdXMtY29sb3IpOworICBib3gtc2hhZG93OiBub25lOyB9CitpbnB1dDpub3QoW3R5cGU9ImJ1dHRvbiJdKTpub3QoW3R5cGU9InN1Ym1pdCJdKTpub3QoW3R5cGU9InJlc2V0Il0pOmludmFsaWQsIGlucHV0Om5vdChbdHlwZT0iYnV0dG9uIl0pOm5vdChbdHlwZT0ic3VibWl0Il0pOm5vdChbdHlwZT0icmVzZXQiXSk6Zm9jdXM6aW52YWxpZCwgdGV4dGFyZWE6aW52YWxpZCwgdGV4dGFyZWE6Zm9jdXM6aW52YWxpZCwgc2VsZWN0OmludmFsaWQsIHNlbGVjdDpmb2N1czppbnZhbGlkIHsKKyAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbnB1dC1pbnZhbGlkLWNvbG9yKTsKKyAgYm94LXNoYWRvdzogbm9uZTsgfQoraW5wdXQ6bm90KFt0eXBlPSJidXR0b24iXSk6bm90KFt0eXBlPSJzdWJtaXQiXSk6bm90KFt0eXBlPSJyZXNldCJdKVtyZWFkb25seV0sIHRleHRhcmVhW3JlYWRvbmx5XSwgc2VsZWN0W3JlYWRvbmx5XSB7CisgIGJhY2tncm91bmQ6IHZhcigtLXNlY29uZGFyeS1iYWNrLWNvbG9yKTsgfQorCitzZWxlY3QgeworICBtYXgtd2lkdGg6IDEwMCU7IH0KKworb3B0aW9uIHsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IH0KKworW3R5cGU9ImNoZWNrYm94Il0sIFt0eXBlPSJyYWRpbyJdIHsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CisgIGFwcGVhcmFuY2U6IG5vbmU7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgaGVpZ2h0OiBjYWxjKDFyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsKKyAgd2lkdGg6IGNhbGMoMXJlbSArIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOworICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CisgIHBhZGRpbmc6IDA7CisgIGZsZXgtYmFzaXM6IGNhbGMoMXJlbSArIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpICFpbXBvcnRhbnQ7CisgIGZsZXgtZ3JvdzogMCAhaW1wb3J0YW50OyB9CisgIFt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQ6YmVmb3JlLCBbdHlwZT0icmFkaW8iXTpjaGVja2VkOmJlZm9yZSB7CisgICAgcG9zaXRpb246IGFic29sdXRlOyB9CisKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQ6YmVmb3JlIHsKKyAgY29udGVudDogJ1wyNzEzJzsKKyAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogY2FsYygxcmVtICsgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7CisgIHRvcDogY2FsYygwcmVtIC0gdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgbGVmdDogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KTsgfQorCitbdHlwZT0icmFkaW8iXSB7CisgIGJvcmRlci1yYWRpdXM6IDEwMCU7IH0KKyAgW3R5cGU9InJhZGlvIl06Y2hlY2tlZDpiZWZvcmUgeworICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CisgICAgY29udGVudDogJyc7CisgICAgdG9wOiBjYWxjKDAuMDYyNXJlbSArIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOworICAgIGxlZnQ6IGNhbGMoMC4wNjI1cmVtICsgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7CisgICAgYmFja2dyb3VuZDogdmFyKC0taW5wdXQtZm9yZS1jb2xvcik7CisgICAgd2lkdGg6IDAuNXJlbTsKKyAgICBoZWlnaHQ6IDAuNXJlbTsgfQorCis6cGxhY2Vob2xkZXItc2hvd24geworICBjb2xvcjogdmFyKC0taW5wdXQtZm9yZS1jb2xvcik7IH0KKworOjotbXMtcGxhY2Vob2xkZXIgeworICBjb2xvcjogdmFyKC0taW5wdXQtZm9yZS1jb2xvcik7CisgIG9wYWNpdHk6IDAuNTQ7IH0KKworYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0iYnV0dG9uIl06Oi1tb3otZm9jdXMtaW5uZXIsIFt0eXBlPSJyZXNldCJdOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0ic3VibWl0Il06Oi1tb3otZm9jdXMtaW5uZXIgeworICBib3JkZXItc3R5bGU6IG5vbmU7CisgIHBhZGRpbmc6IDA7IH0KKworYnV0dG9uLCBodG1sIFt0eXBlPSJidXR0b24iXSwgW3R5cGU9InJlc2V0Il0sIFt0eXBlPSJzdWJtaXQiXSB7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyB9CisKK2J1dHRvbiB7CisgIG92ZXJmbG93OiB2aXNpYmxlOworICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgfQorCitidXR0b24sIFt0eXBlPSJidXR0b24iXSwgW3R5cGU9InN1Ym1pdCJdLCBbdHlwZT0icmVzZXQiXSwKK2EuYnV0dG9uLCBsYWJlbC5idXR0b24sIC5idXR0b24sCithW3JvbGU9ImJ1dHRvbiJdLCBsYWJlbFtyb2xlPSJidXR0b24iXSwgW3JvbGU9ImJ1dHRvbiJdIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBiYWNrZ3JvdW5kOiB2YXIoLS1idXR0b24tYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1idXR0b24tZm9yZS1jb2xvcik7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWJ1dHRvbi1ib3JkZXItY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgY3Vyc29yOiBwb2ludGVyOworICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuM3M7IH0KKyAgYnV0dG9uOmhvdmVyLCBidXR0b246Zm9jdXMsIFt0eXBlPSJidXR0b24iXTpob3ZlciwgW3R5cGU9ImJ1dHRvbiJdOmZvY3VzLCBbdHlwZT0ic3VibWl0Il06aG92ZXIsIFt0eXBlPSJzdWJtaXQiXTpmb2N1cywgW3R5cGU9InJlc2V0Il06aG92ZXIsIFt0eXBlPSJyZXNldCJdOmZvY3VzLAorICBhLmJ1dHRvbjpob3ZlciwKKyAgYS5idXR0b246Zm9jdXMsIGxhYmVsLmJ1dHRvbjpob3ZlciwgbGFiZWwuYnV0dG9uOmZvY3VzLCAuYnV0dG9uOmhvdmVyLCAuYnV0dG9uOmZvY3VzLAorICBhW3JvbGU9ImJ1dHRvbiJdOmhvdmVyLAorICBhW3JvbGU9ImJ1dHRvbiJdOmZvY3VzLCBsYWJlbFtyb2xlPSJidXR0b24iXTpob3ZlciwgbGFiZWxbcm9sZT0iYnV0dG9uIl06Zm9jdXMsIFtyb2xlPSJidXR0b24iXTpob3ZlciwgW3JvbGU9ImJ1dHRvbiJdOmZvY3VzIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1idXR0b24taG92ZXItYmFjay1jb2xvcik7CisgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idXR0b24taG92ZXItYm9yZGVyLWNvbG9yKTsgfQorCitpbnB1dDpkaXNhYmxlZCwgaW5wdXRbZGlzYWJsZWRdLCB0ZXh0YXJlYTpkaXNhYmxlZCwgdGV4dGFyZWFbZGlzYWJsZWRdLCBzZWxlY3Q6ZGlzYWJsZWQsIHNlbGVjdFtkaXNhYmxlZF0sIGJ1dHRvbjpkaXNhYmxlZCwgYnV0dG9uW2Rpc2FibGVkXSwgLmJ1dHRvbjpkaXNhYmxlZCwgLmJ1dHRvbltkaXNhYmxlZF0sIFtyb2xlPSJidXR0b24iXTpkaXNhYmxlZCwgW3JvbGU9ImJ1dHRvbiJdW2Rpc2FibGVkXSB7CisgIGN1cnNvcjogbm90LWFsbG93ZWQ7CisgIG9wYWNpdHk6IDAuNzU7IH0KKworLmJ1dHRvbi1ncm91cCB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWJ1dHRvbi1ncm91cC1ib3JkZXItY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7IH0KKyAgLmJ1dHRvbi1ncm91cCA+IGJ1dHRvbiwgLmJ1dHRvbi1ncm91cCBbdHlwZT0iYnV0dG9uIl0sIC5idXR0b24tZ3JvdXAgPiBbdHlwZT0ic3VibWl0Il0sIC5idXR0b24tZ3JvdXAgPiBbdHlwZT0icmVzZXQiXSwgLmJ1dHRvbi1ncm91cCA+IC5idXR0b24sIC5idXR0b24tZ3JvdXAgPiBbcm9sZT0iYnV0dG9uIl0geworICAgIG1hcmdpbjogMDsKKyAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgZmxleDogMSAxIGF1dG87CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGJvcmRlcjogMDsKKyAgICBib3JkZXItcmFkaXVzOiAwOworICAgIGJveC1zaGFkb3c6IG5vbmU7IH0KKyAgLmJ1dHRvbi1ncm91cCA+IDpub3QoOmZpcnN0LWNoaWxkKSB7CisgICAgYm9yZGVyLWxlZnQ6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1idXR0b24tZ3JvdXAtYm9yZGVyLWNvbG9yKTsgfQorICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0OTlweCkgeworICAgIC5idXR0b24tZ3JvdXAgeworICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfQorICAgICAgLmJ1dHRvbi1ncm91cCA+IDpub3QoOmZpcnN0LWNoaWxkKSB7CisgICAgICAgIGJvcmRlcjogMDsKKyAgICAgICAgYm9yZGVyLXRvcDogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWJ1dHRvbi1ncm91cC1ib3JkZXItY29sb3IpOyB9IH0KKworLyoKKyAgQ3VzdG9tIGVsZW1lbnRzIGZvciBmb3JtcyBhbmQgaW5wdXQgZWxlbWVudHMuCisqLworYnV0dG9uLnByaW1hcnksIFt0eXBlPSJidXR0b24iXS5wcmltYXJ5LCBbdHlwZT0ic3VibWl0Il0ucHJpbWFyeSwgW3R5cGU9InJlc2V0Il0ucHJpbWFyeSwgLmJ1dHRvbi5wcmltYXJ5LCBbcm9sZT0iYnV0dG9uIl0ucHJpbWFyeSB7CisgIC0tYnV0dG9uLWJhY2stY29sb3I6ICMxOTc2ZDI7CisgIC0tYnV0dG9uLWZvcmUtY29sb3I6ICNmOGY4Zjg7IH0KKyAgYnV0dG9uLnByaW1hcnk6aG92ZXIsIGJ1dHRvbi5wcmltYXJ5OmZvY3VzLCBbdHlwZT0iYnV0dG9uIl0ucHJpbWFyeTpob3ZlciwgW3R5cGU9ImJ1dHRvbiJdLnByaW1hcnk6Zm9jdXMsIFt0eXBlPSJzdWJtaXQiXS5wcmltYXJ5OmhvdmVyLCBbdHlwZT0ic3VibWl0Il0ucHJpbWFyeTpmb2N1cywgW3R5cGU9InJlc2V0Il0ucHJpbWFyeTpob3ZlciwgW3R5cGU9InJlc2V0Il0ucHJpbWFyeTpmb2N1cywgLmJ1dHRvbi5wcmltYXJ5OmhvdmVyLCAuYnV0dG9uLnByaW1hcnk6Zm9jdXMsIFtyb2xlPSJidXR0b24iXS5wcmltYXJ5OmhvdmVyLCBbcm9sZT0iYnV0dG9uIl0ucHJpbWFyeTpmb2N1cyB7CisgICAgLS1idXR0b24taG92ZXItYmFjay1jb2xvcjogIzE1NjVjMDsgfQorCitidXR0b24uc2Vjb25kYXJ5LCBbdHlwZT0iYnV0dG9uIl0uc2Vjb25kYXJ5LCBbdHlwZT0ic3VibWl0Il0uc2Vjb25kYXJ5LCBbdHlwZT0icmVzZXQiXS5zZWNvbmRhcnksIC5idXR0b24uc2Vjb25kYXJ5LCBbcm9sZT0iYnV0dG9uIl0uc2Vjb25kYXJ5IHsKKyAgLS1idXR0b24tYmFjay1jb2xvcjogI2QzMmYyZjsKKyAgLS1idXR0b24tZm9yZS1jb2xvcjogI2Y4ZjhmODsgfQorICBidXR0b24uc2Vjb25kYXJ5OmhvdmVyLCBidXR0b24uc2Vjb25kYXJ5OmZvY3VzLCBbdHlwZT0iYnV0dG9uIl0uc2Vjb25kYXJ5OmhvdmVyLCBbdHlwZT0iYnV0dG9uIl0uc2Vjb25kYXJ5OmZvY3VzLCBbdHlwZT0ic3VibWl0Il0uc2Vjb25kYXJ5OmhvdmVyLCBbdHlwZT0ic3VibWl0Il0uc2Vjb25kYXJ5OmZvY3VzLCBbdHlwZT0icmVzZXQiXS5zZWNvbmRhcnk6aG92ZXIsIFt0eXBlPSJyZXNldCJdLnNlY29uZGFyeTpmb2N1cywgLmJ1dHRvbi5zZWNvbmRhcnk6aG92ZXIsIC5idXR0b24uc2Vjb25kYXJ5OmZvY3VzLCBbcm9sZT0iYnV0dG9uIl0uc2Vjb25kYXJ5OmhvdmVyLCBbcm9sZT0iYnV0dG9uIl0uc2Vjb25kYXJ5OmZvY3VzIHsKKyAgICAtLWJ1dHRvbi1ob3Zlci1iYWNrLWNvbG9yOiAjYzYyODI4OyB9CisKK2J1dHRvbi50ZXJ0aWFyeSwgW3R5cGU9ImJ1dHRvbiJdLnRlcnRpYXJ5LCBbdHlwZT0ic3VibWl0Il0udGVydGlhcnksIFt0eXBlPSJyZXNldCJdLnRlcnRpYXJ5LCAuYnV0dG9uLnRlcnRpYXJ5LCBbcm9sZT0iYnV0dG9uIl0udGVydGlhcnkgeworICAtLWJ1dHRvbi1iYWNrLWNvbG9yOiAjMzA4NzMyOworICAtLWJ1dHRvbi1mb3JlLWNvbG9yOiAjZjhmOGY4OyB9CisgIGJ1dHRvbi50ZXJ0aWFyeTpob3ZlciwgYnV0dG9uLnRlcnRpYXJ5OmZvY3VzLCBbdHlwZT0iYnV0dG9uIl0udGVydGlhcnk6aG92ZXIsIFt0eXBlPSJidXR0b24iXS50ZXJ0aWFyeTpmb2N1cywgW3R5cGU9InN1Ym1pdCJdLnRlcnRpYXJ5OmhvdmVyLCBbdHlwZT0ic3VibWl0Il0udGVydGlhcnk6Zm9jdXMsIFt0eXBlPSJyZXNldCJdLnRlcnRpYXJ5OmhvdmVyLCBbdHlwZT0icmVzZXQiXS50ZXJ0aWFyeTpmb2N1cywgLmJ1dHRvbi50ZXJ0aWFyeTpob3ZlciwgLmJ1dHRvbi50ZXJ0aWFyeTpmb2N1cywgW3JvbGU9ImJ1dHRvbiJdLnRlcnRpYXJ5OmhvdmVyLCBbcm9sZT0iYnV0dG9uIl0udGVydGlhcnk6Zm9jdXMgeworICAgIC0tYnV0dG9uLWhvdmVyLWJhY2stY29sb3I6ICMyNzc1Mjk7IH0KKworYnV0dG9uLmludmVyc2UsIFt0eXBlPSJidXR0b24iXS5pbnZlcnNlLCBbdHlwZT0ic3VibWl0Il0uaW52ZXJzZSwgW3R5cGU9InJlc2V0Il0uaW52ZXJzZSwgLmJ1dHRvbi5pbnZlcnNlLCBbcm9sZT0iYnV0dG9uIl0uaW52ZXJzZSB7CisgIC0tYnV0dG9uLWJhY2stY29sb3I6ICMyMTIxMjE7CisgIC0tYnV0dG9uLWZvcmUtY29sb3I6ICNmOGY4Zjg7IH0KKyAgYnV0dG9uLmludmVyc2U6aG92ZXIsIGJ1dHRvbi5pbnZlcnNlOmZvY3VzLCBbdHlwZT0iYnV0dG9uIl0uaW52ZXJzZTpob3ZlciwgW3R5cGU9ImJ1dHRvbiJdLmludmVyc2U6Zm9jdXMsIFt0eXBlPSJzdWJtaXQiXS5pbnZlcnNlOmhvdmVyLCBbdHlwZT0ic3VibWl0Il0uaW52ZXJzZTpmb2N1cywgW3R5cGU9InJlc2V0Il0uaW52ZXJzZTpob3ZlciwgW3R5cGU9InJlc2V0Il0uaW52ZXJzZTpmb2N1cywgLmJ1dHRvbi5pbnZlcnNlOmhvdmVyLCAuYnV0dG9uLmludmVyc2U6Zm9jdXMsIFtyb2xlPSJidXR0b24iXS5pbnZlcnNlOmhvdmVyLCBbcm9sZT0iYnV0dG9uIl0uaW52ZXJzZTpmb2N1cyB7CisgICAgLS1idXR0b24taG92ZXItYmFjay1jb2xvcjogIzExMTsgfQorCitidXR0b24uc21hbGwsIFt0eXBlPSJidXR0b24iXS5zbWFsbCwgW3R5cGU9InN1Ym1pdCJdLnNtYWxsLCBbdHlwZT0icmVzZXQiXS5zbWFsbCwgLmJ1dHRvbi5zbWFsbCwgW3JvbGU9ImJ1dHRvbiJdLnNtYWxsIHsKKyAgcGFkZGluZzogY2FsYygwLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpIGNhbGMoMC43NSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7IH0KKworYnV0dG9uLmxhcmdlLCBbdHlwZT0iYnV0dG9uIl0ubGFyZ2UsIFt0eXBlPSJzdWJtaXQiXS5sYXJnZSwgW3R5cGU9InJlc2V0Il0ubGFyZ2UsIC5idXR0b24ubGFyZ2UsIFtyb2xlPSJidXR0b24iXS5sYXJnZSB7CisgIHBhZGRpbmc6IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKSBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOyB9CisKKy8qCisgIERlZmluaXRpb25zIGZvciBuYXZpZ2F0aW9uIGVsZW1lbnRzLgorKi8KKy8qIE5hdmlnYXRpb24gbW9kdWxlIENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucyAqLworOnJvb3QgeworICAtLWhlYWRlci1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLWhlYWRlci1ob3Zlci1iYWNrLWNvbG9yOiAjZjBmMGYwOworICAtLWhlYWRlci1mb3JlLWNvbG9yOiAjNDQ0OworICAtLWhlYWRlci1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0tbmF2LWJhY2stY29sb3I6ICNmOGY4Zjg7CisgIC0tbmF2LWhvdmVyLWJhY2stY29sb3I6ICNmMGYwZjA7CisgIC0tbmF2LWZvcmUtY29sb3I6ICM0NDQ7CisgIC0tbmF2LWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1uYXYtbGluay1jb2xvcjogIzAyNzdiZDsKKyAgLS1mb290ZXItZm9yZS1jb2xvcjogIzQ0NDsKKyAgLS1mb290ZXItYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1mb290ZXItYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLWZvb3Rlci1saW5rLWNvbG9yOiAjMDI3N2JkOworICAtLWRyYXdlci1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLWRyYXdlci1ob3Zlci1iYWNrLWNvbG9yOiAjZjBmMGYwOworICAtLWRyYXdlci1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0tZHJhd2VyLWNsb3NlLWNvbG9yOiAjNDQ0OyB9CisKK2hlYWRlciB7CisgIGhlaWdodDogMy4xODc1cmVtOworICBiYWNrZ3JvdW5kOiB2YXIoLS1oZWFkZXItYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1oZWFkZXItZm9yZS1jb2xvcik7CisgIGJvcmRlci1ib3R0b206IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1oZWFkZXItYm9yZGVyLWNvbG9yKTsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KSAwOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworICBvdmVyZmxvdy14OiBhdXRvOworICBvdmVyZmxvdy15OiBoaWRkZW47IH0KKyAgaGVhZGVyLnJvdyB7CisgICAgYm94LXNpemluZzogY29udGVudC1ib3g7IH0KKyAgaGVhZGVyIC5sb2dvIHsKKyAgICBjb2xvcjogdmFyKC0taGVhZGVyLWZvcmUtY29sb3IpOworICAgIGZvbnQtc2l6ZTogMS43NXJlbTsKKyAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KKyAgaGVhZGVyIGJ1dHRvbiwgaGVhZGVyIFt0eXBlPSJidXR0b24iXSwgaGVhZGVyIC5idXR0b24sIGhlYWRlciBbcm9sZT0iYnV0dG9uIl0geworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRvcDogY2FsYygwcmVtIC0gdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCk7CisgICAgaGVpZ2h0OiBjYWxjKDMuMTg3NXJlbSArIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOworICAgIGJhY2tncm91bmQ6IHZhcigtLWhlYWRlci1iYWNrLWNvbG9yKTsKKyAgICBsaW5lLWhlaWdodDogY2FsYygzLjE4NzVyZW0gLSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgKiAxLjUpOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBjb2xvcjogdmFyKC0taGVhZGVyLWZvcmUtY29sb3IpOworICAgIGJvcmRlcjogMDsKKyAgICBib3JkZXItcmFkaXVzOiAwOworICAgIG1hcmdpbjogMDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9CisgICAgaGVhZGVyIGJ1dHRvbjpob3ZlciwgaGVhZGVyIGJ1dHRvbjpmb2N1cywgaGVhZGVyIFt0eXBlPSJidXR0b24iXTpob3ZlciwgaGVhZGVyIFt0eXBlPSJidXR0b24iXTpmb2N1cywgaGVhZGVyIC5idXR0b246aG92ZXIsIGhlYWRlciAuYnV0dG9uOmZvY3VzLCBoZWFkZXIgW3JvbGU9ImJ1dHRvbiJdOmhvdmVyLCBoZWFkZXIgW3JvbGU9ImJ1dHRvbiJdOmZvY3VzIHsKKyAgICAgIGJhY2tncm91bmQ6IHZhcigtLWhlYWRlci1ob3Zlci1iYWNrLWNvbG9yKTsgfQorCituYXYgeworICBiYWNrZ3JvdW5kOiB2YXIoLS1uYXYtYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1uYXYtZm9yZS1jb2xvcik7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLW5hdi1ib3JkZXItY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7IH0KKyAgbmF2ICogeworICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7IH0KKyAgbmF2IGEsIG5hdiBhOnZpc2l0ZWQgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGNvbG9yOiB2YXIoLS1uYXYtbGluay1jb2xvcik7CisgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4zczsgfQorICAgIG5hdiBhOmhvdmVyLCBuYXYgYTpmb2N1cywgbmF2IGE6dmlzaXRlZDpob3ZlciwgbmF2IGE6dmlzaXRlZDpmb2N1cyB7CisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1uYXYtaG92ZXItYmFjay1jb2xvcik7IH0KKyAgbmF2IC5zdWJsaW5rLTEgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBtYXJnaW4tbGVmdDogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorICAgIG5hdiAuc3VibGluay0xOmJlZm9yZSB7CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICBsZWZ0OiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAtIDEgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICAgICAgdG9wOiAtMC4wNjI1cmVtOworICAgICAgY29udGVudDogJyc7CisgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1uYXYtYm9yZGVyLWNvbG9yKTsKKyAgICAgIGJvcmRlci1sZWZ0OiAwOyB9CisgIG5hdiAuc3VibGluay0yIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgbWFyZ2luLWxlZnQ6IGNhbGMoNCAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7IH0KKyAgICBuYXYgLnN1YmxpbmstMjpiZWZvcmUgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgbGVmdDogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLSAzICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgICAgIHRvcDogLTAuMDYyNXJlbTsKKyAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tbmF2LWJvcmRlci1jb2xvcik7CisgICAgICBib3JkZXItbGVmdDogMDsgfQorCitmb290ZXIgeworICBiYWNrZ3JvdW5kOiB2YXIoLS1mb290ZXItYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1mb290ZXItZm9yZS1jb2xvcik7CisgIGJvcmRlci10b3A6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1mb290ZXItYm9yZGVyLWNvbG9yKTsKKyAgcGFkZGluZzogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgIGZvbnQtc2l6ZTogMC44NzVyZW07IH0KKyAgZm9vdGVyIGEsIGZvb3RlciBhOnZpc2l0ZWQgeworICAgIGNvbG9yOiB2YXIoLS1mb290ZXItbGluay1jb2xvcik7IH0KKworaGVhZGVyLnN0aWNreSB7CisgIHBvc2l0aW9uOiAtd2Via2l0LXN0aWNreTsKKyAgcG9zaXRpb246IHN0aWNreTsKKyAgei1pbmRleDogMTEwMTsKKyAgdG9wOiAwOyB9CisKK2Zvb3Rlci5zdGlja3kgeworICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7CisgIHBvc2l0aW9uOiBzdGlja3k7CisgIHotaW5kZXg6IDExMDE7CisgIGJvdHRvbTogMDsgfQorCisuZHJhd2VyLXRvZ2dsZTpiZWZvcmUgeworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgY29udGVudDogJ1wwMGEwXDIyNjFcMDBhMCc7CisgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDEuNWVtOyB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1MDBweCkgeworICAuZHJhd2VyLXRvZ2dsZTpub3QoLnBlcnNpc3RlbnQpIHsKKyAgICBkaXNwbGF5OiBub25lOyB9IH0KKworW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyIHsKKyAgaGVpZ2h0OiAxcHg7CisgIHdpZHRoOiAxcHg7CisgIG1hcmdpbjogLTFweDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBjbGlwOiByZWN0KDAgMCAwIDApOworICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSk7IH0KKyAgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyICsgKiB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICBwb3NpdGlvbjogZml4ZWQ7CisgICAgdG9wOiAwOworICAgIHdpZHRoOiAzMjBweDsKKyAgICBoZWlnaHQ6IDEwMHZoOworICAgIG92ZXJmbG93LXk6IGF1dG87CisgICAgYmFja2dyb3VuZDogdmFyKC0tZHJhd2VyLWJhY2stY29sb3IpOworICAgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWRyYXdlci1ib3JkZXItY29sb3IpOworICAgIGJvcmRlci1yYWRpdXM6IDA7CisgICAgbWFyZ2luOiAwOworICAgIHotaW5kZXg6IDExMTA7CisgICAgcmlnaHQ6IC0zMjBweDsKKyAgICB0cmFuc2l0aW9uOiByaWdodCAwLjNzOyB9CisgICAgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyICsgKiAuZHJhd2VyLWNsb3NlIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIHRvcDogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgICAgICByaWdodDogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgICAgICB6LWluZGV4OiAxMTExOworICAgICAgd2lkdGg6IDJyZW07CisgICAgICBoZWlnaHQ6IDJyZW07CisgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgICAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgICAgICBtYXJnaW46IDA7CisgICAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuM3M7IH0KKyAgICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogLmRyYXdlci1jbG9zZTpiZWZvcmUgeworICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgY29udGVudDogJ1wwMEQ3JzsKKyAgICAgICAgY29sb3I6IHZhcigtLWRyYXdlci1jbG9zZS1jb2xvcik7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisgICAgICAgIGZvbnQtc2l6ZTogMnJlbTsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDE7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgfQorICAgICAgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyICsgKiAuZHJhd2VyLWNsb3NlOmhvdmVyLCBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXIgKyAqIC5kcmF3ZXItY2xvc2U6Zm9jdXMgeworICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kcmF3ZXItaG92ZXItYmFjay1jb2xvcik7IH0KKyAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMjBweCkgeworICAgICAgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyICsgKiB7CisgICAgICAgIHdpZHRoOiAxMDAlOyB9IH0KKyAgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyOmNoZWNrZWQgKyAqIHsKKyAgICByaWdodDogMDsgfQorICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1MDBweCkgeworICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlcjpub3QoLnBlcnNpc3RlbnQpICsgKiB7CisgICAgICBwb3NpdGlvbjogc3RhdGljOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgei1pbmRleDogMTEwMDsgfQorICAgICAgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyOm5vdCgucGVyc2lzdGVudCkgKyAqIC5kcmF3ZXItY2xvc2UgeworICAgICAgICBkaXNwbGF5OiBub25lOyB9IH0KKworLyoKKyAgRGVmaW5pdGlvbnMgZm9yIHRoZSByZXNwb25zaXZlIHRhYmxlIGNvbXBvbmVudC4KKyovCisvKiBUYWJsZSBtb2R1bGUgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zLiAqLworOnJvb3QgeworICAtLXRhYmxlLWJvcmRlci1jb2xvcjogI2FhYTsKKyAgLS10YWJsZS1ib3JkZXItc2VwYXJhdG9yLWNvbG9yOiAjNjY2OworICAtLXRhYmxlLWhlYWQtYmFjay1jb2xvcjogI2U2ZTZlNjsKKyAgLS10YWJsZS1oZWFkLWZvcmUtY29sb3I6ICMxMTE7CisgIC0tdGFibGUtYm9keS1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLXRhYmxlLWJvZHktZm9yZS1jb2xvcjogIzExMTsKKyAgLS10YWJsZS1ib2R5LWFsdC1iYWNrLWNvbG9yOiAjZWVlOyB9CisKK3RhYmxlIHsKKyAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKKyAgYm9yZGVyLXNwYWNpbmc6IDA7CisgIDogbWFyZ2luOiBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKSB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleDogMCAxIGF1dG87CisgIGZsZXgtZmxvdzogcm93IHdyYXA7CisgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgcGFkZGluZy10b3A6IDA7CisJbWFyZ2luOiBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKSB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsJfQorICB0YWJsZSBjYXB0aW9uIHsKKyAgICBmb250LXNpemU6IDEuMjUgKiByZW07CisgICAgbWFyZ2luOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSkgMDsKKyAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgZmxleDogMCAwIDEwMCU7CisJCXRleHQtYWxpZ246IGxlZnQ7fQorICB0YWJsZSB0aGVhZCwgdGFibGUgdGJvZHkgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleC1mbG93OiByb3cgd3JhcDsKKyAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpOyB9CisgIHRhYmxlIHRoZWFkIHsKKyAgICB6LWluZGV4OiA5OTk7CisgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSAwIDA7CisgICAgYm9yZGVyLWJvdHRvbTogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1zZXBhcmF0b3ItY29sb3IpOyB9CisgIHRhYmxlIHRib2R5IHsKKyAgICBib3JkZXItdG9wOiAwOworICAgIG1hcmdpbi10b3A6IGNhbGMoMCAtIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsKKyAgICBib3JkZXItcmFkaXVzOiAwIDAgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsgfQorICB0YWJsZSB0ciB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBwYWRkaW5nOiAwOyB9CisgIHRhYmxlIHRoLCB0YWJsZSB0ZCB7CisgICAgcGFkZGluZzogY2FsYygwLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworCQlmb250LXNpemU6IDAuOXJlbTsgfQorICB0YWJsZSB0aCB7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS10YWJsZS1oZWFkLWJhY2stY29sb3IpOworICAgIGNvbG9yOiB2YXIoLS10YWJsZS1oZWFkLWZvcmUtY29sb3IpOyB9CisgIHRhYmxlIHRkIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS10YWJsZS1ib2R5LWJhY2stY29sb3IpOworICAgIGNvbG9yOiB2YXIoLS10YWJsZS1ib2R5LWZvcmUtY29sb3IpOworICAgIGJvcmRlci10b3A6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpOyB9CisKK3RhYmxlOm5vdCguaG9yaXpvbnRhbCkgeworICBvdmVyZmxvdzogYXV0bzsKKyAgbWF4LWhlaWdodDogODUwcHg7IH0KKyAgdGFibGU6bm90KC5ob3Jpem9udGFsKSB0aGVhZCwgdGFibGU6bm90KC5ob3Jpem9udGFsKSB0Ym9keSB7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXg6IDAgMCAxMDAlOyB9CisgIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdHIgeworICAgIGZsZXgtZmxvdzogcm93IHdyYXA7CisgICAgZmxleDogMCAwIDEwMCU7IH0KKyAgdGFibGU6bm90KC5ob3Jpem9udGFsKSB0aCwgdGFibGU6bm90KC5ob3Jpem9udGFsKSB0ZCB7CisgICAgZmxleDogMSAwIDAlOworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IH0KKyAgdGFibGU6bm90KC5ob3Jpem9udGFsKSB0aGVhZCB7CisgICAgcG9zaXRpb246IHN0aWNreTsKKyAgICB0b3A6IDA7IH0KKyAgdGFibGU6bm90KC5ob3Jpem9udGFsKSB0Ym9keSB0cjpmaXJzdC1jaGlsZCB0ZCB7CisgICAgYm9yZGVyLXRvcDogMDsgfQorCit0YWJsZS5ob3Jpem9udGFsIHsKKyAgYm9yZGVyOiAwOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGhlYWQsIHRhYmxlLmhvcml6b250YWwgdGJvZHkgeworICAgIGJvcmRlcjogMDsKKyAgICBmbGV4LWZsb3c6IHJvdyBub3dyYXA7IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0Ym9keSB7CisgICAgb3ZlcmZsb3c6IGF1dG87CisgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOworICAgIGZsZXg6IDEgMCAwOworICAgIG1hcmdpbi1sZWZ0OiBjYWxjKCA0ICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOworICAgIHBhZGRpbmctYm90dG9tOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpOyB9CisgIHRhYmxlLmhvcml6b250YWwgdHIgeworICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgICAgZmxleDogMSAwIGF1dG87IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0aCwgdGFibGUuaG9yaXpvbnRhbCB0ZCB7CisgICAgd2lkdGg6IDEwMCU7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci1ib3R0b206IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpOyB9CisgICAgdGFibGUuaG9yaXpvbnRhbCB0aDpub3QoOmZpcnN0LWNoaWxkKSwgdGFibGUuaG9yaXpvbnRhbCB0ZDpub3QoOmZpcnN0LWNoaWxkKSB7CisgICAgICBib3JkZXItdG9wOiAwOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGggeworICAgIHRleHQtYWxpZ246IHJpZ2h0OworICAgIGJvcmRlci1sZWZ0OiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsKKyAgICBib3JkZXItcmlnaHQ6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItc2VwYXJhdG9yLWNvbG9yKTsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRoZWFkIHRyOmZpcnN0LWNoaWxkIHsKKyAgICBwYWRkaW5nLWxlZnQ6IDA7IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0aDpmaXJzdC1jaGlsZCwgdGFibGUuaG9yaXpvbnRhbCB0ZDpmaXJzdC1jaGlsZCB7CisgICAgYm9yZGVyLXRvcDogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcik7IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0Ym9keSB0cjpsYXN0LWNoaWxkIHRkIHsKKyAgICBib3JkZXItcmlnaHQ6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpOyB9CisgICAgdGFibGUuaG9yaXpvbnRhbCB0Ym9keSB0cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkIHsKKyAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjI1cmVtOyB9CisgICAgdGFibGUuaG9yaXpvbnRhbCB0Ym9keSB0cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQgeworICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuMjVyZW07IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCB7CisgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMC4yNXJlbTsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRoZWFkIHRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQgeworICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAuMjVyZW07IH0KKworQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDk5cHgpIHsKKyAgdGFibGUsIHRhYmxlLmhvcml6b250YWwgeworICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgICAgYm9yZGVyOiAwOworICAgIHdpZHRoOiAxMDAlOworICAgIGRpc3BsYXk6IHRhYmxlOyB9CisgICAgdGFibGUgdGhlYWQsIHRhYmxlIHRoLCB0YWJsZS5ob3Jpem9udGFsIHRoZWFkLCB0YWJsZS5ob3Jpem9udGFsIHRoIHsKKyAgICAgIGJvcmRlcjogMDsKKyAgICAgIGhlaWdodDogMXB4OworICAgICAgd2lkdGg6IDFweDsKKyAgICAgIG1hcmdpbjogLTFweDsKKyAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICBwYWRkaW5nOiAwOworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgY2xpcDogcmVjdCgwIDAgMCAwKTsKKyAgICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsKKyAgICAgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSk7IH0KKyAgICB0YWJsZSB0Ym9keSwgdGFibGUuaG9yaXpvbnRhbCB0Ym9keSB7CisgICAgICBib3JkZXI6IDA7CisgICAgICBkaXNwbGF5OiB0YWJsZS1yb3ctZ3JvdXA7IH0KKyAgICB0YWJsZSB0ciwgdGFibGUuaG9yaXpvbnRhbCB0ciB7CisgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcik7CisgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgICAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOworICAgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICAgICAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgICAgIG1hcmdpbi1ib3R0b206IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsgfQorICAgIHRhYmxlIHRoLCB0YWJsZSB0ZCwgdGFibGUuaG9yaXpvbnRhbCB0aCwgdGFibGUuaG9yaXpvbnRhbCB0ZCB7CisgICAgICB3aWR0aDogYXV0bzsgfQorICAgIHRhYmxlIHRkLCB0YWJsZS5ob3Jpem9udGFsIHRkIHsKKyAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgYm9yZGVyOiAwOworICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7IH0KKyAgICB0YWJsZSB0ZDpiZWZvcmUsIHRhYmxlLmhvcml6b250YWwgdGQ6YmVmb3JlIHsKKyAgICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1sYWJlbCk7CisgICAgICBmbG9hdDogbGVmdDsKKyAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7IH0KKyAgICB0YWJsZSB0aDpmaXJzdC1jaGlsZCwgdGFibGUgdGQ6Zmlyc3QtY2hpbGQsIHRhYmxlLmhvcml6b250YWwgdGg6Zmlyc3QtY2hpbGQsIHRhYmxlLmhvcml6b250YWwgdGQ6Zmlyc3QtY2hpbGQgeworICAgICAgYm9yZGVyLXRvcDogMDsgfQorICAgIHRhYmxlIHRib2R5IHRyOmxhc3QtY2hpbGQgdGQsIHRhYmxlLmhvcml6b250YWwgdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZCB7CisgICAgICBib3JkZXItcmlnaHQ6IDA7IH0gfQorOnJvb3QgeworICAtLXRhYmxlLWJvZHktYWx0LWJhY2stY29sb3I6ICNlZWU7IH0KKwordGFibGUgdHI6bnRoLW9mLXR5cGUoMm4pID4gdGQgeworICBiYWNrZ3JvdW5kOiB2YXIoLS10YWJsZS1ib2R5LWFsdC1iYWNrLWNvbG9yKTsgfQorCitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1MDBweCkgeworICB0YWJsZSB0cjpudGgtb2YtdHlwZSgybikgeworICAgIGJhY2tncm91bmQ6IHZhcigtLXRhYmxlLWJvZHktYWx0LWJhY2stY29sb3IpOyB9IH0KKzpyb290IHsKKyAgLS10YWJsZS1ib2R5LWhvdmVyLWJhY2stY29sb3I6ICM5MGNhZjk7IH0KKwordGFibGUuaG92ZXJhYmxlIHRyOmhvdmVyLCB0YWJsZS5ob3ZlcmFibGUgdHI6aG92ZXIgPiB0ZCwgdGFibGUuaG92ZXJhYmxlIHRyOmZvY3VzLCB0YWJsZS5ob3ZlcmFibGUgdHI6Zm9jdXMgPiB0ZCB7CisgIGJhY2tncm91bmQ6IHZhcigtLXRhYmxlLWJvZHktaG92ZXItYmFjay1jb2xvcik7IH0KKworQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTAwcHgpIHsKKyAgdGFibGUuaG92ZXJhYmxlIHRyOmhvdmVyLCB0YWJsZS5ob3ZlcmFibGUgdHI6aG92ZXIgPiB0ZCwgdGFibGUuaG92ZXJhYmxlIHRyOmZvY3VzLCB0YWJsZS5ob3ZlcmFibGUgdHI6Zm9jdXMgPiB0ZCB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tdGFibGUtYm9keS1ob3Zlci1iYWNrLWNvbG9yKTsgfSB9CisvKgorICBEZWZpbml0aW9ucyBmb3IgY29udGV4dHVhbCBiYWNrZ3JvdW5kIGVsZW1lbnRzLCB0b2FzdHMgYW5kIHRvb2x0aXBzLgorKi8KKy8qIENvbnRleHR1YWwgbW9kdWxlIENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucyAqLworOnJvb3QgeworICAtLW1hcmstYmFjay1jb2xvcjogIzAyNzdiZDsKKyAgLS1tYXJrLWZvcmUtY29sb3I6ICNmYWZhZmE7IH0KKworbWFyayB7CisgIGJhY2tncm91bmQ6IHZhcigtLW1hcmstYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1tYXJrLWZvcmUtY29sb3IpOworICBmb250LXNpemU6IDAuOTVlbTsKKyAgbGluZS1oZWlnaHQ6IDFlbTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpIGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7IH0KKyAgbWFyay5pbmxpbmUtYmxvY2sgeworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICBmb250LXNpemU6IDFlbTsKKyAgICBsaW5lLWhlaWdodDogMS41OworICAgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMikgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOyB9CisKKzpyb290IHsKKyAgLS10b2FzdC1iYWNrLWNvbG9yOiAjNDI0MjQyOworICAtLXRvYXN0LWZvcmUtY29sb3I6ICNmYWZhZmE7IH0KKworLnRvYXN0IHsKKyAgcG9zaXRpb246IGZpeGVkOworICBib3R0b206IGNhbGModmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgKiAzKTsKKyAgbGVmdDogNTAlOworICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKKyAgei1pbmRleDogMTExMTsKKyAgY29sb3I6IHZhcigtLXRvYXN0LWZvcmUtY29sb3IpOworICBiYWNrZ3JvdW5kOiB2YXIoLS10b2FzdC1iYWNrLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogY2FsYyh2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgKiAxNik7CisgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAqIDMpOyB9CisKKzpyb290IHsKKyAgLS10b29sdGlwLWJhY2stY29sb3I6ICMyMTIxMjE7CisgIC0tdG9vbHRpcC1mb3JlLWNvbG9yOiAjZmFmYWZhOyB9CisKKy50b29sdGlwIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH0KKyAgLnRvb2x0aXA6YmVmb3JlLCAudG9vbHRpcDphZnRlciB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIG9wYWNpdHk6IDA7CisgICAgY2xpcDogcmVjdCgwIDAgMCAwKTsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsKKyAgICB0cmFuc2l0aW9uOiBhbGwgMC4zczsKKyAgICB6LWluZGV4OiAxMDEwOworICAgIGxlZnQ6IDUwJTsgfQorICAudG9vbHRpcDpub3QoLmJvdHRvbSk6YmVmb3JlLCAudG9vbHRpcDpub3QoLmJvdHRvbSk6YWZ0ZXIgeworICAgIGJvdHRvbTogNzUlOyB9CisgIC50b29sdGlwLmJvdHRvbTpiZWZvcmUsIC50b29sdGlwLmJvdHRvbTphZnRlciB7CisgICAgdG9wOiA3NSU7IH0KKyAgLnRvb2x0aXA6aG92ZXI6YmVmb3JlLCAudG9vbHRpcDpob3ZlcjphZnRlciwgLnRvb2x0aXA6Zm9jdXM6YmVmb3JlLCAudG9vbHRpcDpmb2N1czphZnRlciB7CisgICAgb3BhY2l0eTogMTsKKyAgICBjbGlwOiBhdXRvOworICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgwJSk7CisgICAgY2xpcC1wYXRoOiBpbnNldCgwJSk7IH0KKyAgLnRvb2x0aXA6YmVmb3JlIHsKKyAgICBjb250ZW50OiAnJzsKKyAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKKyAgICBib3JkZXI6IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pIHNvbGlkIHRyYW5zcGFyZW50OworICAgIGxlZnQ6IGNhbGMoNTAlIC0gdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOyB9CisgIC50b29sdGlwOm5vdCguYm90dG9tKTpiZWZvcmUgeworICAgIGJvcmRlci10b3AtY29sb3I6ICMyMTIxMjE7IH0KKyAgLnRvb2x0aXAuYm90dG9tOmJlZm9yZSB7CisgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzIxMjEyMTsgfQorICAudG9vbHRpcDphZnRlciB7CisgICAgY29udGVudDogYXR0cihhcmlhLWxhYmVsKTsKKyAgICBjb2xvcjogdmFyKC0tdG9vbHRpcC1mb3JlLWNvbG9yKTsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS10b29sdGlwLWJhY2stY29sb3IpOworICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7IH0KKyAgLnRvb2x0aXA6bm90KC5ib3R0b20pOmFmdGVyIHsKKyAgICBtYXJnaW4tYm90dG9tOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7IH0KKyAgLnRvb2x0aXAuYm90dG9tOmFmdGVyIHsKKyAgICBtYXJnaW4tdG9wOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7IH0KKworOnJvb3QgeworICAtLW1vZGFsLW92ZXJsYXktY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40NSk7CisgIC0tbW9kYWwtY2xvc2UtY29sb3I6ICM0NDQ7CisgIC0tbW9kYWwtY2xvc2UtaG92ZXItY29sb3I6ICNmMGYwZjA7IH0KKworW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgeworICBoZWlnaHQ6IDFweDsKKyAgd2lkdGg6IDFweDsKKyAgbWFyZ2luOiAtMXB4OworICBvdmVyZmxvdzogaGlkZGVuOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGNsaXA6IHJlY3QoMCAwIDAgMCk7CisgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsKKyAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsgfQorICBbdHlwZT0iY2hlY2tib3giXS5tb2RhbCArIGRpdiB7CisgICAgcG9zaXRpb246IGZpeGVkOworICAgIHRvcDogMDsKKyAgICBsZWZ0OiAwOworICAgIGRpc3BsYXk6IG5vbmU7CisgICAgd2lkdGg6IDEwMHZ3OworICAgIGhlaWdodDogMTAwdmg7CisgICAgYmFja2dyb3VuZDogdmFyKC0tbW9kYWwtb3ZlcmxheS1jb2xvcik7IH0KKyAgICBbdHlwZT0iY2hlY2tib3giXS5tb2RhbCArIGRpdiAuY2FyZCB7CisgICAgICBtYXJnaW46IDAgYXV0bzsKKyAgICAgIG1heC1oZWlnaHQ6IDUwdmg7CisgICAgICBvdmVyZmxvdzogYXV0bzsgfQorICAgICAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgLmNhcmQgLm1vZGFsLWNsb3NlIHsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IDA7CisgICAgICAgIHJpZ2h0OiAwOworICAgICAgICB3aWR0aDogMS43NXJlbTsKKyAgICAgICAgaGVpZ2h0OiAxLjc1cmVtOworICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgICAgICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgICAgICAgbWFyZ2luOiAwOworICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4zczsgfQorICAgICAgICBbdHlwZT0iY2hlY2tib3giXS5tb2RhbCArIGRpdiAuY2FyZCAubW9kYWwtY2xvc2U6YmVmb3JlIHsKKyAgICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgICBjb250ZW50OiAnXDAwRDcnOworICAgICAgICAgIGNvbG9yOiB2YXIoLS1tb2RhbC1jbG9zZS1jb2xvcik7CisgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICAgICAgICAgIGZvbnQtc2l6ZTogMS43NXJlbTsKKyAgICAgICAgICBsaW5lLWhlaWdodDogMTsKKyAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KKyAgICAgICAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgLmNhcmQgLm1vZGFsLWNsb3NlOmhvdmVyLCBbdHlwZT0iY2hlY2tib3giXS5tb2RhbCArIGRpdiAuY2FyZCAubW9kYWwtY2xvc2U6Zm9jdXMgeworICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLW1vZGFsLWNsb3NlLWhvdmVyLWNvbG9yKTsgfQorICBbdHlwZT0iY2hlY2tib3giXS5tb2RhbDpjaGVja2VkICsgZGl2IHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXg6IDAgMSBhdXRvOworICAgIHotaW5kZXg6IDEyMDA7IH0KKyAgICBbdHlwZT0iY2hlY2tib3giXS5tb2RhbDpjaGVja2VkICsgZGl2IC5jYXJkIC5tb2RhbC1jbG9zZSB7CisgICAgICB6LWluZGV4OiAxMjExOyB9CisKKzpyb290IHsKKyAgLS1jb2xsYXBzZS1sYWJlbC1iYWNrLWNvbG9yOiAjZThlOGU4OworICAtLWNvbGxhcHNlLWxhYmVsLWZvcmUtY29sb3I6ICMyMTIxMjE7CisgIC0tY29sbGFwc2UtbGFiZWwtaG92ZXItYmFjay1jb2xvcjogI2YwZjBmMDsKKyAgLS1jb2xsYXBzZS1zZWxlY3RlZC1sYWJlbC1iYWNrLWNvbG9yOiAjZWNlY2VjOworICAtLWNvbGxhcHNlLWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1jb2xsYXBzZS1jb250ZW50LWJhY2stY29sb3I6ICNmYWZhZmE7CisgIC0tY29sbGFwc2Utc2VsZWN0ZWQtbGFiZWwtYm9yZGVyLWNvbG9yOiAjMDI3N2JkOyB9CisKKy5jb2xsYXBzZSB7CisgIHdpZHRoOiBjYWxjKDEwMCUgLSAyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOworICBvcGFjaXR5OiAxOworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7IH0KKyAgLmNvbGxhcHNlID4gW3R5cGU9InJhZGlvIl0sIC5jb2xsYXBzZSA+IFt0eXBlPSJjaGVja2JveCJdIHsKKyAgICBoZWlnaHQ6IDFweDsKKyAgICB3aWR0aDogMXB4OworICAgIG1hcmdpbjogLTFweDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBjbGlwOiByZWN0KDAgMCAwIDApOworICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsKKyAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpOyB9CisgIC5jb2xsYXBzZSA+IGxhYmVsIHsKKyAgICBmbGV4LWdyb3c6IDE7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIGhlaWdodDogMS41cmVtOworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuM3M7CisgICAgY29sb3I6IHZhcigtLWNvbGxhcHNlLWxhYmVsLWZvcmUtY29sb3IpOworICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhcHNlLWxhYmVsLWJhY2stY29sb3IpOworICAgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWNvbGxhcHNlLWJvcmRlci1jb2xvcik7CisgICAgcGFkZGluZzogY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisgICAgLmNvbGxhcHNlID4gbGFiZWw6aG92ZXIsIC5jb2xsYXBzZSA+IGxhYmVsOmZvY3VzIHsKKyAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhcHNlLWxhYmVsLWhvdmVyLWJhY2stY29sb3IpOyB9CisgICAgLmNvbGxhcHNlID4gbGFiZWwgKyBkaXYgeworICAgICAgZmxleC1iYXNpczogYXV0bzsKKyAgICAgIGhlaWdodDogMXB4OworICAgICAgd2lkdGg6IDFweDsKKyAgICAgIG1hcmdpbjogLTFweDsKKyAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICBjbGlwOiByZWN0KDAgMCAwIDApOworICAgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICAgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsKKyAgICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4zczsKKyAgICAgIG1heC1oZWlnaHQ6IDFweDsgfQorICAuY29sbGFwc2UgPiA6Y2hlY2tlZCArIGxhYmVsIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYXBzZS1zZWxlY3RlZC1sYWJlbC1iYWNrLWNvbG9yKTsKKyAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1jb2xsYXBzZS1zZWxlY3RlZC1sYWJlbC1ib3JkZXItY29sb3IpOyB9CisgICAgLmNvbGxhcHNlID4gOmNoZWNrZWQgKyBsYWJlbCArIGRpdiB7CisgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgd2lkdGg6IDEwMCU7CisgICAgICBoZWlnaHQ6IGF1dG87CisgICAgICBvdmVyZmxvdzogYXV0bzsKKyAgICAgIG1hcmdpbjogMDsKKyAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhcHNlLWNvbnRlbnQtYmFjay1jb2xvcik7CisgICAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1jb2xsYXBzZS1ib3JkZXItY29sb3IpOworICAgICAgYm9yZGVyLXRvcDogMDsKKyAgICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgICAgIGNsaXA6IGF1dG87CisgICAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMCUpOworICAgICAgY2xpcC1wYXRoOiBpbnNldCgwJSk7CisgICAgICBtYXgtaGVpZ2h0OiA4NTBweDsgfQorICAuY29sbGFwc2UgPiBsYWJlbDpub3QoOmZpcnN0LW9mLXR5cGUpIHsKKyAgICBib3JkZXItdG9wOiAwOyB9CisgIC5jb2xsYXBzZSA+IGxhYmVsOmZpcnN0LW9mLXR5cGUgeworICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgMCAwOyB9CisgIC5jb2xsYXBzZSA+IGxhYmVsOmxhc3Qtb2YtdHlwZTpub3QoOmZpcnN0LW9mLXR5cGUpIHsKKyAgICBib3JkZXItcmFkaXVzOiAwIDAgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsgfQorICAuY29sbGFwc2UgPiBsYWJlbDpsYXN0LW9mLXR5cGU6Zmlyc3Qtb2YtdHlwZSB7CisgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOyB9CisgIC5jb2xsYXBzZSA+IDpjaGVja2VkOmxhc3Qtb2YtdHlwZTpub3QoOmZpcnN0LW9mLXR5cGUpICsgbGFiZWwgeworICAgIGJvcmRlci1yYWRpdXM6IDA7IH0KKyAgLmNvbGxhcHNlID4gOmNoZWNrZWQ6bGFzdC1vZi10eXBlICsgbGFiZWwgKyBkaXYgeworICAgIGJvcmRlci1yYWRpdXM6IDAgMCB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOyB9CisKKy8qCisgIEN1c3RvbSBlbGVtZW50cyBmb3IgY29udGV4dHVhbCBiYWNrZ3JvdW5kIGVsZW1lbnRzLCB0b2FzdHMgYW5kIHRvb2x0aXBzLgorKi8KK21hcmsuc2Vjb25kYXJ5IHsKKyAgLS1tYXJrLWJhY2stY29sb3I6ICNkMzJmMmY7IH0KKworbWFyay50ZXJ0aWFyeSB7CisgIC0tbWFyay1iYWNrLWNvbG9yOiAjMzA4NzMyOyB9CisKK21hcmsudGFnIHsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykvMikgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICBib3JkZXItcmFkaXVzOiAxZW07IH0KKworLyoKKyAgRGVmaW5pdGlvbnMgZm9yIHByb2dyZXNzIGVsZW1lbnRzIGFuZCBzcGlubmVycy4KKyovCisvKiBQcm9nZXNzIG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1wcm9ncmVzcy1iYWNrLWNvbG9yOiAjZGRkOworICAtLXByb2dyZXNzLWZvcmUtY29sb3I6ICM1NTU7IH0KKworcHJvZ3Jlc3MgeworICBkaXNwbGF5OiBibG9jazsKKyAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgIC1tb3otYXBwZWFyYW5jZTogbm9uZTsKKyAgYXBwZWFyYW5jZTogbm9uZTsKKyAgaGVpZ2h0OiAwLjc1cmVtOworICB3aWR0aDogY2FsYygxMDAlIC0gMiAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgYm9yZGVyOiAwOworICBib3JkZXItcmFkaXVzOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykpOworICBiYWNrZ3JvdW5kOiB2YXIoLS1wcm9ncmVzcy1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLXByb2dyZXNzLWZvcmUtY29sb3IpOyB9CisgIHByb2dyZXNzOjotd2Via2l0LXByb2dyZXNzLXZhbHVlIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcm9ncmVzcy1mb3JlLWNvbG9yKTsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykpOworICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSk7IH0KKyAgcHJvZ3Jlc3M6Oi13ZWJraXQtcHJvZ3Jlc3MtYmFyIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcm9ncmVzcy1iYWNrLWNvbG9yKTsgfQorICBwcm9ncmVzczo6LW1vei1wcm9ncmVzcy1iYXIgeworICAgIGJhY2tncm91bmQ6IHZhcigtLXByb2dyZXNzLWZvcmUtY29sb3IpOworICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSk7CisgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsgfQorICBwcm9ncmVzc1t2YWx1ZT0iMTAwMCJdOjotd2Via2l0LXByb2dyZXNzLXZhbHVlIHsKKyAgICBib3JkZXItcmFkaXVzOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykpOyB9CisgIHByb2dyZXNzW3ZhbHVlPSIxMDAwIl06Oi1tb3otcHJvZ3Jlc3MtYmFyIHsKKyAgICBib3JkZXItcmFkaXVzOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykpOyB9CisgIHByb2dyZXNzLmlubGluZSB7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgd2lkdGg6IDYwJTsgfQorCis6cm9vdCB7CisgIC0tc3Bpbm5lci1iYWNrLWNvbG9yOiAjZGRkOworICAtLXNwaW5uZXItZm9yZS1jb2xvcjogIzU1NTsgfQorCitAa2V5ZnJhbWVzIHNwaW5uZXItZG9udXQtYW5pbSB7CisgIDAlIHsKKyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQorICAxMDAlIHsKKyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH0KKy5zcGlubmVyIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBib3JkZXI6IDAuMjVyZW0gc29saWQgdmFyKC0tc3Bpbm5lci1iYWNrLWNvbG9yKTsKKyAgYm9yZGVyLWxlZnQ6IDAuMjVyZW0gc29saWQgdmFyKC0tc3Bpbm5lci1mb3JlLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogNTAlOworICB3aWR0aDogMS4yNXJlbTsKKyAgaGVpZ2h0OiAxLjI1cmVtOworICBhbmltYXRpb246IHNwaW5uZXItZG9udXQtYW5pbSAxLjJzIGxpbmVhciBpbmZpbml0ZTsgfQorCisvKgorICBDdXN0b20gZWxlbWVudHMgZm9yIHByb2dyZXNzIGJhcnMgYW5kIHNwaW5uZXJzLgorKi8KK3Byb2dyZXNzLnByaW1hcnkgeworICAtLXByb2dyZXNzLWZvcmUtY29sb3I6ICMxOTc2ZDI7IH0KKworcHJvZ3Jlc3Muc2Vjb25kYXJ5IHsKKyAgLS1wcm9ncmVzcy1mb3JlLWNvbG9yOiAjZDMyZjJmOyB9CisKK3Byb2dyZXNzLnRlcnRpYXJ5IHsKKyAgLS1wcm9ncmVzcy1mb3JlLWNvbG9yOiAjMzA4NzMyOyB9CisKKy5zcGlubmVyLnByaW1hcnkgeworICAtLXNwaW5uZXItZm9yZS1jb2xvcjogIzE5NzZkMjsgfQorCisuc3Bpbm5lci5zZWNvbmRhcnkgeworICAtLXNwaW5uZXItZm9yZS1jb2xvcjogI2QzMmYyZjsgfQorCisuc3Bpbm5lci50ZXJ0aWFyeSB7CisgIC0tc3Bpbm5lci1mb3JlLWNvbG9yOiAjMzA4NzMyOyB9CisKKy8qCisgIERlZmluaXRpb25zIGZvciBpY29ucyAtIHBvd2VyZWQgYnkgRmVhdGhlciAoaHR0cHM6Ly9mZWF0aGVyaWNvbnMuY29tLykuCisqLworc3BhbltjbGFzc149J2ljb24tJ10geworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIGhlaWdodDogMWVtOworICB3aWR0aDogMWVtOworICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07CisgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsKKyAgbWFyZ2luOiAwIGNhbGModmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgLyA0KTsgfQorICBzcGFuW2NsYXNzXj0naWNvbi0nXS5zZWNvbmRhcnkgeworICAgIC13ZWJraXQtZmlsdGVyOiBpbnZlcnQoMjUlKTsKKyAgICBmaWx0ZXI6IGludmVydCgyNSUpOyB9CisgIHNwYW5bY2xhc3NePSdpY29uLSddLmludmVyc2UgeworICAgIC13ZWJraXQtZmlsdGVyOiBpbnZlcnQoMTAwJSk7CisgICAgZmlsdGVyOiBpbnZlcnQoMTAwJSk7IH0KKworc3Bhbi5pY29uLWFsZXJ0IHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NjaXJjbGUgY3g9JzEyJyBjeT0nMTInIHI9JzEwJyUzRSUzQy9jaXJjbGUlM0UlM0NsaW5lIHgxPScxMicgeTE9JzgnIHgyPScxMicgeTI9JzEyJyUzRSUzQy9saW5lJTNFJTNDbGluZSB4MT0nMTInIHkxPScxNicgeDI9JzEyJyB5Mj0nMTYnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1ib29rbWFyayB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMTkgMjFsLTctNS03IDVWNWEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ6JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tY2FsZW5kYXIgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3JlY3QgeD0nMycgeT0nNCcgd2lkdGg9JzE4JyBoZWlnaHQ9JzE4JyByeD0nMicgcnk9JzInJTNFJTNDL3JlY3QlM0UlM0NsaW5lIHgxPScxNicgeTE9JzInIHgyPScxNicgeTI9JzYnJTNFJTNDL2xpbmUlM0UlM0NsaW5lIHgxPSc4JyB5MT0nMicgeDI9JzgnIHkyPSc2JyUzRSUzQy9saW5lJTNFJTNDbGluZSB4MT0nMycgeTE9JzEwJyB4Mj0nMjEnIHkyPScxMCclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWNyZWRpdCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcmVjdCB4PScxJyB5PSc0JyB3aWR0aD0nMjInIGhlaWdodD0nMTYnIHJ4PScyJyByeT0nMiclM0UlM0MvcmVjdCUzRSUzQ2xpbmUgeDE9JzEnIHkxPScxMCcgeDI9JzIzJyB5Mj0nMTAnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1lZGl0IHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00yMCAxNC42NlYyMGEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY2YTIgMiAwIDAgMSAyLTJoNS4zNCclM0UlM0MvcGF0aCUzRSUzQ3BvbHlnb24gcG9pbnRzPScxOCAyIDIyIDYgMTIgMTYgOCAxNiA4IDEyIDE4IDInJTNFJTNDL3BvbHlnb24lM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1saW5rIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00xOCAxM3Y2YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmg2JyUzRSUzQy9wYXRoJTNFJTNDcG9seWxpbmUgcG9pbnRzPScxNSAzIDIxIDMgMjEgOSclM0UlM0MvcG9seWxpbmUlM0UlM0NsaW5lIHgxPScxMCcgeTE9JzE0JyB4Mj0nMjEnIHkyPSczJyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24taGVscCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMnJTNFJTNDL3BhdGglM0UlM0NjaXJjbGUgY3g9JzEyJyBjeT0nMTInIHI9JzEwJyUzRSUzQy9jaXJjbGUlM0UlM0NsaW5lIHgxPScxMicgeTE9JzE3JyB4Mj0nMTInIHkyPScxNyclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWhvbWUgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTMgOWw5LTcgOSA3djExYTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yeiclM0UlM0MvcGF0aCUzRSUzQ3BvbHlsaW5lIHBvaW50cz0nOSAyMiA5IDEyIDE1IDEyIDE1IDIyJyUzRSUzQy9wb2x5bGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWluZm8geworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ2NpcmNsZSBjeD0nMTInIGN5PScxMicgcj0nMTAnJTNFJTNDL2NpcmNsZSUzRSUzQ2xpbmUgeDE9JzEyJyB5MT0nMTYnIHgyPScxMicgeTI9JzEyJyUzRSUzQy9saW5lJTNFJTNDbGluZSB4MT0nMTInIHkxPSc4JyB4Mj0nMTInIHkyPSc4JyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tbG9jayB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcmVjdCB4PSczJyB5PScxMScgd2lkdGg9JzE4JyBoZWlnaHQ9JzExJyByeD0nMicgcnk9JzInJTNFJTNDL3JlY3QlM0UlM0NwYXRoIGQ9J003IDExVjdhNSA1IDAgMCAxIDEwIDB2NCclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLW1haWwgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6JyUzRSUzQy9wYXRoJTNFJTNDcG9seWxpbmUgcG9pbnRzPScyMiw2IDEyLDEzIDIsNiclM0UlM0MvcG9seWxpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1sb2NhdGlvbiB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMjEgMTBjMCA3LTkgMTMtOSAxM3MtOS02LTktMTNhOSA5IDAgMCAxIDE4IDB6JyUzRSUzQy9wYXRoJTNFJTNDY2lyY2xlIGN4PScxMicgY3k9JzEwJyByPSczJyUzRSUzQy9jaXJjbGUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1waG9uZSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMjIgMTYuOTJ2M2EyIDIgMCAwIDEtMi4xOCAyIDE5Ljc5IDE5Ljc5IDAgMCAxLTguNjMtMy4wNyAxOS41IDE5LjUgMCAwIDEtNi02IDE5Ljc5IDE5Ljc5IDAgMCAxLTMuMDctOC42N0EyIDIgMCAwIDEgNC4xMSAyaDNhMiAyIDAgMCAxIDIgMS43MiAxMi44NCAxMi44NCAwIDAgMCAuNyAyLjgxIDIgMiAwIDAgMS0uNDUgMi4xMUw4LjA5IDkuOTFhMTYgMTYgMCAwIDAgNiA2bDEuMjctMS4yN2EyIDIgMCAwIDEgMi4xMS0uNDUgMTIuODQgMTIuODQgMCAwIDAgMi44MS43QTIgMiAwIDAgMSAyMiAxNi45MnonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1yc3MgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTQgMTFhOSA5IDAgMCAxIDkgOSclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZD0nTTQgNGExNiAxNiAwIDAgMSAxNiAxNiclM0UlM0MvcGF0aCUzRSUzQ2NpcmNsZSBjeD0nNScgY3k9JzE5JyByPScxJyUzRSUzQy9jaXJjbGUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1zZWFyY2ggeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ2NpcmNsZSBjeD0nMTEnIGN5PScxMScgcj0nOCclM0UlM0MvY2lyY2xlJTNFJTNDbGluZSB4MT0nMjEnIHkxPScyMScgeDI9JzE2LjY1JyB5Mj0nMTYuNjUnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1zZXR0aW5ncyB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDY2lyY2xlIGN4PScxMicgY3k9JzEyJyByPSczJyUzRSUzQy9jaXJjbGUlM0UlM0NwYXRoIGQ9J00xOS40IDE1YTEuNjUgMS42NSAwIDAgMCAuMzMgMS44MmwuMDYuMDZhMiAyIDAgMCAxIDAgMi44MyAyIDIgMCAwIDEtMi44MyAwbC0uMDYtLjA2YTEuNjUgMS42NSAwIDAgMC0xLjgyLS4zMyAxLjY1IDEuNjUgMCAwIDAtMSAxLjUxVjIxYTIgMiAwIDAgMS0yIDIgMiAyIDAgMCAxLTItMnYtLjA5QTEuNjUgMS42NSAwIDAgMCA5IDE5LjRhMS42NSAxLjY1IDAgMCAwLTEuODIuMzNsLS4wNi4wNmEyIDIgMCAwIDEtMi44MyAwIDIgMiAwIDAgMSAwLTIuODNsLjA2LS4wNmExLjY1IDEuNjUgMCAwIDAgLjMzLTEuODIgMS42NSAxLjY1IDAgMCAwLTEuNTEtMUgzYTIgMiAwIDAgMS0yLTIgMiAyIDAgMCAxIDItMmguMDlBMS42NSAxLjY1IDAgMCAwIDQuNiA5YTEuNjUgMS42NSAwIDAgMC0uMzMtMS44MmwtLjA2LS4wNmEyIDIgMCAwIDEgMC0yLjgzIDIgMiAwIDAgMSAyLjgzIDBsLjA2LjA2YTEuNjUgMS42NSAwIDAgMCAxLjgyLjMzSDlhMS42NSAxLjY1IDAgMCAwIDEtMS41MVYzYTIgMiAwIDAgMSAyLTIgMiAyIDAgMCAxIDIgMnYuMDlhMS42NSAxLjY1IDAgMCAwIDEgMS41MSAxLjY1IDEuNjUgMCAwIDAgMS44Mi0uMzNsLjA2LS4wNmEyIDIgMCAwIDEgMi44MyAwIDIgMiAwIDAgMSAwIDIuODNsLS4wNi4wNmExLjY1IDEuNjUgMCAwIDAtLjMzIDEuODJWOWExLjY1IDEuNjUgMCAwIDAgMS41MSAxSDIxYTIgMiAwIDAgMSAyIDIgMiAyIDAgMCAxLTIgMmgtLjA5YTEuNjUgMS42NSAwIDAgMC0xLjUxIDF6JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tc2hhcmUgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ2NpcmNsZSBjeD0nMTgnIGN5PSc1JyByPSczJyUzRSUzQy9jaXJjbGUlM0UlM0NjaXJjbGUgY3g9JzYnIGN5PScxMicgcj0nMyclM0UlM0MvY2lyY2xlJTNFJTNDY2lyY2xlIGN4PScxOCcgY3k9JzE5JyByPSczJyUzRSUzQy9jaXJjbGUlM0UlM0NsaW5lIHgxPSc4LjU5JyB5MT0nMTMuNTEnIHgyPScxNS40MicgeTI9JzE3LjQ5JyUzRSUzQy9saW5lJTNFJTNDbGluZSB4MT0nMTUuNDEnIHkxPSc2LjUxJyB4Mj0nOC41OScgeTI9JzEwLjQ5JyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tY2FydCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDY2lyY2xlIGN4PSc5JyBjeT0nMjEnIHI9JzEnJTNFJTNDL2NpcmNsZSUzRSUzQ2NpcmNsZSBjeD0nMjAnIGN5PScyMScgcj0nMSclM0UlM0MvY2lyY2xlJTNFJTNDcGF0aCBkPSdNMSAxaDRsMi42OCAxMy4zOWEyIDIgMCAwIDAgMiAxLjYxaDkuNzJhMiAyIDAgMCAwIDItMS42MUwyMyA2SDYnJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi11cGxvYWQgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTIxIDE1djRhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ2LTQnJTNFJTNDL3BhdGglM0UlM0Nwb2x5bGluZSBwb2ludHM9JzE3IDggMTIgMyA3IDgnJTNFJTNDL3BvbHlsaW5lJTNFJTNDbGluZSB4MT0nMTInIHkxPSczJyB4Mj0nMTInIHkyPScxNSclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLXVzZXIgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTIwIDIxdi0yYTQgNCAwIDAgMC00LTRIOGE0IDQgMCAwIDAtNCA0djInJTNFJTNDL3BhdGglM0UlM0NjaXJjbGUgY3g9JzEyJyBjeT0nNycgcj0nNCclM0UlM0MvY2lyY2xlJTNFJTNDL3N2ZyUzRSIpOyB9CisKKy8qCisgIERlZmluaXRpb25zIGZvciB1dGlsaXRpZXMgYW5kIGhlbHBlciBjbGFzc2VzLgorKi8KKy8qIFV0aWxpdHkgbW9kdWxlIENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucyAqLworOnJvb3QgeworICAtLWdlbmVyaWMtYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMyk7CisgIC0tZ2VuZXJpYy1ib3gtc2hhZG93OiAwIDAuMjVyZW0gMC4yNXJlbSAwIHJnYmEoMCwgMCwgMCwgMC4xMjUpLCAwIDAuMTI1cmVtIDAuMTI1cmVtIC0wLjEyNXJlbSByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9CisKKy5oaWRkZW4geworICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KKworLnZpc3VhbGx5LWhpZGRlbiB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OworICB3aWR0aDogMXB4ICFpbXBvcnRhbnQ7CisgIGhlaWdodDogMXB4ICFpbXBvcnRhbnQ7CisgIG1hcmdpbjogLTFweCAhaW1wb3J0YW50OworICBib3JkZXI6IDAgIWltcG9ydGFudDsKKyAgcGFkZGluZzogMCAhaW1wb3J0YW50OworICBjbGlwOiByZWN0KDAgMCAwIDApICFpbXBvcnRhbnQ7CisgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsgfQorCisuYm9yZGVyZWQgeworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1nZW5lcmljLWJvcmRlci1jb2xvcikgIWltcG9ydGFudDsgfQorCisucm91bmRlZCB7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSAhaW1wb3J0YW50OyB9CisKKy5jaXJjdWxhciB7CisgIGJvcmRlci1yYWRpdXM6IDUwJSAhaW1wb3J0YW50OyB9CisKKy5zaGFkb3dlZCB7CisgIGJveC1zaGFkb3c6IHZhcigtLWdlbmVyaWMtYm94LXNoYWRvdykgIWltcG9ydGFudDsgfQorCisucmVzcG9uc2l2ZS1tYXJnaW4geworICBtYXJnaW46IGNhbGModmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgLyA0KSAhaW1wb3J0YW50OyB9CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDUwMHB4KSB7CisgICAgLnJlc3BvbnNpdmUtbWFyZ2luIHsKKyAgICAgIG1hcmdpbjogY2FsYyh2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSAvIDIpICFpbXBvcnRhbnQ7IH0gfQorICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMjgwcHgpIHsKKyAgICAucmVzcG9uc2l2ZS1tYXJnaW4geworICAgICAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSAhaW1wb3J0YW50OyB9IH0KKworLnJlc3BvbnNpdmUtcGFkZGluZyB7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCkgIWltcG9ydGFudDsgfQorICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1MDBweCkgeworICAgIC5yZXNwb25zaXZlLXBhZGRpbmcgeworICAgICAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKSAhaW1wb3J0YW50OyB9IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MHB4KSB7CisgICAgLnJlc3BvbnNpdmUtcGFkZGluZyB7CisgICAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgIWltcG9ydGFudDsgfSB9CisKK0BtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ5OXB4KSB7CisgIC5oaWRkZW4tc20geworICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1MDBweCkgYW5kIChtYXgtd2lkdGg6IDEyNzlweCkgeworICAuaGlkZGVuLW1kIHsKKyAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MHB4KSB7CisgIC5oaWRkZW4tbGcgeworICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0OTlweCkgeworICAudmlzdWFsbHktaGlkZGVuLXNtIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKKyAgICB3aWR0aDogMXB4ICFpbXBvcnRhbnQ7CisgICAgaGVpZ2h0OiAxcHggIWltcG9ydGFudDsKKyAgICBtYXJnaW46IC0xcHggIWltcG9ydGFudDsKKyAgICBib3JkZXI6IDAgIWltcG9ydGFudDsKKyAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CisgICAgY2xpcDogcmVjdCgwIDAgMCAwKSAhaW1wb3J0YW50OworICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICAgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIGFuZCAobWF4LXdpZHRoOiAxMjc5cHgpIHsKKyAgLnZpc3VhbGx5LWhpZGRlbi1tZCB7CisgICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CisgICAgd2lkdGg6IDFweCAhaW1wb3J0YW50OworICAgIGhlaWdodDogMXB4ICFpbXBvcnRhbnQ7CisgICAgbWFyZ2luOiAtMXB4ICFpbXBvcnRhbnQ7CisgICAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7CisgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OworICAgIGNsaXA6IHJlY3QoMCAwIDAgMCkgIWltcG9ydGFudDsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OyB9IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODBweCkgeworICAudmlzdWFsbHktaGlkZGVuLWxnIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKKyAgICB3aWR0aDogMXB4ICFpbXBvcnRhbnQ7CisgICAgaGVpZ2h0OiAxcHggIWltcG9ydGFudDsKKyAgICBtYXJnaW46IC0xcHggIWltcG9ydGFudDsKKyAgICBib3JkZXI6IDAgIWltcG9ydGFudDsKKyAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CisgICAgY2xpcDogcmVjdCgwIDAgMCAwKSAhaW1wb3J0YW50OworICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICAgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7IH0gfQorCisvKiMgc291cmNlTWFwcGluZ1VSTD1taW5pLWRlZmF1bHQuY3NzLm1hcCAqLwpkaWZmIC0tZ2l0IGEvX2h0bXJlc2Mvc3RfbG9nby5wbmcgYi9faHRtcmVzYy9zdF9sb2dvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjgwMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvX2h0bXJlc2Mvc3RfbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgo=